| 98 | } |
| 99 | |
| 100 | function detectSignals(text) { |
| 101 | if (!text) return []; |
| 102 | const lower = text.toLowerCase(); |
| 103 | const signals = []; |
| 104 | if (/error:|exception:|failed/i.test(lower)) signals.push('log_error'); |
| 105 | if (/timeout|slow|latency|bottleneck/i.test(lower)) signals.push('perf_bottleneck'); |
| 106 | if (/add|implement|feature|new function|new module/i.test(lower)) signals.push('user_feature_request'); |
| 107 | if (/improve|enhance|refactor|optimize/i.test(lower)) signals.push('user_improvement_suggestion'); |
| 108 | if (/not supported|unsupported|not implemented/i.test(lower)) signals.push('capability_gap'); |
| 109 | if (/deploy|ci|pipeline|build failed/i.test(lower)) signals.push('deployment_issue'); |
| 110 | if (/test fail|assertion|expect\(/i.test(lower)) signals.push('test_failure'); |
| 111 | return [...new Set(signals)]; |
| 112 | } |
| 113 | |
| 114 | function loadHubFetch() { |
| 115 | const evolverRoot = findEvolverRoot(); |