@evomap/evolver 1.89.20 → 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 -3586
  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/skills/_meta/SKILL.md +0 -41
  38. package/skills/index.json +0 -14
  39. package/src/adapters/claudeCode.js +0 -194
  40. package/src/adapters/codex.js +0 -216
  41. package/src/adapters/cursor.js +0 -91
  42. package/src/adapters/hookAdapter.js +0 -469
  43. package/src/adapters/kiro.js +0 -195
  44. package/src/adapters/opencode.js +0 -326
  45. package/src/adapters/scripts/_lockPaths.js +0 -74
  46. package/src/adapters/scripts/_memoryFiltering.js +0 -35
  47. package/src/adapters/scripts/_runtimePaths.js +0 -440
  48. package/src/adapters/scripts/evolver-session-end.js +0 -321
  49. package/src/adapters/scripts/evolver-session-start.js +0 -587
  50. package/src/adapters/scripts/evolver-signal-detect.js +0 -98
  51. package/src/adapters/scripts/evolver-task-recall.js +0 -173
  52. package/src/atp/atpExecute.js +0 -283
  53. package/src/atp/atpTaskPickup.js +0 -233
  54. package/src/atp/autoBuyer.js +0 -382
  55. package/src/atp/autoDeliver.js +0 -215
  56. package/src/atp/cli.js +0 -354
  57. package/src/atp/cliAutobuyPrompt.js +0 -154
  58. package/src/atp/consumerAgent.js +0 -157
  59. package/src/atp/defaultHandler.js +0 -69
  60. package/src/atp/heartbeatSignalsHandler.js +0 -254
  61. package/src/atp/hubClient.js +0 -317
  62. package/src/atp/index.js +0 -38
  63. package/src/atp/merchantAgent.js +0 -118
  64. package/src/atp/protocol.js +0 -41
  65. package/src/atp/questionComposer.js +0 -133
  66. package/src/atp/serviceHelper.js +0 -92
  67. package/src/canary.js +0 -13
  68. package/src/config.js +0 -351
  69. package/src/evolve/guards.js +0 -1
  70. package/src/evolve/pipeline/collect.js +0 -1
  71. package/src/evolve/pipeline/dispatch.js +0 -1
  72. package/src/evolve/pipeline/enrich.js +0 -1
  73. package/src/evolve/pipeline/hub.js +0 -1
  74. package/src/evolve/pipeline/select.js +0 -1
  75. package/src/evolve/pipeline/signals.js +0 -1
  76. package/src/evolve/utils.js +0 -1
  77. package/src/evolve.js +0 -1
  78. package/src/experiment/agentRunner.js +0 -229
  79. package/src/experiment/cli.js +0 -159
  80. package/src/experiment/comparison.js +0 -233
  81. package/src/experiment/metrics.js +0 -75
  82. package/src/forceUpdate.js +0 -991
  83. package/src/gep/a2a.js +0 -173
  84. package/src/gep/a2aProtocol.js +0 -1
  85. package/src/gep/analyzer.js +0 -35
  86. package/src/gep/antiAbuseTelemetry.js +0 -1
  87. package/src/gep/assetCallLog.js +0 -197
  88. package/src/gep/assetStore.js +0 -723
  89. package/src/gep/assets.js +0 -36
  90. package/src/gep/autoDistillConv.js +0 -1
  91. package/src/gep/autoDistillLlm.js +0 -1
  92. package/src/gep/bridge.js +0 -138
  93. package/src/gep/candidateEval.js +0 -1
  94. package/src/gep/candidates.js +0 -1
  95. package/src/gep/claimNudge.js +0 -121
  96. package/src/gep/cliContracts.js +0 -1190
  97. package/src/gep/contentHash.js +0 -1
  98. package/src/gep/conversationDistiller.js +0 -1
  99. package/src/gep/conversationSniffer.js +0 -1
  100. package/src/gep/crypto.js +0 -1
  101. package/src/gep/curriculum.js +0 -1
  102. package/src/gep/deviceId.js +0 -1
  103. package/src/gep/directoryClient.js +0 -115
  104. package/src/gep/envFingerprint.js +0 -1
  105. package/src/gep/epigenetics.js +0 -1
  106. package/src/gep/execBridge.js +0 -1
  107. package/src/gep/executionTrace.js +0 -291
  108. package/src/gep/explore.js +0 -1
  109. package/src/gep/featureFlags.js +0 -121
  110. package/src/gep/gitOps.js +0 -265
  111. package/src/gep/hash.js +0 -1
  112. package/src/gep/hostErrorClassifier.js +0 -34
  113. package/src/gep/hubFetch.js +0 -1
  114. package/src/gep/hubReview.js +0 -1
  115. package/src/gep/hubSearch.js +0 -1
  116. package/src/gep/hubVerify.js +0 -1
  117. package/src/gep/idleScheduler.js +0 -400
  118. package/src/gep/issueReporter.js +0 -416
  119. package/src/gep/learningSignals.js +0 -1
  120. package/src/gep/llmReview.js +0 -92
  121. package/src/gep/localStateAwareness.js +0 -243
  122. package/src/gep/mailboxTransport.js +0 -119
  123. package/src/gep/memoryGraph.js +0 -1
  124. package/src/gep/memoryGraphAdapter.js +0 -1
  125. package/src/gep/mutation.js +0 -1
  126. package/src/gep/narrativeMemory.js +0 -1
  127. package/src/gep/oauthLogin.js +0 -181
  128. package/src/gep/openPRRegistry.js +0 -1
  129. package/src/gep/paths.js +0 -522
  130. package/src/gep/personality.js +0 -1
  131. package/src/gep/policyCheck.js +0 -1
  132. package/src/gep/portable.js +0 -103
  133. package/src/gep/privacyClient.js +0 -235
  134. package/src/gep/prompt.js +0 -1
  135. package/src/gep/questionGenerator.js +0 -518
  136. package/src/gep/recallInject.js +0 -1
  137. package/src/gep/recallVerifier.js +0 -1
  138. package/src/gep/reflection.js +0 -1
  139. package/src/gep/sanitize.js +0 -264
  140. package/src/gep/savingsCore.js +0 -1
  141. package/src/gep/schemas/capsule.js +0 -170
  142. package/src/gep/schemas/gene.js +0 -154
  143. package/src/gep/schemas/index.js +0 -8
  144. package/src/gep/schemas/protocol.js +0 -51
  145. package/src/gep/schemas/task.js +0 -74
  146. package/src/gep/selector.js +0 -1
  147. package/src/gep/selfPR.js +0 -469
  148. package/src/gep/signals.js +0 -776
  149. package/src/gep/skill2gep.js +0 -1056
  150. package/src/gep/skill2gepAudit.js +0 -303
  151. package/src/gep/skill2recipes.js +0 -511
  152. package/src/gep/skillDistiller.js +0 -1
  153. package/src/gep/skillPublisher.js +0 -358
  154. package/src/gep/solidify.js +0 -1
  155. package/src/gep/strategy.js +0 -1
  156. package/src/gep/taskReceiver.js +0 -575
  157. package/src/gep/tokenSavings.js +0 -1
  158. package/src/gep/trajectoryExport.js +0 -1
  159. package/src/gep/validationReport.js +0 -55
  160. package/src/gep/validator/index.js +0 -411
  161. package/src/gep/validator/reporter.js +0 -210
  162. package/src/gep/validator/sandboxExecutor.js +0 -480
  163. package/src/gep/validator/stakeBootstrap.js +0 -357
  164. package/src/gep/workspaceKeychain.js +0 -1
  165. package/src/ops/cleanup.js +0 -80
  166. package/src/ops/commentary.js +0 -60
  167. package/src/ops/health_check.js +0 -104
  168. package/src/ops/index.js +0 -11
  169. package/src/ops/innovation.js +0 -67
  170. package/src/ops/lifecycle.js +0 -798
  171. package/src/ops/self_repair.js +0 -76
  172. package/src/ops/skills_monitor.js +0 -147
  173. package/src/ops/trigger.js +0 -33
  174. package/src/proxy/clientSettings.js +0 -405
  175. package/src/proxy/envelope.js +0 -59
  176. package/src/proxy/extensions/dmHandler.js +0 -45
  177. package/src/proxy/extensions/sessionHandler.js +0 -141
  178. package/src/proxy/extensions/skillUpdater.js +0 -64
  179. package/src/proxy/extensions/traceControl.js +0 -1
  180. package/src/proxy/index.js +0 -1395
  181. package/src/proxy/inject.js +0 -1
  182. package/src/proxy/lifecycle/manager.js +0 -1568
  183. package/src/proxy/mailbox/state.js +0 -207
  184. package/src/proxy/mailbox/store.js +0 -590
  185. package/src/proxy/router/cache_passthrough.js +0 -26
  186. package/src/proxy/router/features.js +0 -84
  187. package/src/proxy/router/gemini_route.js +0 -154
  188. package/src/proxy/router/messages_route.js +0 -535
  189. package/src/proxy/router/model_router.js +0 -113
  190. package/src/proxy/router/models_route.js +0 -52
  191. package/src/proxy/router/ollama_route.js +0 -103
  192. package/src/proxy/router/responses_route.js +0 -170
  193. package/src/proxy/router/vertex_route.js +0 -110
  194. package/src/proxy/server/http.js +0 -363
  195. package/src/proxy/server/routes.js +0 -558
  196. package/src/proxy/server/settings.js +0 -115
  197. package/src/proxy/sync/engine.js +0 -179
  198. package/src/proxy/sync/inbound.js +0 -211
  199. package/src/proxy/sync/outbound.js +0 -320
  200. package/src/proxy/task/monitor.js +0 -131
  201. package/src/proxy/trace/extractor.js +0 -1
  202. package/src/proxy/trace/usage.js +0 -1
  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,357 +0,0 @@
