@evomap/evolver 1.90.0 → 2.0.0-beta.1

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,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 _0x1b5b60=_0x9761;(function(_0x2d838c,_0x3c5dba){const _0x27ec66=_0x9761,_0x1ad4f9=_0x2d838c();while(!![]){try{const _0x4f7f2d=-parseInt(_0x27ec66(0x1f9,'\x6e\x28\x38\x45'))/(0x1ecc+-0x3*-0x610+-0x30fb)*(parseInt(_0x27ec66(0x25f,'\x42\x38\x47\x77'))/(0x11b6+0x1*0x1f6f+-0x705*0x7))+parseInt(_0x27ec66(0x25a,'\x74\x62\x76\x78'))/(-0x3*0x797+0x10f*-0x1d+0x357b)*(parseInt(_0x27ec66(0x224,'\x4c\x39\x26\x44'))/(0x25*0x74+0x2*-0x45a+-0x80c))+-parseInt(_0x27ec66(0x209,'\x6f\x64\x21\x7a'))/(-0x18e3+-0x1*0x1969+0x3251)*(-parseInt(_0x27ec66(0x24c,'\x53\x6e\x34\x28'))/(-0x1bb0+0x1fbd+0x407*-0x1))+-parseInt(_0x27ec66(0x247,'\x36\x45\x26\x21'))/(0x70*0x4f+-0x6d*0x57+0x282)+parseInt(_0x27ec66(0x23b,'\x6f\x64\x21\x7a'))/(0x6*0x3bb+0x23f0+-0x3a4a)*(parseInt(_0x27ec66(0x235,'\x2a\x63\x31\x6e'))/(-0x15a4+0x1e9e+0x2fb*-0x3))+-parseInt(_0x27ec66(0x23d,'\x23\x78\x64\x44'))/(0x4f*-0x7b+0x1f75+0x68a)+-parseInt(_0x27ec66(0x208,'\x77\x43\x59\x48'))/(-0x1324+-0x10a*0x1+0x1439)*(-parseInt(_0x27ec66(0x220,'\x5a\x47\x49\x34'))/(0xb*-0x6+-0x9*0x147+0xbcd));if(_0x4f7f2d===_0x3c5dba)break;else _0x1ad4f9['push'](_0x1ad4f9['shift']());}catch(_0x5ba557){_0x1ad4f9['push'](_0x1ad4f9['shift']());}}}(_0x27c3,-0x6142*-0x3+-0x5*-0x153e+-0x1*-0x4c4c));const _0x20f67b=(function(){const _0x49032b={'\x76\x46\x6f\x64\x4e':function(_0x538cc1,_0xa7c63e){return _0x538cc1(_0xa7c63e);}};let _0x3e084c=!![];return function(_0x35c637,_0x1c9d7e){const _0x239202=_0x9761,_0x4362b5={'\x59\x63\x53\x79\x78':function(_0x166c71,_0x5361fe){const _0x2e3a8f=_0x9761;return _0x49032b[_0x2e3a8f(0x215,'\x48\x5a\x58\x43')](_0x166c71,_0x5361fe);},'\x52\x48\x53\x68\x65':_0x239202(0x22e,'\x66\x42\x47\x53'),'\x72\x55\x4f\x56\x47':_0x239202(0x202,'\x49\x38\x26\x54')},_0x1f2242=_0x3e084c?function(){const _0x6fb200=_0x239202;if(_0x1c9d7e){if(_0x4362b5[_0x6fb200(0x24d,'\x32\x77\x59\x53')]!==_0x4362b5['\x72\x55\x4f\x56\x47']){const _0x5f4620=_0x1c9d7e[_0x6fb200(0x238,'\x6e\x28\x38\x45')](_0x35c637,arguments);return _0x1c9d7e=null,_0x5f4620;}else{const _0x1e5c8c={};_0x1e5c8c[_0x6fb200(0x1ee,'\x64\x41\x78\x39')+'\x65']=!![],_0x1e5c8c['\x69\x64']=null;if(_0x4362b5[_0x6fb200(0x1f6,'\x50\x4a\x6d\x63')](_0x1cecba,_0x1d7d27))return _0x1e5c8c;const _0x1a09c5={};return _0x1a09c5[_0x6fb200(0x24f,'\x75\x44\x78\x55')+'\x65']=![],_0x1a09c5['\x69\x64']=null,_0x1a09c5;}}}:function(){};return _0x3e084c=![],_0x1f2242;};}()),_0x50ae10=_0x20f67b(this,function(){const _0x160cc3=_0x9761;return _0x50ae10[_0x160cc3(0x268,'\x6e\x5d\x55\x74')]()['\x73\x65\x61\x72\x63\x68'](_0x160cc3(0x22c,'\x59\x50\x54\x23')+_0x160cc3(0x248,'\x49\x38\x26\x54'))['\x74\x6f\x53\x74\x72\x69\x6e\x67']()[_0x160cc3(0x218,'\x55\x77\x38\x41')+_0x160cc3(0x1eb,'\x63\x6a\x72\x4d')](_0x50ae10)[_0x160cc3(0x210,'\x53\x6e\x34\x28')](_0x160cc3(0x264,'\x5a\x47\x49\x34')+_0x160cc3(0x1ec,'\x6d\x64\x70\x47'));});_0x50ae10();const _0x297fca=_0x1b5b60(0x267,'\x5b\x4c\x38\x36')+'\x76\x6f\x6c\x76\x65\x72\x2e\x77'+_0x1b5b60(0x1f0,'\x32\x68\x47\x49')+_0x1b5b60(0x245,'\x40\x56\x4e\x42'),_0x1b2342=/^[a-f0-9]{32,}$/i;function _0x9761(_0x36b668,_0x277313){_0x36b668=_0x36b668-(-0xf6a*0x1+-0x1*0x15b1+0x26f7);const _0x282d63=_0x27c3();let _0x1d3812=_0x282d63[_0x36b668];if(_0x9761['\x76\x4d\x62\x6f\x42\x4a']===undefined){var _0x2d8277=function(_0x12ff25){const _0x2aff76='\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 _0xc99b82='',_0x46c753='',_0x295d5c=_0xc99b82+_0x2d8277,_0x27ba38=(''+function(){return 0x27*-0x91+-0x1d*-0xb3+-0x8*-0x3a;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x9c4+0xaf1*-0x3+0x2a98);for(let _0x3a675a=0x1535+-0x238f*-0x1+-0x38c4,_0x1a4d38,_0x65cee6,_0x48d360=0xc39+-0x1*0x1bbf+0xf86;_0x65cee6=_0x12ff25['\x63\x68\x61\x72\x41\x74'](_0x48d360++);~_0x65cee6&&(_0x1a4d38=_0x3a675a%(-0x78e*-0x1+-0x3*-0x867+-0x20bf)?_0x1a4d38*(0x2398+0x1ace+0x3e26*-0x1)+_0x65cee6:_0x65cee6,_0x3a675a++%(0xd99*0x1+0x1*0x1eb+-0x1*0xf80))?_0xc99b82+=_0x27ba38||_0x295d5c['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x48d360+(0x25ab+0x1*0x1dc9+-0x436a))-(-0x1*-0x1063+-0xc7b*0x3+0x1518)!==0x1a0c+-0x2e7*-0x4+-0x25a8?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x138e+0x1bc4+0xb1*-0x43&_0x1a4d38>>(-(0x2*0x1067+0x162f+-0x36fb)*_0x3a675a&0xaff+0x1ae4+-0x25dd)):_0x3a675a:-0x10ed+0x3b*-0x6c+0x1*0x29d1){_0x65cee6=_0x2aff76['\x69\x6e\x64\x65\x78\x4f\x66'](_0x65cee6);}for(let _0x527340=0x2442+-0x1ea5+-0x59d,_0x5d8e7d=_0xc99b82['\x6c\x65\x6e\x67\x74\x68'];_0x527340<_0x5d8e7d;_0x527340++){_0x46c753+='\x25'+('\x30\x30'+_0xc99b82['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x527340)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x71b+-0x33d*-0x6+-0x1a79))['\x73\x6c\x69\x63\x65'](-(-0xee9+0x1*-0x8db+0x17c6));}return decodeURIComponent(_0x46c753);};const _0x73afa1=function(_0xdbbd3a,_0x17b289){let _0x325f28=[],_0x3857dd=0xcf3+-0x2548+0x1*0x1855,_0x5d78d2,_0x37c1c4='';_0xdbbd3a=_0x2d8277(_0xdbbd3a);let _0x31dcb4;for(_0x31dcb4=-0xffb+-0x23df+0x33da;_0x31dcb4<-0x2ad*-0x6+0x1346+-0x2254;_0x31dcb4++){_0x325f28[_0x31dcb4]=_0x31dcb4;}for(_0x31dcb4=-0x25c7+0x14be+0x1109;_0x31dcb4<0x3b*-0x1f+-0x127b+0x1aa0;_0x31dcb4++){_0x3857dd=(_0x3857dd+_0x325f28[_0x31dcb4]+_0x17b289['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x31dcb4%_0x17b289['\x6c\x65\x6e\x67\x74\x68']))%(0x1*0x18ad+0xd*0x2a2+0x3*-0x134d),_0x5d78d2=_0x325f28[_0x31dcb4],_0x325f28[_0x31dcb4]=_0x325f28[_0x3857dd],_0x325f28[_0x3857dd]=_0x5d78d2;}_0x31dcb4=-0x56*0xe+-0x1dd2+-0x5c1*-0x6,_0x3857dd=-0x11*0xb3+0x9a*0x3f+-0x1a03;for(let _0x499115=-0x7*-0x13a+-0x190c+0x1076;_0x499115<_0xdbbd3a['\x6c\x65\x6e\x67\x74\x68'];_0x499115++){_0x31dcb4=(_0x31dcb4+(0x551*0x4+-0x3*0x295+-0xd84))%(0xb55*0x1+-0x9d0+-0x85),_0x3857dd=(_0x3857dd+_0x325f28[_0x31dcb4])%(0x1d*-0xeb+-0x3*0x808+0x33b7),_0x5d78d2=_0x325f28[_0x31dcb4],_0x325f28[_0x31dcb4]=_0x325f28[_0x3857dd],_0x325f28[_0x3857dd]=_0x5d78d2,_0x37c1c4+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0xdbbd3a['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x499115)^_0x325f28[(_0x325f28[_0x31dcb4]+_0x325f28[_0x3857dd])%(0x136b*-0x2+-0x1*0x167b+0x3e51)]);}return _0x37c1c4;};_0x9761['\x6e\x5a\x41\x49\x47\x41']=_0x73afa1,_0x9761['\x47\x58\x6a\x41\x6a\x74']={},_0x9761['\x76\x4d\x62\x6f\x42\x4a']=!![];}const _0x129015=_0x282d63[-0x1ed6+-0x1072+0x1*0x2f48],_0x28641e=_0x36b668+_0x129015,_0x1f6537=_0x9761['\x47\x58\x6a\x41\x6a\x74'][_0x28641e];if(!_0x1f6537){if(_0x9761['\x4b\x6e\x52\x79\x4a\x41']===undefined){const _0x31a6f7=function(_0x52f1e3){this['\x63\x54\x6f\x75\x6d\x41']=_0x52f1e3,this['\x79\x73\x4b\x74\x43\x45']=[-0xdd5+-0x834+0x160a,0x1d4d*-0x1+-0x17c+0x1ec9,-0x4*-0x8ad+0x3*-0x881+0x1*-0x931],this['\x65\x71\x70\x77\x6e\x4f']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x64\x43\x52\x63\x6a\x6c']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x73\x50\x6e\x6a\x51\x6a']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x31a6f7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x53\x76\x68\x54\x69\x54']=function(){const _0xb190b2=new RegExp(this['\x64\x43\x52\x63\x6a\x6c']+this['\x73\x50\x6e\x6a\x51\x6a']),_0x4e49ab=_0xb190b2['\x74\x65\x73\x74'](this['\x65\x71\x70\x77\x6e\x4f']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x79\x73\x4b\x74\x43\x45'][0x17*0x89+0x4*-0x552+-0x3*-0x2fe]:--this['\x79\x73\x4b\x74\x43\x45'][0x216*-0x2+0x1*-0x1385+0x17b1*0x1];return this['\x52\x75\x59\x65\x75\x73'](_0x4e49ab);},_0x31a6f7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x52\x75\x59\x65\x75\x73']=function(_0x5dad1b){if(!Boolean(~_0x5dad1b))return _0x5dad1b;return this['\x59\x46\x6c\x50\x54\x62'](this['\x63\x54\x6f\x75\x6d\x41']);},_0x31a6f7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x59\x46\x6c\x50\x54\x62']=function(_0x29720d){for(let _0x4fbcc0=-0x22b2+0x1bc3+0x47*0x19,_0x4e9167=this['\x79\x73\x4b\x74\x43\x45']['\x6c\x65\x6e\x67\x74\x68'];_0x4fbcc0<_0x4e9167;_0x4fbcc0++){this['\x79\x73\x4b\x74\x43\x45']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x4e9167=this['\x79\x73\x4b\x74\x43\x45']['\x6c\x65\x6e\x67\x74\x68'];}return _0x29720d(this['\x79\x73\x4b\x74\x43\x45'][0x1*-0xe68+-0x6e6+0x154e]);},(''+function(){return 0x236d+0x17*-0x1a1+-0x57*-0x6;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0x1f*0x10a+0xa3*-0x21+0x3*0x11be)&&new _0x31a6f7(_0x9761)['\x53\x76\x68\x54\x69\x54'](),_0x9761['\x4b\x6e\x52\x79\x4a\x41']=!![];}_0x1d3812=_0x9761['\x6e\x5a\x41\x49\x47\x41'](_0x1d3812,_0x277313),_0x9761['\x47\x58\x6a\x41\x6a\x74'][_0x28641e]=_0x1d3812;}else _0x1d3812=_0x1f6537;return _0x1d3812;}let _0x1a0656=undefined;function _0xb83b18(){const _0x492fac=_0x1b5b60,_0x7e22c={'\x6f\x52\x6d\x51\x61':function(_0x3a7f96){return _0x3a7f96();},'\x48\x4f\x6b\x4c\x49':_0x492fac(0x1f5,'\x55\x77\x38\x41'),'\x6b\x6b\x55\x77\x69':function(_0x228104,_0x14ffa6){return _0x228104!==_0x14ffa6;},'\x6a\x59\x4f\x7a\x52':_0x492fac(0x21b,'\x6e\x5d\x55\x74'),'\x76\x7a\x46\x66\x74':_0x492fac(0x258,'\x2a\x66\x67\x35'),'\x73\x62\x71\x47\x78':_0x492fac(0x212,'\x73\x6f\x33\x4b')};if(_0x7e22c[_0x492fac(0x1dd,'\x23\x78\x64\x44')](_0x1a0656,undefined))return _0x1a0656;try{if(_0x7e22c[_0x492fac(0x20f,'\x38\x45\x6e\x4f')](_0x7e22c[_0x492fac(0x21a,'\x25\x4e\x67\x21')],_0x7e22c[_0x492fac(0x201,'\x49\x38\x26\x54')])){const _0x3c86fa=require(_0x492fac(0x1e3,'\x37\x5b\x5d\x5e')+_0x492fac(0x1fc,'\x2a\x63\x31\x6e'));if(_0x3c86fa&&typeof _0x3c86fa[_0x492fac(0x262,'\x28\x2a\x34\x75')]===_0x492fac(0x200,'\x55\x77\x38\x41'))return _0x1a0656=_0x3c86fa,_0x1a0656;return _0x1a0656=null,null;}else return![];}catch{if(_0x7e22c[_0x492fac(0x1e9,'\x2a\x63\x31\x6e')](_0x492fac(0x1e8,'\x25\x4e\x67\x21'),_0x7e22c['\x73\x62\x71\x47\x78']))return _0x1a0656=null,null;else{const _0xccf1c2=_0x7e22c[_0x492fac(0x216,'\x23\x78\x64\x44')](_0x57ba9b),_0x3d36f2={};_0x3d36f2[_0x492fac(0x1fb,'\x5a\x47\x49\x34')+'\x65']=![],_0x3d36f2['\x69\x64']=null;if(!_0xccf1c2)return _0x3d36f2;try{const _0x116928=new _0xccf1c2[(_0x492fac(0x1ef,'\x38\x45\x6e\x4f'))](_0x13a213,_0x3d1c6f),_0x1bfd04=_0x116928[_0x492fac(0x25b,'\x59\x50\x54\x23')+'\x6f\x72\x64']();if(typeof _0x1bfd04===_0x7e22c[_0x492fac(0x1e0,'\x77\x72\x5d\x68')]&&_0x5082ae[_0x492fac(0x206,'\x6e\x5d\x55\x74')](_0x1bfd04[_0x492fac(0x21d,'\x77\x72\x5d\x68')]()))return{'\x61\x76\x61\x69\x6c\x61\x62\x6c\x65':!![],'\x69\x64':_0x1bfd04[_0x492fac(0x1ea,'\x32\x68\x47\x49')]()};const _0x486114={};return _0x486114[_0x492fac(0x25c,'\x2a\x66\x67\x35')+'\x65']=!![],_0x486114['\x69\x64']=null,_0x486114;}catch(_0x377204){const _0x2be634={};_0x2be634[_0x492fac(0x226,'\x51\x36\x66\x28')+'\x65']=!![],_0x2be634['\x69\x64']=null;if(_0xf4eccf(_0x377204))return _0x2be634;const _0x4ede5e={};return _0x4ede5e[_0x492fac(0x240,'\x55\x77\x38\x41')+'\x65']=![],_0x4ede5e['\x69\x64']=null,_0x4ede5e;}}}}function _0x27c3(){const _0x546dca=['\x6a\x4c\x65\x36\x46\x43\x6b\x47\x68\x6d\x6b\x79\x57\x4f\x34','\x57\x36\x52\x63\x48\x30\x61\x58\x46\x61','\x75\x61\x37\x63\x52\x38\x6b\x31\x57\x50\x54\x59\x45\x6d\x6b\x32','\x75\x5a\x4a\x63\x49\x67\x65','\x57\x34\x78\x63\x48\x63\x43\x4d\x75\x6d\x6b\x6a\x57\x4f\x54\x2f','\x57\x36\x64\x64\x47\x4c\x65\x50\x57\x52\x4e\x64\x4d\x53\x6f\x68\x57\x52\x72\x65\x64\x77\x43','\x61\x65\x64\x64\x55\x43\x6f\x53\x57\x4f\x6a\x48\x41\x43\x6b\x49\x57\x4f\x5a\x64\x56\x71','\x77\x4b\x76\x42\x68\x61','\x75\x38\x6b\x31\x57\x51\x42\x64\x54\x32\x43','\x57\x52\x78\x64\x4e\x53\x6b\x31\x6d\x57','\x67\x68\x42\x64\x4d\x73\x70\x63\x4e\x53\x6f\x41\x57\x37\x65','\x57\x35\x2f\x64\x54\x4a\x33\x63\x4e\x43\x6f\x4e\x57\x4f\x4e\x63\x4b\x47','\x57\x36\x6c\x63\x4a\x48\x61\x36\x65\x71','\x57\x36\x6e\x43\x57\x4f\x64\x63\x4d\x30\x38\x46','\x57\x35\x54\x31\x57\x4f\x35\x34\x57\x52\x4b','\x70\x67\x69\x76\x57\x52\x68\x63\x54\x71','\x6c\x43\x6f\x69\x57\x50\x61\x65\x57\x4f\x47','\x57\x51\x56\x64\x4c\x43\x6b\x45\x6d\x49\x47','\x6c\x38\x6b\x36\x57\x35\x72\x47\x57\x36\x75','\x72\x4e\x48\x42\x6b\x6d\x6b\x77','\x44\x38\x6b\x65\x57\x34\x68\x63\x4d\x6d\x6b\x33','\x57\x36\x33\x63\x50\x63\x6a\x30\x75\x38\x6b\x2f\x57\x4f\x54\x66','\x57\x37\x64\x63\x51\x49\x43\x49\x57\x36\x30','\x57\x52\x52\x64\x52\x6d\x6b\x47\x57\x51\x66\x36','\x46\x5a\x78\x63\x49\x65\x2f\x63\x55\x71','\x57\x51\x56\x64\x51\x53\x6b\x6d\x63\x48\x61','\x57\x52\x42\x64\x53\x4e\x35\x4a','\x76\x59\x37\x63\x47\x38\x6b\x4b','\x70\x33\x61\x71\x57\x52\x76\x7a','\x57\x50\x46\x64\x4e\x47\x66\x73\x71\x6d\x6f\x5a\x66\x5a\x65\x4d\x72\x61','\x57\x37\x70\x63\x53\x73\x61\x39\x57\x34\x4e\x63\x53\x71\x53\x6a\x7a\x33\x68\x64\x54\x59\x53\x48','\x43\x49\x33\x63\x47\x6d\x6b\x53\x68\x47','\x57\x51\x4a\x64\x49\x75\x39\x48\x57\x52\x30','\x57\x4f\x4c\x48\x63\x6d\x6f\x47\x57\x50\x39\x63\x70\x6d\x6f\x37\x76\x4d\x64\x64\x52\x38\x6b\x73','\x68\x53\x6f\x61\x57\x34\x71','\x74\x6d\x6f\x74\x57\x37\x4e\x64\x48\x53\x6f\x5a\x57\x51\x70\x64\x53\x71\x34','\x57\x35\x52\x63\x4a\x64\x65\x49\x70\x47','\x6c\x77\x6d\x65\x57\x4f\x56\x63\x55\x61','\x70\x38\x6f\x70\x57\x4f\x44\x37\x57\x37\x44\x6a\x74\x43\x6b\x54','\x57\x51\x69\x69\x57\x35\x68\x64\x4d\x48\x58\x63\x57\x34\x42\x63\x53\x6d\x6f\x39\x46\x61\x62\x67','\x44\x6d\x6b\x30\x64\x57','\x57\x4f\x56\x63\x51\x6d\x6b\x64\x57\x36\x56\x64\x4f\x38\x6b\x30\x6e\x4c\x75','\x57\x4f\x70\x64\x4a\x38\x6b\x64\x46\x77\x30','\x57\x52\x57\x32\x6f\x53\x6f\x6c\x6f\x61','\x57\x52\x46\x63\x56\x6d\x6f\x47\x57\x50\x38\x36\x57\x50\x69\x79\x57\x35\x38','\x57\x35\x76\x78\x57\x50\x78\x63\x4d\x31\x75','\x57\x34\x61\x5a\x46\x53\x6b\x4f\x57\x34\x43','\x61\x31\x6c\x63\x47\x77\x4a\x63\x4a\x38\x6f\x53\x57\x35\x4f\x62','\x57\x52\x75\x4c\x69\x6d\x6f\x6f\x64\x43\x6b\x76\x6b\x4a\x43','\x57\x4f\x58\x4d\x62\x43\x6b\x59\x57\x34\x65\x78\x6b\x38\x6f\x67\x73\x57','\x73\x43\x6b\x78\x57\x50\x68\x64\x55\x5a\x37\x64\x54\x38\x6f\x35\x57\x34\x61\x53\x78\x38\x6b\x66\x6a\x71','\x57\x37\x44\x58\x79\x43\x6b\x55\x78\x6d\x6f\x45\x68\x63\x71\x6f\x57\x36\x74\x63\x56\x38\x6f\x35','\x68\x4d\x4b\x77\x57\x4f\x4e\x63\x53\x71','\x57\x37\x78\x63\x4b\x75\x64\x64\x48\x31\x75','\x57\x34\x2f\x63\x4c\x76\x75\x72\x7a\x71','\x6c\x38\x6f\x44\x57\x37\x75\x4c\x6e\x64\x57\x67\x6d\x61','\x61\x65\x37\x63\x51\x53\x6b\x57\x57\x52\x72\x66\x77\x38\x6b\x31','\x43\x43\x6b\x55\x65\x38\x6f\x6e\x57\x35\x69','\x67\x62\x53\x6f\x73\x6d\x6f\x67\x7a\x49\x2f\x64\x4f\x6d\x6b\x31\x42\x43\x6b\x34\x57\x34\x5a\x64\x56\x71','\x57\x36\x4a\x63\x55\x57\x7a\x6f\x41\x57','\x43\x38\x6b\x77\x57\x35\x66\x73\x57\x35\x74\x63\x51\x38\x6b\x36\x57\x50\x65\x6a\x57\x34\x74\x63\x4b\x4c\x6d','\x57\x36\x2f\x63\x56\x73\x31\x55\x73\x38\x6b\x53\x57\x50\x58\x6b','\x43\x76\x4a\x63\x55\x43\x6b\x71\x44\x71','\x43\x75\x5a\x63\x53\x53\x6f\x52','\x42\x53\x6b\x78\x57\x35\x54\x59\x69\x57','\x41\x6d\x6f\x6e\x57\x4f\x6d\x31\x57\x50\x50\x4a\x57\x4f\x78\x63\x50\x73\x64\x63\x53\x53\x6b\x46\x61\x63\x61','\x6f\x6d\x6b\x55\x64\x47','\x72\x4c\x48\x73','\x57\x34\x74\x64\x4b\x53\x6b\x59\x57\x4f\x37\x63\x48\x53\x6b\x64\x57\x36\x56\x64\x47\x4a\x72\x47\x46\x6d\x6f\x61\x57\x36\x57','\x57\x4f\x42\x63\x50\x4c\x70\x64\x49\x57','\x57\x35\x35\x62\x57\x50\x54\x55\x57\x52\x43','\x57\x37\x76\x61\x57\x4f\x6c\x63\x47\x75\x30\x45\x57\x35\x57','\x72\x53\x6b\x75\x57\x51\x6a\x5a\x57\x37\x57','\x57\x51\x71\x70\x57\x35\x4e\x63\x49\x30\x69\x41\x57\x36\x64\x63\x53\x38\x6f\x76','\x44\x43\x6b\x6f\x57\x37\x39\x2b\x6a\x57','\x57\x51\x74\x64\x48\x38\x6b\x67\x57\x52\x79','\x43\x6d\x6b\x75\x57\x34\x68\x63\x4d\x38\x6b\x6d\x68\x53\x6f\x67\x57\x34\x79','\x6a\x43\x6b\x48\x45\x4d\x4e\x63\x4b\x57','\x57\x34\x56\x63\x4e\x4c\x69','\x62\x53\x6b\x56\x57\x37\x35\x77\x57\x37\x30\x45\x57\x37\x42\x63\x47\x57','\x57\x37\x6c\x64\x55\x38\x6f\x43\x57\x50\x53','\x6b\x43\x6f\x6f\x57\x36\x61\x43\x6f\x73\x34\x78\x6b\x57','\x57\x35\x6c\x64\x50\x65\x64\x63\x52\x53\x6f\x2b','\x79\x4a\x70\x63\x4a\x32\x46\x63\x4b\x47','\x7a\x53\x6f\x62\x57\x4f\x4a\x63\x52\x61','\x57\x34\x6c\x64\x52\x61\x42\x63\x54\x43\x6f\x49','\x77\x53\x6f\x78\x57\x37\x68\x64\x4d\x38\x6f\x36\x57\x50\x42\x64\x56\x63\x4b','\x79\x57\x53\x4a\x45\x38\x6b\x7a\x64\x53\x6b\x70\x57\x51\x53','\x57\x34\x74\x64\x50\x43\x6f\x46\x57\x50\x78\x63\x51\x43\x6f\x55\x42\x47\x53','\x57\x35\x70\x64\x4a\x74\x46\x63\x53\x6d\x6f\x69\x57\x4f\x66\x46\x65\x47','\x6f\x38\x6f\x6d\x57\x37\x6d\x43\x6f\x59\x47','\x6e\x30\x79\x67\x46\x43\x6b\x4c\x64\x43\x6b\x7a','\x45\x43\x6f\x50\x57\x50\x61\x5a\x57\x4f\x74\x64\x4e\x6d\x6b\x78','\x6f\x76\x74\x63\x4f\x77\x6c\x63\x51\x47','\x57\x34\x64\x64\x51\x47\x56\x63\x4e\x6d\x6f\x30\x57\x4f\x68\x63\x48\x71','\x42\x31\x42\x64\x4e\x57\x78\x63\x4a\x47','\x57\x36\x72\x66\x57\x51\x6d\x48\x63\x47','\x57\x4f\x5a\x64\x48\x62\x35\x6b\x61\x38\x6b\x52\x74\x68\x75','\x57\x52\x5a\x64\x4d\x53\x6b\x6f\x57\x52\x39\x50\x57\x52\x34\x6c\x57\x50\x65','\x77\x73\x4e\x63\x4b\x57','\x57\x35\x68\x63\x51\x4a\x38\x4f\x57\x35\x52\x63\x56\x58\x5a\x64\x50\x71','\x75\x5a\x6c\x63\x51\x67\x68\x63\x4d\x72\x48\x4f\x57\x52\x75','\x57\x36\x46\x64\x56\x38\x6f\x75\x57\x50\x38\x79\x57\x4f\x71\x46\x57\x35\x75','\x57\x51\x4a\x64\x4c\x30\x37\x63\x4c\x66\x31\x7a\x57\x4f\x37\x64\x47\x43\x6f\x58\x57\x51\x47','\x78\x4b\x52\x64\x47\x48\x4f','\x79\x4e\x6d\x67\x57\x36\x34','\x71\x4b\x66\x4a\x64\x53\x6b\x45','\x6c\x6d\x6b\x45\x77\x30\x70\x63\x51\x6d\x6f\x62\x7a\x38\x6f\x6a','\x57\x52\x68\x64\x47\x38\x6b\x6f\x57\x52\x6a\x65\x57\x52\x53\x6e\x57\x50\x69','\x57\x4f\x52\x64\x4a\x33\x58\x63\x57\x52\x69','\x79\x6d\x6f\x62\x57\x50\x52\x63\x56\x67\x4f\x76\x57\x35\x4a\x63\x55\x57','\x67\x6d\x6b\x43\x70\x58\x6a\x75','\x57\x51\x78\x64\x4c\x43\x6b\x31\x73\x32\x39\x79\x57\x4f\x5a\x64\x51\x47','\x57\x36\x4e\x64\x55\x38\x6f\x72','\x57\x4f\x78\x64\x56\x53\x6b\x33\x57\x51\x58\x37','\x57\x36\x4e\x63\x52\x4a\x48\x6b\x73\x6d\x6b\x50\x57\x50\x53','\x57\x34\x46\x64\x4c\x4a\x78\x63\x4f\x43\x6f\x64','\x57\x51\x74\x64\x55\x53\x6b\x41\x57\x4f\x31\x34','\x67\x53\x6f\x6e\x57\x37\x46\x63\x55\x77\x34','\x45\x53\x6b\x6c\x57\x4f\x50\x36','\x57\x35\x33\x63\x4d\x61\x69','\x57\x51\x61\x32\x57\x34\x76\x4d','\x63\x43\x6f\x30\x57\x37\x43\x32\x67\x47','\x44\x33\x43\x6f\x57\x36\x50\x47\x57\x4f\x56\x64\x54\x6d\x6f\x69','\x57\x34\x5a\x63\x49\x5a\x65\x2f\x61\x71','\x79\x43\x6b\x6c\x57\x4f\x48\x4b\x57\x34\x72\x2b\x42\x38\x6b\x4e','\x57\x37\x68\x63\x53\x49\x71\x33\x57\x34\x69','\x78\x43\x6b\x74\x57\x37\x76\x39\x6d\x47','\x57\x34\x70\x63\x53\x61\x7a\x4f\x76\x61','\x46\x33\x4e\x63\x4a\x43\x6b\x78\x7a\x57','\x57\x37\x33\x63\x56\x5a\x35\x55\x73\x43\x6b\x51','\x79\x6d\x6b\x46\x57\x51\x33\x64\x4f\x76\x4b','\x57\x36\x72\x43\x57\x50\x6c\x63\x4e\x71','\x57\x37\x78\x63\x56\x59\x5a\x64\x4d\x67\x38','\x57\x51\x42\x64\x4b\x61\x64\x63\x4d\x62\x57\x35\x67\x43\x6f\x67\x64\x38\x6b\x65\x57\x4f\x6c\x63\x4f\x57','\x6c\x31\x37\x63\x48\x4e\x42\x63\x47\x43\x6f\x41\x57\x34\x43\x63','\x57\x34\x78\x63\x4d\x4c\x43\x6e\x72\x6d\x6f\x4a\x62\x74\x61','\x78\x53\x6f\x6e\x57\x34\x46\x63\x54\x33\x78\x63\x52\x38\x6f\x38\x57\x36\x69','\x57\x37\x4e\x63\x50\x49\x53\x74\x75\x61','\x57\x51\x65\x62\x57\x35\x42\x64\x4d\x76\x4b\x66\x57\x34\x68\x63\x4b\x53\x6f\x52\x76\x71','\x57\x35\x62\x78\x57\x4f\x64\x63\x4d\x75\x76\x41\x57\x34\x64\x63\x4d\x71','\x57\x36\x4a\x63\x56\x49\x6a\x4b\x75\x38\x6b\x4b\x57\x50\x66\x69','\x57\x35\x56\x64\x54\x74\x37\x63\x49\x43\x6f\x48','\x57\x35\x46\x64\x51\x59\x4e\x63\x55\x6d\x6f\x75'];_0x27c3=function(){return _0x546dca;};return _0x27c3();}function _0x25f88e(){const _0x3061a1=_0x1b5b60,_0xe3c0fe={};_0xe3c0fe[_0x3061a1(0x211,'\x36\x64\x66\x43')]=_0x3061a1(0x21e,'\x31\x50\x4c\x6a'),_0xe3c0fe[_0x3061a1(0x214,'\x50\x6e\x7a\x43')]=function(_0x18bbef,_0x27a7d2){return _0x18bbef===_0x27a7d2;},_0xe3c0fe[_0x3061a1(0x231,'\x4c\x39\x26\x44')]=_0x3061a1(0x225,'\x2a\x63\x31\x6e'),_0xe3c0fe[_0x3061a1(0x1f4,'\x4a\x21\x51\x77')]=function(_0x2b823c,_0x4809ae){return _0x2b823c===_0x4809ae;};const _0x5a2d09=_0xe3c0fe,_0x5a9bca=String(process.env.EVOLVER_WORKSPACE_KEYCHAIN||_0x5a2d09['\x6f\x5a\x4d\x63\x6f'])[_0x3061a1(0x203,'\x74\x62\x76\x78')+_0x3061a1(0x22b,'\x40\x56\x4e\x42')]()[_0x3061a1(0x253,'\x63\x5a\x50\x36')]();if(_0x5a2d09[_0x3061a1(0x249,'\x36\x64\x66\x43')](_0x5a9bca,_0x3061a1(0x213,'\x42\x38\x47\x77'))||_0x5a2d09['\x6a\x6e\x58\x75\x61'](_0x5a9bca,_0x5a2d09['\x78\x63\x43\x78\x68'])||_0x5a2d09[_0x3061a1(0x217,'\x75\x44\x78\x55')](_0x5a9bca,_0x5a2d09[_0x3061a1(0x211,'\x36\x64\x66\x43')]))return _0x5a9bca;return _0x5a2d09[_0x3061a1(0x263,'\x6d\x64\x70\x47')];}const _0x183ce4=[/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 _0x528f95(_0x7ce5b3){const _0x298e77=_0x1b5b60,_0x2b2a91=_0x7ce5b3&&_0x7ce5b3[_0x298e77(0x261,'\x49\x38\x26\x54')]||'';return _0x183ce4[_0x298e77(0x20a,'\x23\x78\x64\x44')](_0x3b6de9=>_0x3b6de9[_0x298e77(0x20c,'\x50\x6e\x7a\x43')](_0x2b2a91));}function _0x55151d(_0x39aea4){const _0x5ab6ff=_0x1b5b60,_0x3c75d8={'\x48\x6d\x41\x64\x48':function(_0x55df66,_0x400062){return _0x55df66!==_0x400062;},'\x64\x69\x79\x47\x65':function(_0x205b8a,_0x3e5379){return _0x205b8a(_0x3e5379);},'\x4f\x76\x76\x55\x77':_0x5ab6ff(0x1ff,'\x53\x6e\x34\x28')+'\x2f\x6b\x65\x79\x72\x69\x6e\x67','\x6a\x47\x76\x65\x70':function(_0x5d79ff,_0x43f4b1){return _0x5d79ff===_0x43f4b1;},'\x6b\x79\x63\x75\x4d':'\x66\x75\x6e\x63\x74\x69\x6f\x6e','\x55\x4b\x58\x77\x53':function(_0x996bf7){return _0x996bf7();},'\x65\x6f\x53\x44\x4a':function(_0x5494d1,_0x190b2d){return _0x5494d1===_0x190b2d;},'\x6a\x49\x58\x6f\x46':_0x5ab6ff(0x237,'\x73\x6f\x33\x4b'),'\x66\x74\x57\x46\x6b':_0x5ab6ff(0x25d,'\x78\x2a\x57\x63'),'\x77\x67\x55\x76\x48':function(_0x483b26,_0x3f2c5e){return _0x483b26!==_0x3f2c5e;},'\x4e\x6b\x76\x55\x54':_0x5ab6ff(0x243,'\x32\x77\x59\x53'),'\x53\x69\x74\x6f\x46':_0x5ab6ff(0x1e7,'\x2a\x66\x67\x35'),'\x68\x47\x55\x6d\x45':_0x5ab6ff(0x1f2,'\x32\x77\x59\x53'),'\x6a\x51\x4a\x4d\x59':function(_0x58bbb5,_0x423a7b){return _0x58bbb5(_0x423a7b);}},_0x345789=_0xb83b18(),_0xdeb70c={};_0xdeb70c[_0x5ab6ff(0x205,'\x6f\x64\x21\x7a')+'\x65']=![],_0xdeb70c['\x69\x64']=null;if(!_0x345789)return _0xdeb70c;try{if(_0x3c75d8[_0x5ab6ff(0x260,'\x45\x48\x52\x29')](_0x3c75d8[_0x5ab6ff(0x223,'\x77\x72\x5d\x68')],_0x3c75d8[_0x5ab6ff(0x20b,'\x50\x4a\x6d\x63')])){const _0x4d5928=new _0x345789[(_0x5ab6ff(0x21f,'\x33\x45\x5e\x24'))](_0x297fca,_0x39aea4),_0x33d8d6=_0x4d5928[_0x5ab6ff(0x23a,'\x78\x2a\x57\x63')+_0x5ab6ff(0x266,'\x31\x50\x4c\x6a')]();if(_0x3c75d8[_0x5ab6ff(0x255,'\x61\x5a\x42\x33')](typeof _0x33d8d6,_0x3c75d8[_0x5ab6ff(0x22d,'\x37\x5b\x5d\x5e')])&&_0x1b2342[_0x5ab6ff(0x1f7,'\x53\x6e\x34\x28')](_0x33d8d6[_0x5ab6ff(0x1dc,'\x64\x41\x78\x39')]())){if(_0x3c75d8[_0x5ab6ff(0x1fd,'\x56\x33\x4a\x41')](_0x5ab6ff(0x1e2,'\x64\x4f\x79\x46'),_0x3c75d8[_0x5ab6ff(0x204,'\x5a\x47\x49\x34')])){if(QGttHs[_0x5ab6ff(0x24b,'\x32\x68\x47\x49')](_0x11aefa,_0x1681fc))return _0x3e9ae7;try{const _0x34a918=QGttHs[_0x5ab6ff(0x23c,'\x40\x56\x4e\x42')](_0x38e87d,QGttHs['\x4f\x76\x76\x55\x77']);if(_0x34a918&&QGttHs[_0x5ab6ff(0x1f3,'\x63\x6a\x72\x4d')](typeof _0x34a918[_0x5ab6ff(0x1f1,'\x5b\x4c\x38\x36')],QGttHs[_0x5ab6ff(0x239,'\x5a\x47\x49\x34')]))return _0x48596b=_0x34a918,_0x280a84;return _0x2ab851=null,null;}catch{return _0x5b21fb=null,null;}}else return{'\x61\x76\x61\x69\x6c\x61\x62\x6c\x65':!![],'\x69\x64':_0x33d8d6[_0x5ab6ff(0x24e,'\x25\x4e\x67\x21')]()};}const _0xc37923={};return _0xc37923[_0x5ab6ff(0x1df,'\x25\x4e\x67\x21')+'\x65']=!![],_0xc37923['\x69\x64']=null,_0xc37923;}else{const _0x4d8082=_0x3c75d8[_0x5ab6ff(0x1e5,'\x25\x4e\x67\x21')](_0x16b81b);if(!_0x4d8082)return![];try{const _0x12ff5d=new _0x4d8082[(_0x5ab6ff(0x230,'\x53\x6e\x34\x28'))](_0x29808e,_0x4a9a11);return _0x12ff5d[_0x5ab6ff(0x1fa,'\x45\x48\x52\x29')+_0x5ab6ff(0x246,'\x23\x78\x64\x44')](_0x43cad6),!![];}catch{return![];}}}catch(_0x4d17db){if(_0x3c75d8[_0x5ab6ff(0x227,'\x38\x45\x6e\x4f')]===_0x3c75d8[_0x5ab6ff(0x241,'\x4a\x21\x51\x77')])return{'\x61\x76\x61\x69\x6c\x61\x62\x6c\x65':!![],'\x69\x64':_0x296668[_0x5ab6ff(0x26b,'\x28\x2a\x34\x75')]()};else{const _0x1caf37={};_0x1caf37[_0x5ab6ff(0x226,'\x51\x36\x66\x28')+'\x65']=!![],_0x1caf37['\x69\x64']=null;if(_0x3c75d8[_0x5ab6ff(0x21c,'\x50\x6e\x7a\x43')](_0x528f95,_0x4d17db))return _0x1caf37;const _0x23c604={};return _0x23c604[_0x5ab6ff(0x269,'\x63\x5a\x50\x36')+'\x65']=![],_0x23c604['\x69\x64']=null,_0x23c604;}}}function _0x909da4(_0x44a752,_0x4ea023){const _0x72045f=_0x1b5b60,_0x36ddfb={};_0x36ddfb[_0x72045f(0x1ed,'\x78\x2a\x57\x63')]='\x73\x74\x72\x69\x6e\x67',_0x36ddfb[_0x72045f(0x250,'\x68\x30\x52\x63')]=function(_0x570f01,_0x1c288e){return _0x570f01!==_0x1c288e;},_0x36ddfb[_0x72045f(0x219,'\x5b\x4c\x38\x36')]='\x44\x53\x47\x49\x6c';const _0x528a1f=_0x36ddfb,_0x567b1c=_0xb83b18();if(!_0x567b1c)return![];try{if(_0x528a1f[_0x72045f(0x1f8,'\x4a\x51\x29\x59')](_0x528a1f['\x44\x76\x77\x67\x56'],_0x528a1f[_0x72045f(0x222,'\x31\x50\x4c\x6a')])){const _0x18f423=new _0x5bf09d[(_0x72045f(0x228,'\x73\x6f\x33\x4b'))](_0xa4993f,_0x220795),_0x2614fe=_0x18f423[_0x72045f(0x1de,'\x68\x30\x52\x63')+_0x72045f(0x251,'\x5a\x47\x49\x34')]();if(typeof _0x2614fe===UUGNSX[_0x72045f(0x23e,'\x63\x6a\x72\x4d')]&&_0x1adb00[_0x72045f(0x257,'\x72\x6e\x69\x23')](_0x2614fe['\x74\x72\x69\x6d']()))return{'\x61\x76\x61\x69\x6c\x61\x62\x6c\x65':!![],'\x69\x64':_0x2614fe[_0x72045f(0x242,'\x4f\x6a\x26\x70')]()};const _0x56cc04={};return _0x56cc04[_0x72045f(0x254,'\x78\x2a\x57\x63')+'\x65']=!![],_0x56cc04['\x69\x64']=null,_0x56cc04;}else{const _0xa1e427=new _0x567b1c[(_0x72045f(0x256,'\x6e\x5d\x55\x74'))](_0x297fca,_0x44a752);return _0xa1e427[_0x72045f(0x233,'\x66\x42\x47\x53')+_0x72045f(0x1e4,'\x63\x5a\x50\x36')](_0x4ea023),!![];}}catch{return![];}}const _0x102a81={};_0x102a81[_0x1b5b60(0x207,'\x56\x33\x4a\x41')+_0x1b5b60(0x252,'\x48\x5a\x58\x43')]=_0x297fca,_0x102a81[_0x1b5b60(0x1e6,'\x55\x77\x38\x41')]=_0x25f88e,_0x102a81[_0x1b5b60(0x265,'\x25\x4e\x67\x21')+'\x6e']=_0xb83b18,_0x102a81[_0x1b5b60(0x1e1,'\x72\x6e\x69\x23')+'\x4b\x65\x79\x63\x68\x61\x69\x6e']=_0x55151d,_0x102a81[_0x1b5b60(0x259,'\x51\x36\x66\x28')+_0x1b5b60(0x24a,'\x53\x6e\x34\x28')]=_0x909da4,_0x102a81[_0x1b5b60(0x232,'\x45\x48\x52\x29')+_0x1b5b60(0x20e,'\x49\x38\x26\x54')]=_0x528f95,module[_0x1b5b60(0x25e,'\x74\x62\x76\x78')]=_0x102a81;
@@ -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
- };