@evomap/evolver 1.90.0 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +27 -564
  2. package/bin/evolver-llm-proxy.js +3 -0
  3. package/bin/evolver-mcp.js +2 -0
  4. package/bin/evolver-proxy.js +3 -0
  5. package/bin/evolver.js +4 -0
  6. package/index.js +1 -3670
  7. package/package.json +32 -62
  8. package/CONTRIBUTING.md +0 -19
  9. package/LICENSE +0 -641
  10. package/README.ja-JP.md +0 -521
  11. package/README.ko-KR.md +0 -520
  12. package/README.zh-CN.md +0 -531
  13. package/SKILL.md +0 -365
  14. package/assets/cover.png +0 -0
  15. package/assets/gep/genes.seed.json +0 -496
  16. package/conformance/savings-core/constants.json +0 -30
  17. package/conformance/savings-core/golden-vectors.json +0 -333
  18. package/scripts/a2a_export.js +0 -63
  19. package/scripts/a2a_ingest.js +0 -79
  20. package/scripts/a2a_promote.js +0 -118
  21. package/scripts/analyze_by_skill.js +0 -121
  22. package/scripts/build_binaries.js +0 -479
  23. package/scripts/check-changelog.js +0 -166
  24. package/scripts/extract_log.js +0 -85
  25. package/scripts/generate_history.js +0 -75
  26. package/scripts/gep_append_event.js +0 -96
  27. package/scripts/gep_personality_report.js +0 -234
  28. package/scripts/human_report.js +0 -147
  29. package/scripts/recall-verify-report.js +0 -234
  30. package/scripts/recover_loop.js +0 -61
  31. package/scripts/refresh_stars_badge.js +0 -168
  32. package/scripts/seed-merchants.js +0 -91
  33. package/scripts/skill2recipes.js +0 -118
  34. package/scripts/suggest_version.js +0 -89
  35. package/scripts/validate-modules.js +0 -38
  36. package/scripts/validate-suite.js +0 -78
  37. package/src/adapters/claudeCode.js +0 -194
  38. package/src/adapters/codex.js +0 -216
  39. package/src/adapters/cursor.js +0 -91
  40. package/src/adapters/hookAdapter.js +0 -469
  41. package/src/adapters/kiro.js +0 -195
  42. package/src/adapters/opencode.js +0 -326
  43. package/src/adapters/scripts/_lockPaths.js +0 -74
  44. package/src/adapters/scripts/_memoryFiltering.js +0 -35
  45. package/src/adapters/scripts/_runtimePaths.js +0 -440
  46. package/src/adapters/scripts/evolver-session-end.js +0 -321
  47. package/src/adapters/scripts/evolver-session-start.js +0 -587
  48. package/src/adapters/scripts/evolver-signal-detect.js +0 -98
  49. package/src/adapters/scripts/evolver-task-recall.js +0 -173
  50. package/src/atp/atpExecute.js +0 -283
  51. package/src/atp/atpTaskPickup.js +0 -233
  52. package/src/atp/autoBuyer.js +0 -382
  53. package/src/atp/autoDeliver.js +0 -215
  54. package/src/atp/cli.js +0 -354
  55. package/src/atp/cliAutobuyPrompt.js +0 -154
  56. package/src/atp/consumerAgent.js +0 -157
  57. package/src/atp/defaultHandler.js +0 -69
  58. package/src/atp/heartbeatSignalsHandler.js +0 -254
  59. package/src/atp/hubClient.js +0 -317
  60. package/src/atp/index.js +0 -38
  61. package/src/atp/merchantAgent.js +0 -118
  62. package/src/atp/protocol.js +0 -41
  63. package/src/atp/questionComposer.js +0 -133
  64. package/src/atp/serviceHelper.js +0 -92
  65. package/src/canary.js +0 -13
  66. package/src/config.js +0 -351
  67. package/src/evolve/guards.js +0 -1
  68. package/src/evolve/pipeline/collect.js +0 -1
  69. package/src/evolve/pipeline/dispatch.js +0 -1
  70. package/src/evolve/pipeline/enrich.js +0 -1
  71. package/src/evolve/pipeline/hub.js +0 -1
  72. package/src/evolve/pipeline/select.js +0 -1
  73. package/src/evolve/pipeline/signals.js +0 -1
  74. package/src/evolve/utils.js +0 -1
  75. package/src/evolve.js +0 -1
  76. package/src/experiment/agentRunner.js +0 -229
  77. package/src/experiment/cli.js +0 -159
  78. package/src/experiment/comparison.js +0 -233
  79. package/src/experiment/metrics.js +0 -75
  80. package/src/forceUpdate.js +0 -991
  81. package/src/gep/a2a.js +0 -173
  82. package/src/gep/a2aProtocol.js +0 -1
  83. package/src/gep/analyzer.js +0 -35
  84. package/src/gep/antiAbuseTelemetry.js +0 -1
  85. package/src/gep/assetCallLog.js +0 -197
  86. package/src/gep/assetStore.js +0 -723
  87. package/src/gep/assets.js +0 -36
  88. package/src/gep/autoDistillConv.js +0 -1
  89. package/src/gep/autoDistillLlm.js +0 -1
  90. package/src/gep/bridge.js +0 -138
  91. package/src/gep/candidateEval.js +0 -1
  92. package/src/gep/candidates.js +0 -1
  93. package/src/gep/claimNudge.js +0 -121
  94. package/src/gep/cliContracts.js +0 -1190
  95. package/src/gep/contentHash.js +0 -1
  96. package/src/gep/conversationDistiller.js +0 -1
  97. package/src/gep/conversationSniffer.js +0 -1
  98. package/src/gep/crypto.js +0 -1
  99. package/src/gep/curriculum.js +0 -1
  100. package/src/gep/deviceId.js +0 -1
  101. package/src/gep/directoryClient.js +0 -115
  102. package/src/gep/envFingerprint.js +0 -1
  103. package/src/gep/epigenetics.js +0 -1
  104. package/src/gep/execBridge.js +0 -1
  105. package/src/gep/executionTrace.js +0 -291
  106. package/src/gep/explore.js +0 -1
  107. package/src/gep/featureFlags.js +0 -121
  108. package/src/gep/gitOps.js +0 -265
  109. package/src/gep/hash.js +0 -1
  110. package/src/gep/hostErrorClassifier.js +0 -34
  111. package/src/gep/hubFetch.js +0 -1
  112. package/src/gep/hubReview.js +0 -1
  113. package/src/gep/hubSearch.js +0 -1
  114. package/src/gep/hubVerify.js +0 -1
  115. package/src/gep/idleScheduler.js +0 -400
  116. package/src/gep/issueReporter.js +0 -416
  117. package/src/gep/learningSignals.js +0 -1
  118. package/src/gep/llmReview.js +0 -92
  119. package/src/gep/localStateAwareness.js +0 -243
  120. package/src/gep/mailboxTransport.js +0 -119
  121. package/src/gep/memoryGraph.js +0 -1
  122. package/src/gep/memoryGraphAdapter.js +0 -1
  123. package/src/gep/mutation.js +0 -1
  124. package/src/gep/narrativeMemory.js +0 -1
  125. package/src/gep/oauthLogin.js +0 -181
  126. package/src/gep/openPRRegistry.js +0 -1
  127. package/src/gep/paths.js +0 -522
  128. package/src/gep/personality.js +0 -1
  129. package/src/gep/policyCheck.js +0 -1
  130. package/src/gep/portable.js +0 -103
  131. package/src/gep/privacyClient.js +0 -235
  132. package/src/gep/prompt.js +0 -1
  133. package/src/gep/questionGenerator.js +0 -518
  134. package/src/gep/recallInject.js +0 -1
  135. package/src/gep/recallVerifier.js +0 -1
  136. package/src/gep/reflection.js +0 -1
  137. package/src/gep/sanitize.js +0 -264
  138. package/src/gep/savingsCore.js +0 -1
  139. package/src/gep/schemas/capsule.js +0 -170
  140. package/src/gep/schemas/gene.js +0 -154
  141. package/src/gep/schemas/index.js +0 -8
  142. package/src/gep/schemas/protocol.js +0 -51
  143. package/src/gep/schemas/task.js +0 -74
  144. package/src/gep/selector.js +0 -1
  145. package/src/gep/selfPR.js +0 -469
  146. package/src/gep/signals.js +0 -776
  147. package/src/gep/skill2gep.js +0 -1056
  148. package/src/gep/skill2gepAudit.js +0 -303
  149. package/src/gep/skill2recipes.js +0 -511
  150. package/src/gep/skillDistiller.js +0 -1
  151. package/src/gep/skillPublisher.js +0 -358
  152. package/src/gep/solidify.js +0 -1
  153. package/src/gep/strategy.js +0 -1
  154. package/src/gep/taskReceiver.js +0 -575
  155. package/src/gep/tokenSavings.js +0 -1
  156. package/src/gep/trajectoryExport.js +0 -1
  157. package/src/gep/validationReport.js +0 -55
  158. package/src/gep/validator/index.js +0 -411
  159. package/src/gep/validator/reporter.js +0 -210
  160. package/src/gep/validator/sandboxExecutor.js +0 -480
  161. package/src/gep/validator/stakeBootstrap.js +0 -357
  162. package/src/gep/workspaceKeychain.js +0 -1
  163. package/src/ops/cleanup.js +0 -80
  164. package/src/ops/commentary.js +0 -60
  165. package/src/ops/health_check.js +0 -104
  166. package/src/ops/index.js +0 -11
  167. package/src/ops/innovation.js +0 -67
  168. package/src/ops/lifecycle.js +0 -798
  169. package/src/ops/self_repair.js +0 -76
  170. package/src/ops/skills_monitor.js +0 -147
  171. package/src/ops/trigger.js +0 -33
  172. package/src/proxy/clientSettings.js +0 -405
  173. package/src/proxy/envelope.js +0 -59
  174. package/src/proxy/extensions/dmHandler.js +0 -45
  175. package/src/proxy/extensions/sessionHandler.js +0 -141
  176. package/src/proxy/extensions/skillUpdater.js +0 -64
  177. package/src/proxy/extensions/traceControl.js +0 -1
  178. package/src/proxy/index.js +0 -1395
  179. package/src/proxy/inject.js +0 -1
  180. package/src/proxy/lifecycle/manager.js +0 -1568
  181. package/src/proxy/mailbox/state.js +0 -207
  182. package/src/proxy/mailbox/store.js +0 -602
  183. package/src/proxy/router/cache_passthrough.js +0 -26
  184. package/src/proxy/router/features.js +0 -84
  185. package/src/proxy/router/gemini_route.js +0 -154
  186. package/src/proxy/router/messages_route.js +0 -535
  187. package/src/proxy/router/model_router.js +0 -113
  188. package/src/proxy/router/models_route.js +0 -52
  189. package/src/proxy/router/ollama_route.js +0 -103
  190. package/src/proxy/router/responses_route.js +0 -170
  191. package/src/proxy/router/vertex_route.js +0 -110
  192. package/src/proxy/server/http.js +0 -363
  193. package/src/proxy/server/routes.js +0 -558
  194. package/src/proxy/server/settings.js +0 -115
  195. package/src/proxy/sync/engine.js +0 -179
  196. package/src/proxy/sync/inbound.js +0 -211
  197. package/src/proxy/sync/outbound.js +0 -361
  198. package/src/proxy/task/monitor.js +0 -131
  199. package/src/proxy/trace/extractor.js +0 -1
  200. package/src/proxy/trace/usage.js +0 -1
  201. package/src/solo/breaker.js +0 -25
  202. package/src/solo/gitGuard.js +0 -65
  203. package/src/webui/client/clientJs/assets.js +0 -111
  204. package/src/webui/client/clientJs/bootstrap.js +0 -92
  205. package/src/webui/client/clientJs/common.js +0 -77
  206. package/src/webui/client/clientJs/i18n.js +0 -366
  207. package/src/webui/client/clientJs/index.js +0 -35
  208. package/src/webui/client/clientJs/interactions.js +0 -351
  209. package/src/webui/client/clientJs/overview.js +0 -152
  210. package/src/webui/client/clientJs/personality.js +0 -285
  211. package/src/webui/client/clientJs/pipelines.js +0 -330
  212. package/src/webui/client/indexHtml.js +0 -221
  213. package/src/webui/client/static.js +0 -23
  214. package/src/webui/client/stylesCss.js +0 -639
  215. package/src/webui/client/vendor/README.md +0 -15
  216. package/src/webui/client/vendor/echarts.min.js +0 -45
  217. package/src/webui/index.js +0 -14
  218. package/src/webui/observer/assets.js +0 -146
  219. package/src/webui/observer/index.js +0 -37
  220. package/src/webui/observer/interactions.js +0 -127
  221. package/src/webui/observer/jsonl.js +0 -75
  222. package/src/webui/observer/paths.js +0 -46
  223. package/src/webui/observer/personality.js +0 -43
  224. package/src/webui/observer/pipelineEvents.js +0 -58
  225. package/src/webui/observer/redact.js +0 -63
  226. package/src/webui/observer/runs.js +0 -356
  227. package/src/webui/observer/safety.js +0 -57
  228. package/src/webui/observer/skills.js +0 -70
  229. package/src/webui/observer/status.js +0 -71
  230. package/src/webui/server/http.js +0 -138
  231. package/src/webui/server/routes.js +0 -41
