@@ -121,19 +121,19 @@ private function processApplicationErrors($config)
121121 SELECT e.*
122122 FROM KyteError e
123123 LEFT JOIN AIErrorAnalysis a ON e.id = a.error_id
124- WHERE e.application = ?
124+ WHERE e.app_id = ?
125125 AND e.deleted = 0
126126 AND a.id IS NULL
127127 " ;
128128
129129 // Filter by error types if configured
130130 if (!$ config ['include_warnings ' ]) {
131- $ sql .= " AND e.error_type NOT IN ('Warning ', 'Notice ', 'Deprecated ') " ;
131+ $ sql .= " AND e.log_level NOT IN ('warning ', 'notice ', 'deprecated ') " ;
132132 }
133133
134134 $ sql .= " ORDER BY e.date_created DESC LIMIT 100 " ;
135135
136- $ errors = DBI ::prepared_query ($ sql , 'i ' , [$ appId ]);
136+ $ errors = DBI ::prepared_query ($ sql , 's ' , [$ config [ ' app_identifier ' ] ]);
137137
138138 if (empty ($ errors )) {
139139 $ this ->log (" No new errors to process " );
@@ -179,18 +179,30 @@ private function shouldAnalyzeError($error, $config)
179179
180180 if (empty ($ dedup )) {
181181 // New error signature - create deduplication record
182+ // Extract controller name from file path (e.g., "Controller/UserController.php" -> "UserController")
183+ $ controllerName = '' ;
184+ $ filePath = $ error ['file ' ] ?? '' ;
185+ if (preg_match ('/([A-Z][a-zA-Z0-9]+Controller)\.php/ ' , $ filePath , $ matches )) {
186+ $ controllerName = $ matches [1 ];
187+ } elseif (preg_match ('/\/([^\/]+)\.php$/ ' , $ filePath , $ matches )) {
188+ $ controllerName = $ matches [1 ];
189+ } else {
190+ $ controllerName = 'Unknown ' ;
191+ }
192+
182193 $ sql = "
183194 INSERT INTO AIErrorDeduplication (
184- application, kyte_account, error_signature, error_message, error_file,
185- error_line, first_seen, last_seen, occurrence_count, date_created
186- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, UNIX_TIMESTAMP() )
195+ application, kyte_account, error_signature, controller_name, error_message, error_file,
196+ error_line, first_seen, last_seen, occurrence_count
197+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1 )
187198 " ;
188199
189- DBI ::prepared_query ($ sql , 'iisssiii ' , [
200+ DBI ::prepared_query ($ sql , 'iisssssii ' , [
190201 $ config ['application ' ],
191202 $ config ['kyte_account ' ],
192203 $ signature ,
193- $ error ['error_message ' ],
204+ $ controllerName ,
205+ $ error ['message ' ],
194206 $ error ['file ' ] ?? '' ,
195207 $ error ['line ' ] ?? 0 ,
196208 $ error ['date_created ' ],
@@ -247,15 +259,15 @@ private function shouldAnalyzeError($error, $config)
247259 private function generateErrorSignature ($ error )
248260 {
249261 // Combine error type, message (normalized), file, and line
250- $ message = $ error ['error_message ' ];
262+ $ message = $ error ['message ' ];
251263
252264 // Normalize message (remove variable values, IDs, etc.)
253265 $ message = preg_replace ('/\d+/ ' , 'N ' , $ message ); // Replace numbers
254266 $ message = preg_replace ('/[ \'"][^ \'\"]*[ \'"]/ ' , 'STR ' , $ message ); // Replace strings
255267 $ message = preg_replace ('/0x[a-f0-9]+/i ' , 'HEX ' , $ message ); // Replace hex values
256268
257269 $ sigParts = [
258- $ error ['error_type ' ] ?? 'Error ' ,
270+ $ error ['log_level ' ] ?? 'error ' ,
259271 $ message ,
260272 $ error ['file ' ] ?? '' ,
261273 $ error ['line ' ] ?? 0
@@ -269,24 +281,21 @@ private function generateErrorSignature($error)
269281 */
270282 private function queueErrorForAnalysis ($ error , $ config )
271283 {
284+ // Generate error signature
285+ $ signature = $ this ->generateErrorSignature ($ error );
286+
272287 $ sql = "
273288 INSERT INTO AIErrorAnalysis (
274- error_id, application, kyte_account, error_type, error_message,
275- file_path, line_number, stack_trace, request_data, analysis_status,
276- analysis_stage, queued_at, date_created
277- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'queued', 'pending', UNIX_TIMESTAMP(), UNIX_TIMESTAMP())
289+ error_id, error_signature, application, kyte_account,
290+ analysis_status, analysis_stage, queued_at, date_created
291+ ) VALUES (?, ?, ?, ?, 'queued', 'pending', UNIX_TIMESTAMP(), UNIX_TIMESTAMP())
278292 " ;
279293
280- DBI ::prepared_query ($ sql , 'iiisssiss ' , [
294+ DBI ::prepared_query ($ sql , 'isii ' , [
281295 $ error ['id ' ],
296+ $ signature ,
282297 $ config ['application ' ],
283- $ config ['kyte_account ' ],
284- $ error ['error_type ' ] ?? 'Error ' ,
285- $ error ['error_message ' ],
286- $ error ['file ' ] ?? '' ,
287- $ error ['line ' ] ?? 0 ,
288- $ error ['stack_trace ' ] ?? '' ,
289- $ error ['request_data ' ] ?? ''
298+ $ config ['kyte_account ' ]
290299 ]);
291300
292301 $ this ->log (" Queued error # {$ error ['id ' ]} for analysis " );
@@ -373,7 +382,7 @@ private function processConfigAnalyses($config)
373382 $ sql = "
374383 UPDATE AIErrorAnalysis
375384 SET analysis_status = 'failed',
376- error_analysis = ?,
385+ last_error = ?,
377386 processing_completed_at = UNIX_TIMESTAMP()
378387 WHERE id = ?
379388 " ;
0 commit comments