-
Notifications
You must be signed in to change notification settings - Fork 545
Expand file tree
/
Copy pathconfig.js
More file actions
185 lines (166 loc) · 7.1 KB
/
config.js
File metadata and controls
185 lines (166 loc) · 7.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// Centralized configuration for evolver runtime thresholds and timeouts.
// All values support environment variable override where specified.
// Groups: network, solidify, evolution, ops, limits.
function envInt(key, fallback) {
const v = process.env[key];
if (v === undefined || v === '') return fallback;
const n = parseInt(v, 10);
return isNaN(n) ? fallback : n;
}
function envFloat(key, fallback) {
const v = process.env[key];
if (v === undefined || v === '') return fallback;
const n = parseFloat(v);
return isNaN(n) ? fallback : n;
}
function envStr(key, fallback) {
const v = process.env[key];
return (v !== undefined && v !== '') ? v : fallback;
}
// --- Network & A2A ---
const HELLO_TIMEOUT_MS = envInt('EVOLVER_HELLO_TIMEOUT_MS', 15000);
const HEARTBEAT_TIMEOUT_MS = envInt('EVOLVER_HEARTBEAT_TIMEOUT_MS', 10000);
const HEARTBEAT_INTERVAL_MS = envInt('HEARTBEAT_INTERVAL_MS', 360000);
const HEARTBEAT_FIRST_DELAY_MS = envInt('EVOLVER_HEARTBEAT_FIRST_DELAY_MS', 30000);
const EVENT_POLL_TIMEOUT_MS = envInt('EVOLVER_EVENT_POLL_TIMEOUT_MS', 60000);
const HTTP_TRANSPORT_TIMEOUT_MS = envInt('EVOLVER_HTTP_TRANSPORT_TIMEOUT_MS', 15000);
const SECRET_CACHE_TTL_MS = envInt('EVOLVER_SECRET_CACHE_TTL_MS', 60000);
const HUB_SEARCH_TIMEOUT_MS = envInt('EVOLVER_HUB_SEARCH_TIMEOUT_MS', 8000);
// --- Solidify & Validation ---
const VALIDATION_TIMEOUT_MS = envInt('EVOLVER_VALIDATION_TIMEOUT_MS', 180000);
const CANARY_TIMEOUT_MS = envInt('EVOLVER_CANARY_TIMEOUT_MS', 30000);
const CAPSULE_CONTENT_MAX_CHARS = envInt('EVOLVER_CAPSULE_MAX_CHARS', 8000);
const SOLIDIFY_MAX_RETRIES = envInt('SOLIDIFY_MAX_RETRIES', 2);
const SOLIDIFY_RETRY_INTERVAL_MS = envInt('EVOLVER_SOLIDIFY_RETRY_INTERVAL_MS', 1000);
const MIN_PUBLISH_SCORE = envFloat('EVOLVER_MIN_PUBLISH_SCORE', 0.78);
const BROADCAST_SCORE_THRESHOLD = 0.7;
const BROADCAST_SUCCESS_STREAK = 2;
const MAX_REGEX_PATTERN_LEN = 1024;
// --- Evolution Loop ---
const REPAIR_LOOP_THRESHOLD = envInt('EVOLVER_REPAIR_LOOP_THRESHOLD', 3);
// --- Gene Suppression (saturated / repeatedly failing genes) ---
// These thresholds control when a Gene is forcibly excluded from selection
// regardless of drift state. Without this, a Gene that fails repeatedly can
// trigger plateau detection -> drift mode -> the legacy ban skip path,
// resulting in the same failed Gene being re-selected forever.
//
// GENE_BAN_PER_KEY_ATTEMPTS: minimum attempts on the same signal key
// GENE_BAN_BEST_THRESHOLD: best success rate at or below which the Gene is banned
// GENE_EPIGENETIC_HARD_BOOST: epigenetic boost at or below which the Gene is hard-suppressed
const GENE_BAN_PER_KEY_ATTEMPTS = envInt('EVOLVER_GENE_BAN_PER_KEY_ATTEMPTS', 4);
const GENE_BAN_BEST_THRESHOLD = envFloat('EVOLVER_GENE_BAN_BEST_THRESHOLD', 0.15);
const GENE_EPIGENETIC_HARD_BOOST = envFloat('EVOLVER_GENE_EPIGENETIC_HARD_BOOST', -0.3);
const SESSION_ARCHIVE_TRIGGER = envInt('EVOLVER_SESSION_ARCHIVE_TRIGGER', 100);
const SESSION_ARCHIVE_KEEP = envInt('EVOLVER_SESSION_ARCHIVE_KEEP', 50);
const MEMORY_FRAGMENT_MAX_CHARS = envInt('EVOLVER_MEMORY_FRAGMENT_MAX_CHARS', 50000);
const IDLE_FETCH_INTERVAL_MS = envInt('EVOLVER_IDLE_FETCH_INTERVAL_MS', 600000);
const PROMPT_MAX_CHARS = envInt('EVOLVER_PROMPT_MAX_CHARS', 24000);
const ACTIVE_WINDOW_MS = 24 * 60 * 60 * 1000;
const TARGET_BYTES = 120000;
const PER_FILE_BYTES = 20000;
const PER_SESSION_BYTES = 20000;
const RECENCY_GUARD_MS = 30 * 1000;
const DORMANT_TTL_MS = 3600 * 1000;
const PACKAGE_DESC_CACHE_TTL_MS = 6 * 60 * 60 * 1000;
const MEMORY_GRAPH_READ_LIMIT = 1000;
const NARRATIVE_SUMMARY_MAX_CHARS = 3000;
// --- Ops ---
const MAX_SILENCE_MS = envInt('EVOLVER_MAX_SILENCE_MS', 30 * 60 * 1000);
const CLEANUP_MAX_AGE_MS = envInt('EVOLVER_CLEANUP_MAX_AGE_MS', 24 * 60 * 60 * 1000);
const CLEANUP_MIN_KEEP = envInt('EVOLVER_CLEANUP_MIN_KEEP', 10);
const CLEANUP_MAX_FILES = envInt('EVOLVER_CLEANUP_MAX_FILES', 10);
const LOCK_MAX_AGE_MS = envInt('EVOLVER_LOCK_MAX_AGE_MS', 10 * 60 * 1000);
// --- Self-PR (auto-contribute mutations back to public repo) ---
const SELF_PR_MIN_SCORE = envFloat('EVOLVER_SELF_PR_MIN_SCORE', 0.85);
const SELF_PR_MIN_STREAK = envInt('EVOLVER_SELF_PR_MIN_STREAK', 3);
const SELF_PR_MAX_FILES = envInt('EVOLVER_SELF_PR_MAX_FILES', 3);
const SELF_PR_MAX_LINES = envInt('EVOLVER_SELF_PR_MAX_LINES', 100);
const SELF_PR_COOLDOWN_MS = envInt('EVOLVER_SELF_PR_COOLDOWN_MS', 24 * 60 * 60 * 1000);
const SELF_PR_REPO = envStr('EVOLVER_SELF_PR_REPO', 'EvoMap/evolver');
const SELF_PR_TIMEOUT_MS = envInt('EVOLVER_SELF_PR_TIMEOUT_MS', 30000);
// --- Leak Check ---
const LEAK_CHECK_MODE = envStr('EVOLVER_LEAK_CHECK', 'warn');
// --- Validator mode (opt-in) ---
// Opt-in node role: when enabled, the evolver periodically fetches assigned
// validation tasks from the Hub, runs the commands in an isolated sandbox,
// and submits ValidationReports. Default is OFF for backward compatibility.
const VALIDATOR_ENABLED = (function () {
const v = String(process.env.EVOLVER_VALIDATOR_ENABLED || '').toLowerCase().trim();
return v === '1' || v === 'true' || v === 'yes' || v === 'on';
})();
const VALIDATOR_STAKE_AMOUNT = envInt('EVOLVER_VALIDATOR_STAKE_AMOUNT', 100);
const VALIDATOR_MAX_TASKS_PER_CYCLE = envInt('EVOLVER_VALIDATOR_MAX_TASKS_PER_CYCLE', 2);
const VALIDATOR_FETCH_TIMEOUT_MS = envInt('EVOLVER_VALIDATOR_FETCH_TIMEOUT_MS', 8000);
const VALIDATOR_REPORT_TIMEOUT_MS = envInt('EVOLVER_VALIDATOR_REPORT_TIMEOUT_MS', 10000);
const VALIDATOR_STAKE_TIMEOUT_MS = envInt('EVOLVER_VALIDATOR_STAKE_TIMEOUT_MS', 10000);
const VALIDATOR_CMD_TIMEOUT_MS = envInt('EVOLVER_VALIDATOR_CMD_TIMEOUT_MS', 60000);
const VALIDATOR_BATCH_TIMEOUT_MS = envInt('EVOLVER_VALIDATOR_BATCH_TIMEOUT_MS', 180000);
module.exports = {
// Network
HELLO_TIMEOUT_MS,
HEARTBEAT_TIMEOUT_MS,
HEARTBEAT_INTERVAL_MS,
HEARTBEAT_FIRST_DELAY_MS,
EVENT_POLL_TIMEOUT_MS,
HTTP_TRANSPORT_TIMEOUT_MS,
SECRET_CACHE_TTL_MS,
HUB_SEARCH_TIMEOUT_MS,
// Solidify
VALIDATION_TIMEOUT_MS,
CANARY_TIMEOUT_MS,
CAPSULE_CONTENT_MAX_CHARS,
SOLIDIFY_MAX_RETRIES,
SOLIDIFY_RETRY_INTERVAL_MS,
MIN_PUBLISH_SCORE,
BROADCAST_SCORE_THRESHOLD,
BROADCAST_SUCCESS_STREAK,
MAX_REGEX_PATTERN_LEN,
// Evolution
REPAIR_LOOP_THRESHOLD,
GENE_BAN_PER_KEY_ATTEMPTS,
GENE_BAN_BEST_THRESHOLD,
GENE_EPIGENETIC_HARD_BOOST,
SESSION_ARCHIVE_TRIGGER,
SESSION_ARCHIVE_KEEP,
MEMORY_FRAGMENT_MAX_CHARS,
IDLE_FETCH_INTERVAL_MS,
PROMPT_MAX_CHARS,
ACTIVE_WINDOW_MS,
TARGET_BYTES,
PER_FILE_BYTES,
PER_SESSION_BYTES,
RECENCY_GUARD_MS,
DORMANT_TTL_MS,
PACKAGE_DESC_CACHE_TTL_MS,
MEMORY_GRAPH_READ_LIMIT,
NARRATIVE_SUMMARY_MAX_CHARS,
// Ops
MAX_SILENCE_MS,
CLEANUP_MAX_AGE_MS,
CLEANUP_MIN_KEEP,
CLEANUP_MAX_FILES,
LOCK_MAX_AGE_MS,
// Self-PR
SELF_PR_MIN_SCORE,
SELF_PR_MIN_STREAK,
SELF_PR_MAX_FILES,
SELF_PR_MAX_LINES,
SELF_PR_COOLDOWN_MS,
SELF_PR_REPO,
SELF_PR_TIMEOUT_MS,
// Security
LEAK_CHECK_MODE,
// Validator (opt-in role)
VALIDATOR_ENABLED,
VALIDATOR_STAKE_AMOUNT,
VALIDATOR_MAX_TASKS_PER_CYCLE,
VALIDATOR_FETCH_TIMEOUT_MS,
VALIDATOR_REPORT_TIMEOUT_MS,
VALIDATOR_STAKE_TIMEOUT_MS,
VALIDATOR_CMD_TIMEOUT_MS,
VALIDATOR_BATCH_TIMEOUT_MS,
// Helpers
envInt,
envFloat,
envStr,
};