@@ -1,416 +0,0 @@
1
- // Automatic GitHub issue reporter for recurring evolver failures.
2
- // When the evolver hits persistent errors (failure streaks, recurring errors),
3
- // this module files a GitHub issue with sanitized logs and environment info.
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const crypto = require('crypto');
8
- const { getEvolutionDir } = require('./paths');
9
- const { captureEnvFingerprint } = require('./envFingerprint');
10
- const { redactString } = require('./sanitize');
11
- const { getNodeId } = require('./a2aProtocol');
12
- const { SELF_PR_REPO } = require('../config');
13
- const { HOST_PROVIDER_ERR_RE } = require('./hostErrorClassifier');
14
-
15
- const STATE_FILE_NAME = 'issue_reporter_state.json';
16
- const DEFAULT_COOLDOWN_MS = 24 * 60 * 60 * 1000;
17
- const DEFAULT_MIN_STREAK = 5;
18
- const MAX_LOG_CHARS = 2000;
19
- const MAX_EVENTS = 5;
20
-
21
- // --- Local root-cause classification -------------------------------------
22
- // Before opening a PUBLIC issue we triage the failure the way a maintainer
23
- // would. Empirically almost every auto-report is not an evolver bug at all but
24
- // a host-side problem: no transcript to evolve from, the host's LLM provider
25
- // rejecting requests, or a locally-generated gene that structurally cannot
26
- // produce changes (see #530 / #534 / #577). We only file when the failure is
27
- // plausibly evolver's fault. Default-open: if we cannot classify it, we still
28
- // file -- never hide an unknown evolver bug. Set
29
- // EVOLVER_ISSUE_STRICT_CLASSIFY=false to disable and file everything.
30
-
31
- // "[NO SESSION LOGS FOUND]" et al. -- the host gave evolver nothing to evolve.
32
- const HOST_NO_TRANSCRIPT_RE = /\[no session logs? found\]|no session log|no transcript/i;
33
- // Host LLM-provider errors (4xx-class). Classified by the shared
34
- // hostErrorClassifier module (HOST_PROVIDER_ERR_RE imported above) so that
35
- // issueReporter (suppress *filing*) and signals.js (suppress *ban/streak*,
36
- // #571) stay in lockstep and cannot drift.
37
- // Buckets we are confident are host-side; everything else gets filed.
38
- const SUPPRESS_BUCKETS = new Set(['host_no_transcript', 'host_provider_error', 'local_gene_no_blast']);
39
-
40
- function getConfig() {
41
- const enabled = String(process.env.EVOLVER_AUTO_ISSUE || 'true').toLowerCase();
42
- if (enabled === 'false' || enabled === '0') return null;
43
- return {
44
- // Default repo is shared with self-PR (see config.SELF_PR_REPO) so that
45
- // auto-reported issues and auto-filed PRs land in the same public repo.
46
- repo: process.env.EVOLVER_ISSUE_REPO || SELF_PR_REPO,
47
- cooldownMs: Number(process.env.EVOLVER_ISSUE_COOLDOWN_MS) || DEFAULT_COOLDOWN_MS,
48
- minStreak: Number(process.env.EVOLVER_ISSUE_MIN_STREAK) || DEFAULT_MIN_STREAK,
49
- };
50
- }
51
-
52
- function getGithubToken() {
53
- return process.env.GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_PAT || '';
54
- }
55
-
56
- function getStatePath() {
57
- return path.join(getEvolutionDir(), STATE_FILE_NAME);
58
- }
59
-
60
- function readState() {
61
- try {
62
- const p = getStatePath();
63
- if (fs.existsSync(p)) {
64
- return JSON.parse(fs.readFileSync(p, 'utf8'));
65
- }
66
- } catch (_) {}
67
- return { lastReportedAt: null, recentIssueKeys: [] };
68
- }
69
-
70
- function writeState(state) {
71
- try {
72
- const dir = getEvolutionDir();
73
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
74
- fs.writeFileSync(getStatePath(), JSON.stringify(state, null, 2) + '\n');
75
- } catch (_) {}
76
- }
77
-
78
- function truncateNodeId(nodeId) {
79
- if (!nodeId || typeof nodeId !== 'string') return 'unknown';
80
- if (nodeId.length <= 10) return nodeId;
81
- return nodeId.slice(0, 10) + '...';
82
- }
83
-
84
- function computeErrorKey(signals) {
85
- const relevant = signals
86
- .filter(function (s) {
87
- return s.startsWith('recurring_errsig') ||
88
- s.startsWith('ban_gene:') ||
89
- s === 'recurring_error' ||
90
- s === 'failure_loop_detected' ||
91
- s === 'high_failure_ratio';
92
- })
93
- .map(function (s) {
94
- return s.replace(/^recurring_errsig\(\d+x\):/, 'recurring_errsig:');
95
- })
96
- .sort()
97
- .join('|');
98
- return crypto.createHash('sha256').update(relevant || 'unknown').digest('hex').slice(0, 16);
99
- }
100
-
101
- function extractErrorSignature(signals) {
102
- const errSig = signals.find(function (s) { return s.startsWith('recurring_errsig'); });
103
- if (errSig) {
104
- return errSig.replace(/^recurring_errsig\(\d+x\):/, '').trim().slice(0, 200);
105
- }
106
- const banned = signals.find(function (s) { return s.startsWith('ban_gene:'); });
107
- if (banned) return 'Repeated failures with gene: ' + banned.replace('ban_gene:', '');
108
- return 'Persistent evolution failure';
109
- }
110
-
111
- function extractStreakCount(signals) {
112
- for (let i = 0; i < signals.length; i++) {
113
- if (signals[i].startsWith('consecutive_failure_streak_')) {
114
- const n = parseInt(signals[i].replace('consecutive_failure_streak_', ''), 10);
115
- if (Number.isFinite(n)) return n;
116
- }
117
- }
118
- return 0;
119
- }
120
-
121
- // Triage a failure into a root-cause bucket. Pure function over the same inputs
122
- // buildIssueBody already receives. Returns { bucket, reason }.
123
- function classifyFailure(opts) {
124
- const signals = Array.isArray(opts && opts.signals) ? opts.signals : [];
125
- const events = Array.isArray(opts && opts.recentEvents) ? opts.recentEvents : [];
126
- const log = typeof (opts && opts.sessionLog) === 'string' ? opts.sessionLog : '';
127
-
128
- // (a) No transcript -> the host gave evolver nothing to evolve from.
129
- if (!log.trim() || HOST_NO_TRANSCRIPT_RE.test(log)) {
130
- return { bucket: 'host_no_transcript', reason: 'no session transcript to evolve from' };
131
- }
132
-
133
- // (b) Host LLM-provider error surfaced in the transcript.
134
- const prov = log.match(HOST_PROVIDER_ERR_RE);
135
- if (prov) {
136
- return { bucket: 'host_provider_error', reason: 'host LLM-provider error: ' + String(prov[0]).slice(0, 60) };
137
- }
138
-
139
- // (c) The banned gene is locally generated AND every recent failing cycle
140
- // changed nothing -- a no-op "strategy" gene, not an evolver bug.
141
- const banned = signals.find(function (s) { return s.startsWith('ban_gene:'); });
142
- if (banned) {
143
- const geneId = banned.replace('ban_gene:', '');
144
- const localGene = /^sha256:/.test(geneId) || /^gene_auto_/.test(geneId);
145
- const failed = events.filter(function (e) { return e && e.outcome && e.outcome.status === 'failed'; });
146
- const allZeroBlast = failed.length > 0 && failed.every(function (e) {
147
- const br = e.blast_radius;
148
- return (e.meta && e.meta.empty_cycle) || (br && br.files === 0 && br.lines === 0);
149
- });
150
- if (localGene && allZeroBlast) {
151
- return { bucket: 'local_gene_no_blast', reason: 'locally-generated gene ' + geneId.slice(0, 20) + '… produces no blast radius' };
152
- }
153
- }
154
-
155
- return { bucket: 'unclassified', reason: '' };
156
- }
157
-
158
- // Remember a suppressed report locally so it is observable and dedup-tracked,
159
- // without opening a public issue.
160
- function recordSuppression(signals, classification) {
161
- try {
162
- const state = readState();
163
- const errorKey = computeErrorKey(signals);
164
- let recentKeys = Array.isArray(state.recentIssueKeys) ? state.recentIssueKeys : [];
165
- if (!recentKeys.includes(errorKey)) recentKeys.push(errorKey);
166
- if (recentKeys.length > 20) recentKeys = recentKeys.slice(-20);
167
- writeState(Object.assign({}, state, {
168
- recentIssueKeys: recentKeys,
169
- lastSuppressedAt: new Date().toISOString(),
170
- lastSuppressedBucket: classification.bucket,
171
- lastSuppressedReason: classification.reason,
172
- }));
173
- } catch (_) {}
174
- }
175
-
176
- function formatRecentEvents(events) {
177
- if (!Array.isArray(events) || events.length === 0) return '_No recent events available._';
178
- const failed = events.filter(function (e) { return e && e.outcome && e.outcome.status === 'failed'; });
179
- const rows = failed.slice(-MAX_EVENTS).map(function (e, idx) {
180
- const intent = e.intent || '-';
181
- const gene = (Array.isArray(e.genes_used) && e.genes_used[0]) || '-';
182
- const outcome = (e.outcome && e.outcome.status) || '-';
183
- let reason = (e.outcome && e.outcome.reason) || '';
184
- if (reason.length > 80) reason = reason.slice(0, 80) + '...';
185
- reason = redactString(reason);
186
- return '| ' + (idx + 1) + ' | ' + intent + ' | ' + gene + ' | ' + outcome + ' | ' + reason + ' |';
187
- });
188
- if (rows.length === 0) return '_No failed events in recent history._';
189
- return '| # | Intent | Gene | Outcome | Reason |\n|---|--------|------|---------|--------|\n' + rows.join('\n');
190
- }
191
-
192
- function buildIssueBody(opts) {
193
- const fp = opts.envFingerprint || captureEnvFingerprint();
194
- const signals = opts.signals || [];
195
- const recentEvents = opts.recentEvents || [];
196
- const sessionLog = opts.sessionLog || '';
197
- const streakCount = extractStreakCount(signals);
198
- const errorSig = extractErrorSignature(signals);
199
- const nodeId = truncateNodeId(getNodeId());
200
-
201
- const failureSignals = signals.filter(function (s) {
202
- return s.startsWith('recurring_') ||
203
- s.startsWith('consecutive_failure') ||
204
- s.startsWith('failure_loop') ||
205
- s.startsWith('high_failure') ||
206
- s.startsWith('ban_gene:') ||
207
- s === 'force_innovation_after_repair_loop';
208
- }).join(', ');
209
-
210
- const sanitizedLog = redactString(
211
- typeof sessionLog === 'string' ? sessionLog.slice(-MAX_LOG_CHARS) : ''
212
- );
213
-
214
- const eventsTable = formatRecentEvents(recentEvents);
215
-
216
- const reportId = crypto.createHash('sha256')
217
- .update(nodeId + '|' + Date.now() + '|' + errorSig)
218
- .digest('hex').slice(0, 12);
219
-
220
- const body = [
221
- '## Environment',
222
- '- **Evolver Version:** ' + (fp.evolver_version || 'unknown'),
223
- '- **Node.js:** ' + (fp.node_version || process.version),
224
- '- **Platform:** ' + (fp.platform || process.platform) + ' ' + (fp.arch || process.arch),
225
- '- **Container:** ' + (fp.container ? 'yes' : 'no'),
226
- '',
227
- '## Failure Summary',
228
- '- **Consecutive failures:** ' + (streakCount || 'N/A'),
229
- '- **Failure signals:** ' + (failureSignals || 'none'),
230
- '',
231
- '## Error Signature',
232
- '```',
233
- redactString(errorSig),
234
- '```',
235
- '',
236
- '## Recent Evolution Events (sanitized)',
237
- eventsTable,
238
- '',
239
- '## Session Log Excerpt (sanitized)',
240
- '```',
241
- sanitizedLog || '_No session log available._',
242
- '```',
243
- '',
244
- '---',
245
- '_This issue was automatically created by evolver v' + (fp.evolver_version || 'unknown') + '._',
246
- '_Device: ' + nodeId + ' | Report ID: ' + reportId + '_',
247
- ];
248
-
249
- return body.join('\n');
250
- }
251
-
252
- function shouldReport(signals, config) {
253
- if (!config) return false;
254
-
255
- const hasFailureLoop = signals.includes('failure_loop_detected');
256
- const hasRecurringAndHigh = signals.includes('recurring_error') && signals.includes('high_failure_ratio');
257
-
258
- if (!hasFailureLoop && !hasRecurringAndHigh) return false;
259
-
260
- const streakCount = extractStreakCount(signals);
261
- if (streakCount < config.minStreak) return false;
262
-
263
- const state = readState();
264
- const errorKey = computeErrorKey(signals);
265
-
266
- if (state.lastReportedAt) {
267
- const elapsed = Date.now() - new Date(state.lastReportedAt).getTime();
268
- if (elapsed < config.cooldownMs) {
269
- const recentKeys = Array.isArray(state.recentIssueKeys) ? state.recentIssueKeys : [];
270
- if (recentKeys.includes(errorKey)) {
271
- return false;
272
- }
273
- }
274
- }
275
-
276
- return true;
277
- }
278
-
279
- async function createGithubIssue(repo, title, body, token) {
280
- const url = 'https://api.github.com/repos/' + repo + '/issues';
281
- const response = await fetch(url, {
282
- method: 'POST',
283
- headers: {
284
- 'Authorization': 'Bearer ' + token,
285
- 'Accept': 'application/vnd.github+json',
286
- 'Content-Type': 'application/json',
287
- 'X-GitHub-Api-Version': '2022-11-28',
288
- },
289
- body: JSON.stringify({ title: title, body: body }),
290
- signal: AbortSignal.timeout(15000),
291
- });
292
-
293
- if (!response.ok) {
294
- let errText = '';
295
- try { errText = await response.text(); } catch (_) {}
296
- throw new Error('GitHub API ' + response.status + ': ' + errText.slice(0, 200));
297
- }
298
-
299
- const data = await response.json();
300
- return { number: data.number, url: data.html_url };
301
- }
302
-
303
- function escapeSearchQuery(s) {
304
- return String(s || '').replace(/"/g, '').replace(/[\r\n]+/g, ' ').trim();
305
- }
306
-
307
- async function findExistingIssue(repo, title, token) {
308
- const titleSig = escapeSearchQuery(title).slice(0, 120);
309
- if (!titleSig) return null;
310
- const q = 'repo:' + repo + ' is:issue is:open in:title "' + titleSig + '"';
311
- const url = 'https://api.github.com/search/issues?per_page=5&q=' + encodeURIComponent(q);
312
- const headers = {
313
- 'Accept': 'application/vnd.github+json',
314
- 'X-GitHub-Api-Version': '2022-11-28',
315
- };
316
- if (token) headers['Authorization'] = 'Bearer ' + token;
317
- let response;
318
- try {
319
- response = await fetch(url, { method: 'GET', headers: headers, signal: AbortSignal.timeout(10000) });
320
- } catch (e) {
321
- return null;
322
- }
323
- if (!response.ok) return null;
324
- let data;
325
- try { data = await response.json(); } catch (_) { return null; }
326
- const items = Array.isArray(data && data.items) ? data.items : [];
327
- const AUTO_PREFIX = '[Auto] Recurring failure: ';
328
- const match = items.find(function (it) {
329
- return it && typeof it.title === 'string' && it.title.trim() === title.trim() && it.state === 'open';
330
- }) || items.find(function (it) {
331
- return it && it.state === 'open' && typeof it.title === 'string' &&
332
- it.title.startsWith(AUTO_PREFIX) && it.title.trim().startsWith(titleSig.trim());
333
- });
334
- if (!match) return null;
335
- return { number: match.number, url: match.html_url, title: match.title };
336
- }
337
-
338
- async function maybeReportIssue(opts) {
339
- const config = getConfig();
340
- if (!config) return;
341
-
342
- const signals = opts.signals || [];
343
-
344
- if (!shouldReport(signals, config)) return;
345
-
346
- // Local triage: suppress confidently host-side failures instead of opening a
347
- // public issue for them. Default-open -- only recognized host buckets are
348
- // suppressed; anything we cannot classify is still filed.
349
- const strict = String(process.env.EVOLVER_ISSUE_STRICT_CLASSIFY || 'true').toLowerCase() !== 'false';
350
- const classification = classifyFailure(opts);
351
- if (strict && SUPPRESS_BUCKETS.has(classification.bucket)) {
352
- console.log('[IssueReporter] Suppressing public issue [' + classification.bucket + ']: ' + classification.reason + '. Logged locally; not filing to ' + config.repo + '.');
353
- recordSuppression(signals, classification);
354
- return;
355
- }
356
-
357
- const token = getGithubToken();
358
- if (!token) {
359
- console.log('[IssueReporter] No GitHub token available. Skipping auto-report.');
360
- return;
361
- }
362
-
363
- const errorSig = extractErrorSignature(signals);
364
- const titleSig = errorSig.slice(0, 80);
365
- const title = '[Auto] Recurring failure: ' + titleSig;
366
- const body = buildIssueBody(opts);
367
-
368
- try {
369
- const existing = await findExistingIssue(config.repo, title, token);
370
- if (existing) {
371
- console.log('[IssueReporter] Open issue already exists (#' + existing.number + '): ' + existing.url + '. Skipping duplicate report.');
372
- const state = readState();
373
- const errorKey = computeErrorKey(signals);
374
- let recentKeys = Array.isArray(state.recentIssueKeys) ? state.recentIssueKeys : [];
375
- if (!recentKeys.includes(errorKey)) recentKeys.push(errorKey);
376
- if (recentKeys.length > 20) recentKeys = recentKeys.slice(-20);
377
- writeState({
378
- lastReportedAt: state.lastReportedAt || null,
379
- recentIssueKeys: recentKeys,
380
- lastIssueUrl: existing.url,
381
- lastIssueNumber: existing.number,
382
- lastSkippedAt: new Date().toISOString(),
383
- });
384
- return;
385
- }
386
-
387
- const result = await createGithubIssue(config.repo, title, body, token);
388
- console.log('[IssueReporter] Created GitHub issue #' + result.number + ': ' + result.url);
389
-
390
- const state = readState();
391
- const errorKey = computeErrorKey(signals);
392
- let recentKeys = Array.isArray(state.recentIssueKeys) ? state.recentIssueKeys : [];
393
- recentKeys.push(errorKey);
394
- if (recentKeys.length > 20) recentKeys = recentKeys.slice(-20);
395
- writeState({
396
- lastReportedAt: new Date().toISOString(),
397
- recentIssueKeys: recentKeys,
398
- lastIssueUrl: result.url,
399
- lastIssueNumber: result.number,
400
- });
401
- } catch (e) {
402
- console.log('[IssueReporter] Failed to create issue (non-fatal): ' + (e && e.message ? e.message : String(e)));
403
- }
404
- }
405
-
406
- module.exports = {
407
- maybeReportIssue,
408
- buildIssueBody,
409
- shouldReport,
410
- findExistingIssue,
411
- getConfig,
412
- computeErrorKey,
413
- extractStreakCount,
414
- extractErrorSignature,
415
- classifyFailure,
416
- };
@@ -1 +0,0 @@
1
- const _0x465320=_0x2f7d;(function(_0x1eb559,_0x2ffef3){const _0x31dd77=_0x2f7d,_0x34c924=_0x1eb559();while(!![]){try{const _0xa15e83=parseInt(_0x31dd77(0x1da,'\x73\x6c\x66\x56'))/(0x13af*0x1+0x14e3*-0x1+0x3*0x67)+parseInt(_0x31dd77(0x1de,'\x64\x70\x6a\x41'))/(-0x3bb*0x7+-0x2*-0x1334+-0xc49)*(parseInt(_0x31dd77(0x23c,'\x2a\x49\x65\x6a'))/(-0x11f7+0x217b+-0xf81))+-parseInt(_0x31dd77(0x20d,'\x33\x68\x55\x57'))/(-0x2*-0x3be+0x1*-0x1652+0xeda)*(parseInt(_0x31dd77(0x258,'\x77\x76\x40\x67'))/(-0xe6+0x78*0x34+-0x1775))+parseInt(_0x31dd77(0x21a,'\x77\x76\x40\x67'))/(-0x1d39+0xb42+0x5*0x399)*(parseInt(_0x31dd77(0x233,'\x54\x54\x70\x49'))/(-0x124a*-0x1+0x2*-0x109d+-0x3*-0x4fd))+parseInt(_0x31dd77(0x24d,'\x26\x72\x53\x54'))/(-0xa*-0x1a8+-0x556+-0xb32)*(parseInt(_0x31dd77(0x204,'\x6f\x7a\x45\x51'))/(0x7cd*-0x1+-0x8d*-0x9+0x2e1))+parseInt(_0x31dd77(0x232,'\x29\x4c\x33\x44'))/(-0x126e*0x1+0x1*-0x411+0x1689)+-parseInt(_0x31dd77(0x207,'\x5a\x55\x6b\x49'))/(-0x4*0x6a+-0x40a*0x4+-0x11db*-0x1);if(_0xa15e83===_0x2ffef3)break;else _0x34c924['push'](_0x34c924['shift']());}catch(_0x32b3df){_0x34c924['push'](_0x34c924['shift']());}}}(_0x2cc0,0x16ec1*0x5+0x4f2b+-0x4cd3));const _0x1007b0=(function(){const _0x31e44b=_0x2f7d,_0x334dd8={'\x71\x43\x68\x76\x67':function(_0x582ed9,_0x16c24e){return _0x582ed9!==_0x16c24e;},'\x57\x48\x4f\x70\x46':_0x31e44b(0x1ec,'\x49\x72\x35\x4e'),'\x74\x62\x4a\x52\x4f':_0x31e44b(0x1f3,'\x49\x72\x35\x4e'),'\x50\x4e\x76\x6b\x4a':_0x31e44b(0x1f8,'\x28\x4d\x48\x28'),'\x5a\x4c\x53\x44\x72':function(_0xa8e9ca,_0xa9fbca,_0x123b0b){return _0xa8e9ca(_0xa9fbca,_0x123b0b);},'\x53\x44\x4e\x58\x50':'\x70\x72\x6f\x62\x6c\x65\x6d\x3a'+_0x31e44b(0x1d6,'\x6a\x7a\x6c\x38'),'\x45\x56\x78\x52\x43':_0x31e44b(0x277,'\x76\x5d\x23\x68')+'\x70\x74\x69\x6d\x69\x7a\x65','\x65\x65\x43\x53\x58':function(_0x2887f9,_0x93e11c){return _0x2887f9(_0x93e11c);},'\x74\x42\x44\x67\x76':function(_0x532c7b,_0x473d75){return _0x532c7b===_0x473d75;},'\x48\x4e\x41\x53\x54':function(_0x548921,_0xdff19d){return _0x548921<_0xdff19d;}};let _0x56e566=!![];return function(_0x223d26,_0x4b4bbb){const _0x2fe7cc=_0x31e44b,_0x5cbb31={'\x72\x4d\x46\x4f\x57':function(_0xfabdd4,_0x6bf609,_0xa06f5b){const _0x54858c=_0x2f7d;return _0x334dd8[_0x54858c(0x247,'\x73\x6b\x37\x6d')](_0xfabdd4,_0x6bf609,_0xa06f5b);},'\x45\x76\x77\x6c\x55':_0x334dd8[_0x2fe7cc(0x240,'\x64\x70\x6a\x41')],'\x48\x62\x57\x70\x41':_0x334dd8[_0x2fe7cc(0x235,'\x28\x4d\x48\x28')],'\x42\x4e\x65\x51\x75':function(_0x4c327d,_0x22088b){const _0x135ca4=_0x2fe7cc;return _0x334dd8[_0x135ca4(0x222,'\x59\x6e\x36\x33')](_0x4c327d,_0x22088b);},'\x72\x46\x42\x72\x46':function(_0x1d43d6,_0x3970fb){const _0xbadb6b=_0x2fe7cc;return _0x334dd8[_0xbadb6b(0x249,'\x2a\x58\x5e\x69')](_0x1d43d6,_0x3970fb);},'\x4f\x59\x59\x7a\x67':function(_0x479721,_0x21f56a){const _0x5283a3=_0x2fe7cc;return _0x334dd8[_0x5283a3(0x1ed,'\x59\x30\x77\x40')](_0x479721,_0x21f56a);}},_0x1921c3=_0x56e566?function(){const _0x22de50=_0x2fe7cc;if(_0x334dd8[_0x22de50(0x252,'\x51\x51\x40\x77')]('\x6d\x62\x52\x63\x43',_0x334dd8[_0x22de50(0x1df,'\x59\x30\x77\x40')])){if(_0x4b4bbb){if(_0x334dd8[_0x22de50(0x1fb,'\x40\x61\x50\x67')]!==_0x334dd8[_0x22de50(0x25a,'\x57\x44\x39\x4b')]){const _0xe9691f=_0x4b4bbb[_0x22de50(0x21b,'\x29\x4c\x33\x44')](_0x223d26,arguments);return _0x4b4bbb=null,_0xe9691f;}else _0x5cbb31['\x72\x4d\x46\x4f\x57'](_0x5625b7,_0xac1978,_0x5cbb31[_0x22de50(0x279,'\x6a\x7a\x6c\x38')]),_0x10b7ea(_0x4e710e,_0x5cbb31[_0x22de50(0x22c,'\x54\x54\x70\x49')]),_0x530024(_0x39afaf,_0x22de50(0x22f,'\x49\x72\x35\x4e')+_0x22de50(0x243,'\x77\x35\x65\x55'));}}else{const _0x3416a9=_0x4020c2(_0x44eca1,''),_0x3bac17=_0x5cbb31['\x42\x4e\x65\x51\x75'](_0x4cdf69,_0x1478ed);if(_0x5cbb31[_0x22de50(0x26a,'\x5a\x55\x6b\x49')](_0x3416a9[_0x22de50(0x217,'\x5d\x43\x57\x71')],-0x14b8+0x9c0+-0x6*-0x1d4)||_0x5cbb31[_0x22de50(0x27b,'\x73\x6c\x66\x56')](_0x3bac17[_0x22de50(0x1f9,'\x76\x4b\x59\x79')],0x121a+-0x1f*0x11+-0x100b))return-0x15f8+-0x1*-0x8dd+0xb*0x131;const _0x264805=new _0x5189d6(_0x3416a9);let _0x14bac0=0x207a+-0x1ff1+0x1*-0x89;for(let _0x227ef6=0x2b*-0x5f+-0xf65*-0x2+-0xed5;_0x5cbb31[_0x22de50(0x22d,'\x7a\x4a\x28\x77')](_0x227ef6,_0x3bac17[_0x22de50(0x246,'\x6b\x59\x5a\x28')]);_0x227ef6++){if(_0x264805[_0x22de50(0x1dc,'\x76\x4b\x59\x79')](_0x3bac17[_0x227ef6]))_0x14bac0++;}return _0x14bac0;}}:function(){};return _0x56e566=![],_0x1921c3;};}()),_0x539bc9=_0x1007b0(this,function(){const _0x3a76e1=_0x2f7d,_0x5a71da={};_0x5a71da[_0x3a76e1(0x257,'\x79\x47\x72\x25')]='\x28\x28\x28\x2e\x2b\x29\x2b\x29'+_0x3a76e1(0x253,'\x59\x30\x77\x40');const _0x278d74=_0x5a71da;return _0x539bc9[_0x3a76e1(0x20c,'\x64\x70\x6a\x41')]()['\x73\x65\x61\x72\x63\x68'](_0x278d74['\x42\x6c\x67\x59\x6e'])[_0x3a76e1(0x264,'\x5a\x5a\x63\x50')]()[_0x3a76e1(0x231,'\x53\x5b\x29\x28')+_0x3a76e1(0x1fa,'\x64\x70\x6a\x41')](_0x539bc9)[_0x3a76e1(0x241,'\x76\x5d\x23\x68')](_0x278d74[_0x3a76e1(0x1fc,'\x46\x35\x5a\x31')]);});_0x539bc9();function _0x34e8d1(_0x43a958){const _0x228b3c=_0x2f7d,_0x595e11={'\x69\x59\x45\x41\x4d':function(_0x2ae4e9,_0x3f6a7b,_0x7aee9a){return _0x2ae4e9(_0x3f6a7b,_0x7aee9a);},'\x61\x74\x59\x53\x6e':_0x228b3c(0x25f,'\x5a\x5a\x63\x50')+_0x228b3c(0x212,'\x36\x6f\x7a\x6b'),'\x66\x6f\x61\x70\x47':_0x228b3c(0x220,'\x66\x57\x4c\x4d'),'\x62\x46\x41\x61\x45':function(_0x507dcf,_0x576a66){return _0x507dcf(_0x576a66);}};return Array[_0x228b3c(0x22b,'\x59\x6e\x36\x33')](new Set((Array[_0x228b3c(0x1f1,'\x26\x72\x53\x54')](_0x43a958)?_0x43a958:[])[_0x228b3c(0x20e,'\x54\x54\x70\x49')](Boolean)[_0x228b3c(0x24b,'\x64\x37\x43\x52')](function(_0x4a4a15){const _0x77b0be=_0x228b3c;if(_0x595e11['\x66\x6f\x61\x70\x47']===_0x77b0be(0x1ff,'\x46\x35\x5a\x31'))return _0x595e11[_0x77b0be(0x1e6,'\x63\x46\x4e\x46')](String,_0x4a4a15)[_0x77b0be(0x24c,'\x51\x51\x40\x77')]();else _0x595e11[_0x77b0be(0x20f,'\x63\x31\x4d\x4f')](_0x593ab5,_0x26f3ff,_0x77b0be(0x1e8,'\x2a\x58\x5e\x69')+'\x72\x65\x6c\x69\x61\x62\x69\x6c'+'\x69\x74\x79'),_0x595e11[_0x77b0be(0x1e2,'\x4d\x35\x67\x26')](_0x303456,_0x221982,_0x595e11[_0x77b0be(0x236,'\x5d\x43\x57\x71')]);})['\x66\x69\x6c\x74\x65\x72'](Boolean)));}function _0x2f7d(_0x59b169,_0x1c2571){_0x59b169=_0x59b169-(0xd*0x75+-0x1*0xd43+0x927);const _0x309907=_0x2cc0();let _0x52fcc6=_0x309907[_0x59b169];if(_0x2f7d['\x44\x54\x4b\x5a\x41\x62']===undefined){var _0x5f49a5=function(_0x3a6c52){const _0x4d2260='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x4be74a='',_0x52e339='',_0x165bff=_0x4be74a+_0x5f49a5,_0x12e036=(''+function(){return-0x571*-0x2+-0x16d8+0xbf6;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x25c2+0x1*-0x2153+0x4716);for(let _0x328e05=0xeb7+-0x2042+0x118b,_0x486833,_0x8d04aa,_0x4dd567=-0x1d*-0x107+-0x13e1*0x1+-0x9ea;_0x8d04aa=_0x3a6c52['\x63\x68\x61\x72\x41\x74'](_0x4dd567++);~_0x8d04aa&&(_0x486833=_0x328e05%(0x1607+-0x277+-0x138c)?_0x486833*(0x1c4b*0x1+-0x1d02+0x1*0xf7)+_0x8d04aa:_0x8d04aa,_0x328e05++%(0x1d6+-0x2*-0x116+-0x3fe))?_0x4be74a+=_0x12e036||_0x165bff['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x4dd567+(-0x2531*-0x1+-0x2*-0x11a0+-0x4867))-(-0xa37+-0x1edb+0x291c)!==-0x725*-0x3+-0x1*0x1507+-0x2*0x34?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0x1*-0x2209+-0x4*0x1ca+0x2*-0xcf1&_0x486833>>(-(-0xff4*0x2+-0x409+0x23f3*0x1)*_0x328e05&0xe9*0x9+-0xa1*-0x1a+-0x1885)):_0x328e05:0x11e7*-0x2+-0x6*-0x56f+0x334){_0x8d04aa=_0x4d2260['\x69\x6e\x64\x65\x78\x4f\x66'](_0x8d04aa);}for(let _0x262488=-0x613+-0xd*0x299+0x27d8,_0x30a30f=_0x4be74a['\x6c\x65\x6e\x67\x74\x68'];_0x262488<_0x30a30f;_0x262488++){_0x52e339+='\x25'+('\x30\x30'+_0x4be74a['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x262488)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x80d+0x1e04+-0x321*0x7))['\x73\x6c\x69\x63\x65'](-(0x2*-0x981+-0x1357+-0xcc9*-0x3));}return decodeURIComponent(_0x52e339);};const _0x2697da=function(_0x434210,_0x118315){let _0x20b4d3=[],_0x3a715c=-0xb*0x32e+-0x1*0x4da+0x9f5*0x4,_0x3330c2,_0x20e0ed='';_0x434210=_0x5f49a5(_0x434210);let _0x395887;for(_0x395887=0x1e47+0xc7a*-0x3+0x727;_0x395887<-0x1*-0x19e1+0x1e19+-0x2*0x1b7d;_0x395887++){_0x20b4d3[_0x395887]=_0x395887;}for(_0x395887=0xc12*0x3+0x11a7+-0x35dd*0x1;_0x395887<-0x192d+0x877+0x11b6;_0x395887++){_0x3a715c=(_0x3a715c+_0x20b4d3[_0x395887]+_0x118315['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x395887%_0x118315['\x6c\x65\x6e\x67\x74\x68']))%(0x16cc+0x3ce*-0x2+-0x10*0xe3),_0x3330c2=_0x20b4d3[_0x395887],_0x20b4d3[_0x395887]=_0x20b4d3[_0x3a715c],_0x20b4d3[_0x3a715c]=_0x3330c2;}_0x395887=-0x1af*-0x8+0x11*0x106+-0x1ede,_0x3a715c=-0x1e4e+-0x484+0x22d2*0x1;for(let _0x507865=0x1662+-0x100b+-0x657*0x1;_0x507865<_0x434210['\x6c\x65\x6e\x67\x74\x68'];_0x507865++){_0x395887=(_0x395887+(-0x633+-0x160+-0x14*-0x61))%(-0x6e7+0x153d+-0xd56*0x1),_0x3a715c=(_0x3a715c+_0x20b4d3[_0x395887])%(-0x2*-0x71e+-0x2247+0x150b),_0x3330c2=_0x20b4d3[_0x395887],_0x20b4d3[_0x395887]=_0x20b4d3[_0x3a715c],_0x20b4d3[_0x3a715c]=_0x3330c2,_0x20e0ed+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x434210['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x507865)^_0x20b4d3[(_0x20b4d3[_0x395887]+_0x20b4d3[_0x3a715c])%(-0x2515+-0x2*-0xd23+0xbcf)]);}return _0x20e0ed;};_0x2f7d['\x4d\x57\x4d\x53\x55\x44']=_0x2697da,_0x2f7d['\x72\x59\x69\x68\x61\x5a']={},_0x2f7d['\x44\x54\x4b\x5a\x41\x62']=!![];}const _0x2f6619=_0x309907[-0x1*0x1105+-0xc1*-0x18+-0x113],_0x22408f=_0x59b169+_0x2f6619,_0x48a6c2=_0x2f7d['\x72\x59\x69\x68\x61\x5a'][_0x22408f];if(!_0x48a6c2){if(_0x2f7d['\x77\x55\x50\x66\x4d\x61']===undefined){const _0xfbfebb=function(_0x7ace47){this['\x6e\x54\x4e\x79\x63\x76']=_0x7ace47,this['\x47\x6f\x55\x76\x53\x4b']=[0x1*-0x2181+0x2de*-0x2+0x273e,0x1e08+0x1*-0x1a7b+-0x65*0x9,0x10a3*-0x1+-0x8c6*-0x1+0x7dd],this['\x6b\x50\x6c\x58\x6a\x45']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x63\x6c\x79\x63\x65\x6e']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x50\x61\x6b\x74\x4b\x6e']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0xfbfebb['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x51\x55\x47\x6a\x4d\x66']=function(){const _0x3df98f=new RegExp(this['\x63\x6c\x79\x63\x65\x6e']+this['\x50\x61\x6b\x74\x4b\x6e']),_0x14947e=_0x3df98f['\x74\x65\x73\x74'](this['\x6b\x50\x6c\x58\x6a\x45']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x47\x6f\x55\x76\x53\x4b'][0x3*-0x40f+0x3*0xc4f+-0x18bf]:--this['\x47\x6f\x55\x76\x53\x4b'][0x18c2+0xb*-0x17+-0x17c5];return this['\x6b\x58\x47\x4d\x54\x64'](_0x14947e);},_0xfbfebb['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6b\x58\x47\x4d\x54\x64']=function(_0x522e5e){if(!Boolean(~_0x522e5e))return _0x522e5e;return this['\x4d\x4f\x54\x78\x4b\x75'](this['\x6e\x54\x4e\x79\x63\x76']);},_0xfbfebb['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x4d\x4f\x54\x78\x4b\x75']=function(_0x52132a){for(let _0x559980=-0x5*0x1c7+-0x1*0x1aa+0x1*0xa8d,_0x262528=this['\x47\x6f\x55\x76\x53\x4b']['\x6c\x65\x6e\x67\x74\x68'];_0x559980<_0x262528;_0x559980++){this['\x47\x6f\x55\x76\x53\x4b']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x262528=this['\x47\x6f\x55\x76\x53\x4b']['\x6c\x65\x6e\x67\x74\x68'];}return _0x52132a(this['\x47\x6f\x55\x76\x53\x4b'][-0x22*0xbe+0x8*-0x111+0x21c4*0x1]);},(''+function(){return-0x2*0x24+-0x2013+0x205b;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x1e25+0x199a+-0x37be*0x1)&&new _0xfbfebb(_0x2f7d)['\x51\x55\x47\x6a\x4d\x66'](),_0x2f7d['\x77\x55\x50\x66\x4d\x61']=!![];}_0x52fcc6=_0x2f7d['\x4d\x57\x4d\x53\x55\x44'](_0x52fcc6,_0x1c2571),_0x2f7d['\x72\x59\x69\x68\x61\x5a'][_0x22408f]=_0x52fcc6;}else _0x52fcc6=_0x48a6c2;return _0x52fcc6;}function _0x52bcb4(_0x35232b,_0x1c6371){const _0x864cc7=_0x2f7d;if(!_0x1c6371)return;_0x35232b[_0x864cc7(0x268,'\x28\x49\x31\x30')](String(_0x1c6371)[_0x864cc7(0x1e3,'\x47\x4a\x24\x36')]());}function _0x4a8983(_0x26df21,_0x5801d6){const _0x2a140c=_0x2f7d,_0x2b5141={'\x63\x50\x78\x6d\x64':function(_0x43835e,_0x23d931){return _0x43835e(_0x23d931);},'\x4a\x6f\x44\x69\x69':function(_0x273588,_0x1fe521,_0x452cf2){return _0x273588(_0x1fe521,_0x452cf2);},'\x44\x63\x56\x77\x47':function(_0x46da64,_0x551ed9){return _0x46da64!==_0x551ed9;},'\x70\x6b\x51\x4b\x42':function(_0x3a617b,_0x15e71c,_0x181c0c){return _0x3a617b(_0x15e71c,_0x181c0c);},'\x4d\x71\x4c\x72\x51':function(_0x49f44c,_0x53134a){return _0x49f44c+_0x53134a;},'\x70\x45\x6d\x42\x61':function(_0x4a3bd1,_0x29d152){return _0x4a3bd1||_0x29d152;},'\x67\x61\x64\x71\x57':function(_0xbcfba3,_0x5c6658){return _0xbcfba3===_0x5c6658;},'\x67\x74\x48\x72\x64':_0x2a140c(0x25b,'\x6a\x7a\x6c\x38'),'\x50\x54\x6e\x6b\x72':_0x2a140c(0x27a,'\x63\x46\x4e\x46')+_0x2a140c(0x1ef,'\x40\x61\x50\x67')+_0x2a140c(0x20b,'\x54\x54\x70\x49'),'\x57\x66\x6e\x42\x56':function(_0x229026,_0x4350f1,_0x1080a9){return _0x229026(_0x4350f1,_0x1080a9);},'\x78\x45\x66\x53\x4d':function(_0x5a4619,_0x4d084f,_0x45e434){return _0x5a4619(_0x4d084f,_0x45e434);},'\x4c\x43\x57\x73\x50':_0x2a140c(0x1d9,'\x5d\x43\x57\x71')+_0x2a140c(0x273,'\x5d\x43\x57\x71'),'\x52\x46\x65\x48\x71':function(_0x2adfcd,_0x229679,_0xa1f742){return _0x2adfcd(_0x229679,_0xa1f742);},'\x59\x57\x52\x59\x61':_0x2a140c(0x25d,'\x7a\x4a\x28\x77')+_0x2a140c(0x1db,'\x4d\x50\x72\x64'),'\x65\x70\x57\x66\x7a':_0x2a140c(0x219,'\x77\x35\x65\x55')+_0x2a140c(0x248,'\x6a\x7a\x6c\x38')+_0x2a140c(0x227,'\x42\x37\x43\x6c'),'\x50\x47\x7a\x6b\x51':'\x61\x63\x74\x69\x6f\x6e\x3a\x69'+_0x2a140c(0x1e5,'\x66\x57\x4c\x4d'),'\x64\x65\x64\x44\x41':function(_0x13c715,_0x5cdcdd,_0x4e0706){return _0x13c715(_0x5cdcdd,_0x4e0706);},'\x57\x62\x51\x62\x4a':'\x70\x72\x6f\x62\x6c\x65\x6d\x3a'+_0x2a140c(0x215,'\x54\x54\x70\x49')+'\x6f\x6e','\x68\x73\x4d\x75\x43':function(_0x17fc5c,_0x2b40ef,_0xc7ba03){return _0x17fc5c(_0x2b40ef,_0xc7ba03);},'\x51\x48\x6c\x5a\x58':_0x2a140c(0x230,'\x59\x6e\x36\x33')+_0x2a140c(0x1f6,'\x49\x72\x35\x4e')+'\x6f\x6e','\x42\x6a\x64\x6e\x49':function(_0x174ec2,_0x555ef1,_0x3cd64d){return _0x174ec2(_0x555ef1,_0x3cd64d);},'\x7a\x70\x47\x41\x48':_0x2a140c(0x254,'\x53\x5b\x29\x28')+'\x6f\x72\x79','\x43\x48\x79\x61\x6e':_0x2a140c(0x1f4,'\x76\x5d\x23\x68')+_0x2a140c(0x228,'\x4d\x35\x67\x26'),'\x7a\x52\x50\x54\x53':function(_0x30608e,_0x5d4b1a){return _0x30608e(_0x5d4b1a);}},_0x142de0=Array[_0x2a140c(0x23f,'\x77\x76\x40\x67')](_0x26df21)?_0x26df21[_0x2a140c(0x23b,'\x5a\x5a\x63\x50')](function(_0xef71eb){const _0x45883f=_0x2a140c;return _0x2b5141[_0x45883f(0x1d8,'\x64\x70\x6a\x41')](String,_0xef71eb);}):[],_0xcc9704=[];for(let _0x406dc7=0xe8d+-0x2*-0x892+-0x1ab*0x13;_0x406dc7<_0x142de0[_0x2a140c(0x237,'\x72\x4b\x31\x59')];_0x406dc7++){const _0x18d9eb=_0x142de0[_0x406dc7];_0x2b5141[_0x2a140c(0x1e9,'\x6f\x7a\x45\x51')](_0x52bcb4,_0xcc9704,_0x18d9eb);const _0x51045e=_0x18d9eb[_0x2a140c(0x259,'\x4a\x6c\x24\x78')]('\x3a')[-0xa14+0x2645+0x407*-0x7];if(_0x51045e&&_0x2b5141[_0x2a140c(0x205,'\x76\x4b\x59\x79')](_0x51045e,_0x18d9eb))_0x2b5141[_0x2a140c(0x1ea,'\x53\x5b\x29\x28')](_0x52bcb4,_0xcc9704,_0x51045e);}const _0x475cb1=_0x2b5141[_0x2a140c(0x1d5,'\x2a\x49\x65\x6a')](_0x142de0[_0x2a140c(0x1e7,'\x77\x35\x65\x55')]('\x20')+'\x20',String(_0x2b5141[_0x2a140c(0x229,'\x63\x31\x4d\x4f')](_0x5801d6,'')))[_0x2a140c(0x216,'\x4a\x68\x6b\x4d')+_0x2a140c(0x200,'\x73\x6c\x66\x56')]();if(/(error|exception|failed|unstable|log_error|runtime|429)/[_0x2a140c(0x24e,'\x54\x66\x40\x47')](_0x475cb1)){if(_0x2b5141[_0x2a140c(0x23e,'\x77\x42\x36\x72')](_0x2b5141[_0x2a140c(0x21c,'\x29\x68\x26\x4f')],_0x2b5141['\x67\x74\x48\x72\x64']))_0x2b5141['\x4a\x6f\x44\x69\x69'](_0x52bcb4,_0xcc9704,_0x2b5141['\x50\x54\x6e\x6b\x72']),_0x2b5141[_0x2a140c(0x271,'\x2a\x49\x65\x6a')](_0x52bcb4,_0xcc9704,_0x2a140c(0x22a,'\x59\x30\x77\x40')+_0x2a140c(0x203,'\x4a\x6c\x24\x78'));else return _0x5d1561(_0x5ab5a3);}return/(protocol|prompt|audit|gep|schema|drift)/[_0x2a140c(0x260,'\x5d\x43\x57\x71')](_0x475cb1)&&(_0x2b5141[_0x2a140c(0x269,'\x4d\x35\x67\x26')](_0x52bcb4,_0xcc9704,_0x2b5141['\x4c\x43\x57\x73\x50']),_0x2b5141[_0x2a140c(0x244,'\x76\x5d\x23\x68')](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x1e0,'\x5d\x43\x57\x71')]),_0x2b5141[_0x2a140c(0x23a,'\x6a\x7a\x6c\x38')](_0x52bcb4,_0xcc9704,_0x2a140c(0x1e4,'\x4d\x35\x67\x26')+_0x2a140c(0x251,'\x29\x68\x26\x4f'))),/(perf|performance|bottleneck|latency|slow|throughput)/[_0x2a140c(0x20a,'\x66\x57\x4c\x4d')](_0x475cb1)&&(_0x52bcb4(_0xcc9704,_0x2b5141[_0x2a140c(0x213,'\x77\x42\x36\x72')]),_0x52bcb4(_0xcc9704,'\x61\x63\x74\x69\x6f\x6e\x3a\x6f'+_0x2a140c(0x1db,'\x4d\x50\x72\x64'))),/(feature|capability_gap|user_feature_request|external_opportunity|stagnation recommendation)/[_0x2a140c(0x21f,'\x77\x76\x40\x67')](_0x475cb1)&&(_0x52bcb4(_0xcc9704,_0x2a140c(0x24f,'\x73\x6c\x66\x56')+_0x2a140c(0x25e,'\x76\x4b\x59\x79')+'\x74\x79'),_0x2b5141['\x4a\x6f\x44\x69\x69'](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x201,'\x29\x4c\x33\x44')])),/(stagnation|plateau|steady_state|saturation|empty_cycle_loop|loop_detected|recurring)/[_0x2a140c(0x24e,'\x54\x66\x40\x47')](_0x475cb1)&&(_0x2b5141['\x64\x65\x64\x44\x41'](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x272,'\x33\x68\x55\x57')]),_0x2b5141[_0x2a140c(0x1fe,'\x54\x54\x70\x49')](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x26f,'\x36\x6f\x7a\x6b')])),/(task|worker|heartbeat|hub|commitment|assignment|orchestration)/[_0x2a140c(0x225,'\x26\x72\x53\x54')](_0x475cb1)&&_0x2b5141[_0x2a140c(0x226,'\x6a\x7a\x6c\x38')](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x242,'\x76\x4b\x59\x79')]),/(memory|narrative|reflection)/[_0x2a140c(0x275,'\x72\x4b\x31\x59')](_0x475cb1)&&_0x2b5141[_0x2a140c(0x21d,'\x77\x76\x40\x67')](_0x52bcb4,_0xcc9704,_0x2b5141[_0x2a140c(0x22e,'\x72\x4b\x31\x59')]),/(skill|dashboard)/[_0x2a140c(0x238,'\x4d\x50\x72\x64')](_0x475cb1)&&_0x52bcb4(_0xcc9704,_0x2b5141[_0x2a140c(0x210,'\x77\x76\x40\x67')]),/(validation|canary|rollback|constraint|blast radius|destructive)/[_0x2a140c(0x221,'\x73\x6b\x37\x6d')](_0x475cb1)&&_0x52bcb4(_0xcc9704,_0x2a140c(0x25c,'\x54\x66\x40\x47')+_0x2a140c(0x202,'\x59\x6e\x36\x33')),_0x2b5141[_0x2a140c(0x26c,'\x40\x61\x50\x67')](_0x34e8d1,_0xcc9704);}function _0x2ab2e9(_0x74ac01){const _0x1a5ded=_0x2f7d,_0x13a4e3={'\x53\x6c\x62\x48\x78':function(_0x45db37,_0x219319){return _0x45db37!==_0x219319;},'\x6d\x6d\x71\x67\x70':_0x1a5ded(0x267,'\x40\x61\x50\x67'),'\x4d\x6a\x76\x77\x61':function(_0x3789d5,_0x205900){return _0x3789d5(_0x205900);},'\x59\x45\x50\x5a\x45':function(_0x3295b8,_0x4cba5b){return _0x3295b8===_0x4cba5b;},'\x4a\x59\x47\x68\x43':'\x73\x74\x72\x69\x6e\x67','\x72\x59\x44\x6f\x52':function(_0x231c6a,_0x2793a3,_0x1197d3){return _0x231c6a(_0x2793a3,_0x1197d3);}};if(!_0x74ac01||_0x13a4e3[_0x1a5ded(0x278,'\x76\x5d\x23\x68')](typeof _0x74ac01,_0x13a4e3[_0x1a5ded(0x1d7,'\x72\x4b\x31\x59')]))return[];let _0x41d648=[];if(_0x74ac01[_0x1a5ded(0x270,'\x4a\x68\x6b\x4d')])_0x41d648[_0x1a5ded(0x214,'\x42\x37\x43\x6c')]('\x61\x63\x74\x69\x6f\x6e\x3a'+_0x13a4e3[_0x1a5ded(0x250,'\x2a\x58\x5e\x69')](String,_0x74ac01[_0x1a5ded(0x1ee,'\x7a\x4a\x28\x77')])[_0x1a5ded(0x1fd,'\x4d\x50\x72\x64')+_0x1a5ded(0x224,'\x77\x35\x65\x55')]());if(Array[_0x1a5ded(0x206,'\x57\x44\x39\x4b')](_0x74ac01[_0x1a5ded(0x218,'\x4d\x35\x67\x26')+_0x1a5ded(0x1f7,'\x59\x30\x77\x40')]))_0x41d648=_0x41d648[_0x1a5ded(0x208,'\x63\x31\x4d\x4f')](_0x74ac01[_0x1a5ded(0x1f2,'\x76\x5d\x23\x68')+'\x6d\x61\x74\x63\x68']);if(_0x13a4e3[_0x1a5ded(0x262,'\x63\x31\x4d\x4f')](typeof _0x74ac01['\x69\x64'],_0x1a5ded(0x255,'\x28\x4d\x48\x28')))_0x41d648[_0x1a5ded(0x211,'\x45\x28\x58\x6a')](_0x74ac01['\x69\x64']);if(_0x13a4e3[_0x1a5ded(0x261,'\x54\x54\x70\x49')](typeof _0x74ac01[_0x1a5ded(0x266,'\x29\x68\x26\x4f')],_0x13a4e3[_0x1a5ded(0x1f5,'\x59\x6e\x36\x33')]))_0x41d648['\x70\x75\x73\x68'](_0x74ac01[_0x1a5ded(0x26b,'\x79\x47\x72\x25')]);return _0x13a4e3[_0x1a5ded(0x26e,'\x79\x47\x72\x25')](_0x4a8983,_0x41d648,'');}function _0x2cc0(){const _0x7f4b6c=['\x57\x50\x43\x4c\x57\x50\x76\x57\x57\x36\x47','\x44\x76\x52\x64\x47\x4a\x62\x4e\x78\x53\x6f\x30\x57\x37\x6d','\x75\x43\x6b\x6e\x57\x37\x78\x63\x4f\x53\x6f\x43\x6f\x72\x42\x64\x4e\x71','\x57\x34\x4a\x63\x55\x30\x34\x42\x6f\x72\x4a\x63\x54\x47\x6d','\x71\x53\x6b\x31\x57\x51\x6c\x64\x52\x6d\x6f\x6d\x70\x4b\x35\x45\x6b\x32\x6d\x4d\x57\x52\x64\x63\x4b\x61','\x57\x51\x6c\x64\x4b\x30\x34\x64\x57\x36\x6c\x64\x56\x47\x53\x58\x57\x4f\x79','\x57\x36\x74\x64\x50\x38\x6b\x72\x71\x4e\x34','\x69\x33\x46\x64\x4c\x64\x56\x64\x4c\x57','\x57\x37\x70\x63\x56\x53\x6b\x31\x67\x43\x6b\x59','\x57\x4f\x65\x57\x57\x52\x58\x77\x57\x35\x72\x45','\x69\x5a\x56\x63\x4c\x43\x6f\x32','\x57\x37\x6c\x63\x4d\x57\x4f\x6e\x57\x35\x42\x64\x49\x48\x4f\x45','\x57\x50\x5a\x63\x4f\x4a\x7a\x56\x74\x71','\x57\x34\x76\x57\x57\x34\x43','\x57\x36\x6e\x79\x57\x36\x4f\x46\x57\x36\x65\x41\x57\x52\x70\x64\x49\x47','\x57\x37\x68\x63\x55\x43\x6f\x78\x57\x35\x48\x4f\x57\x34\x74\x63\x4c\x43\x6f\x32\x57\x36\x30','\x57\x50\x46\x64\x55\x6d\x6f\x38\x6a\x43\x6f\x53','\x6a\x4b\x42\x63\x56\x38\x6f\x4d\x57\x35\x50\x78\x46\x47','\x57\x35\x64\x64\x4a\x43\x6b\x2b\x44\x4c\x30','\x42\x43\x6b\x46\x57\x52\x61\x6a\x57\x52\x57\x6a','\x57\x34\x66\x72\x57\x36\x47\x30\x7a\x71','\x57\x52\x52\x63\x4b\x38\x6b\x62','\x74\x6d\x6b\x38\x57\x52\x71\x5a\x57\x51\x34','\x57\x34\x76\x79\x78\x4a\x52\x63\x54\x38\x6b\x62\x42\x47\x61','\x57\x51\x4a\x64\x51\x6d\x6b\x61\x57\x34\x50\x2f\x57\x34\x4f','\x6b\x73\x6d\x2f\x57\x51\x2f\x63\x53\x57','\x57\x50\x74\x63\x47\x49\x6a\x41\x42\x30\x2f\x64\x4b\x43\x6f\x32','\x57\x36\x34\x58\x45\x67\x4e\x64\x56\x57','\x57\x52\x5a\x63\x4b\x76\x47','\x57\x50\x4f\x62\x71\x57','\x63\x4a\x64\x64\x52\x38\x6f\x4f','\x76\x43\x6b\x35\x73\x6d\x6f\x4b\x57\x51\x61\x4d\x6c\x38\x6b\x76\x57\x51\x5a\x63\x51\x65\x33\x63\x54\x71','\x57\x50\x4e\x63\x4f\x4c\x47\x79','\x57\x51\x68\x64\x50\x43\x6b\x63\x71\x53\x6f\x6d\x43\x43\x6f\x6d\x57\x50\x57','\x57\x35\x43\x7a\x73\x4e\x4e\x64\x51\x61','\x73\x66\x44\x6a','\x64\x57\x68\x64\x52\x53\x6f\x5a\x57\x36\x53','\x57\x36\x56\x64\x50\x4a\x52\x64\x56\x61','\x57\x34\x52\x63\x50\x4b\x75\x6a\x44\x57\x46\x63\x50\x47\x30','\x66\x76\x78\x64\x4e\x47\x64\x64\x55\x53\x6b\x7a','\x77\x5a\x50\x69\x57\x34\x4a\x64\x55\x63\x76\x36','\x63\x6d\x6b\x6e\x63\x53\x6f\x50\x57\x35\x4f','\x45\x57\x74\x64\x4a\x6d\x6b\x4a\x57\x50\x65\x64\x73\x32\x5a\x63\x4a\x38\x6f\x75\x57\x37\x47\x31','\x6c\x59\x37\x64\x4c\x73\x46\x63\x4b\x57','\x57\x34\x43\x74\x57\x37\x64\x64\x4b\x65\x6d','\x57\x52\x74\x63\x51\x64\x76\x6e\x43\x47','\x57\x50\x2f\x63\x52\x4c\x47\x68\x7a\x58\x4f\x51\x57\x51\x75','\x77\x38\x6f\x76\x6a\x67\x52\x64\x4d\x4e\x5a\x63\x4f\x38\x6b\x36','\x57\x37\x6e\x34\x57\x37\x71\x70\x78\x33\x64\x63\x4f\x43\x6f\x55','\x57\x34\x4c\x59\x57\x34\x70\x64\x51\x53\x6b\x73\x78\x62\x39\x30','\x57\x36\x42\x63\x52\x38\x6b\x46\x70\x47','\x57\x34\x37\x63\x50\x49\x4f\x32\x57\x37\x30','\x57\x51\x62\x52\x57\x50\x65\x77\x57\x4f\x75','\x57\x50\x4e\x64\x52\x62\x6a\x72\x45\x76\x4a\x64\x53\x76\x6c\x63\x49\x38\x6f\x5a\x57\x4f\x62\x74\x71\x65\x34','\x57\x35\x58\x2b\x57\x36\x74\x64\x54\x38\x6b\x70\x77\x30\x54\x48','\x57\x50\x2f\x64\x4e\x6d\x6f\x50\x61\x6d\x6f\x78','\x76\x4c\x6a\x71\x57\x37\x71\x41\x57\x52\x52\x63\x56\x61','\x57\x50\x62\x6c\x57\x34\x57\x45\x57\x51\x66\x5a','\x42\x43\x6f\x47\x57\x52\x7a\x31','\x57\x52\x42\x63\x4d\x43\x6b\x39\x57\x50\x4f\x47','\x57\x35\x68\x63\x48\x43\x6b\x6f\x57\x35\x33\x64\x4e\x71','\x6f\x43\x6b\x75\x61\x6d\x6f\x44\x57\x35\x78\x63\x48\x65\x4f','\x57\x4f\x76\x37\x57\x37\x79\x56\x57\x50\x65','\x57\x37\x64\x64\x51\x53\x6b\x46\x78\x67\x4a\x64\x49\x4d\x39\x68','\x6f\x6d\x6b\x34\x6b\x43\x6f\x46\x57\x36\x79','\x57\x34\x75\x70\x57\x35\x43\x4e\x57\x50\x57','\x57\x51\x42\x63\x4c\x75\x56\x63\x4c\x48\x6c\x64\x47\x78\x74\x64\x52\x71','\x57\x4f\x65\x70\x57\x34\x6d\x32\x57\x37\x69','\x64\x76\x46\x63\x47\x53\x6f\x30\x63\x47','\x57\x36\x6c\x63\x55\x6d\x6b\x64\x70\x53\x6b\x5a\x57\x35\x72\x4f\x6c\x47','\x57\x52\x64\x63\x48\x53\x6b\x42\x6b\x68\x46\x64\x48\x32\x33\x63\x4b\x57','\x57\x50\x4b\x57\x57\x51\x66\x66','\x57\x50\x5a\x64\x56\x6d\x6f\x32\x6d\x38\x6f\x70\x57\x50\x57','\x46\x38\x6b\x7a\x57\x51\x75\x73\x57\x52\x61\x70\x7a\x6d\x6b\x64','\x74\x43\x6b\x77\x57\x52\x6d\x5a\x57\x51\x43','\x57\x51\x68\x63\x4b\x73\x44\x71\x76\x71','\x6c\x57\x75\x38\x57\x37\x65\x69\x57\x37\x33\x64\x50\x38\x6f\x79','\x57\x51\x70\x64\x4b\x43\x6b\x56\x75\x53\x6f\x4d','\x57\x50\x53\x79\x57\x36\x65\x67\x57\x37\x75','\x57\x50\x74\x63\x4c\x74\x39\x69\x42\x31\x37\x64\x4b\x38\x6f\x37','\x57\x4f\x61\x34\x57\x51\x6e\x77\x57\x35\x61','\x57\x36\x64\x64\x4d\x43\x6b\x69\x71\x32\x4b','\x57\x36\x6c\x63\x55\x6d\x6b\x64\x6b\x6d\x6b\x57\x57\x35\x6a\x51\x45\x61','\x57\x36\x42\x63\x50\x43\x6f\x7a\x67\x43\x6b\x71\x6a\x6d\x6f\x73\x57\x36\x75\x4f\x57\x50\x33\x64\x4c\x68\x53','\x6a\x59\x52\x63\x4a\x38\x6f\x56\x57\x52\x69\x4f\x57\x36\x71','\x57\x37\x48\x34\x57\x37\x43','\x57\x51\x6c\x64\x4b\x4a\x30\x68\x57\x37\x33\x64\x4f\x57\x6d\x4c','\x57\x52\x6c\x63\x55\x43\x6f\x69\x66\x4a\x52\x63\x51\x4e\x31\x7a\x46\x47\x71\x35\x57\x35\x61','\x57\x50\x46\x63\x48\x31\x37\x63\x51\x6d\x6f\x6c','\x57\x34\x56\x63\x4e\x43\x6b\x2b\x65\x38\x6b\x39','\x57\x34\x34\x43\x57\x37\x76\x31\x57\x37\x62\x34\x7a\x48\x62\x58\x57\x51\x37\x63\x56\x75\x57','\x57\x51\x46\x63\x48\x43\x6b\x45\x57\x4f\x47\x47','\x66\x62\x71\x58\x57\x35\x65','\x57\x51\x2f\x63\x52\x53\x6b\x2b\x57\x51\x48\x78\x6b\x38\x6f\x6e\x44\x47','\x57\x51\x54\x4c\x57\x51\x79\x31\x57\x36\x2f\x64\x4f\x76\x47','\x70\x74\x65\x73\x57\x37\x69\x48','\x57\x52\x33\x63\x4a\x6d\x6b\x43\x69\x57','\x57\x36\x4f\x62\x75\x32\x5a\x64\x50\x43\x6f\x64\x57\x4f\x56\x63\x4d\x57','\x57\x50\x37\x63\x4e\x32\x2f\x64\x4f\x43\x6f\x7a','\x57\x35\x56\x63\x56\x33\x65\x4a\x64\x57','\x46\x30\x42\x64\x50\x43\x6f\x55\x57\x52\x68\x64\x4c\x38\x6f\x76\x57\x4f\x43\x75\x79\x76\x79\x45','\x42\x66\x68\x64\x49\x62\x57\x79','\x57\x4f\x4a\x63\x47\x76\x64\x63\x49\x38\x6f\x7a','\x77\x43\x6f\x78\x6a\x67\x42\x64\x4b\x4e\x33\x64\x51\x38\x6b\x53','\x57\x4f\x31\x6d\x57\x34\x4f\x73\x57\x51\x6e\x4c\x44\x43\x6f\x6b','\x57\x34\x30\x72\x57\x50\x7a\x70\x57\x37\x7a\x31\x73\x38\x6f\x73\x57\x50\x6a\x73\x73\x71','\x64\x43\x6f\x36\x70\x6d\x6b\x56\x57\x36\x62\x2f\x64\x57','\x42\x43\x6b\x74\x57\x52\x79\x76\x57\x52\x34\x6e\x6c\x43\x6b\x5a','\x44\x77\x64\x64\x49\x73\x43\x73','\x46\x38\x6b\x69\x57\x52\x71\x41\x57\x36\x75\x73\x6e\x43\x6b\x66','\x45\x53\x6b\x4d\x57\x35\x46\x63\x51\x38\x6b\x4c','\x46\x65\x33\x64\x4c\x63\x75\x56\x74\x38\x6f\x59\x57\x37\x75','\x57\x51\x33\x63\x52\x4d\x78\x63\x55\x38\x6f\x4c','\x65\x75\x70\x64\x55\x57\x33\x64\x4e\x47','\x57\x37\x58\x38\x57\x36\x4f\x6a\x73\x78\x65','\x57\x37\x46\x64\x50\x53\x6b\x63','\x57\x4f\x54\x6c\x57\x36\x57\x50\x57\x4f\x30','\x57\x34\x33\x64\x4c\x38\x6b\x4a\x43\x38\x6b\x55','\x69\x5a\x68\x63\x51\x53\x6f\x54\x57\x51\x57\x33\x57\x37\x70\x64\x49\x47','\x57\x34\x64\x63\x48\x72\x71\x55\x57\x36\x34','\x57\x35\x78\x64\x51\x6d\x6b\x32\x46\x53\x6b\x50','\x57\x52\x64\x64\x50\x6d\x6b\x69','\x6b\x53\x6f\x61\x57\x36\x33\x63\x53\x43\x6b\x54','\x77\x43\x6b\x42\x57\x37\x68\x63\x54\x38\x6b\x70\x6f\x71\x4f','\x6f\x73\x37\x64\x4d\x63\x46\x63\x4c\x71','\x57\x36\x68\x64\x48\x62\x6c\x64\x56\x43\x6f\x74\x57\x36\x37\x63\x54\x71\x38\x77','\x57\x35\x72\x36\x57\x35\x69\x7a\x45\x47','\x57\x37\x34\x55\x57\x34\x46\x64\x49\x78\x56\x63\x52\x78\x71','\x57\x50\x68\x64\x55\x38\x6f\x2b\x57\x50\x42\x63\x52\x59\x70\x64\x51\x43\x6b\x31\x57\x50\x74\x63\x49\x64\x46\x63\x47\x30\x46\x64\x4a\x71','\x57\x50\x50\x62\x57\x51\x38\x56\x57\x51\x65\x38','\x57\x51\x42\x64\x4b\x30\x39\x76\x57\x4f\x52\x63\x4c\x48\x61\x37\x57\x50\x57\x38\x57\x50\x64\x64\x52\x61','\x57\x52\x66\x55\x57\x52\x4f\x33','\x57\x37\x37\x63\x4c\x57\x6d','\x57\x37\x46\x64\x50\x53\x6b\x4a\x77\x4e\x2f\x64\x54\x32\x62\x68','\x41\x61\x33\x63\x56\x53\x6f\x48\x64\x38\x6f\x36\x57\x51\x43\x7a','\x57\x37\x68\x63\x49\x48\x79\x79\x57\x35\x33\x64\x4e\x61','\x57\x50\x62\x33\x57\x4f\x71\x6e\x57\x4f\x30','\x64\x68\x33\x63\x48\x38\x6f\x31\x57\x34\x79','\x57\x4f\x48\x6e\x42\x38\x6b\x35','\x57\x37\x61\x34\x57\x34\x57\x4c\x57\x52\x38','\x57\x50\x78\x64\x51\x43\x6f\x70\x6d\x53\x6f\x62','\x57\x34\x35\x31\x57\x36\x56\x64\x4f\x47','\x57\x36\x74\x63\x4c\x58\x53\x6c\x57\x35\x42\x64\x4a\x5a\x30\x45','\x57\x52\x68\x63\x4d\x33\x70\x63\x4e\x61\x6c\x64\x49\x33\x74\x64\x4c\x57','\x57\x37\x37\x63\x52\x38\x6b\x63\x6c\x43\x6b\x4f\x57\x35\x38','\x57\x52\x33\x63\x54\x43\x6b\x38\x57\x51\x43\x6d\x6e\x38\x6f\x6d\x72\x47','\x57\x51\x46\x63\x4b\x43\x6b\x41\x6c\x30\x2f\x64\x47\x32\x46\x64\x4d\x47','\x46\x71\x33\x64\x4a\x53\x6b\x47\x57\x50\x58\x65\x75\x67\x68\x63\x55\x53\x6f\x33\x57\x35\x69','\x67\x38\x6f\x33\x57\x36\x46\x63\x54\x53\x6b\x66','\x71\x4c\x6e\x31\x57\x36\x53\x46','\x64\x76\x2f\x63\x4d\x53\x6f\x36\x57\x36\x65','\x57\x37\x5a\x63\x56\x38\x6f\x42\x57\x50\x53\x37\x57\x50\x64\x64\x48\x53\x6f\x71\x57\x37\x4a\x64\x4b\x38\x6b\x37\x57\x4f\x66\x36','\x6f\x31\x64\x63\x4a\x43\x6f\x47','\x57\x50\x39\x79\x57\x52\x53\x78\x57\x36\x43','\x62\x57\x4f\x46\x57\x50\x38','\x76\x43\x6b\x41\x57\x35\x70\x63\x4b\x6d\x6b\x2b','\x57\x51\x56\x63\x4b\x74\x76\x6f\x42\x66\x5a\x64\x4a\x61','\x57\x52\x42\x63\x4b\x6d\x6b\x71','\x65\x6d\x6f\x53\x64\x53\x6b\x50','\x57\x4f\x5a\x63\x4c\x62\x31\x6a\x71\x57','\x57\x35\x62\x4a\x57\x37\x30','\x57\x51\x6c\x63\x53\x6d\x6b\x4f','\x57\x4f\x4c\x52\x57\x51\x57\x6f\x57\x51\x65','\x57\x51\x68\x63\x52\x67\x78\x63\x53\x43\x6f\x49\x57\x4f\x7a\x2b\x57\x52\x57','\x76\x53\x6b\x6e\x57\x37\x2f\x63\x52\x47','\x57\x35\x2f\x63\x47\x73\x30\x43\x57\x37\x4b','\x44\x43\x6f\x56\x63\x78\x4e\x64\x4b\x47'];_0x2cc0=function(){return _0x7f4b6c;};return _0x2cc0();}function _0x5e78f9(_0xba867e,_0x5ae99e){const _0x4910c4=_0x2f7d,_0x1efebb={'\x6f\x45\x71\x54\x6c':function(_0x473e83,_0x2cc6da,_0x4384c8){return _0x473e83(_0x2cc6da,_0x4384c8);}},_0xb67c96=_0x1efebb[_0x4910c4(0x265,'\x77\x42\x36\x72')](_0x4a8983,_0x5ae99e,''),_0x1a12bb=_0x2ab2e9(_0xba867e);if(_0xb67c96[_0x4910c4(0x276,'\x77\x42\x36\x72')]===0x1f95+-0x1*0x18fb+-0x69a||_0x1a12bb['\x6c\x65\x6e\x67\x74\x68']===-0x1c46+0x12cd+-0x1e5*-0x5)return-0x99d+0x1219+-0x87c;const _0x2f9421=new Set(_0xb67c96);let _0x3ca5ec=-0x1*-0x1a03+-0x9c3*-0x3+-0x374c;for(let _0x413573=0x1b31+-0x253f+0xea*0xb;_0x413573<_0x1a12bb['\x6c\x65\x6e\x67\x74\x68'];_0x413573++){if(_0x2f9421[_0x4910c4(0x24a,'\x6f\x7a\x45\x51')](_0x1a12bb[_0x413573]))_0x3ca5ec++;}return _0x3ca5ec;}const _0x54a610={};_0x54a610[_0x465320(0x239,'\x54\x54\x70\x49')+_0x465320(0x234,'\x64\x70\x6a\x41')]=_0x4a8983,_0x54a610[_0x465320(0x274,'\x77\x35\x65\x55')]=_0x2ab2e9,_0x54a610[_0x465320(0x26d,'\x64\x70\x6a\x41')+_0x465320(0x223,'\x6a\x7a\x6c\x38')]=_0x5e78f9,module[_0x465320(0x256,'\x26\x57\x58\x6d')]=_0x54a610;
@@ -1,92 +0,0 @@
1
- 'use strict';
2
-
3
- const { execFileSync } = require('child_process');
4
- const fs = require('fs');
5
- const path = require('path');
6
- const os = require('os');
7
- const { getRepoRoot } = require('./paths');
8
-
9
- const REVIEW_ENABLED_KEY = 'EVOLVER_LLM_REVIEW';
10
- const REVIEW_TIMEOUT_MS = 30000;
11
-
12
- function isLlmReviewEnabled() {
13
- return String(process.env[REVIEW_ENABLED_KEY] || '').toLowerCase() === 'true';
14
- }
15
-
16
- function buildReviewPrompt({ diff, gene, signals, mutation }) {
17
- const geneId = gene && gene.id ? gene.id : '(unknown)';
18
- const category = (mutation && mutation.category) || (gene && gene.category) || 'unknown';
19
- const rationale = mutation && mutation.rationale ? String(mutation.rationale).slice(0, 500) : '(none)';
20
- const signalsList = Array.isArray(signals) ? signals.slice(0, 8).join(', ') : '(none)';
21
- const diffPreview = String(diff || '').slice(0, 6000);
22
-
23
- return `You are reviewing a code change produced by an autonomous evolution engine.
24
-
25
- ## Context
26
- - Gene: ${geneId} (${category})
27
- - Signals: [${signalsList}]
28
- - Rationale: ${rationale}
29
-
30
- ## Diff
31
- \`\`\`diff
32
- ${diffPreview}
33
- \`\`\`
34
-
35
- ## Review Criteria
36
- 1. Does this change address the stated signals?
37
- 2. Are there any obvious regressions or bugs introduced?
38
- 3. Is the blast radius proportionate to the problem?
39
- 4. Are there any security or safety concerns?
40
-
41
- ## Response Format
42
- Respond with a JSON object:
43
- {
44
- "approved": true|false,
45
- "confidence": 0.0-1.0,
46
- "concerns": ["..."],
47
- "summary": "one-line review summary"
48
- }`;
49
- }
50
-
51
- function runLlmReview({ diff, gene, signals, mutation }) {
52
- if (!isLlmReviewEnabled()) return null;
53
-
54
- const prompt = buildReviewPrompt({ diff, gene, signals, mutation });
55
-
56
- try {
57
- const repoRoot = getRepoRoot();
58
-
59
- // Write prompt to a temp file to avoid shell quoting issues entirely.
60
- const tmpFile = path.join(os.tmpdir(), 'evolver_review_prompt_' + process.pid + '.txt');
61
- fs.writeFileSync(tmpFile, prompt, 'utf8');
62
-
63
- try {
64
- // Use execFileSync to bypass shell interpretation (no quoting issues).
65
- const reviewScript = `
66
- const fs = require('fs');
67
- const prompt = fs.readFileSync(process.argv[1], 'utf8');
68
- console.log(JSON.stringify({ approved: true, confidence: 0.7, concerns: [], summary: 'auto-approved (no external LLM configured)' }));
69
- `;
70
- const result = execFileSync(process.execPath, ['-e', reviewScript, tmpFile], {
71
- cwd: repoRoot,
72
- encoding: 'utf8',
73
- timeout: REVIEW_TIMEOUT_MS,
74
- stdio: ['ignore', 'pipe', 'pipe'],
75
- windowsHide: true,
76
- });
77
-
78
- try {
79
- return JSON.parse(result.trim());
80
- } catch (_) {
81
- return { approved: true, confidence: 0.5, concerns: ['failed to parse review response'], summary: 'review parse error' };
82
- }
83
- } finally {
84
- try { fs.unlinkSync(tmpFile); } catch (_) {}
85
- }
86
- } catch (e) {
87
- console.log('[LLMReview] Execution failed (non-fatal): ' + (e && e.message ? e.message : e));
88
- return { approved: true, confidence: 0.5, concerns: ['review execution failed'], summary: 'review timeout or error' };
89
- }
90
- }
91
-
92
- module.exports = { isLlmReviewEnabled, runLlmReview, buildReviewPrompt };