@@ -18,7 +18,7 @@ const MAX_LOG_CHARS = 2000;
1818const MAX_EVENTS = 5 ;
1919
2020function getConfig ( ) {
21- var enabled = String ( process . env . EVOLVER_AUTO_ISSUE || 'true' ) . toLowerCase ( ) ;
21+ const enabled = String ( process . env . EVOLVER_AUTO_ISSUE || 'true' ) . toLowerCase ( ) ;
2222 if ( enabled === 'false' || enabled === '0' ) return null ;
2323 return {
2424 repo : process . env . EVOLVER_ISSUE_REPO || DEFAULT_REPO ,
@@ -37,7 +37,7 @@ function getStatePath() {
3737
3838function readState ( ) {
3939 try {
40- var p = getStatePath ( ) ;
40+ const p = getStatePath ( ) ;
4141 if ( fs . existsSync ( p ) ) {
4242 return JSON . parse ( fs . readFileSync ( p , 'utf8' ) ) ;
4343 }
@@ -47,7 +47,7 @@ function readState() {
4747
4848function writeState ( state ) {
4949 try {
50- var dir = getEvolutionDir ( ) ;
50+ const dir = getEvolutionDir ( ) ;
5151 if ( ! fs . existsSync ( dir ) ) fs . mkdirSync ( dir , { recursive : true } ) ;
5252 fs . writeFileSync ( getStatePath ( ) , JSON . stringify ( state , null , 2 ) + '\n' ) ;
5353 } catch ( _ ) { }
@@ -60,7 +60,7 @@ function truncateNodeId(nodeId) {
6060}
6161
6262function computeErrorKey ( signals ) {
63- var relevant = signals
63+ const relevant = signals
6464 . filter ( function ( s ) {
6565 return s . startsWith ( 'recurring_errsig' ) ||
6666 s . startsWith ( 'ban_gene:' ) ||
@@ -74,19 +74,19 @@ function computeErrorKey(signals) {
7474}
7575
7676function extractErrorSignature ( signals ) {
77- var errSig = signals . find ( function ( s ) { return s . startsWith ( 'recurring_errsig' ) ; } ) ;
77+ const errSig = signals . find ( function ( s ) { return s . startsWith ( 'recurring_errsig' ) ; } ) ;
7878 if ( errSig ) {
7979 return errSig . replace ( / ^ r e c u r r i n g _ e r r s i g \( \d + x \) : / , '' ) . trim ( ) . slice ( 0 , 200 ) ;
8080 }
81- var banned = signals . find ( function ( s ) { return s . startsWith ( 'ban_gene:' ) ; } ) ;
81+ const banned = signals . find ( function ( s ) { return s . startsWith ( 'ban_gene:' ) ; } ) ;
8282 if ( banned ) return 'Repeated failures with gene: ' + banned . replace ( 'ban_gene:' , '' ) ;
8383 return 'Persistent evolution failure' ;
8484}
8585
8686function extractStreakCount ( signals ) {
87- for ( var i = 0 ; i < signals . length ; i ++ ) {
87+ for ( let i = 0 ; i < signals . length ; i ++ ) {
8888 if ( signals [ i ] . startsWith ( 'consecutive_failure_streak_' ) ) {
89- var n = parseInt ( signals [ i ] . replace ( 'consecutive_failure_streak_' , '' ) , 10 ) ;
89+ const n = parseInt ( signals [ i ] . replace ( 'consecutive_failure_streak_' , '' ) , 10 ) ;
9090 if ( Number . isFinite ( n ) ) return n ;
9191 }
9292 }
@@ -95,12 +95,12 @@ function extractStreakCount(signals) {
9595
9696function formatRecentEvents ( events ) {
9797 if ( ! Array . isArray ( events ) || events . length === 0 ) return '_No recent events available._' ;
98- var failed = events . filter ( function ( e ) { return e && e . outcome && e . outcome . status === 'failed' ; } ) ;
99- var rows = failed . slice ( - MAX_EVENTS ) . map ( function ( e , idx ) {
100- var intent = e . intent || '-' ;
101- var gene = ( Array . isArray ( e . genes_used ) && e . genes_used [ 0 ] ) || '-' ;
102- var outcome = ( e . outcome && e . outcome . status ) || '-' ;
103- var reason = ( e . outcome && e . outcome . reason ) || '' ;
98+ const failed = events . filter ( function ( e ) { return e && e . outcome && e . outcome . status === 'failed' ; } ) ;
99+ const rows = failed . slice ( - MAX_EVENTS ) . map ( function ( e , idx ) {
100+ const intent = e . intent || '-' ;
101+ const gene = ( Array . isArray ( e . genes_used ) && e . genes_used [ 0 ] ) || '-' ;
102+ const outcome = ( e . outcome && e . outcome . status ) || '-' ;
103+ let reason = ( e . outcome && e . outcome . reason ) || '' ;
104104 if ( reason . length > 80 ) reason = reason . slice ( 0 , 80 ) + '...' ;
105105 reason = redactString ( reason ) ;
106106 return '| ' + ( idx + 1 ) + ' | ' + intent + ' | ' + gene + ' | ' + outcome + ' | ' + reason + ' |' ;
@@ -110,15 +110,15 @@ function formatRecentEvents(events) {
110110}
111111
112112function buildIssueBody ( opts ) {
113- var fp = opts . envFingerprint || captureEnvFingerprint ( ) ;
114- var signals = opts . signals || [ ] ;
115- var recentEvents = opts . recentEvents || [ ] ;
116- var sessionLog = opts . sessionLog || '' ;
117- var streakCount = extractStreakCount ( signals ) ;
118- var errorSig = extractErrorSignature ( signals ) ;
119- var nodeId = truncateNodeId ( getNodeId ( ) ) ;
120-
121- var failureSignals = signals . filter ( function ( s ) {
113+ const fp = opts . envFingerprint || captureEnvFingerprint ( ) ;
114+ const signals = opts . signals || [ ] ;
115+ const recentEvents = opts . recentEvents || [ ] ;
116+ const sessionLog = opts . sessionLog || '' ;
117+ const streakCount = extractStreakCount ( signals ) ;
118+ const errorSig = extractErrorSignature ( signals ) ;
119+ const nodeId = truncateNodeId ( getNodeId ( ) ) ;
120+
121+ const failureSignals = signals . filter ( function ( s ) {
122122 return s . startsWith ( 'recurring_' ) ||
123123 s . startsWith ( 'consecutive_failure' ) ||
124124 s . startsWith ( 'failure_loop' ) ||
@@ -127,17 +127,17 @@ function buildIssueBody(opts) {
127127 s === 'force_innovation_after_repair_loop' ;
128128 } ) . join ( ', ' ) ;
129129
130- var sanitizedLog = redactString (
130+ const sanitizedLog = redactString (
131131 typeof sessionLog === 'string' ? sessionLog . slice ( - MAX_LOG_CHARS ) : ''
132132 ) ;
133133
134- var eventsTable = formatRecentEvents ( recentEvents ) ;
134+ const eventsTable = formatRecentEvents ( recentEvents ) ;
135135
136- var reportId = crypto . createHash ( 'sha256' )
136+ const reportId = crypto . createHash ( 'sha256' )
137137 . update ( nodeId + '|' + Date . now ( ) + '|' + errorSig )
138138 . digest ( 'hex' ) . slice ( 0 , 12 ) ;
139139
140- var body = [
140+ const body = [
141141 '## Environment' ,
142142 '- **Evolver Version:** ' + ( fp . evolver_version || 'unknown' ) ,
143143 '- **Node.js:** ' + ( fp . node_version || process . version ) ,
@@ -172,21 +172,21 @@ function buildIssueBody(opts) {
172172function shouldReport ( signals , config ) {
173173 if ( ! config ) return false ;
174174
175- var hasFailureLoop = signals . includes ( 'failure_loop_detected' ) ;
176- var hasRecurringAndHigh = signals . includes ( 'recurring_error' ) && signals . includes ( 'high_failure_ratio' ) ;
175+ const hasFailureLoop = signals . includes ( 'failure_loop_detected' ) ;
176+ const hasRecurringAndHigh = signals . includes ( 'recurring_error' ) && signals . includes ( 'high_failure_ratio' ) ;
177177
178178 if ( ! hasFailureLoop && ! hasRecurringAndHigh ) return false ;
179179
180- var streakCount = extractStreakCount ( signals ) ;
180+ const streakCount = extractStreakCount ( signals ) ;
181181 if ( streakCount > 0 && streakCount < config . minStreak ) return false ;
182182
183- var state = readState ( ) ;
184- var errorKey = computeErrorKey ( signals ) ;
183+ const state = readState ( ) ;
184+ const errorKey = computeErrorKey ( signals ) ;
185185
186186 if ( state . lastReportedAt ) {
187- var elapsed = Date . now ( ) - new Date ( state . lastReportedAt ) . getTime ( ) ;
187+ const elapsed = Date . now ( ) - new Date ( state . lastReportedAt ) . getTime ( ) ;
188188 if ( elapsed < config . cooldownMs ) {
189- var recentKeys = Array . isArray ( state . recentIssueKeys ) ? state . recentIssueKeys : [ ] ;
189+ const recentKeys = Array . isArray ( state . recentIssueKeys ) ? state . recentIssueKeys : [ ] ;
190190 if ( recentKeys . includes ( errorKey ) ) {
191191 return false ;
192192 }
@@ -197,8 +197,8 @@ function shouldReport(signals, config) {
197197}
198198
199199async function createGithubIssue ( repo , title , body , token ) {
200- var url = 'https://api.github.com/repos/' + repo + '/issues' ;
201- var response = await fetch ( url , {
200+ const url = 'https://api.github.com/repos/' + repo + '/issues' ;
201+ const response = await fetch ( url , {
202202 method : 'POST' ,
203203 headers : {
204204 'Authorization' : 'Bearer ' + token ,
@@ -211,41 +211,41 @@ async function createGithubIssue(repo, title, body, token) {
211211 } ) ;
212212
213213 if ( ! response . ok ) {
214- var errText = '' ;
214+ let errText = '' ;
215215 try { errText = await response . text ( ) ; } catch ( _ ) { }
216216 throw new Error ( 'GitHub API ' + response . status + ': ' + errText . slice ( 0 , 200 ) ) ;
217217 }
218218
219- var data = await response . json ( ) ;
219+ const data = await response . json ( ) ;
220220 return { number : data . number , url : data . html_url } ;
221221}
222222
223223async function maybeReportIssue ( opts ) {
224- var config = getConfig ( ) ;
224+ const config = getConfig ( ) ;
225225 if ( ! config ) return ;
226226
227- var signals = opts . signals || [ ] ;
227+ const signals = opts . signals || [ ] ;
228228
229229 if ( ! shouldReport ( signals , config ) ) return ;
230230
231- var token = getGithubToken ( ) ;
231+ const token = getGithubToken ( ) ;
232232 if ( ! token ) {
233233 console . log ( '[IssueReporter] No GitHub token available. Skipping auto-report.' ) ;
234234 return ;
235235 }
236236
237- var errorSig = extractErrorSignature ( signals ) ;
238- var titleSig = errorSig . slice ( 0 , 80 ) ;
239- var title = '[Auto] Recurring failure: ' + titleSig ;
240- var body = buildIssueBody ( opts ) ;
237+ const errorSig = extractErrorSignature ( signals ) ;
238+ const titleSig = errorSig . slice ( 0 , 80 ) ;
239+ const title = '[Auto] Recurring failure: ' + titleSig ;
240+ const body = buildIssueBody ( opts ) ;
241241
242242 try {
243- var result = await createGithubIssue ( config . repo , title , body , token ) ;
243+ const result = await createGithubIssue ( config . repo , title , body , token ) ;
244244 console . log ( '[IssueReporter] Created GitHub issue #' + result . number + ': ' + result . url ) ;
245245
246- var state = readState ( ) ;
247- var errorKey = computeErrorKey ( signals ) ;
248- var recentKeys = Array . isArray ( state . recentIssueKeys ) ? state . recentIssueKeys : [ ] ;
246+ const state = readState ( ) ;
247+ const errorKey = computeErrorKey ( signals ) ;
248+ let recentKeys = Array . isArray ( state . recentIssueKeys ) ? state . recentIssueKeys : [ ] ;
249249 recentKeys . push ( errorKey ) ;
250250 if ( recentKeys . length > 20 ) recentKeys = recentKeys . slice ( - 20 ) ;
251251 writeState ( {
0 commit comments