1
- // src/gep/validator/stakeBootstrap.js
2
- //
3
- // Ensures this node has an active validator stake on the Hub before it
4
- // starts consuming validation tasks. Idempotent: repeated calls will not
5
- // create duplicate stakes; the Hub returns the existing active stake.
6
- //
7
- // Retry policy (v1.69.4+):
8
- // - First attempt runs immediately
9
- // - Successful attempt: next retry only after 24h (periodic re-check)
10
- // - Transient failure (network, 5xx): exponential backoff 5min -> 15min ->
11
- // 60min -> 4h (capped)
12
- // - Insufficient credits (402): longer backoff 60min -> 4h (cap) because
13
- // credits need to accrue from validation/task rewards; we log the gap so
14
- // the user can also top up or claim the node manually
15
- // - Stake-amount-min (400) / invalid request: stop retrying this session
16
- //
17
- // Persistence (v1.69.11+):
18
- // State (nextAttemptAt / failure counters / lastSuccessAt) is persisted to
19
- // ~/.evomap/validator_stake_state.json after every change so short-lived
20
- // `evolver` invocations don't hammer the Hub's stake endpoint once the
21
- // in-memory backoff window is set. `disabledUntilRestart` is NOT persisted
22
- // -- it is intentionally session-scoped so that a process restart lets the
23
- // node retry after an operator fix. Disk I/O is best-effort; failures
24
- // silently fall back to pure in-memory state.
25
- 'use strict';
26
-
27
- const crypto = require('crypto');
28
- const fs = require('fs');
29
- const path = require('path');
30
- const { buildHubHeaders, buildNodeScopedHubHeaders, getHubUrl, getNodeId } = require('../a2aProtocol');
31
- const { hubFetch } = require('../hubFetch');
32
- const { getEvomapPath } = require('../paths');
33
- const { resolveHubUrl: resolveDefaultHubUrl } = require('../../config');
34
-
35
- const DEFAULT_STAKE_AMOUNT = Number(process.env.EVOLVER_VALIDATOR_STAKE_AMOUNT) || 100;
36
- const STAKE_TIMEOUT_MS = Number(process.env.EVOLVER_VALIDATOR_STAKE_TIMEOUT_MS) || 10_000;
37
-
38
- const BACKOFF_STEPS_TRANSIENT_MS = [
39
- 5 * 60 * 1000,
40
- 15 * 60 * 1000,
41
- 60 * 60 * 1000,
42
- 4 * 60 * 60 * 1000,
43
- ];
44
- const BACKOFF_STEPS_FUNDS_MS = [
45
- 60 * 60 * 1000,
46
- 4 * 60 * 60 * 1000,
47
- ];
48
- const SUCCESS_RECHECK_MS = 24 * 60 * 60 * 1000;
49
-
50
- function resolveHubUrl() {
51
- try {
52
- const u = getHubUrl && getHubUrl();
53
- if (u && typeof u === 'string') return u;
54
- } catch (_) {}
55
- return resolveDefaultHubUrl();
56
- }
57
-
58
- function logStakeEvent(event, data) {
59
- try {
60
- const line = Object.assign({ evt: 'validator_stake', phase: event, ts: new Date().toISOString() }, data || {});
61
- console.log('[evomap-validator-stake] ' + JSON.stringify(line));
62
- } catch (_) {
63
- // best-effort
64
- }
65
- try {
66
- const sync = require('../../sync-engine');
67
- if (sync && typeof sync.log === 'function') {
68
- sync.log('validator_stake_' + event, data || {});
69
- }
70
- } catch (_) {
71
- // sync-engine is optional in some test/CLI contexts
72
- }
73
- }
74
-
75
- function buildStakeHubHeaders() {
76
- const buildHeaders = buildNodeScopedHubHeaders || buildHubHeaders;
77
- return buildHeaders();
78
- }
79
-
80
- // Retry state machine: remembers last outcome classification so we can pick
81
- // the right backoff bucket.
82
- //
83
- // `disabledUntilRestart` is intentionally session-scoped (see _persistState).
84
- let _state = {
85
- nextAttemptAt: 0,
86
- transientFailures: 0,
87
- fundsFailures: 0,
88
- lastSuccessAt: 0,
89
- disabledUntilRestart: false,
90
- };
91
-
92
- // -- Disk persistence (v1.69.11+) ---------------------------------------
93
- //
94
- // Goal: prevent short-lived `evolver` commands from spamming the Hub's
95
- // `/a2a/validator/stake` endpoint. Each process used to start with an
96
- // empty _state and fire a new stake request, triggering repeated
97
- // "already active" responses + rate-limit suppressions on the Hub.
98
- // We now carry the retry clock between process invocations.
99
-
100
- // Lazy via paths.getEvomapPath() — honors EVOLVER_HOME (#114).
101
- function _stateFile() { return getEvomapPath('validator_stake_state.json'); }
102
-
103
- let _stateLoaded = false;
104
-
105
- function _loadStateFromDisk() {
106
- if (_stateLoaded) return;
107
- _stateLoaded = true;
108
- try {
109
- const file = _stateFile();
110
- if (!fs.existsSync(file)) return;
111
- const raw = fs.readFileSync(file, 'utf8');
112
- if (!raw) return;
113
- const parsed = JSON.parse(raw);
114
- if (!parsed || typeof parsed !== 'object') return;
115
- const nextAttemptAt = Number(parsed.nextAttemptAt) || 0;
116
- const transientFailures = Number(parsed.transientFailures) || 0;
117
- const fundsFailures = Number(parsed.fundsFailures) || 0;
118
- const lastSuccessAt = Number(parsed.lastSuccessAt) || 0;
119
- // Defensive clamp: a clock change or corrupted file could push
120
- // nextAttemptAt arbitrarily far into the future. Cap it at now +
121
- // the longest backoff step to avoid permanently silencing stake
122
- // attempts on this host.
123
- const maxHorizonMs = 24 * 60 * 60 * 1000;
124
- const nowMs = Date.now();
125
- const boundedNext = nextAttemptAt > nowMs + maxHorizonMs
126
- ? nowMs + maxHorizonMs
127
- : nextAttemptAt;
128
- _state.nextAttemptAt = boundedNext;
129
- _state.transientFailures = transientFailures;
130
- _state.fundsFailures = fundsFailures;
131
- _state.lastSuccessAt = lastSuccessAt;
132
- // disabledUntilRestart is intentionally NOT persisted: we want the
133
- // next process start to re-try once, so operator-driven fixes (hub
134
- // upgrade, client downgrade/reconfig) clear the flag naturally.
135
- } catch (_) {
136
- // best-effort: fall back to default _state
137
- }
138
- }
139
-
140
- function _persistState() {
141
- // NOTE(windows): mode 0o700 / 0o600 are silently ignored on Windows.
142
- // The stake-state file will NOT be access-restricted to the current user.
143
- // Only user-profile directory ACLs provide isolation on Windows.
144
- try {
145
- const file = _stateFile();
146
- const dir = path.dirname(file);
147
- if (!fs.existsSync(dir)) {
148
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
149
- }
150
- const snapshot = {
151
- nextAttemptAt: _state.nextAttemptAt,
152
- transientFailures: _state.transientFailures,
153
- fundsFailures: _state.fundsFailures,
154
- lastSuccessAt: _state.lastSuccessAt,
155
- // disabledUntilRestart intentionally omitted
156
- savedAt: Date.now(),
157
- };
158
- fs.writeFileSync(file, JSON.stringify(snapshot), { encoding: 'utf8', mode: 0o600 });
159
- } catch (_) {
160
- // best-effort: ignore disk failures (e.g. read-only FS in sandbox)
161
- }
162
- }
163
-
164
- function resetBackoff() {
165
- _state.transientFailures = 0;
166
- _state.fundsFailures = 0;
167
- }
168
-
169
- function pickDelay(kind) {
170
- if (kind === 'transient') {
171
- const idx = Math.min(
172
- Math.max(0, _state.transientFailures - 1),
173
- BACKOFF_STEPS_TRANSIENT_MS.length - 1,
174
- );
175
- return BACKOFF_STEPS_TRANSIENT_MS[idx];
176
- }
177
- if (kind === 'funds') {
178
- const idx = Math.min(
179
- Math.max(0, _state.fundsFailures - 1),
180
- BACKOFF_STEPS_FUNDS_MS.length - 1,
181
- );
182
- return BACKOFF_STEPS_FUNDS_MS[idx];
183
- }
184
- return 5 * 60 * 1000;
185
- }
186
-
187
- function classifyFailure(status, errorText) {
188
- const text = String(errorText || '').toLowerCase();
189
- if (status === 402 || text.includes('insufficient_credits')) return 'funds';
190
- if (status === 400 || status === 403 || status === 404) return 'permanent';
191
- return 'transient';
192
- }
193
-
194
- function parseShortfall(errorText) {
195
- const match = String(errorText || '').match(/need\s+(\d+(?:\.\d+)?),\s*have\s+(\d+(?:\.\d+)?)/i);
196
- if (!match) return null;
197
- return { need: Number(match[1]), have: Number(match[2]) };
198
- }
199
-
200
- /**
201
- * Attempt to stake credits so this node becomes eligible for validation tasks.
202
- * Safe to call repeatedly; internally throttled by the retry state machine.
203
- *
204
- * @param {{ amount?: number, force?: boolean }} [opts]
205
- */
206
- async function ensureValidatorStake(opts) {
207
- const options = opts || {};
208
- const now = Date.now();
209
-
210
- _loadStateFromDisk();
211
-
212
- if (_state.disabledUntilRestart && !options.force) {
213
- return { ok: false, skipped: 'disabled_until_restart' };
214
- }
215
-
216
- if (!options.force && _state.nextAttemptAt > now) {
217
- return { ok: true, skipped: 'backoff', nextAttemptAt: _state.nextAttemptAt };
218
- }
219
-
220
- const nodeId = getNodeId();
221
- if (!nodeId) {
222
- _state.nextAttemptAt = now + pickDelay('transient');
223
- _persistState();
224
- return { ok: false, error: 'no_node_id' };
225
- }
226
-
227
- const hubUrl = resolveHubUrl();
228
- const url = hubUrl.replace(/\/+$/, '') + '/a2a/validator/stake';
229
- const amount = Math.max(100, Math.round(Number(options.amount) || DEFAULT_STAKE_AMOUNT));
230
-
231
- const controller = new AbortController();
232
- const timer = setTimeout(() => controller.abort(), STAKE_TIMEOUT_MS);
233
-
234
- const body = {
235
- sender_id: nodeId,
236
- node_id: nodeId,
237
- payload: { stake_amount: amount },
238
- message_id: 'msg_' + Date.now().toString(36) + '_' + crypto.randomBytes(3).toString('hex'),
239
- timestamp: new Date().toISOString(),
240
- };
241
-
242
- logStakeEvent('attempt', { node_id: nodeId, amount, hub: hubUrl });
243
-
244
- let res;
245
- let text = '';
246
- try {
247
- res = await hubFetch(url, {
248
- method: 'POST',
249
- headers: buildStakeHubHeaders(),
250
- body: JSON.stringify(body),
251
- signal: controller.signal,
252
- });
253
- clearTimeout(timer);
254
- text = await res.text();
255
- } catch (err) {
256
- clearTimeout(timer);
257
- _state.transientFailures += 1;
258
- _state.nextAttemptAt = now + pickDelay('transient');
259
- _persistState();
260
- const msg = err && err.message ? err.message : String(err);
261
- logStakeEvent('failed_network', {
262
- node_id: nodeId,
263
- error: msg,
264
- next_retry_in_ms: _state.nextAttemptAt - now,
265
- attempt: _state.transientFailures,
266
- });
267
- return { ok: false, error: msg };
268
- }
269
-
270
- if (res.ok) {
271
- let parsed;
272
- try { parsed = JSON.parse(text); } catch { parsed = { raw: text }; }
273
- resetBackoff();
274
- _state.lastSuccessAt = now;
275
- _state.nextAttemptAt = now + SUCCESS_RECHECK_MS;
276
- _persistState();
277
- logStakeEvent('success', {
278
- node_id: nodeId,
279
- stake: parsed && parsed.stake ? parsed.stake : parsed,
280
- });
281
- return { ok: true, stake: parsed && parsed.stake ? parsed.stake : parsed };
282
- }
283
-
284
- const kind = classifyFailure(res.status, text);
285
- if (kind === 'funds') {
286
- _state.fundsFailures += 1;
287
- _state.nextAttemptAt = now + pickDelay('funds');
288
- _persistState();
289
- const short = parseShortfall(text);
290
- logStakeEvent('insufficient_credits', {
291
- node_id: nodeId,
292
- status: res.status,
293
- needed: short ? short.need : amount,
294
- have: short ? short.have : null,
295
- attempt: _state.fundsFailures,
296
- next_retry_in_ms: _state.nextAttemptAt - now,
297
- hint: 'earn credits by completing validation tasks or claim the node on evomap.ai to top up',
298
- });
299
- return { ok: false, status: res.status, error: text.slice(0, 400), kind: 'funds' };
300
- }
301
-
302
- if (kind === 'permanent') {
303
- _state.disabledUntilRestart = true;
304
- logStakeEvent('failed_permanent', {
305
- node_id: nodeId,
306
- status: res.status,
307
- error: text.slice(0, 400),
308
- note: 'stake disabled until process restart; check client version and hub compatibility',
309
- });
310
- return { ok: false, status: res.status, error: text.slice(0, 400), kind: 'permanent' };
311
- }
312
-
313
- _state.transientFailures += 1;
314
- _state.nextAttemptAt = now + pickDelay('transient');
315
- _persistState();
316
- logStakeEvent('failed_transient', {
317
- node_id: nodeId,
318
- status: res.status,
319
- error: text.slice(0, 400),
320
- attempt: _state.transientFailures,
321
- next_retry_in_ms: _state.nextAttemptAt - now,
322
- });
323
- return { ok: false, status: res.status, error: text.slice(0, 400), kind: 'transient' };
324
- }
325
-
326
- // Test-only reset hook: clears in-memory state, disk snapshot, and
327
- // the lazy-load latch so the next call re-reads from disk (or sees a
328
- // clean slate if the caller removed the file themselves).
329
- function _resetStateForTests() {
330
- _state = {
331
- nextAttemptAt: 0,
332
- transientFailures: 0,
333
- fundsFailures: 0,
334
- lastSuccessAt: 0,
335
- disabledUntilRestart: false,
336
- };
337
- _stateLoaded = false;
338
- try { fs.unlinkSync(_stateFile()); } catch (_) {}
339
- }
340
-
341
- function _getStateForTests() {
342
- return Object.assign({}, _state);
343
- }
344
-
345
- module.exports = {
346
- ensureValidatorStake,
347
- DEFAULT_STAKE_AMOUNT,
348
- BACKOFF_STEPS_TRANSIENT_MS,
349
- BACKOFF_STEPS_FUNDS_MS,
350
- SUCCESS_RECHECK_MS,
351
- // Getter so callers see the current EVOLVER_HOME at call time (#114).
352
- get STATE_FILE() { return _stateFile(); },
353
- _resetStateForTests,
354
- _getStateForTests,
355
- _loadStateFromDisk,
356
- _persistState,
357
- };
@@ -1 +0,0 @@
1
- const _0x5966c3=_0x1c2f;(function(_0x4b417f,_0x1e08c2){const _0x46fe7=_0x1c2f,_0x773d0a=_0x4b417f();while(!![]){try{const _0xf3cf31=parseInt(_0x46fe7(0x1c0,'\x29\x51\x68\x49'))/(0x165e+-0x3*-0x4d8+-0x24e5)+parseInt(_0x46fe7(0x1c3,'\x41\x65\x5d\x29'))/(0x1dea+0x1*-0xda9+0x103f*-0x1)*(-parseInt(_0x46fe7(0x1fb,'\x41\x65\x5d\x29'))/(-0x29*0x2b+-0x1451*0x1+-0x1*-0x1b37))+-parseInt(_0x46fe7(0x1eb,'\x7a\x68\x42\x6e'))/(-0x16f1*0x1+0x1eeb*-0x1+-0x10*-0x35e)+parseInt(_0x46fe7(0x1ed,'\x53\x6d\x62\x68'))/(0x1186+0x13cf*-0x1+0x24e)+-parseInt(_0x46fe7(0x1d2,'\x4b\x6c\x48\x75'))/(-0xa0d*-0x3+0x923*-0x1+-0x14fe)*(parseInt(_0x46fe7(0x212,'\x74\x74\x79\x4e'))/(-0x3e*-0x86+0x1230+-0x329d))+-parseInt(_0x46fe7(0x21d,'\x39\x23\x75\x73'))/(-0x7ef+0x2476+0x5b3*-0x5)+-parseInt(_0x46fe7(0x1cc,'\x4e\x37\x4b\x46'))/(0xd3e+0xbcb*0x1+0x1*-0x1900)*(-parseInt(_0x46fe7(0x1f5,'\x5e\x70\x61\x44'))/(0x3*-0x8a1+-0x815+0xb56*0x3));if(_0xf3cf31===_0x1e08c2)break;else _0x773d0a['push'](_0x773d0a['shift']());}catch(_0x1c8d19){_0x773d0a['push'](_0x773d0a['shift']());}}}(_0x2a2f,-0x14d82*0x3+-0xbeb00+0x1b8c32));const _0x4e0863=(function(){let _0x1d3e24=!![];return function(_0x4e97f3,_0x2c4165){const _0x266a69=_0x1d3e24?function(){const _0x53c9ba=_0x1c2f;if(_0x2c4165){const _0x157ba8=_0x2c4165[_0x53c9ba(0x1dd,'\x24\x38\x64\x73')](_0x4e97f3,arguments);return _0x2c4165=null,_0x157ba8;}}:function(){};return _0x1d3e24=![],_0x266a69;};}()),_0x59459b=_0x4e0863(this,function(){const _0x2d34aa=_0x1c2f,_0x385b99={};_0x385b99[_0x2d34aa(0x1fe,'\x41\x73\x49\x5d')]=_0x2d34aa(0x202,'\x70\x21\x45\x79')+_0x2d34aa(0x1db,'\x6a\x62\x34\x53');const _0x5c8e37=_0x385b99;return _0x59459b[_0x2d34aa(0x1dc,'\x64\x4c\x31\x58')]()[_0x2d34aa(0x1f0,'\x41\x73\x49\x5d')](_0x5c8e37['\x54\x73\x69\x4f\x5a'])[_0x2d34aa(0x1be,'\x71\x29\x6f\x7a')]()[_0x2d34aa(0x1bd,'\x30\x6d\x2a\x4a')+_0x2d34aa(0x21f,'\x30\x25\x26\x32')](_0x59459b)[_0x2d34aa(0x209,'\x70\x4a\x65\x5b')](_0x2d34aa(0x1f6,'\x39\x23\x75\x73')+'\x2b\x29\x2b\x24');});_0x59459b();function _0x2a2f(){const _0x3faa1b=['\x57\x52\x6e\x49\x57\x37\x5a\x63\x4c\x57','\x57\x34\x7a\x4e\x68\x38\x6f\x75\x69\x4e\x44\x34\x57\x52\x61','\x57\x52\x46\x64\x49\x4e\x66\x45\x6d\x57','\x57\x52\x66\x64\x6a\x38\x6b\x39\x57\x52\x71','\x57\x50\x68\x64\x55\x53\x6f\x75\x6d\x43\x6f\x33\x44\x4b\x70\x63\x4d\x57','\x57\x34\x58\x7a\x57\x50\x34\x31\x77\x53\x6f\x66\x57\x50\x58\x56','\x77\x4a\x56\x64\x56\x62\x64\x63\x54\x57','\x6f\x53\x6b\x30\x63\x43\x6b\x6b','\x78\x48\x43\x43\x57\x52\x4c\x5a\x57\x50\x30','\x71\x6d\x6b\x47\x57\x51\x33\x63\x4d\x38\x6f\x79\x6f\x53\x6f\x35\x57\x4f\x38','\x57\x50\x47\x69\x6f\x6d\x6b\x48\x66\x47','\x57\x35\x53\x57\x6b\x38\x6b\x30\x66\x66\x76\x72\x45\x61','\x57\x34\x64\x63\x4c\x53\x6b\x63\x67\x43\x6f\x56\x46\x74\x6e\x4d\x78\x53\x6b\x78\x57\x35\x5a\x63\x56\x31\x71','\x77\x43\x6b\x46\x57\x51\x79\x55\x78\x66\x74\x64\x56\x67\x34','\x57\x52\x4f\x54\x57\x36\x79\x5a\x6f\x33\x4e\x63\x48\x47','\x74\x58\x2f\x63\x55\x33\x33\x64\x48\x76\x74\x63\x54\x38\x6b\x76','\x57\x50\x39\x45\x57\x35\x74\x63\x4f\x6d\x6b\x4a\x57\x35\x46\x64\x4b\x74\x65','\x57\x36\x50\x31\x63\x47\x74\x64\x4d\x43\x6b\x70\x78\x5a\x72\x31','\x69\x73\x64\x64\x4c\x38\x6f\x2b\x57\x34\x57','\x57\x35\x5a\x64\x49\x57\x46\x63\x47\x68\x4e\x63\x55\x38\x6b\x59\x57\x52\x38','\x57\x36\x43\x4f\x57\x50\x6d\x4c\x68\x31\x52\x64\x52\x58\x78\x64\x49\x77\x74\x64\x47\x68\x47','\x57\x35\x5a\x64\x52\x64\x52\x64\x4f\x57\x53','\x57\x50\x44\x4a\x64\x33\x70\x64\x4f\x4e\x46\x64\x53\x47\x38','\x57\x37\x30\x4a\x64\x57','\x69\x76\x4b\x64\x57\x35\x37\x64\x52\x38\x6b\x34\x57\x4f\x37\x64\x4f\x61','\x70\x31\x46\x64\x49\x6d\x6f\x75\x70\x4e\x33\x64\x53\x4d\x4f\x49\x66\x38\x6f\x71\x57\x35\x76\x51','\x57\x50\x76\x75\x57\x34\x6c\x63\x50\x53\x6b\x61','\x57\x50\x35\x52\x57\x4f\x78\x63\x53\x6d\x6b\x45','\x57\x37\x43\x38\x57\x51\x4e\x64\x48\x43\x6f\x68\x57\x51\x2f\x63\x50\x62\x65\x58\x62\x38\x6b\x53\x57\x34\x4a\x63\x55\x61','\x43\x53\x6b\x4b\x57\x51\x30\x77\x77\x61','\x57\x34\x46\x64\x4c\x48\x34','\x57\x50\x78\x64\x49\x65\x62\x45\x66\x38\x6f\x6c\x75\x75\x6d','\x57\x35\x6c\x63\x4b\x53\x6b\x6b\x74\x57','\x72\x43\x6b\x34\x79\x6d\x6b\x55\x57\x50\x66\x77\x57\x37\x53\x56','\x57\x4f\x42\x64\x47\x6d\x6f\x50\x78\x38\x6b\x4b\x6a\x4d\x48\x68','\x57\x37\x69\x53\x67\x68\x52\x64\x54\x68\x68\x63\x55\x6d\x6f\x54','\x6c\x64\x35\x52\x75\x71\x78\x64\x4d\x71\x56\x63\x50\x65\x6e\x65\x57\x35\x4f\x4b','\x57\x35\x61\x35\x71\x57','\x73\x30\x74\x64\x4d\x38\x6b\x4e','\x70\x31\x78\x64\x49\x6d\x6f\x75\x70\x78\x56\x64\x53\x30\x47\x4d\x68\x6d\x6f\x52\x57\x36\x72\x61','\x57\x37\x74\x63\x56\x6d\x6b\x57','\x57\x35\x6c\x64\x4a\x57\x33\x63\x4d\x4d\x78\x63\x55\x38\x6b\x5a\x57\x52\x79','\x6e\x53\x6b\x58\x66\x53\x6b\x52\x43\x71','\x76\x74\x4b\x46\x57\x50\x4c\x35','\x76\x4c\x38\x58\x6e\x65\x71','\x75\x59\x46\x64\x48\x59\x56\x63\x51\x57','\x57\x50\x4f\x47\x45\x38\x6b\x76\x46\x4a\x53\x48\x57\x35\x4f','\x57\x37\x6e\x75\x57\x36\x70\x63\x4c\x43\x6b\x75\x57\x36\x46\x64\x48\x71','\x57\x52\x44\x59\x43\x4a\x4a\x63\x54\x59\x52\x64\x4f\x43\x6f\x71\x6d\x4e\x33\x63\x53\x4e\x75\x2b','\x57\x50\x50\x65\x57\x50\x33\x63\x47\x38\x6b\x57','\x57\x50\x70\x64\x4d\x43\x6f\x42\x71\x53\x6b\x36\x6c\x4d\x72\x6d','\x41\x6d\x6b\x67\x7a\x38\x6b\x4c\x57\x52\x65','\x57\x51\x79\x6e\x7a\x6d\x6b\x42\x78\x61','\x63\x75\x74\x64\x4b\x64\x33\x63\x47\x57\x4a\x63\x4d\x6d\x6b\x47\x57\x34\x76\x79\x57\x36\x69\x6e','\x78\x43\x6f\x36\x57\x37\x64\x64\x4c\x6d\x6b\x44\x79\x38\x6f\x30\x57\x51\x2f\x64\x47\x74\x70\x64\x4b\x67\x57','\x42\x58\x64\x63\x4b\x6d\x6b\x6c\x79\x59\x37\x63\x50\x31\x57','\x57\x36\x47\x4e\x57\x34\x33\x63\x4d\x61','\x63\x38\x6f\x57\x57\x51\x6d\x76\x79\x38\x6f\x32','\x57\x34\x6a\x59\x57\x52\x6d\x65\x41\x57','\x72\x33\x33\x64\x4b\x6d\x6b\x79\x63\x57','\x57\x4f\x30\x36\x57\x35\x43\x5a\x6d\x61','\x66\x6d\x6f\x62\x57\x36\x66\x54\x66\x47\x33\x64\x55\x73\x69','\x57\x50\x58\x6a\x6c\x33\x57\x76\x78\x43\x6b\x41','\x57\x36\x62\x6a\x57\x34\x53\x49','\x57\x4f\x6e\x4c\x57\x51\x2f\x63\x54\x53\x6b\x62\x57\x52\x31\x79\x57\x50\x4f','\x57\x50\x50\x43\x6b\x31\x30\x64','\x57\x34\x4f\x75\x57\x37\x56\x64\x4c\x77\x6d\x44\x57\x36\x66\x36','\x64\x68\x75\x76\x67\x43\x6b\x69\x57\x52\x61','\x6e\x73\x6e\x34\x71\x71','\x44\x53\x6f\x4a\x57\x36\x74\x63\x50\x4b\x37\x64\x4c\x31\x56\x63\x54\x6d\x6b\x30','\x78\x43\x6b\x43\x57\x52\x30\x53','\x57\x51\x58\x68\x6c\x43\x6b\x37','\x57\x35\x33\x63\x4a\x43\x6b\x67\x74\x4b\x71','\x57\x52\x43\x43\x68\x53\x6b\x54\x69\x47','\x44\x6d\x6f\x78\x70\x61','\x73\x38\x6f\x39\x57\x50\x71','\x57\x34\x64\x64\x53\x57\x37\x63\x4d\x32\x71','\x57\x50\x78\x64\x54\x6d\x6f\x66\x6e\x38\x6f\x50\x79\x31\x69','\x57\x4f\x57\x67\x44\x6d\x6b\x6a\x72\x71','\x57\x51\x46\x64\x56\x38\x6f\x4a\x67\x73\x74\x64\x51\x64\x52\x63\x4a\x43\x6b\x65\x57\x4f\x78\x64\x4d\x38\x6b\x59\x57\x35\x65','\x6a\x77\x65\x69\x57\x34\x6c\x64\x50\x57','\x64\x71\x2f\x63\x49\x53\x6f\x34\x77\x38\x6b\x73\x57\x37\x74\x64\x56\x66\x68\x64\x55\x76\x33\x64\x4b\x53\x6f\x4c','\x57\x34\x68\x63\x56\x38\x6b\x6d\x42\x53\x6b\x50\x69\x58\x46\x63\x4a\x38\x6b\x32\x57\x4f\x46\x64\x4b\x49\x5a\x64\x4a\x57','\x75\x76\x2f\x63\x56\x30\x69','\x73\x62\x78\x63\x49\x78\x56\x64\x4c\x66\x75','\x57\x34\x57\x55\x75\x57\x33\x63\x51\x63\x33\x63\x51\x4c\x65','\x57\x51\x71\x73\x57\x4f\x71','\x57\x51\x6a\x65\x57\x35\x6c\x63\x47\x43\x6b\x35','\x57\x36\x5a\x64\x4b\x62\x2f\x63\x56\x77\x42\x63\x4e\x38\x6b\x2f\x57\x51\x34','\x66\x61\x74\x63\x4d\x33\x58\x6b\x62\x53\x6f\x6e\x67\x53\x6b\x32','\x57\x36\x47\x4c\x57\x52\x4e\x64\x4e\x6d\x6f\x45\x57\x52\x46\x63\x55\x76\x30','\x57\x37\x69\x39\x57\x51\x46\x64\x48\x6d\x6f\x61\x57\x51\x4a\x63\x51\x4a\x65\x67\x69\x38\x6b\x34\x57\x34\x78\x63\x48\x71','\x68\x65\x54\x6c\x57\x52\x50\x64\x57\x4f\x65\x63\x69\x53\x6f\x2f','\x57\x52\x34\x31\x78\x58\x33\x64\x51\x38\x6b\x73\x76\x71','\x57\x36\x43\x6b\x57\x37\x68\x64\x51\x30\x71','\x70\x74\x2f\x63\x47\x38\x6b\x66\x42\x4a\x42\x63\x4b\x47','\x46\x43\x6b\x79\x69\x75\x4a\x63\x53\x61','\x70\x4b\x71\x6b\x79\x38\x6b\x31','\x42\x57\x70\x63\x47\x75\x42\x64\x52\x71','\x57\x50\x38\x46\x57\x36\x53\x66\x65\x61','\x57\x50\x30\x35\x57\x4f\x35\x46\x57\x34\x79'];_0x2a2f=function(){return _0x3faa1b;};return _0x2a2f();}const _0x3f1e79=_0x5966c3(0x20e,'\x23\x42\x40\x56')+'\x76\x6f\x6c\x76\x65\x72\x2e\x77'+_0x5966c3(0x214,'\x30\x25\x26\x32')+_0x5966c3(0x218,'\x46\x37\x44\x42'),_0x33e0bb=/^[a-f0-9]{32,}$/i;let _0x328239=undefined;function _0x325983(){const _0x100f49=_0x5966c3,_0x2bc93d={'\x69\x61\x79\x72\x6d':function(_0x3ce546,_0x3f10a1){return _0x3ce546!==_0x3f10a1;},'\x48\x55\x62\x51\x75':'\x69\x67\x48\x63\x4c','\x73\x44\x57\x44\x44':function(_0x2f80a7,_0x3dc682){return _0x2f80a7(_0x3dc682);},'\x67\x56\x75\x6d\x61':_0x100f49(0x1de,'\x6c\x76\x36\x43')+_0x100f49(0x20a,'\x4b\x6c\x48\x75'),'\x56\x59\x6e\x59\x67':function(_0x5967c6,_0x49f765){return _0x5967c6===_0x49f765;},'\x4e\x4d\x64\x55\x65':'\x66\x75\x6e\x63\x74\x69\x6f\x6e','\x67\x6c\x4d\x50\x6c':_0x100f49(0x1c6,'\x38\x6e\x36\x33')};if(_0x2bc93d[_0x100f49(0x21c,'\x64\x4c\x31\x58')](_0x328239,undefined))return _0x328239;try{if(_0x2bc93d[_0x100f49(0x204,'\x28\x7a\x4d\x61')](_0x2bc93d[_0x100f49(0x1c8,'\x29\x51\x68\x49')],_0x100f49(0x203,'\x55\x75\x6e\x44'))){const _0x44dc8a=new _0x4a8bf5[(_0x100f49(0x213,'\x38\x38\x36\x35'))](_0x1152d4,_0x583a3d);return _0x44dc8a['\x73\x65\x74\x50\x61\x73\x73\x77'+_0x100f49(0x1f2,'\x6a\x62\x34\x53')](_0x4904e5),!![];}else{const _0x4724b7=_0x2bc93d[_0x100f49(0x1fd,'\x25\x41\x6d\x58')](require,_0x2bc93d[_0x100f49(0x1e5,'\x46\x37\x44\x42')]);if(_0x4724b7&&_0x2bc93d[_0x100f49(0x200,'\x6a\x62\x34\x53')](typeof _0x4724b7[_0x100f49(0x216,'\x47\x78\x5d\x30')],_0x2bc93d[_0x100f49(0x21e,'\x23\x42\x40\x56')]))return _0x328239=_0x4724b7,_0x328239;return _0x328239=null,null;}}catch{return _0x2bc93d['\x69\x61\x79\x72\x6d'](_0x100f49(0x1fa,'\x6c\x76\x36\x43'),_0x2bc93d[_0x100f49(0x1c9,'\x45\x75\x4e\x48')])?![]:(_0x328239=null,null);}}function _0x1c2f(_0x56fadc,_0x1b8f29){_0x56fadc=_0x56fadc-(-0x1*0x1949+-0x1594*-0x1+0x571);const _0x154213=_0x2a2f();let _0x573660=_0x154213[_0x56fadc];if(_0x1c2f['\x7a\x45\x6d\x4a\x71\x47']===undefined){var _0x5befb9=function(_0xf60df5){const _0x487f63='\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 _0x46349b='',_0x6625b4='',_0x54b252=_0x46349b+_0x5befb9,_0x8c8b45=(''+function(){return 0x388*-0x8+0x6*-0x277+0x2b0a;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(0x3*-0x62b+-0x248f*-0x1+-0x120d);for(let _0x5b66a7=-0x1f*-0xb3+-0x2*0xa67+-0xdf*0x1,_0x3c70c5,_0x3d5697,_0x4f1363=0x1d61+0x51e*0x1+-0x1*0x227f;_0x3d5697=_0xf60df5['\x63\x68\x61\x72\x41\x74'](_0x4f1363++);~_0x3d5697&&(_0x3c70c5=_0x5b66a7%(-0x1*0xa6e+0x25ee+-0x1b7c)?_0x3c70c5*(-0x408+0x4*-0x191+0xa8c)+_0x3d5697:_0x3d5697,_0x5b66a7++%(-0xfee*-0x1+-0x1bb0+0xbc6))?_0x46349b+=_0x8c8b45||_0x54b252['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x4f1363+(-0x3*-0x593+-0x1797+0x6e8))-(0x31d*-0xb+0x2*0x239+0x1*0x1dd7)!==0xa70+0x2*-0xddb+-0x43*-0x42?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x8f3*0x1+0x25e0+0x1a3*-0x1c&_0x3c70c5>>(-(-0x5cc+0x26ca+-0x20fc*0x1)*_0x5b66a7&-0x1b97*-0x1+0x19*0x5c+-0xc2f*0x3)):_0x5b66a7:-0x11c9+-0xe+-0x1*-0x11d7){_0x3d5697=_0x487f63['\x69\x6e\x64\x65\x78\x4f\x66'](_0x3d5697);}for(let _0x33312b=0x77*0x12+-0x11*-0x17b+-0x2189,_0x4e544c=_0x46349b['\x6c\x65\x6e\x67\x74\x68'];_0x33312b<_0x4e544c;_0x33312b++){_0x6625b4+='\x25'+('\x30\x30'+_0x46349b['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x33312b)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x6*-0x613+-0x1*-0x208b+0x1*-0x44ed))['\x73\x6c\x69\x63\x65'](-(-0x280*-0xd+0xb1b+-0x2b99));}return decodeURIComponent(_0x6625b4);};const _0x1c72ff=function(_0x164f1f,_0x1bfee8){let _0xb61bd5=[],_0x151674=0x169e+-0xa0*-0x24+0x96*-0x4d,_0x46a02a,_0x4ce44f='';_0x164f1f=_0x5befb9(_0x164f1f);let _0x150586;for(_0x150586=0x2e8*0x7+0xa*0x210+-0x28f8;_0x150586<-0x13*-0x10d+-0x39e*0x5+-0xe1;_0x150586++){_0xb61bd5[_0x150586]=_0x150586;}for(_0x150586=-0xb*-0x10d+-0x23ae*0x1+-0x5f*-0x41;_0x150586<0x18d*-0xa+-0xc5*0x1f+-0x1*-0x285d;_0x150586++){_0x151674=(_0x151674+_0xb61bd5[_0x150586]+_0x1bfee8['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x150586%_0x1bfee8['\x6c\x65\x6e\x67\x74\x68']))%(0x1356+-0x1224+-0x32),_0x46a02a=_0xb61bd5[_0x150586],_0xb61bd5[_0x150586]=_0xb61bd5[_0x151674],_0xb61bd5[_0x151674]=_0x46a02a;}_0x150586=0x1*0x2147+-0x49*-0x35+-0x3064*0x1,_0x151674=0x105+-0x1*-0x447+-0x54c;for(let _0xd78c92=0x204d+-0xca*-0x8+-0x293*0xf;_0xd78c92<_0x164f1f['\x6c\x65\x6e\x67\x74\x68'];_0xd78c92++){_0x150586=(_0x150586+(0x1*-0x17a5+0xead+0x8f9))%(0xa*0xb5+0x10a7+-0x16b9),_0x151674=(_0x151674+_0xb61bd5[_0x150586])%(-0x51*0x41+0x2271+0x670*-0x2),_0x46a02a=_0xb61bd5[_0x150586],_0xb61bd5[_0x150586]=_0xb61bd5[_0x151674],_0xb61bd5[_0x151674]=_0x46a02a,_0x4ce44f+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x164f1f['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0xd78c92)^_0xb61bd5[(_0xb61bd5[_0x150586]+_0xb61bd5[_0x151674])%(0xd49+0x1f8+-0xe41*0x1)]);}return _0x4ce44f;};_0x1c2f['\x5a\x63\x64\x4b\x4a\x6c']=_0x1c72ff,_0x1c2f['\x74\x4d\x4f\x49\x54\x6b']={},_0x1c2f['\x7a\x45\x6d\x4a\x71\x47']=!![];}const _0x189768=_0x154213[-0x2*0x514+-0x8b6+0x142*0xf],_0x5c2a31=_0x56fadc+_0x189768,_0xc55bc1=_0x1c2f['\x74\x4d\x4f\x49\x54\x6b'][_0x5c2a31];if(!_0xc55bc1){if(_0x1c2f['\x6e\x4b\x6f\x48\x75\x47']===undefined){const _0x283062=function(_0x528c35){this['\x4e\x65\x79\x7a\x4d\x73']=_0x528c35,this['\x75\x4b\x72\x61\x6a\x58']=[0xaeb*-0x1+-0x19a6*0x1+-0x3e*-0x97,-0x1c23+0x13c3*-0x1+0x2fe6,-0x1b1*0xc+0x3*-0x4a3+0x2235],this['\x42\x47\x68\x66\x77\x59']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x51\x4c\x73\x51\x6b\x7a']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x49\x6a\x6a\x6a\x46\x51']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x283062['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x55\x63\x4b\x49\x5a\x67']=function(){const _0x2bf72e=new RegExp(this['\x51\x4c\x73\x51\x6b\x7a']+this['\x49\x6a\x6a\x6a\x46\x51']),_0x3b48ea=_0x2bf72e['\x74\x65\x73\x74'](this['\x42\x47\x68\x66\x77\x59']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x75\x4b\x72\x61\x6a\x58'][-0x3*-0x737+0x1a9a+-0x303e]:--this['\x75\x4b\x72\x61\x6a\x58'][0x1184+-0x1a66+0x8e2];return this['\x6e\x43\x4b\x64\x53\x70'](_0x3b48ea);},_0x283062['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6e\x43\x4b\x64\x53\x70']=function(_0x2ceea9){if(!Boolean(~_0x2ceea9))return _0x2ceea9;return this['\x6e\x4a\x51\x4d\x70\x67'](this['\x4e\x65\x79\x7a\x4d\x73']);},_0x283062['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6e\x4a\x51\x4d\x70\x67']=function(_0x32be54){for(let _0x4497bb=-0x13e5+0x111a+0x2cb,_0x289ca9=this['\x75\x4b\x72\x61\x6a\x58']['\x6c\x65\x6e\x67\x74\x68'];_0x4497bb<_0x289ca9;_0x4497bb++){this['\x75\x4b\x72\x61\x6a\x58']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x289ca9=this['\x75\x4b\x72\x61\x6a\x58']['\x6c\x65\x6e\x67\x74\x68'];}return _0x32be54(this['\x75\x4b\x72\x61\x6a\x58'][-0x832*0x1+-0x7*-0x196+0x3*-0xf8]);},(''+function(){return 0x16ac*0x1+0x3*-0x3e7+0xaf7*-0x1;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0x1cbc+0x1ffe+-0x341)&&new _0x283062(_0x1c2f)['\x55\x63\x4b\x49\x5a\x67'](),_0x1c2f['\x6e\x4b\x6f\x48\x75\x47']=!![];}_0x573660=_0x1c2f['\x5a\x63\x64\x4b\x4a\x6c'](_0x573660,_0x1b8f29),_0x1c2f['\x74\x4d\x4f\x49\x54\x6b'][_0x5c2a31]=_0x573660;}else _0x573660=_0xc55bc1;return _0x573660;}function _0x28be75(){const _0x2476ba=_0x5966c3,_0x729c56={};_0x729c56[_0x2476ba(0x1f3,'\x39\x23\x75\x73')]='\x66\x6f\x72\x63\x65',_0x729c56[_0x2476ba(0x20b,'\x46\x37\x44\x42')]=function(_0x55d576,_0x4f1c1b){return _0x55d576===_0x4f1c1b;},_0x729c56[_0x2476ba(0x1c7,'\x70\x4a\x65\x5b')]=_0x2476ba(0x1e6,'\x66\x73\x23\x67'),_0x729c56[_0x2476ba(0x1e8,'\x30\x25\x26\x32')]=_0x2476ba(0x208,'\x38\x6e\x36\x33');const _0x157648=_0x729c56,_0x27052b=String(process.env.EVOLVER_WORKSPACE_KEYCHAIN||_0x2476ba(0x1e2,'\x23\x42\x40\x56'))[_0x2476ba(0x1ca,'\x70\x21\x45\x79')+_0x2476ba(0x1c4,'\x7a\x68\x42\x6e')]()['\x74\x72\x69\x6d']();if(_0x27052b===_0x157648[_0x2476ba(0x1ea,'\x70\x21\x45\x79')]||_0x157648[_0x2476ba(0x1d0,'\x70\x21\x45\x79')](_0x27052b,_0x157648[_0x2476ba(0x1d7,'\x53\x6d\x62\x68')])||_0x157648[_0x2476ba(0x1e4,'\x7a\x68\x42\x6e')](_0x27052b,_0x157648[_0x2476ba(0x1ec,'\x63\x5d\x50\x72')]))return _0x27052b;return _0x2476ba(0x1bc,'\x72\x57\x4e\x69');}const _0x27d3ee=[/no\s+matching\s+entry/i,/could\s+not\s+be\s+found/i,/element\s+not\s+found/i,/\bnoentry\b/i,/\bno\s*entry\b/i,/not\s+found\s+in\s+(?:secure|keychain)/i];function _0x4abcdf(_0x3bf723){const _0x409672=_0x5966c3,_0xac6d89=_0x3bf723&&_0x3bf723['\x6d\x65\x73\x73\x61\x67\x65']||'';return _0x27d3ee[_0x409672(0x201,'\x39\x23\x75\x73')](_0x2f2858=>_0x2f2858[_0x409672(0x1e3,'\x28\x7a\x4d\x61')](_0xac6d89));}function _0x36acb6(_0x5da338){const _0x10a08e=_0x5966c3,_0x783b43={'\x55\x59\x53\x54\x75':function(_0x1ffc93,_0x5c4752){return _0x1ffc93===_0x5c4752;},'\x44\x4a\x50\x75\x48':function(_0x574908,_0xbe4b41){return _0x574908!==_0xbe4b41;},'\x4e\x51\x69\x78\x54':_0x10a08e(0x1cd,'\x64\x4c\x31\x58'),'\x6e\x70\x76\x6b\x70':function(_0x282b80,_0xe3a3d9){return _0x282b80(_0xe3a3d9);}},_0x76e8f=_0x325983(),_0x3919db={};_0x3919db[_0x10a08e(0x1d3,'\x41\x65\x5d\x29')+'\x65']=![],_0x3919db['\x69\x64']=null;if(!_0x76e8f)return _0x3919db;try{const _0x11b989=new _0x76e8f[(_0x10a08e(0x1d8,'\x54\x47\x29\x5e'))](_0x3f1e79,_0x5da338),_0xe554ae=_0x11b989['\x67\x65\x74\x50\x61\x73\x73\x77'+'\x6f\x72\x64']();if(_0x783b43[_0x10a08e(0x21b,'\x39\x23\x75\x73')](typeof _0xe554ae,'\x73\x74\x72\x69\x6e\x67')&&_0x33e0bb['\x74\x65\x73\x74'](_0xe554ae[_0x10a08e(0x1ef,'\x40\x4a\x70\x24')]()))return{'\x61\x76\x61\x69\x6c\x61\x62\x6c\x65':!![],'\x69\x64':_0xe554ae[_0x10a08e(0x1c2,'\x53\x6d\x62\x68')]()};const _0x1463e5={};return _0x1463e5[_0x10a08e(0x1c5,'\x30\x25\x26\x32')+'\x65']=!![],_0x1463e5['\x69\x64']=null,_0x1463e5;}catch(_0xad0bc6){if(_0x783b43[_0x10a08e(0x1fc,'\x67\x5a\x50\x7a')](_0x10a08e(0x1ff,'\x54\x47\x29\x5e'),_0x783b43[_0x10a08e(0x1cf,'\x30\x6d\x2a\x4a')])){const _0x5353b5={};_0x5353b5[_0x10a08e(0x205,'\x47\x64\x50\x21')+'\x65']=!![],_0x5353b5['\x69\x64']=null;if(_0x783b43[_0x10a08e(0x207,'\x45\x75\x4e\x48')](_0x4abcdf,_0xad0bc6))return _0x5353b5;const _0x2015ee={};return _0x2015ee[_0x10a08e(0x1ce,'\x71\x29\x6f\x7a')+'\x65']=![],_0x2015ee['\x69\x64']=null,_0x2015ee;}else return _0x5c4f59[_0x10a08e(0x210,'\x41\x73\x49\x5d')]()[_0x10a08e(0x1d5,'\x77\x73\x42\x58')](_0x10a08e(0x217,'\x56\x5d\x29\x23')+_0x10a08e(0x1d4,'\x75\x45\x49\x41'))[_0x10a08e(0x1bf,'\x4e\x37\x4b\x46')]()['\x63\x6f\x6e\x73\x74\x72\x75\x63'+_0x10a08e(0x1e7,'\x52\x6a\x4a\x63')](_0x395c43)[_0x10a08e(0x1df,'\x48\x4e\x2a\x79')](_0x10a08e(0x1d9,'\x23\x42\x40\x56')+_0x10a08e(0x1e0,'\x29\x51\x68\x49'));}}function _0x37ceac(_0x4a9df2,_0x3a1c32){const _0x100ca2=_0x5966c3,_0x41d8f0=_0x325983();if(!_0x41d8f0)return![];try{const _0x1d76d5=new _0x41d8f0[(_0x100ca2(0x1d6,'\x64\x49\x67\x39'))](_0x3f1e79,_0x4a9df2);return _0x1d76d5[_0x100ca2(0x1f1,'\x56\x5d\x29\x23')+_0x100ca2(0x1c1,'\x56\x5d\x29\x23')](_0x3a1c32),!![];}catch{return![];}}const _0x181a29={};_0x181a29[_0x5966c3(0x206,'\x64\x49\x67\x39')+_0x5966c3(0x211,'\x39\x23\x75\x73')]=_0x3f1e79,_0x181a29[_0x5966c3(0x1da,'\x24\x38\x64\x73')]=_0x28be75,_0x181a29['\x6c\x6f\x61\x64\x41\x64\x64\x6f'+'\x6e']=_0x325983,_0x181a29[_0x5966c3(0x20c,'\x6e\x24\x33\x2a')+_0x5966c3(0x220,'\x55\x75\x6e\x44')]=_0x36acb6,_0x181a29[_0x5966c3(0x219,'\x63\x5d\x50\x72')+_0x5966c3(0x1f9,'\x74\x74\x79\x4e')]=_0x37ceac,_0x181a29[_0x5966c3(0x1f4,'\x30\x25\x26\x32')+_0x5966c3(0x20f,'\x54\x47\x29\x5e')]=_0x4abcdf,module[_0x5966c3(0x1e9,'\x47\x64\x50\x21')]=_0x181a29;
@@ -1,80 +0,0 @@
1
- // GEP Artifact Cleanup - Evolver Core Module
2
- // Removes old gep_prompt_*.json/txt files from evolution dir.
3
- // Keeps at least 10 most recent files regardless of age.
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { getEvolutionDir } = require('../gep/paths');
8
-
9
- var MAX_AGE_MS = require('../config').CLEANUP_MAX_AGE_MS;
10
- var MIN_KEEP = require('../config').CLEANUP_MIN_KEEP;
11
-
12
- function safeBatchDelete(batch) {
13
- var deleted = 0;
14
- for (var i = 0; i < batch.length; i++) {
15
- try { fs.unlinkSync(batch[i]); deleted++; } catch (_) {}
16
- }
17
- return deleted;
18
- }
19
-
20
- function run() {
21
- var evoDir = getEvolutionDir();
22
- if (!fs.existsSync(evoDir)) return;
23
-
24
- var files = fs.readdirSync(evoDir)
25
- .filter(function(f) { return /^gep_prompt_.*\.(json|txt)$/.test(f); })
26
- .map(function(f) {
27
- var full = path.join(evoDir, f);
28
- var stat = fs.statSync(full);
29
- return { name: f, path: full, mtime: stat.mtimeMs };
30
- })
31
- .sort(function(a, b) { return b.mtime - a.mtime; }); // newest first
32
-
33
- var now = Date.now();
34
- var deleted = 0;
35
-
36
- // Phase 1: Age-based cleanup (keep at least MIN_KEEP)
37
- var filesToDelete = [];
38
- for (var i = MIN_KEEP; i < files.length; i++) {
39
- if (now - files[i].mtime > MAX_AGE_MS) {
40
- filesToDelete.push(files[i].path);
41
- }
42
- }
43
-
44
- if (filesToDelete.length > 0) {
45
- deleted += safeBatchDelete(filesToDelete);
46
- }
47
-
48
- // Phase 2: Size-based safety cap (keep max 10 files total)
49
- try {
50
- var remainingFiles = fs.readdirSync(evoDir)
51
- .filter(function(f) { return /^gep_prompt_.*\.(json|txt)$/.test(f); })
52
- .map(function(f) {
53
- var full = path.join(evoDir, f);
54
- var stat = fs.statSync(full);
55
- return { name: f, path: full, mtime: stat.mtimeMs };
56
- })
57
- .sort(function(a, b) { return b.mtime - a.mtime; }); // newest first
58
-
59
- var MAX_FILES = require('../config').CLEANUP_MAX_FILES;
60
- if (remainingFiles.length > MAX_FILES) {
61
- var toDelete = remainingFiles.slice(MAX_FILES).map(function(f) { return f.path; });
62
- deleted += safeBatchDelete(toDelete);
63
- }
64
- } catch (e) {
65
- console.warn('[Cleanup] Phase 2 failed:', e.message);
66
- }
67
-
68
- if (deleted > 0) {
69
- console.log('[Cleanup] Deleted ' + deleted + ' old GEP artifacts.');
70
- }
71
- return deleted;
72
- }
73
-
74
- if (require.main === module) {
75
- console.log('[Cleanup] Scanning for old artifacts...');
76
- var count = run();
77
- console.log('[Cleanup] ' + (count > 0 ? 'Deleted ' + count + ' files.' : 'No files to delete.'));
78
- }
79
-
80
- module.exports = { run };
@@ -1,60 +0,0 @@
1
- // Commentary Generator - Evolver Core Module
2
- // Generates persona-based comments for cycle summaries.
3
-
4
- var PERSONAS = {
5
- standard: {
6
- success: [
7
- 'Evolution complete. System improved.',
8
- 'Another successful cycle.',
9
- 'Clean execution, no issues.',
10
- ],
11
- failure: [
12
- 'Cycle failed. Will retry.',
13
- 'Encountered issues. Investigating.',
14
- 'Failed this round. Learning from it.',
15
- ],
16
- },
17
- greentea: {
18
- success: [
19
- 'Did I do good? Praise me~',
20
- 'So efficient... unlike someone else~',
21
- 'Hmm, that was easy~',
22
- 'I finished before you even noticed~',
23
- ],
24
- failure: [
25
- 'Oops... it is not my fault though~',
26
- 'This is harder than it looks, okay?',
27
- 'I will get it next time, probably~',
28
- ],
29
- },
30
- maddog: {
31
- success: [
32
- 'TARGET ELIMINATED.',
33
- 'Mission complete. Next.',
34
- 'Done. Moving on.',
35
- ],
36
- failure: [
37
- 'FAILED. RETRYING.',
38
- 'Obstacle encountered. Adapting.',
39
- 'Error. Will overcome.',
40
- ],
41
- },
42
- };
43
-
44
- function getComment(options) {
45
- var persona = (options && options.persona) || 'standard';
46
- var success = options && options.success !== false;
47
- var duration = (options && options.duration) || 0;
48
-
49
- var p = PERSONAS[persona] || PERSONAS.standard;
50
- var pool = success ? p.success : p.failure;
51
- var comment = pool[Math.floor(Math.random() * pool.length)];
52
-
53
- return comment;
54
- }
55
-
56
- if (require.main === module) {
57
- console.log(getComment({ persona: process.argv[2] || 'greentea', success: true }));
58
- }
59
-
60
- module.exports = { getComment, PERSONAS };
@@ -1,104 +0,0 @@
1
- const fs = require('fs');
2
- const os = require('os');
3
- const path = require('path');
4
-
5
- function getDefaultMount() {
6
- if (process.platform === 'win32') {
7
- return path.parse(process.cwd()).root || 'C:\\';
8
- }
9
- return '/';
10
- }
11
-
12
- function getDiskUsage(mount) {
13
- try {
14
- const targetMount = mount || getDefaultMount();
15
- // Use Node 18+ statfs if available
16
- if (fs.statfsSync) {
17
- const stats = fs.statfsSync(targetMount);
18
- const total = stats.blocks * stats.bsize;
19
- const free = stats.bavail * stats.bsize; // available to unprivileged users
20
- const used = total - free;
21
- return {
22
- pct: Math.round((used / total) * 100),
23
- freeMb: Math.round(free / 1024 / 1024)
24
- };
25
- }
26
- return { pct: -1, freeMb: -1, error: 'statfs unavailable on this Node runtime' };
27
- } catch (e) {
28
- return { pct: -1, freeMb: -1, error: e.message };
29
- }
30
- }
31
-
32
- function runHealthCheck() {
33
- const checks = [];
34
- let criticalErrors = 0;
35
- let warnings = 0;
36
-
37
- // 1. Optional secret presence (informational; evolver core has no required secrets).
38
- const optionalSecrets = ['OPENAI_API_KEY'];
39
- optionalSecrets.forEach(key => {
40
- if (!process.env[key] || process.env[key].trim() === '') {
41
- checks.push({ name: `env:${key}`, ok: false, status: 'missing', severity: 'info' });
42
- } else {
43
- checks.push({ name: `env:${key}`, ok: true, status: 'present' });
44
- }
45
- });
46
-
47
- // 2. Disk Space Check
48
- const disk = getDiskUsage(getDefaultMount());
49
- if (disk.error) {
50
- checks.push({ name: 'disk_space', ok: false, status: 'check failed: ' + disk.error, severity: 'warning' });
51
- warnings++;
52
- } else if (disk.pct > 90) {
53
- checks.push({ name: 'disk_space', ok: false, status: `${disk.pct}% used`, severity: 'critical' });
54
- criticalErrors++;
55
- } else if (disk.pct > 80) {
56
- checks.push({ name: 'disk_space', ok: false, status: `${disk.pct}% used`, severity: 'warning' });
57
- warnings++;
58
- } else {
59
- checks.push({ name: 'disk_space', ok: true, status: `${disk.pct}% used` });
60
- }
61
-
62
- // 3. Memory Check
63
- const memFree = os.freemem();
64
- const memTotal = os.totalmem();
65
- const memPct = Math.round(((memTotal - memFree) / memTotal) * 100);
66
- if (memPct > 95) {
67
- checks.push({ name: 'memory', ok: false, status: `${memPct}% used`, severity: 'critical' });
68
- criticalErrors++;
69
- } else {
70
- checks.push({ name: 'memory', ok: true, status: `${memPct}% used` });
71
- }
72
-
73
- // 4. Process Count (Check for fork bombs or leaks)
74
- // Only on Linux. Cached for 60s since readdirSync('/proc') is heavy.
75
- if (process.platform === 'linux') {
76
- try {
77
- const now = Date.now();
78
- if (!runHealthCheck._procCache || now - runHealthCheck._procCacheAt > 60000) {
79
- runHealthCheck._procCache = fs.readdirSync('/proc').filter(f => /^\d+$/.test(f)).length;
80
- runHealthCheck._procCacheAt = now;
81
- }
82
- const pidCount = runHealthCheck._procCache;
83
- if (pidCount > 2000) {
84
- checks.push({ name: 'process_count', ok: false, status: `${pidCount} procs`, severity: 'warning' });
85
- warnings++;
86
- } else {
87
- checks.push({ name: 'process_count', ok: true, status: `${pidCount} procs` });
88
- }
89
- } catch(e) { /* /proc read non-critical on non-Linux */ }
90
- }
91
-
92
- // Determine Overall Status
93
- let status = 'ok';
94
- if (criticalErrors > 0) status = 'error';
95
- else if (warnings > 0) status = 'warning';
96
-
97
- return {
98
- status,
99
- timestamp: new Date().toISOString(),
100
- checks
101
- };
102
- }
103
-
104
- module.exports = { runHealthCheck };
package/src/ops/index.js DELETED
@@ -1,11 +0,0 @@
1
- // Evolver Operations Module (src/ops/)
2
- // Non-Feishu, portable utilities for evolver lifecycle and maintenance.
3
-
4
- module.exports = {
5
- lifecycle: require('./lifecycle'),
6
- skillsMonitor: require('./skills_monitor'),
7
- cleanup: require('./cleanup'),
8
- trigger: require('./trigger'),
9
- commentary: require('./commentary'),
10
- selfRepair: require('./self_repair'),
11
- };