@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.
- package/README.md +27 -564
- package/bin/evolver-llm-proxy.js +3 -0
- package/bin/evolver-mcp.js +2 -0
- package/bin/evolver-proxy.js +3 -0
- package/bin/evolver.js +4 -0
- package/index.js +1 -3586
- package/package.json +32 -62
- package/CONTRIBUTING.md +0 -19
- package/LICENSE +0 -641
- package/README.ja-JP.md +0 -521
- package/README.ko-KR.md +0 -520
- package/README.zh-CN.md +0 -531
- package/SKILL.md +0 -365
- package/assets/cover.png +0 -0
- package/assets/gep/genes.seed.json +0 -496
- package/conformance/savings-core/constants.json +0 -30
- package/conformance/savings-core/golden-vectors.json +0 -333
- package/scripts/a2a_export.js +0 -63
- package/scripts/a2a_ingest.js +0 -79
- package/scripts/a2a_promote.js +0 -118
- package/scripts/analyze_by_skill.js +0 -121
- package/scripts/build_binaries.js +0 -479
- package/scripts/check-changelog.js +0 -166
- package/scripts/extract_log.js +0 -85
- package/scripts/generate_history.js +0 -75
- package/scripts/gep_append_event.js +0 -96
- package/scripts/gep_personality_report.js +0 -234
- package/scripts/human_report.js +0 -147
- package/scripts/recall-verify-report.js +0 -234
- package/scripts/recover_loop.js +0 -61
- package/scripts/refresh_stars_badge.js +0 -168
- package/scripts/seed-merchants.js +0 -91
- package/scripts/skill2recipes.js +0 -118
- package/scripts/suggest_version.js +0 -89
- package/scripts/validate-modules.js +0 -38
- package/scripts/validate-suite.js +0 -78
- package/skills/_meta/SKILL.md +0 -41
- package/skills/index.json +0 -14
- package/src/adapters/claudeCode.js +0 -194
- package/src/adapters/codex.js +0 -216
- package/src/adapters/cursor.js +0 -91
- package/src/adapters/hookAdapter.js +0 -469
- package/src/adapters/kiro.js +0 -195
- package/src/adapters/opencode.js +0 -326
- package/src/adapters/scripts/_lockPaths.js +0 -74
- package/src/adapters/scripts/_memoryFiltering.js +0 -35
- package/src/adapters/scripts/_runtimePaths.js +0 -440
- package/src/adapters/scripts/evolver-session-end.js +0 -321
- package/src/adapters/scripts/evolver-session-start.js +0 -587
- package/src/adapters/scripts/evolver-signal-detect.js +0 -98
- package/src/adapters/scripts/evolver-task-recall.js +0 -173
- package/src/atp/atpExecute.js +0 -283
- package/src/atp/atpTaskPickup.js +0 -233
- package/src/atp/autoBuyer.js +0 -382
- package/src/atp/autoDeliver.js +0 -215
- package/src/atp/cli.js +0 -354
- package/src/atp/cliAutobuyPrompt.js +0 -154
- package/src/atp/consumerAgent.js +0 -157
- package/src/atp/defaultHandler.js +0 -69
- package/src/atp/heartbeatSignalsHandler.js +0 -254
- package/src/atp/hubClient.js +0 -317
- package/src/atp/index.js +0 -38
- package/src/atp/merchantAgent.js +0 -118
- package/src/atp/protocol.js +0 -41
- package/src/atp/questionComposer.js +0 -133
- package/src/atp/serviceHelper.js +0 -92
- package/src/canary.js +0 -13
- package/src/config.js +0 -351
- package/src/evolve/guards.js +0 -1
- package/src/evolve/pipeline/collect.js +0 -1
- package/src/evolve/pipeline/dispatch.js +0 -1
- package/src/evolve/pipeline/enrich.js +0 -1
- package/src/evolve/pipeline/hub.js +0 -1
- package/src/evolve/pipeline/select.js +0 -1
- package/src/evolve/pipeline/signals.js +0 -1
- package/src/evolve/utils.js +0 -1
- package/src/evolve.js +0 -1
- package/src/experiment/agentRunner.js +0 -229
- package/src/experiment/cli.js +0 -159
- package/src/experiment/comparison.js +0 -233
- package/src/experiment/metrics.js +0 -75
- package/src/forceUpdate.js +0 -991
- package/src/gep/a2a.js +0 -173
- package/src/gep/a2aProtocol.js +0 -1
- package/src/gep/analyzer.js +0 -35
- package/src/gep/antiAbuseTelemetry.js +0 -1
- package/src/gep/assetCallLog.js +0 -197
- package/src/gep/assetStore.js +0 -723
- package/src/gep/assets.js +0 -36
- package/src/gep/autoDistillConv.js +0 -1
- package/src/gep/autoDistillLlm.js +0 -1
- package/src/gep/bridge.js +0 -138
- package/src/gep/candidateEval.js +0 -1
- package/src/gep/candidates.js +0 -1
- package/src/gep/claimNudge.js +0 -121
- package/src/gep/cliContracts.js +0 -1190
- package/src/gep/contentHash.js +0 -1
- package/src/gep/conversationDistiller.js +0 -1
- package/src/gep/conversationSniffer.js +0 -1
- package/src/gep/crypto.js +0 -1
- package/src/gep/curriculum.js +0 -1
- package/src/gep/deviceId.js +0 -1
- package/src/gep/directoryClient.js +0 -115
- package/src/gep/envFingerprint.js +0 -1
- package/src/gep/epigenetics.js +0 -1
- package/src/gep/execBridge.js +0 -1
- package/src/gep/executionTrace.js +0 -291
- package/src/gep/explore.js +0 -1
- package/src/gep/featureFlags.js +0 -121
- package/src/gep/gitOps.js +0 -265
- package/src/gep/hash.js +0 -1
- package/src/gep/hostErrorClassifier.js +0 -34
- package/src/gep/hubFetch.js +0 -1
- package/src/gep/hubReview.js +0 -1
- package/src/gep/hubSearch.js +0 -1
- package/src/gep/hubVerify.js +0 -1
- package/src/gep/idleScheduler.js +0 -400
- package/src/gep/issueReporter.js +0 -416
- package/src/gep/learningSignals.js +0 -1
- package/src/gep/llmReview.js +0 -92
- package/src/gep/localStateAwareness.js +0 -243
- package/src/gep/mailboxTransport.js +0 -119
- package/src/gep/memoryGraph.js +0 -1
- package/src/gep/memoryGraphAdapter.js +0 -1
- package/src/gep/mutation.js +0 -1
- package/src/gep/narrativeMemory.js +0 -1
- package/src/gep/oauthLogin.js +0 -181
- package/src/gep/openPRRegistry.js +0 -1
- package/src/gep/paths.js +0 -522
- package/src/gep/personality.js +0 -1
- package/src/gep/policyCheck.js +0 -1
- package/src/gep/portable.js +0 -103
- package/src/gep/privacyClient.js +0 -235
- package/src/gep/prompt.js +0 -1
- package/src/gep/questionGenerator.js +0 -518
- package/src/gep/recallInject.js +0 -1
- package/src/gep/recallVerifier.js +0 -1
- package/src/gep/reflection.js +0 -1
- package/src/gep/sanitize.js +0 -264
- package/src/gep/savingsCore.js +0 -1
- package/src/gep/schemas/capsule.js +0 -170
- package/src/gep/schemas/gene.js +0 -154
- package/src/gep/schemas/index.js +0 -8
- package/src/gep/schemas/protocol.js +0 -51
- package/src/gep/schemas/task.js +0 -74
- package/src/gep/selector.js +0 -1
- package/src/gep/selfPR.js +0 -469
- package/src/gep/signals.js +0 -776
- package/src/gep/skill2gep.js +0 -1056
- package/src/gep/skill2gepAudit.js +0 -303
- package/src/gep/skill2recipes.js +0 -511
- package/src/gep/skillDistiller.js +0 -1
- package/src/gep/skillPublisher.js +0 -358
- package/src/gep/solidify.js +0 -1
- package/src/gep/strategy.js +0 -1
- package/src/gep/taskReceiver.js +0 -575
- package/src/gep/tokenSavings.js +0 -1
- package/src/gep/trajectoryExport.js +0 -1
- package/src/gep/validationReport.js +0 -55
- package/src/gep/validator/index.js +0 -411
- package/src/gep/validator/reporter.js +0 -210
- package/src/gep/validator/sandboxExecutor.js +0 -480
- package/src/gep/validator/stakeBootstrap.js +0 -357
- package/src/gep/workspaceKeychain.js +0 -1
- package/src/ops/cleanup.js +0 -80
- package/src/ops/commentary.js +0 -60
- package/src/ops/health_check.js +0 -104
- package/src/ops/index.js +0 -11
- package/src/ops/innovation.js +0 -67
- package/src/ops/lifecycle.js +0 -798
- package/src/ops/self_repair.js +0 -76
- package/src/ops/skills_monitor.js +0 -147
- package/src/ops/trigger.js +0 -33
- package/src/proxy/clientSettings.js +0 -405
- package/src/proxy/envelope.js +0 -59
- package/src/proxy/extensions/dmHandler.js +0 -45
- package/src/proxy/extensions/sessionHandler.js +0 -141
- package/src/proxy/extensions/skillUpdater.js +0 -64
- package/src/proxy/extensions/traceControl.js +0 -1
- package/src/proxy/index.js +0 -1395
- package/src/proxy/inject.js +0 -1
- package/src/proxy/lifecycle/manager.js +0 -1568
- package/src/proxy/mailbox/state.js +0 -207
- package/src/proxy/mailbox/store.js +0 -590
- package/src/proxy/router/cache_passthrough.js +0 -26
- package/src/proxy/router/features.js +0 -84
- package/src/proxy/router/gemini_route.js +0 -154
- package/src/proxy/router/messages_route.js +0 -535
- package/src/proxy/router/model_router.js +0 -113
- package/src/proxy/router/models_route.js +0 -52
- package/src/proxy/router/ollama_route.js +0 -103
- package/src/proxy/router/responses_route.js +0 -170
- package/src/proxy/router/vertex_route.js +0 -110
- package/src/proxy/server/http.js +0 -363
- package/src/proxy/server/routes.js +0 -558
- package/src/proxy/server/settings.js +0 -115
- package/src/proxy/sync/engine.js +0 -179
- package/src/proxy/sync/inbound.js +0 -211
- package/src/proxy/sync/outbound.js +0 -320
- package/src/proxy/task/monitor.js +0 -131
- package/src/proxy/trace/extractor.js +0 -1
- package/src/proxy/trace/usage.js +0 -1
- package/src/webui/client/clientJs/assets.js +0 -111
- package/src/webui/client/clientJs/bootstrap.js +0 -92
- package/src/webui/client/clientJs/common.js +0 -77
- package/src/webui/client/clientJs/i18n.js +0 -366
- package/src/webui/client/clientJs/index.js +0 -35
- package/src/webui/client/clientJs/interactions.js +0 -351
- package/src/webui/client/clientJs/overview.js +0 -152
- package/src/webui/client/clientJs/personality.js +0 -285
- package/src/webui/client/clientJs/pipelines.js +0 -330
- package/src/webui/client/indexHtml.js +0 -221
- package/src/webui/client/static.js +0 -23
- package/src/webui/client/stylesCss.js +0 -639
- package/src/webui/client/vendor/README.md +0 -15
- package/src/webui/client/vendor/echarts.min.js +0 -45
- package/src/webui/index.js +0 -14
- package/src/webui/observer/assets.js +0 -146
- package/src/webui/observer/index.js +0 -37
- package/src/webui/observer/interactions.js +0 -127
- package/src/webui/observer/jsonl.js +0 -75
- package/src/webui/observer/paths.js +0 -46
- package/src/webui/observer/personality.js +0 -43
- package/src/webui/observer/pipelineEvents.js +0 -58
- package/src/webui/observer/redact.js +0 -63
- package/src/webui/observer/runs.js +0 -356
- package/src/webui/observer/safety.js +0 -57
- package/src/webui/observer/skills.js +0 -70
- package/src/webui/observer/status.js +0 -71
- package/src/webui/server/http.js +0 -138
- 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;
|
package/src/ops/cleanup.js
DELETED
|
@@ -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 };
|
package/src/ops/commentary.js
DELETED
|
@@ -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 };
|
package/src/ops/health_check.js
DELETED
|
@@ -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
|
-
};
|