UNPKG

@nomyx/assistant

Version:

A powerful assistant library and cli for your AI projects. works with Vertex AI (Claude and Gemini)

144 lines (126 loc) 3.55 kB
import { randomUUID } from 'crypto'; export interface CodeQualityMetrics { complexity: number; maintainabilityIndex: number; codeDuplicationPercentage: number; commentDensity: number; functionLength: number; } export interface SecurityIssue { severity: 'HIGH' | 'MEDIUM' | 'LOW'; description: string; location: string; } export class CodeNode { id: string; codeQualityMetrics?: CodeQualityMetrics; securityIssues?: SecurityIssue[]; generatedCode?: string; constructor( public type: string, public value: string, public children: CodeNode[] = [], public metadata: Record<string, any> = {} ) { this.id = randomUUID(); } toJSON(): any { return { id: this.id, type: this.type, value: this.value, children: this.children.map(child => child.toJSON()), metadata: this.metadata, codeQualityMetrics: this.codeQualityMetrics, securityIssues: this.securityIssues, generatedCode: this.generatedCode }; } static fromJSON(json: any): CodeNode { if (!json || typeof json !== 'object') { throw new Error('Invalid JSON structure for CodeNode'); } const node = new CodeNode( json.type || 'Unknown', json.value || '', Array.isArray(json.children) ? json.children.map((child: any) => CodeNode.fromJSON(child)) : [], json.metadata || {} ); node.id = json.id || randomUUID(); node.codeQualityMetrics = json.codeQualityMetrics; node.securityIssues = json.securityIssues; node.generatedCode = json.generatedCode; return node; } toString(indent = ''): string { let result = `${indent}${this.type}: ${this.value}\n`; for (const child of this.children) { result += child.toString(indent + ' '); } return result; } // Tree traversal methods traverse(callback: (node: CodeNode) => void): void { callback(this); for (const child of this.children) { child.traverse(callback); } } find(predicate: (node: CodeNode) => boolean): CodeNode | null { if (predicate(this)) { return this; } for (const child of this.children) { const found = child.find(predicate); if (found) { return found; } } return null; } // Serialization and deserialization serialize(): string { return JSON.stringify(this.toJSON()); } static deserialize(serialized: string): CodeNode { return CodeNode.fromJSON(JSON.parse(serialized)); } } // Utility functions for working with CodeNode structures export function findNodeById(root: CodeNode, id: string): CodeNode | null { return root.find(node => node.id === id); } export function countNodes(root: CodeNode): number { let count = 1; root.traverse(() => count++); return count; } export function getLeafNodes(root: CodeNode): CodeNode[] { const leafNodes: CodeNode[] = []; root.traverse(node => { if (node.children.length === 0) { leafNodes.push(node); } }); return leafNodes; } export function getNodeDepth(root: CodeNode, targetNode: CodeNode): number { let depth = -1; let found = false; function traverse(node: CodeNode, currentDepth: number) { if (found) return; if (node === targetNode) { depth = currentDepth; found = true; return; } for (const child of node.children) { traverse(child, currentDepth + 1); } } traverse(root, 0); return depth; } export function cloneCodeNode(node: CodeNode): CodeNode { return CodeNode.fromJSON(node.toJSON()); }