@evomap/evolver 1.89.0 → 1.89.2
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/CONTRIBUTING.md +19 -0
- package/README.ja-JP.md +9 -32
- package/README.ko-KR.md +9 -32
- package/README.md +530 -86
- package/README.zh-CN.md +4 -31
- package/SKILL.md +1 -1
- package/assets/cover.png +0 -0
- package/index.js +14 -1
- package/package.json +17 -6
- package/scripts/a2a_export.js +63 -0
- package/scripts/a2a_ingest.js +79 -0
- package/scripts/a2a_promote.js +118 -0
- package/scripts/analyze_by_skill.js +121 -0
- package/scripts/build_binaries.js +479 -0
- package/scripts/check-changelog.js +166 -0
- package/scripts/extract_log.js +85 -0
- package/scripts/generate_history.js +75 -0
- package/scripts/gep_append_event.js +96 -0
- package/scripts/gep_personality_report.js +234 -0
- package/scripts/human_report.js +147 -0
- package/scripts/recall-verify-report.js +234 -0
- package/scripts/recover_loop.js +61 -0
- package/scripts/seed-merchants.js +91 -0
- package/scripts/suggest_version.js +89 -0
- package/scripts/validate-modules.js +38 -0
- package/scripts/validate-suite.js +78 -0
- package/skills/index.json +14 -0
- package/src/evolve/guards.js +1 -721
- package/src/evolve/pipeline/collect.js +1 -1283
- package/src/evolve/pipeline/dispatch.js +1 -421
- package/src/evolve/pipeline/enrich.js +1 -434
- package/src/evolve/pipeline/hub.js +1 -319
- package/src/evolve/pipeline/select.js +1 -274
- package/src/evolve/pipeline/signals.js +1 -206
- package/src/evolve/utils.js +1 -264
- package/src/evolve.js +1 -350
- package/src/forceUpdate.js +105 -20
- package/src/gep/a2aProtocol.js +1 -4395
- package/src/gep/autoDistillConv.js +1 -205
- package/src/gep/autoDistillLlm.js +1 -315
- package/src/gep/candidateEval.js +1 -92
- package/src/gep/candidates.js +1 -198
- package/src/gep/contentHash.js +1 -30
- package/src/gep/conversationSniffer.js +1 -266
- package/src/gep/crypto.js +1 -89
- package/src/gep/curriculum.js +1 -163
- package/src/gep/deviceId.js +1 -218
- package/src/gep/envFingerprint.js +1 -118
- package/src/gep/epigenetics.js +1 -31
- package/src/gep/execBridge.js +1 -711
- package/src/gep/explore.js +1 -289
- package/src/gep/hash.js +1 -15
- package/src/gep/hubFetch.js +1 -359
- package/src/gep/hubReview.js +1 -207
- package/src/gep/hubSearch.js +1 -526
- package/src/gep/hubVerify.js +1 -306
- package/src/gep/learningSignals.js +1 -89
- package/src/gep/memoryGraph.js +1 -1374
- package/src/gep/memoryGraphAdapter.js +1 -203
- package/src/gep/mutation.js +1 -203
- package/src/gep/narrativeMemory.js +1 -108
- package/src/gep/oauthLogin.js +34 -0
- package/src/gep/openPRRegistry.js +1 -205
- package/src/gep/personality.js +1 -423
- package/src/gep/policyCheck.js +1 -599
- package/src/gep/prompt.js +1 -836
- package/src/gep/recallInject.js +1 -409
- package/src/gep/recallVerifier.js +1 -318
- package/src/gep/reflection.js +1 -177
- package/src/gep/selector.js +1 -602
- package/src/gep/skillDistiller.js +1 -1294
- package/src/gep/skillPublisher.js +1 -1
- package/src/gep/solidify.js +1 -1699
- package/src/gep/strategy.js +1 -136
- package/src/gep/tokenSavings.js +1 -88
- package/src/gep/workspaceKeychain.js +1 -174
- package/src/proxy/extensions/traceControl.js +1 -99
- package/src/proxy/inject.js +1 -52
- package/src/proxy/lifecycle/manager.js +2 -0
- package/src/proxy/trace/extractor.js +1 -534
- package/src/proxy/trace/usage.js +1 -105
- package/.cursor/BUGBOT.md +0 -182
- package/.env.example +0 -68
- package/.git-commit-guard-token +0 -1
- package/.github/CODEOWNERS +0 -63
- package/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -23
- package/.github/pull_request_template.md +0 -45
- package/.github/workflows/test.yml +0 -75
- package/CHANGELOG.md +0 -1123
- package/README.public.md +0 -594
- package/SECURITY.md +0 -108
- package/assets/gep/events.jsonl +0 -3
- package/examples/atp-consumer-quickstart.md +0 -100
- package/examples/hello-world.md +0 -38
- package/proxy-package.json +0 -39
- package/public.manifest.json +0 -141
- /package/assets/gep/{genes.json → genes.seed.json} +0 -0
- /package/{bundled-skills → skills}/_meta/SKILL.md +0 -0
package/src/proxy/trace/usage.js
CHANGED
|
@@ -1,105 +1 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Per-run token-usage rollup over the proxy trace log.
|
|
4
|
-
//
|
|
5
|
-
// The local proxy (src/proxy) meters real Anthropic input/output tokens for
|
|
6
|
-
// every Hand /v1/messages call into proxy-traces.jsonl. This reads that log
|
|
7
|
-
// back -- decrypting encrypted rows with the local EvoMap node secret -- and
|
|
8
|
-
// sums the real tokens spent within a time window, giving solidify the
|
|
9
|
-
// MEASURED cost of a derive loop.
|
|
10
|
-
//
|
|
11
|
-
// Best-effort by design: returns measured:false (and never throws) when the
|
|
12
|
-
// proxy was inactive, the node secret is missing, no rows fall in the window,
|
|
13
|
-
// or the in-window rows carried no usage (e.g. streamed-but-unobserved calls).
|
|
14
|
-
// Callers fall back to a grounded estimate in that case.
|
|
15
|
-
|
|
16
|
-
const fs = require('fs');
|
|
17
|
-
const {
|
|
18
|
-
resolveTraceFile,
|
|
19
|
-
resolveEvomapNodeSecret,
|
|
20
|
-
decryptTraceEnvelope,
|
|
21
|
-
} = require('./extractor');
|
|
22
|
-
|
|
23
|
-
const EMPTY = Object.freeze({
|
|
24
|
-
input_tokens: 0,
|
|
25
|
-
output_tokens: 0,
|
|
26
|
-
total_tokens: 0,
|
|
27
|
-
calls: 0,
|
|
28
|
-
measured: false,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
function _rowTimestampMs(row) {
|
|
32
|
-
const iso = row && (row.timestamp || row.createdAtIso);
|
|
33
|
-
if (iso) {
|
|
34
|
-
const ms = Date.parse(iso);
|
|
35
|
-
if (Number.isFinite(ms)) return ms;
|
|
36
|
-
}
|
|
37
|
-
// createdAt is unix seconds in the Prism trace shape.
|
|
38
|
-
if (row && Number.isFinite(Number(row.createdAt))) return Number(row.createdAt) * 1000;
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Sum the real token usage the proxy recorded within a run's time window.
|
|
44
|
-
*
|
|
45
|
-
* @param {object} opts
|
|
46
|
-
* @param {string} opts.sinceIso - REQUIRED lower bound (e.g. last_run.created_at).
|
|
47
|
-
* Without a window we cannot attribute traces to this run, so we report
|
|
48
|
-
* unmeasured rather than summing unrelated calls.
|
|
49
|
-
* @param {string} [opts.untilIso] - upper bound; defaults to now.
|
|
50
|
-
* @returns {{input_tokens:number,output_tokens:number,total_tokens:number,calls:number,measured:boolean}}
|
|
51
|
-
*/
|
|
52
|
-
function sumRunUsage(opts = {}) {
|
|
53
|
-
const sinceMs = opts && opts.sinceIso != null ? Date.parse(opts.sinceIso) : NaN;
|
|
54
|
-
if (!Number.isFinite(sinceMs)) return { ...EMPTY };
|
|
55
|
-
const untilMs = opts && opts.untilIso != null && Number.isFinite(Date.parse(opts.untilIso))
|
|
56
|
-
? Date.parse(opts.untilIso)
|
|
57
|
-
: Date.now();
|
|
58
|
-
|
|
59
|
-
let raw;
|
|
60
|
-
try {
|
|
61
|
-
const file = resolveTraceFile();
|
|
62
|
-
if (!fs.existsSync(file)) return { ...EMPTY };
|
|
63
|
-
raw = fs.readFileSync(file, 'utf8');
|
|
64
|
-
} catch (_) {
|
|
65
|
-
return { ...EMPTY };
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
let secret = null;
|
|
69
|
-
try { secret = resolveEvomapNodeSecret(); } catch (_) { secret = null; }
|
|
70
|
-
|
|
71
|
-
let input = 0;
|
|
72
|
-
let output = 0;
|
|
73
|
-
let calls = 0;
|
|
74
|
-
for (const line of raw.split('\n')) {
|
|
75
|
-
const s = line.trim();
|
|
76
|
-
if (!s) continue;
|
|
77
|
-
let row;
|
|
78
|
-
try { row = JSON.parse(s); } catch (_) { continue; }
|
|
79
|
-
if (row && row.encrypted) {
|
|
80
|
-
if (!secret) continue; // cannot decrypt -> treat as unobserved
|
|
81
|
-
try { row = decryptTraceEnvelope(row, secret); } catch (_) { continue; }
|
|
82
|
-
}
|
|
83
|
-
if (!row || typeof row !== 'object') continue;
|
|
84
|
-
const ms = _rowTimestampMs(row);
|
|
85
|
-
if (ms == null || ms < sinceMs || ms > untilMs) continue;
|
|
86
|
-
const i = Number(row.input_tokens);
|
|
87
|
-
const o = Number(row.output_tokens);
|
|
88
|
-
const hasI = Number.isFinite(i) && i > 0;
|
|
89
|
-
const hasO = Number.isFinite(o) && o > 0;
|
|
90
|
-
if (hasI) input += i;
|
|
91
|
-
if (hasO) output += o;
|
|
92
|
-
if (hasI || hasO) calls += 1;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (calls === 0) return { ...EMPTY };
|
|
96
|
-
return {
|
|
97
|
-
input_tokens: input,
|
|
98
|
-
output_tokens: output,
|
|
99
|
-
total_tokens: input + output,
|
|
100
|
-
calls,
|
|
101
|
-
measured: true,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
module.exports = { sumRunUsage };
|
|
1
|
+
const _0x28f474=_0x2c06;(function(_0x43e92d,_0x1c7e6a){const _0x3c9e19=_0x2c06,_0x5f0eea=_0x43e92d();while(!![]){try{const _0x3d94e2=parseInt(_0x3c9e19(0x222,'\x45\x41\x59\x72'))/(0x16f7+-0x847+-0xeaf)*(-parseInt(_0x3c9e19(0x218,'\x40\x35\x23\x76'))/(0x1*-0xdc7+-0x4*-0x516+-0x68f))+parseInt(_0x3c9e19(0x1ec,'\x32\x42\x2a\x44'))/(0x2*0x8d+0x66d*-0x6+0x1*0x2577)*(parseInt(_0x3c9e19(0x253,'\x5d\x29\x37\x34'))/(0x287*0x1+0x331*-0x6+0x10a3))+parseInt(_0x3c9e19(0x209,'\x32\x42\x2a\x44'))/(-0x1965+-0x7ae*0x5+0x3fd0)+parseInt(_0x3c9e19(0x203,'\x69\x28\x45\x5b'))/(0x22b0+-0x1d2b+-0x57f)+parseInt(_0x3c9e19(0x231,'\x31\x65\x2a\x49'))/(0x1*-0x235f+-0x263f+0x49a5)+parseInt(_0x3c9e19(0x1fe,'\x34\x50\x61\x65'))/(-0xd43+-0x62*0x43+0x3*0xcfb)*(-parseInt(_0x3c9e19(0x20a,'\x71\x72\x2a\x40'))/(-0x3b*0x5d+0x6ef*-0x3+0x2a45))+-parseInt(_0x3c9e19(0x21b,'\x51\x37\x6e\x39'))/(0x2c*-0x32+0x2*0x79d+0x34c*-0x2);if(_0x3d94e2===_0x1c7e6a)break;else _0x5f0eea['push'](_0x5f0eea['shift']());}catch(_0x202450){_0x5f0eea['push'](_0x5f0eea['shift']());}}}(_0x3c70,0x20d40+0x1*-0x6ceb6+0x94875));const _0x17389a=(function(){const _0x57b490=_0x2c06,_0x32d187={};_0x32d187[_0x57b490(0x1ff,'\x74\x72\x58\x42')]=function(_0x3b53bf,_0x267d6f){return _0x3b53bf===_0x267d6f;},_0x32d187[_0x57b490(0x205,'\x39\x5e\x44\x49')]='\x59\x6c\x6e\x50\x64';const _0x4c2de3=_0x32d187;let _0x421f0a=!![];return function(_0xdbd152,_0x1cdee7){const _0x460201=_0x57b490;if(_0x4c2de3[_0x460201(0x1f5,'\x71\x72\x2a\x40')](_0x4c2de3[_0x460201(0x216,'\x74\x72\x58\x42')],_0x4c2de3['\x74\x69\x45\x71\x48'])){const _0x2b6747=_0x421f0a?function(){const _0x4fbd16=_0x460201;if(_0x1cdee7){const _0x41cabd=_0x1cdee7[_0x4fbd16(0x1eb,'\x39\x5e\x44\x49')](_0xdbd152,arguments);return _0x1cdee7=null,_0x41cabd;}}:function(){};return _0x421f0a=![],_0x2b6747;}else _0x1fe7f5=_0x3eb75d();};}()),_0x48ff12=_0x17389a(this,function(){const _0x48106d=_0x2c06,_0x31c781={};_0x31c781[_0x48106d(0x234,'\x33\x69\x5d\x78')]='\x28\x28\x28\x2e\x2b\x29\x2b\x29'+'\x2b\x29\x2b\x24';const _0x2d5d2a=_0x31c781;return _0x48ff12[_0x48106d(0x1ed,'\x74\x23\x4e\x57')]()[_0x48106d(0x220,'\x36\x69\x21\x40')](_0x2d5d2a['\x55\x77\x57\x50\x78'])[_0x48106d(0x1ef,'\x39\x5e\x44\x49')]()[_0x48106d(0x20b,'\x33\x69\x5d\x78')+_0x48106d(0x1f8,'\x54\x53\x34\x71')](_0x48ff12)[_0x48106d(0x251,'\x79\x61\x77\x54')](_0x2d5d2a[_0x48106d(0x232,'\x54\x53\x34\x71')]);});_0x48ff12();'use strict';const _0x3234c5=require('\x66\x73'),{resolveTraceFile:_0x4babcd,resolveEvomapNodeSecret:_0x4160e3,decryptTraceEnvelope:_0x4c9550}=require('\x2e\x2f\x65\x78\x74\x72\x61\x63'+_0x28f474(0x242,'\x61\x40\x4a\x32')),_0xd87bda={};_0xd87bda[_0x28f474(0x1ea,'\x45\x41\x59\x72')+_0x28f474(0x202,'\x56\x4c\x6b\x63')]=0x0,_0xd87bda[_0x28f474(0x249,'\x40\x35\x23\x76')+_0x28f474(0x225,'\x61\x40\x4a\x32')]=0x0,_0xd87bda[_0x28f474(0x1f7,'\x49\x21\x39\x64')+_0x28f474(0x23d,'\x4d\x49\x4d\x72')]=0x0,_0xd87bda[_0x28f474(0x22b,'\x31\x65\x2a\x49')]=0x0,_0xd87bda[_0x28f474(0x24f,'\x74\x32\x75\x5b')]=![];function _0x2c06(_0x5259d1,_0x4d6708){_0x5259d1=_0x5259d1-(-0x1974+-0xd68+0x15*0x1f1);const _0x1c6bb7=_0x3c70();let _0x489063=_0x1c6bb7[_0x5259d1];if(_0x2c06['\x4b\x66\x59\x48\x6c\x4d']===undefined){var _0x590938=function(_0x5c4255){const _0x577247='\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 _0x563664='',_0x54ce96='',_0x43c357=_0x563664+_0x590938,_0x306b57=(''+function(){return 0x6*-0x80+-0x1*0xcd+0x3cd;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x1*0x209c+0x2239*-0x1+-0xd5e*-0x5);for(let _0xd1b3a3=0x22fe+0x3b*-0x1+-0x22c3,_0x13dd9a,_0x44d714,_0x5e369b=-0x3ce*0x3+-0x10a5*-0x1+-0x67*0xd;_0x44d714=_0x5c4255['\x63\x68\x61\x72\x41\x74'](_0x5e369b++);~_0x44d714&&(_0x13dd9a=_0xd1b3a3%(0x722*0x4+-0x21fa+0x576)?_0x13dd9a*(-0x1d*0xbf+-0x83e+-0x1e21*-0x1)+_0x44d714:_0x44d714,_0xd1b3a3++%(-0x1277+-0x2b4*-0x1+0x1*0xfc7))?_0x563664+=_0x306b57||_0x43c357['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5e369b+(0x823*0x1+0x14a9+-0x1cc2))-(0xb01+-0x3*0x75a+-0xb17*-0x1)!==-0x23ee+0x1e2d+0x5c1?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0x135c+-0xfd*0x9+-0x3*-0x9c0&_0x13dd9a>>(-(-0x121+0x1*-0x147a+0x159d)*_0xd1b3a3&0x5*-0x49a+-0x4a*-0x24+0xca0)):_0xd1b3a3:-0x1*-0x176e+-0x21f2+0xa84){_0x44d714=_0x577247['\x69\x6e\x64\x65\x78\x4f\x66'](_0x44d714);}for(let _0x2e2afa=-0x17af+-0x1c8b*0x1+0x343a,_0x1d86ed=_0x563664['\x6c\x65\x6e\x67\x74\x68'];_0x2e2afa<_0x1d86ed;_0x2e2afa++){_0x54ce96+='\x25'+('\x30\x30'+_0x563664['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x2e2afa)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x2b*-0x8b+-0x1c01+0x336a))['\x73\x6c\x69\x63\x65'](-(0x1ee0+-0x1*-0x502+-0x23e0));}return decodeURIComponent(_0x54ce96);};const _0x269e7f=function(_0x303924,_0x59769e){let _0x1192ba=[],_0x371bb7=-0x1a4b+0x828+0x1223*0x1,_0x3f7d71,_0xbca765='';_0x303924=_0x590938(_0x303924);let _0x6b0d12;for(_0x6b0d12=0x18fb+0x1*-0xe8b+-0x2*0x538;_0x6b0d12<0x130b+-0x2e*-0x65+0x73d*-0x5;_0x6b0d12++){_0x1192ba[_0x6b0d12]=_0x6b0d12;}for(_0x6b0d12=0x921*0x4+0x678*0x4+-0x3e64;_0x6b0d12<0x188a+-0xb99+-0xbf1*0x1;_0x6b0d12++){_0x371bb7=(_0x371bb7+_0x1192ba[_0x6b0d12]+_0x59769e['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x6b0d12%_0x59769e['\x6c\x65\x6e\x67\x74\x68']))%(0x15a1+-0x1f*0x112+0x3*0x42f),_0x3f7d71=_0x1192ba[_0x6b0d12],_0x1192ba[_0x6b0d12]=_0x1192ba[_0x371bb7],_0x1192ba[_0x371bb7]=_0x3f7d71;}_0x6b0d12=0x1*-0x10a5+-0x157*0xa+0x1e0b,_0x371bb7=-0x6*0xd9+0x10af+-0xb99;for(let _0x50d26f=0xeef+-0x291+-0xc5e;_0x50d26f<_0x303924['\x6c\x65\x6e\x67\x74\x68'];_0x50d26f++){_0x6b0d12=(_0x6b0d12+(-0x2435+-0xc*-0x2e2+0x19e))%(-0x6fd*-0x1+-0x9*0x182+0x795),_0x371bb7=(_0x371bb7+_0x1192ba[_0x6b0d12])%(-0x2f3*0x9+0x1434+0x1*0x757),_0x3f7d71=_0x1192ba[_0x6b0d12],_0x1192ba[_0x6b0d12]=_0x1192ba[_0x371bb7],_0x1192ba[_0x371bb7]=_0x3f7d71,_0xbca765+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x303924['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x50d26f)^_0x1192ba[(_0x1192ba[_0x6b0d12]+_0x1192ba[_0x371bb7])%(-0x182*-0x7+0x1051+-0x25*0xb3)]);}return _0xbca765;};_0x2c06['\x6d\x57\x68\x73\x52\x4a']=_0x269e7f,_0x2c06['\x70\x43\x72\x56\x54\x73']={},_0x2c06['\x4b\x66\x59\x48\x6c\x4d']=!![];}const _0x5ad2df=_0x1c6bb7[-0x2*0x583+0x4b2*0x6+-0x1126],_0x54d502=_0x5259d1+_0x5ad2df,_0x1f405c=_0x2c06['\x70\x43\x72\x56\x54\x73'][_0x54d502];if(!_0x1f405c){if(_0x2c06['\x66\x73\x69\x78\x4f\x47']===undefined){const _0x38a3e7=function(_0x3e3796){this['\x59\x41\x57\x54\x48\x4c']=_0x3e3796,this['\x51\x4e\x57\x54\x61\x4b']=[-0x2*-0x419+-0x173c+-0x1*-0xf0b,0x1*-0x13d0+0x227c+-0xeac,0x86f+0x557*0x5+0x3*-0xbb6],this['\x6b\x67\x51\x48\x50\x73']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x69\x64\x53\x76\x6a\x65']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x69\x65\x6b\x70\x5a\x74']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x38a3e7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x48\x54\x75\x75\x6c\x6d']=function(){const _0x488ee0=new RegExp(this['\x69\x64\x53\x76\x6a\x65']+this['\x69\x65\x6b\x70\x5a\x74']),_0x4fd7ea=_0x488ee0['\x74\x65\x73\x74'](this['\x6b\x67\x51\x48\x50\x73']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x51\x4e\x57\x54\x61\x4b'][0x7*0x3d5+-0x110f+-0x9c3]:--this['\x51\x4e\x57\x54\x61\x4b'][-0xd60+-0x1e7*0x13+0x1*0x3185];return this['\x47\x72\x45\x6d\x50\x64'](_0x4fd7ea);},_0x38a3e7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x47\x72\x45\x6d\x50\x64']=function(_0xfa4b41){if(!Boolean(~_0xfa4b41))return _0xfa4b41;return this['\x56\x6c\x70\x78\x7a\x68'](this['\x59\x41\x57\x54\x48\x4c']);},_0x38a3e7['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x56\x6c\x70\x78\x7a\x68']=function(_0x598689){for(let _0x23b304=-0x4d7+-0xeaa+0x1381,_0x52a9fe=this['\x51\x4e\x57\x54\x61\x4b']['\x6c\x65\x6e\x67\x74\x68'];_0x23b304<_0x52a9fe;_0x23b304++){this['\x51\x4e\x57\x54\x61\x4b']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x52a9fe=this['\x51\x4e\x57\x54\x61\x4b']['\x6c\x65\x6e\x67\x74\x68'];}return _0x598689(this['\x51\x4e\x57\x54\x61\x4b'][0x357+-0xcf4*-0x2+-0x1d3f]);},(''+function(){return-0x750+0x2*0x855+0x1*-0x95a;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(-0x18a+-0x6d3*0x3+-0x581*-0x4)&&new _0x38a3e7(_0x2c06)['\x48\x54\x75\x75\x6c\x6d'](),_0x2c06['\x66\x73\x69\x78\x4f\x47']=!![];}_0x489063=_0x2c06['\x6d\x57\x68\x73\x52\x4a'](_0x489063,_0x4d6708),_0x2c06['\x70\x43\x72\x56\x54\x73'][_0x54d502]=_0x489063;}else _0x489063=_0x1f405c;return _0x489063;}const _0x3b95db=Object[_0x28f474(0x1fc,'\x66\x32\x58\x29')](_0xd87bda);function _0x325126(_0x8cf2d4){const _0x4eb3f7=_0x28f474,_0x4ff622={'\x6f\x52\x45\x6d\x6e':function(_0x264d75,_0xa9b737){return _0x264d75!==_0xa9b737;},'\x6a\x57\x6a\x4a\x44':_0x4eb3f7(0x23a,'\x51\x37\x6e\x39'),'\x6f\x68\x64\x43\x52':_0x4eb3f7(0x237,'\x45\x41\x59\x72'),'\x6b\x46\x44\x4d\x41':function(_0x28fb9f,_0x468977){return _0x28fb9f(_0x468977);},'\x6c\x55\x69\x49\x6c':function(_0x32ed42,_0x2ce9c5){return _0x32ed42*_0x2ce9c5;}},_0x5bd761=_0x8cf2d4&&(_0x8cf2d4[_0x4eb3f7(0x245,'\x49\x21\x39\x64')+'\x70']||_0x8cf2d4[_0x4eb3f7(0x22e,'\x51\x37\x6e\x39')+_0x4eb3f7(0x254,'\x33\x69\x5d\x78')]);if(_0x5bd761){if(_0x4ff622[_0x4eb3f7(0x207,'\x31\x65\x2a\x49')](_0x4ff622[_0x4eb3f7(0x23f,'\x79\x61\x77\x54')],_0x4ff622[_0x4eb3f7(0x21a,'\x34\x50\x61\x65')])){const _0x35cb2e=Date[_0x4eb3f7(0x1f0,'\x6c\x4c\x4a\x45')](_0x5bd761);if(Number[_0x4eb3f7(0x226,'\x74\x72\x58\x42')](_0x35cb2e))return _0x35cb2e;}else{const _0x353ea8=_0x397b89['\x70\x61\x72\x73\x65'](_0x69e1a7);if(_0x19264c[_0x4eb3f7(0x230,'\x21\x6a\x4f\x44')](_0x353ea8))return _0x353ea8;}}if(_0x8cf2d4&&Number[_0x4eb3f7(0x240,'\x48\x34\x4f\x64')](_0x4ff622[_0x4eb3f7(0x250,'\x79\x26\x40\x4f')](Number,_0x8cf2d4[_0x4eb3f7(0x21e,'\x6e\x21\x69\x42')+'\x74'])))return _0x4ff622[_0x4eb3f7(0x23b,'\x5d\x29\x37\x34')](Number(_0x8cf2d4['\x63\x72\x65\x61\x74\x65\x64\x41'+'\x74']),-0xa4b+-0x1a0d+-0x10*-0x284);return null;}function _0x24a556(_0x2dcc63={}){const _0x10f836=_0x28f474,_0x70b525={'\x49\x67\x64\x53\x45':function(_0x30b580,_0x1bc2cd){return _0x30b580*_0x1bc2cd;},'\x52\x69\x57\x74\x54':function(_0x47d50f,_0x5df386){return _0x47d50f(_0x5df386);},'\x53\x7a\x6f\x59\x5a':function(_0x404584,_0x251b13){return _0x404584!=_0x251b13;},'\x65\x63\x4a\x4e\x77':'\x75\x74\x66\x38','\x57\x4b\x62\x46\x47':function(_0x456206){return _0x456206();},'\x4e\x53\x58\x6b\x57':function(_0x366b6c,_0x34bd07){return _0x366b6c===_0x34bd07;},'\x4e\x4d\x58\x70\x72':_0x10f836(0x214,'\x48\x34\x4f\x64'),'\x79\x44\x54\x7a\x59':function(_0x463db6,_0x33dfed){return _0x463db6===_0x33dfed;},'\x6e\x52\x6d\x56\x47':_0x10f836(0x22a,'\x48\x34\x4f\x64'),'\x48\x63\x4a\x56\x42':'\x77\x4e\x41\x4c\x76','\x47\x76\x64\x66\x66':function(_0x5df656,_0x3a9662,_0xd972e7){return _0x5df656(_0x3a9662,_0xd972e7);},'\x7a\x7a\x78\x50\x50':function(_0x1a6eb2,_0x4b7928){return _0x1a6eb2!==_0x4b7928;},'\x54\x53\x79\x49\x69':_0x10f836(0x22f,'\x65\x30\x62\x36'),'\x72\x48\x72\x4f\x49':function(_0x1d739d,_0x378f5e){return _0x1d739d(_0x378f5e);},'\x75\x76\x74\x62\x4e':function(_0x2193b9,_0x3f476f){return _0x2193b9==_0x3f476f;},'\x51\x71\x4d\x6c\x6f':function(_0x5bc364,_0x14de93){return _0x5bc364<_0x14de93;},'\x59\x48\x57\x6d\x53':function(_0x5e89da,_0x200eee){return _0x5e89da>_0x200eee;},'\x4c\x75\x43\x4f\x52':function(_0x340303,_0x1bc231){return _0x340303(_0x1bc231);},'\x48\x6d\x5a\x63\x4f':function(_0x3d6229,_0x1d6da2){return _0x3d6229(_0x1d6da2);},'\x47\x6d\x64\x78\x77':function(_0x1da588,_0x4761d9){return _0x1da588>_0x4761d9;},'\x58\x4e\x66\x4d\x54':function(_0x2b3ef3,_0x135240){return _0x2b3ef3>_0x135240;},'\x70\x4f\x48\x79\x44':function(_0x40ddc9,_0x1a2159){return _0x40ddc9||_0x1a2159;},'\x58\x63\x6b\x4e\x64':function(_0x560b61,_0x16e116){return _0x560b61===_0x16e116;},'\x57\x52\x52\x56\x46':function(_0x5a0433,_0x12e5c2){return _0x5a0433+_0x12e5c2;}},_0x374b8d=_0x2dcc63&&_0x70b525[_0x10f836(0x21d,'\x79\x61\x77\x54')](_0x2dcc63[_0x10f836(0x221,'\x6e\x21\x69\x42')],null)?Date[_0x10f836(0x1ee,'\x31\x65\x2a\x49')](_0x2dcc63['\x73\x69\x6e\x63\x65\x49\x73\x6f']):NaN,_0xc5c9d2={..._0x3b95db};if(!Number[_0x10f836(0x244,'\x32\x42\x2a\x44')](_0x374b8d))return _0xc5c9d2;const _0x3090a4=_0x2dcc63&&_0x2dcc63[_0x10f836(0x224,'\x61\x40\x4a\x32')]!=null&&Number[_0x10f836(0x1f3,'\x5e\x58\x44\x33')](Date[_0x10f836(0x20e,'\x54\x53\x34\x71')](_0x2dcc63[_0x10f836(0x1fb,'\x33\x69\x5d\x78')]))?Date[_0x10f836(0x215,'\x61\x40\x4a\x32')](_0x2dcc63[_0x10f836(0x23e,'\x66\x5a\x2a\x56')]):Date[_0x10f836(0x219,'\x74\x23\x4e\x57')]();let _0x4adff4;try{const _0x358ff0=_0x4babcd(),_0x3fce3b={..._0x3b95db};if(!_0x3234c5[_0x10f836(0x1f4,'\x48\x42\x79\x68')+'\x6e\x63'](_0x358ff0))return _0x3fce3b;_0x4adff4=_0x3234c5[_0x10f836(0x21c,'\x41\x63\x29\x32')+_0x10f836(0x204,'\x33\x69\x5d\x78')](_0x358ff0,_0x70b525[_0x10f836(0x20c,'\x45\x41\x59\x72')]);}catch(_0x45d3d8){const _0x3347fc={..._0x3b95db};return _0x3347fc;}let _0x79011e=null;try{_0x79011e=_0x70b525['\x57\x4b\x62\x46\x47'](_0x4160e3);}catch(_0x96b450){_0x79011e=null;}let _0x135d31=0x11*-0x137+-0x1539+0x1*0x29e0,_0x51a447=-0x5ed*0x4+-0x14*-0x1c9+-0xc00,_0x135c16=-0x157*0x9+-0x1e3b+-0x2a4a*-0x1;for(const _0x3b3a87 of _0x4adff4[_0x10f836(0x20d,'\x32\x42\x2a\x44')]('\x0a')){if(_0x70b525[_0x10f836(0x1f9,'\x23\x46\x34\x4c')](_0x70b525[_0x10f836(0x208,'\x21\x6a\x6e\x66')],_0x70b525[_0x10f836(0x246,'\x48\x34\x4f\x64')])){const _0x408483=_0x3b3a87[_0x10f836(0x1fd,'\x74\x72\x58\x42')]();if(!_0x408483)continue;let _0x21e7bc;try{if(_0x70b525[_0x10f836(0x21f,'\x65\x73\x4c\x25')](_0x70b525[_0x10f836(0x22c,'\x6c\x6b\x45\x68')],_0x70b525[_0x10f836(0x24b,'\x34\x21\x39\x44')])){const _0x576487=_0x440168&&(_0x48dd32[_0x10f836(0x1e9,'\x39\x5e\x44\x49')+'\x70']||_0xd325c2['\x63\x72\x65\x61\x74\x65\x64\x41'+_0x10f836(0x223,'\x39\x5e\x44\x49')]);if(_0x576487){const _0x1619ed=_0x8a04b5['\x70\x61\x72\x73\x65'](_0x576487);if(_0x7f39f5[_0x10f836(0x239,'\x69\x28\x45\x5b')](_0x1619ed))return _0x1619ed;}if(_0x3cd051&&_0x1084a1['\x69\x73\x46\x69\x6e\x69\x74\x65'](_0x5282f2(_0x6381b4[_0x10f836(0x24c,'\x6c\x23\x74\x55')+'\x74'])))return VVUKAh[_0x10f836(0x228,'\x48\x42\x79\x68')](VVUKAh[_0x10f836(0x217,'\x33\x69\x5d\x78')](_0x32779f,_0x58e9a2[_0x10f836(0x21e,'\x6e\x21\x69\x42')+'\x74']),0x409*0x5+-0x4*-0x6eb+-0x2bf1);return null;}else _0x21e7bc=JSON[_0x10f836(0x248,'\x74\x23\x4e\x57')](_0x408483);}catch(_0x37d85f){continue;}if(_0x21e7bc&&_0x21e7bc[_0x10f836(0x20f,'\x79\x26\x40\x4f')+'\x64']){if(!_0x79011e)continue;try{_0x21e7bc=_0x70b525['\x47\x76\x64\x66\x66'](_0x4c9550,_0x21e7bc,_0x79011e);}catch(_0x1972cf){continue;}}if(!_0x21e7bc||_0x70b525[_0x10f836(0x235,'\x65\x73\x4c\x25')](typeof _0x21e7bc,_0x70b525[_0x10f836(0x24a,'\x34\x50\x61\x65')]))continue;const _0x3cf76c=_0x70b525[_0x10f836(0x23c,'\x48\x34\x4f\x64')](_0x325126,_0x21e7bc);if(_0x70b525[_0x10f836(0x229,'\x79\x61\x77\x54')](_0x3cf76c,null)||_0x70b525[_0x10f836(0x22d,'\x74\x32\x75\x5b')](_0x3cf76c,_0x374b8d)||_0x70b525[_0x10f836(0x1f6,'\x31\x65\x2a\x49')](_0x3cf76c,_0x3090a4))continue;const _0x4652f2=_0x70b525[_0x10f836(0x200,'\x4d\x49\x4d\x72')](Number,_0x21e7bc[_0x10f836(0x212,'\x5d\x29\x37\x34')+_0x10f836(0x241,'\x5e\x58\x44\x33')]),_0x1ce9ad=_0x70b525[_0x10f836(0x227,'\x34\x21\x39\x44')](Number,_0x21e7bc[_0x10f836(0x1fa,'\x5e\x58\x44\x33')+_0x10f836(0x252,'\x61\x49\x6b\x23')]),_0xabf059=Number['\x69\x73\x46\x69\x6e\x69\x74\x65'](_0x4652f2)&&_0x70b525[_0x10f836(0x24e,'\x74\x72\x58\x42')](_0x4652f2,-0x1*-0x487+0x24c9+-0x2950),_0x33dbd3=Number[_0x10f836(0x1f2,'\x65\x73\x4c\x25')](_0x1ce9ad)&&_0x70b525[_0x10f836(0x236,'\x31\x65\x2a\x49')](_0x1ce9ad,0x1*-0x3fb+0x9ad*-0x3+0x34d*0xa);if(_0xabf059)_0x135d31+=_0x4652f2;if(_0x33dbd3)_0x51a447+=_0x1ce9ad;if(_0x70b525['\x70\x4f\x48\x79\x44'](_0xabf059,_0x33dbd3))_0x135c16+=0x15c5*0x1+0x17f+-0x18d*0xf;}else _0x2ec853=_0x180f56[_0x10f836(0x1f0,'\x6c\x4c\x4a\x45')](_0x24d554);}const _0x383581={..._0x3b95db};if(_0x70b525[_0x10f836(0x243,'\x74\x32\x75\x5b')](_0x135c16,-0x9*0x35c+0x135+0x1d07))return _0x383581;return{'\x69\x6e\x70\x75\x74\x5f\x74\x6f\x6b\x65\x6e\x73':_0x135d31,'\x6f\x75\x74\x70\x75\x74\x5f\x74\x6f\x6b\x65\x6e\x73':_0x51a447,'\x74\x6f\x74\x61\x6c\x5f\x74\x6f\x6b\x65\x6e\x73':_0x70b525['\x57\x52\x52\x56\x46'](_0x135d31,_0x51a447),'\x63\x61\x6c\x6c\x73':_0x135c16,'\x6d\x65\x61\x73\x75\x72\x65\x64':!![]};}function _0x3c70(){const _0x18df63=['\x57\x36\x70\x64\x4a\x53\x6b\x76\x44\x38\x6b\x31','\x57\x36\x4b\x30\x67\x75\x33\x63\x54\x53\x6b\x4f\x57\x52\x68\x64\x4d\x47','\x6f\x53\x6b\x42\x57\x4f\x6c\x64\x50\x6d\x6b\x41','\x57\x35\x66\x41\x57\x52\x78\x63\x47\x4b\x30','\x76\x77\x4a\x64\x4f\x71\x35\x34\x57\x35\x69\x37\x57\x37\x75','\x69\x43\x6b\x6f\x57\x34\x74\x63\x4f\x4d\x4a\x64\x52\x61\x37\x64\x4c\x61\x79','\x57\x34\x61\x2b\x57\x51\x74\x64\x4a\x30\x34','\x44\x64\x72\x37\x57\x51\x33\x64\x56\x74\x6c\x64\x54\x57\x6d','\x43\x53\x6f\x34\x57\x52\x68\x63\x55\x33\x34','\x66\x58\x46\x63\x50\x4e\x52\x63\x52\x43\x6b\x43','\x57\x35\x38\x75\x57\x50\x47\x6c\x6a\x47','\x57\x34\x33\x63\x49\x4a\x61\x47\x57\x34\x76\x53\x57\x4f\x78\x63\x4e\x58\x4e\x64\x4e\x68\x56\x63\x56\x71','\x64\x53\x6b\x6c\x42\x6d\x6f\x37','\x57\x36\x4a\x63\x4b\x38\x6f\x54\x57\x4f\x33\x63\x4a\x71\x72\x4e\x57\x37\x53\x49\x57\x36\x56\x64\x4e\x71\x34\x41','\x65\x47\x42\x64\x52\x38\x6b\x4e\x42\x5a\x37\x63\x4d\x75\x79','\x6b\x53\x6f\x7a\x64\x75\x48\x36\x57\x51\x42\x64\x56\x6d\x6f\x4f','\x62\x58\x2f\x64\x53\x53\x6b\x55\x7a\x71','\x64\x53\x6f\x4b\x69\x38\x6b\x35\x57\x4f\x5a\x64\x50\x38\x6f\x45\x6c\x71','\x57\x36\x46\x64\x47\x6d\x6b\x30\x43\x6d\x6b\x49\x57\x4f\x4a\x63\x51\x6d\x6f\x41','\x45\x43\x6b\x73\x57\x34\x2f\x63\x55\x30\x69','\x65\x47\x64\x64\x4b\x43\x6b\x32\x42\x49\x70\x63\x4c\x4b\x57','\x6b\x58\x4e\x63\x56\x6d\x6f\x59\x67\x71','\x57\x4f\x4b\x30\x57\x34\x30','\x57\x37\x66\x48\x57\x50\x56\x64\x48\x77\x31\x37\x57\x37\x4e\x63\x52\x47','\x57\x52\x78\x64\x4c\x6d\x6b\x7a\x57\x35\x46\x64\x4b\x66\x38\x4a\x57\x37\x4f','\x57\x37\x48\x70\x57\x37\x78\x63\x4d\x32\x56\x64\x4f\x6d\x6b\x71\x57\x36\x57','\x62\x71\x50\x39\x6d\x33\x6d','\x75\x6d\x6b\x37\x57\x36\x52\x63\x50\x78\x71','\x72\x38\x6b\x2b\x61\x6d\x6f\x6d\x57\x50\x35\x34\x57\x37\x54\x44','\x65\x57\x54\x45','\x57\x37\x4a\x64\x53\x66\x5a\x64\x54\x53\x6b\x54','\x57\x52\x70\x64\x4b\x53\x6b\x52\x57\x34\x37\x64\x49\x30\x69\x69\x57\x36\x53','\x64\x38\x6b\x53\x41\x38\x6f\x39\x57\x52\x56\x64\x49\x61\x39\x59','\x57\x4f\x6e\x6f\x44\x48\x43\x38\x57\x51\x4b','\x57\x37\x6d\x48\x57\x51\x4e\x64\x4d\x47','\x78\x43\x6f\x35\x57\x34\x6c\x63\x4e\x38\x6b\x35\x57\x36\x30\x54\x57\x52\x4a\x63\x52\x43\x6b\x44','\x57\x37\x65\x58\x57\x52\x78\x64\x4c\x77\x65','\x61\x53\x6f\x37\x57\x4f\x70\x63\x51\x53\x6f\x46','\x46\x38\x6b\x32\x57\x37\x78\x64\x4b\x53\x6b\x37\x57\x34\x58\x71\x57\x52\x74\x63\x47\x73\x6e\x59\x57\x51\x37\x64\x52\x61','\x57\x35\x7a\x66\x77\x72\x69','\x57\x51\x78\x63\x48\x63\x68\x64\x55\x4a\x37\x63\x53\x74\x78\x63\x51\x53\x6f\x49\x68\x6d\x6b\x71\x57\x35\x5a\x63\x4a\x57','\x6b\x43\x6b\x37\x43\x43\x6f\x33','\x65\x47\x42\x64\x48\x38\x6b\x5a\x76\x61','\x57\x52\x76\x4c\x57\x37\x4e\x63\x48\x47\x4f\x37\x64\x49\x33\x63\x50\x43\x6b\x6b\x43\x33\x53\x30','\x7a\x53\x6b\x48\x57\x37\x4a\x63\x50\x75\x4b','\x57\x35\x50\x44\x57\x52\x37\x64\x4d\x66\x34','\x63\x53\x6f\x48\x44\x38\x6f\x43\x57\x34\x2f\x63\x52\x38\x6f\x73\x62\x6d\x6b\x76\x57\x52\x61\x63\x57\x4f\x53','\x73\x31\x47\x35\x62\x78\x58\x59\x64\x38\x6b\x51\x57\x50\x57','\x67\x43\x6b\x54\x43\x43\x6f\x4e\x57\x51\x70\x64\x53\x57\x4c\x2b','\x6a\x53\x6f\x75\x6e\x33\x6e\x35','\x74\x53\x6b\x4e\x6b\x6d\x6b\x68\x57\x4f\x4f','\x66\x57\x76\x45\x57\x4f\x50\x4d','\x46\x6d\x6f\x71\x57\x50\x42\x63\x48\x65\x42\x64\x4c\x57\x52\x64\x56\x47','\x57\x4f\x68\x63\x4c\x74\x46\x63\x52\x38\x6f\x6c\x57\x37\x37\x64\x47\x38\x6f\x37\x79\x58\x4a\x63\x56\x71\x4f','\x57\x35\x4c\x49\x57\x50\x38\x69\x6c\x78\x79\x41\x57\x52\x69\x36\x79\x49\x42\x64\x4c\x6d\x6b\x43','\x57\x50\x78\x64\x4e\x68\x48\x4e\x57\x4f\x43\x64\x57\x51\x78\x63\x4b\x71','\x57\x51\x76\x4c\x57\x4f\x2f\x64\x4f\x4e\x2f\x64\x53\x43\x6f\x2f','\x57\x51\x2f\x63\x51\x43\x6b\x43\x57\x35\x66\x64','\x42\x38\x6f\x75\x57\x50\x56\x64\x55\x38\x6b\x4d','\x57\x37\x6d\x36\x57\x4f\x78\x64\x48\x4e\x65','\x6b\x6d\x6b\x52\x73\x6d\x6f\x47\x57\x4f\x6d','\x57\x52\x44\x57\x77\x47\x74\x64\x54\x6d\x6f\x4c\x57\x35\x4a\x64\x55\x53\x6b\x34\x77\x43\x6b\x73\x46\x43\x6f\x6e','\x57\x37\x33\x64\x47\x6d\x6b\x71','\x61\x43\x6b\x47\x57\x50\x2f\x64\x52\x53\x6b\x48','\x78\x4c\x52\x63\x49\x6d\x6f\x72\x57\x36\x75\x59\x72\x71\x57\x6c\x57\x34\x70\x64\x4a\x4e\x37\x64\x4d\x61','\x57\x52\x78\x63\x4e\x73\x43\x4d\x57\x35\x42\x63\x52\x59\x65\x66','\x6e\x57\x4a\x63\x51\x66\x68\x63\x4c\x61','\x6a\x71\x6e\x6a\x45\x4e\x58\x55\x45\x6d\x6b\x50','\x57\x36\x66\x77\x57\x4f\x4e\x64\x4c\x4c\x4f','\x67\x43\x6f\x4d\x57\x36\x6c\x63\x4b\x53\x6f\x43\x57\x51\x38','\x6e\x72\x48\x63\x45\x67\x31\x63\x42\x38\x6b\x68','\x43\x53\x6f\x63\x66\x68\x44\x44\x57\x51\x56\x64\x52\x47','\x65\x49\x42\x64\x53\x43\x6b\x54','\x41\x53\x6f\x42\x57\x50\x33\x64\x4f\x43\x6b\x56\x65\x4e\x5a\x64\x4c\x47','\x43\x6d\x6f\x45\x57\x4f\x5a\x64\x50\x53\x6b\x57','\x57\x36\x34\x47\x57\x4f\x42\x64\x4e\x4c\x44\x49\x74\x4a\x53','\x57\x35\x66\x75\x57\x51\x78\x63\x54\x30\x61','\x57\x35\x72\x71\x57\x37\x4a\x63\x55\x31\x4f','\x65\x71\x74\x63\x53\x32\x52\x63\x47\x61','\x57\x4f\x33\x63\x4f\x53\x6b\x45\x57\x34\x7a\x51','\x41\x53\x6b\x73\x57\x35\x68\x63\x50\x66\x71','\x57\x52\x4b\x4c\x6d\x43\x6f\x2b\x6d\x71','\x73\x63\x62\x78\x57\x52\x6c\x64\x50\x57','\x63\x72\x5a\x64\x4e\x38\x6b\x64\x57\x51\x6a\x4c\x65\x73\x4b','\x6e\x6d\x6f\x72\x57\x4f\x4a\x64\x47\x72\x74\x64\x52\x71','\x57\x36\x34\x7a\x57\x36\x74\x63\x49\x38\x6b\x4f\x57\x50\x4e\x63\x49\x4a\x38','\x6f\x38\x6f\x66\x57\x4f\x74\x64\x55\x72\x74\x64\x48\x6d\x6b\x49\x71\x53\x6b\x61\x7a\x4a\x37\x63\x4a\x74\x6d','\x6d\x48\x6e\x37\x57\x51\x4c\x37','\x57\x37\x47\x35\x57\x37\x58\x43\x57\x37\x78\x64\x4b\x64\x62\x70\x62\x57\x34','\x6c\x38\x6b\x31\x73\x6d\x6f\x65\x57\x51\x38','\x57\x36\x6a\x4f\x57\x51\x78\x64\x56\x66\x6d','\x75\x43\x6b\x39\x57\x35\x56\x63\x48\x78\x6d','\x6b\x38\x6f\x2f\x6e\x66\x6e\x50','\x76\x30\x68\x63\x4f\x66\x2f\x63\x56\x6d\x6b\x6d\x57\x37\x66\x6f','\x57\x37\x33\x64\x4a\x31\x6c\x63\x50\x67\x42\x64\x4f\x78\x68\x63\x4e\x61','\x67\x73\x52\x64\x4e\x6d\x6b\x77\x57\x52\x30','\x57\x50\x64\x64\x50\x32\x66\x42\x57\x50\x38','\x57\x4f\x2f\x63\x53\x38\x6b\x35\x57\x35\x48\x73','\x6a\x43\x6f\x52\x57\x51\x37\x63\x4c\x47','\x57\x36\x68\x64\x54\x6d\x6b\x4c\x7a\x6d\x6b\x6b\x57\x4f\x56\x64\x56\x58\x69','\x64\x49\x78\x63\x52\x75\x6c\x63\x49\x47','\x57\x50\x74\x63\x49\x6d\x6b\x6e\x57\x37\x35\x31\x57\x51\x30\x62\x70\x61','\x57\x52\x46\x64\x47\x53\x6b\x58\x57\x34\x30','\x41\x38\x6f\x41\x57\x50\x53','\x71\x74\x6a\x58\x57\x50\x64\x64\x52\x61','\x76\x6d\x6b\x4b\x61\x53\x6b\x68\x57\x50\x64\x64\x54\x53\x6f\x49\x65\x71','\x72\x38\x6b\x34\x67\x43\x6f\x69\x57\x4f\x66\x74\x57\x36\x35\x46','\x57\x52\x70\x63\x54\x53\x6b\x74\x57\x36\x44\x50','\x42\x6d\x6f\x61\x57\x4f\x74\x64\x4d\x53\x6b\x32\x6e\x76\x52\x64\x49\x47'];_0x3c70=function(){return _0x18df63;};return _0x3c70();}const _0x58002d={};_0x58002d[_0x28f474(0x247,'\x61\x40\x4a\x32')+_0x28f474(0x1f1,'\x6d\x71\x49\x61')]=_0x24a556,module['\x65\x78\x70\x6f\x72\x74\x73']=_0x58002d;
|
package/.cursor/BUGBOT.md
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
# Bugbot Review Rules — evolver-private-dev
|
|
2
|
-
|
|
3
|
-
This file gives Cursor Bugbot project-specific context. The repository is the
|
|
4
|
-
**private source of truth** for `@evomap/evolver`; the public mirror is
|
|
5
|
-
`EvoMap/evolver`, built via `scripts/build_public.js` driven by
|
|
6
|
-
`public.manifest.json`. Treat anything that could leak from private to public,
|
|
7
|
-
or that could break GEP asset integrity, as high severity.
|
|
8
|
-
|
|
9
|
-
## Project shape
|
|
10
|
-
|
|
11
|
-
- Pure Node.js (no TypeScript). Public surface is the npm package
|
|
12
|
-
`@evomap/evolver`; entry point is `index.js`.
|
|
13
|
-
- Runtime dependencies are intentionally minimal — only `dotenv`. Do not
|
|
14
|
-
approve PRs that add new runtime dependencies without a clear justification
|
|
15
|
-
in the PR description.
|
|
16
|
-
- Tests run via `node --test`. There is no ESLint/Prettier in CI; rely on
|
|
17
|
-
Bugbot to catch style and correctness regressions.
|
|
18
|
-
|
|
19
|
-
## High-severity rules (block the PR)
|
|
20
|
-
|
|
21
|
-
### 1. Secrets must round-trip through `src/gep/sanitize.js`
|
|
22
|
-
|
|
23
|
-
Any code path that writes capsule payloads, agent logs, prompts, or hub
|
|
24
|
-
broadcasts must call `sanitizePayload` (or an equivalent redactor) **before**
|
|
25
|
-
the data leaves the process. Flag as a blocking Bug if a PR:
|
|
26
|
-
|
|
27
|
-
- Logs raw `process.env.*`, request headers, or `Authorization` values.
|
|
28
|
-
- Sends capsule/event/log objects to `src/gep/bridge.js`,
|
|
29
|
-
`src/gep/a2aProtocol.js`, `src/gep/issueReporter.js`, `src/proxy/sync/**`,
|
|
30
|
-
or any HTTP/IPC sink without first running `sanitizePayload`.
|
|
31
|
-
- Adds a new secret pattern (API key, token, private key) that is not also
|
|
32
|
-
added to `REDACT_PATTERNS` in `sanitize.js`.
|
|
33
|
-
|
|
34
|
-
### 2. Public/private leak prevention
|
|
35
|
-
|
|
36
|
-
`scripts/build_public.js` + `public.manifest.json` decide what ships to the
|
|
37
|
-
public repo and to npm. Block PRs that:
|
|
38
|
-
|
|
39
|
-
- Add a new top-level path that is **not** covered by either `include` or
|
|
40
|
-
`exclude` in `public.manifest.json`. New private-only paths (docs/,
|
|
41
|
-
memory/, internal scripts) must be added to `exclude`.
|
|
42
|
-
- Add `console.log` / TODO / FIXME / internal URLs / employee emails inside
|
|
43
|
-
files listed in the `obfuscate` array — those files are shipped after
|
|
44
|
-
obfuscation and any plaintext secret/comment leaks past obfuscation.
|
|
45
|
-
- Reference `EvoMap/evolver-private-dev` (this repo's URL) inside any file
|
|
46
|
-
that is part of the public include set.
|
|
47
|
-
- **Add a new file under `src/gep/**` or `src/evolve/**` (or any directory
|
|
48
|
-
whose siblings are already in the `obfuscate` array) without also adding
|
|
49
|
-
the new file to `obfuscate`.** Sibling consistency is the rule: if every
|
|
50
|
-
other `*.js` in the same directory is obfuscated, the new one must be
|
|
51
|
-
too. Exception: the PR description must explicitly state why obfuscation
|
|
52
|
-
is unnecessary (e.g. "trivial public algorithm reused from MIT-licensed
|
|
53
|
-
source") AND the file must contain no business logic, no env-var reads,
|
|
54
|
-
and no path/URL constants. Historical regressions: PR #20 (hub.js,
|
|
55
|
-
enrich.js, utils.js missed obfuscate, fixed in 79821fc and 3da07e3),
|
|
56
|
-
PR #34 (hash.js missed obfuscate).
|
|
57
|
-
|
|
58
|
-
**This file is private-only.** `.cursor/BUGBOT.md` is private to this repo
|
|
59
|
-
and is pruned from the public build via `public.manifest.json`'s
|
|
60
|
-
`exclude: [".cursor/**"]`. Project-specific rules for the public mirror
|
|
61
|
-
`EvoMap/evolver` (if any are needed) live in the Cursor dashboard's
|
|
62
|
-
repository manual rules, not in the source tree, so the published npm
|
|
63
|
-
package and the public GitHub repo do not carry editor-tool config files.
|
|
64
|
-
|
|
65
|
-
### 3. GEP asset integrity
|
|
66
|
-
|
|
67
|
-
The GEP protocol depends on stable hashing and signatures
|
|
68
|
-
(`src/gep/contentHash.js`, `src/gep/crypto.js`, `src/gep/integrityCheck.js`).
|
|
69
|
-
Block PRs that:
|
|
70
|
-
|
|
71
|
-
- Change `contentHash` / `crypto.sign` / `crypto.verify` behaviour without an
|
|
72
|
-
explicit version bump and a migration path for existing
|
|
73
|
-
`assets/gep/*.jsonl` records.
|
|
74
|
-
- Mutate gene/capsule/event objects in-place after they have been hashed or
|
|
75
|
-
signed.
|
|
76
|
-
- Introduce non-deterministic ordering (e.g. `Object.keys` without sort, or
|
|
77
|
-
`for ... in`) inside any code that participates in hashing.
|
|
78
|
-
- **Ship a schema factory (e.g. `createGene` / `createCapsule` / `createTask`,
|
|
79
|
-
or any new `src/gep/schemas/<X>.js`) without proving the matching
|
|
80
|
-
`validate<X>` is actually called on every write/publish path.** A schema
|
|
81
|
-
that no one calls is dead code that masks LLM/Hub-supplied garbage.
|
|
82
|
-
Require the PR description to include a `grep -rn 'validate<X>' src/`
|
|
83
|
-
output covering at least: every `upsert<X>` / `append<X>` in
|
|
84
|
-
`src/gep/assetStore.js`, every `buildPublish<X>*` in
|
|
85
|
-
`src/gep/a2aProtocol.js`, and every direct disk-write site. Historical
|
|
86
|
-
regression: PR #25 / #27 shipped `validateGene` / `validateCapsule` that
|
|
87
|
-
no caller invoked, fixed retroactively as audit issue #30 H1 (commit
|
|
88
|
-
902a256). Track the same expectation for any future `validate<Y>`.
|
|
89
|
-
- **Spread `DEFAULTS` into a partial without slicing every reference-typed
|
|
90
|
-
field afterwards.** `Object.assign({}, X_DEFAULTS, partial)` is a shallow
|
|
91
|
-
copy: arrays and sub-objects on the result still point to either
|
|
92
|
-
`X_DEFAULTS`'s shared instance or to `partial`'s caller-owned
|
|
93
|
-
instance. Downstream `.push(...)` then contaminates every other consumer.
|
|
94
|
-
Every array field needs `Array.isArray(x) ? x.slice() : []`; every
|
|
95
|
-
sub-object needs `Object.assign({}, FIELD_DEFAULTS, x)`. Historical
|
|
96
|
-
regression: PR #25 createGene leaked `epigenetic_marks` /
|
|
97
|
-
`learning_history` / `anti_patterns` / `constraints.forbidden_paths`
|
|
98
|
-
across all genes (commit 549f1bd).
|
|
99
|
-
|
|
100
|
-
### 4. Filesystem and network safety
|
|
101
|
-
|
|
102
|
-
- Reject `child_process.exec*` / `spawn*` calls that interpolate untrusted
|
|
103
|
-
strings into the command. Use the array form with explicit args.
|
|
104
|
-
- Reject `fs.writeFileSync` / `fs.rmSync({recursive:true})` calls that
|
|
105
|
-
resolve paths from user/LLM input without going through `src/gep/paths.js`
|
|
106
|
-
or an equivalent allowlist.
|
|
107
|
-
- Reject HTTP fetches that disable TLS verification
|
|
108
|
-
(`rejectUnauthorized: false`, `NODE_TLS_REJECT_UNAUTHORIZED=0`) outside
|
|
109
|
-
isolated test fixtures.
|
|
110
|
-
|
|
111
|
-
## Medium-severity rules (request changes)
|
|
112
|
-
|
|
113
|
-
### Async correctness
|
|
114
|
-
|
|
115
|
-
- Every Promise must either be `await`ed or have a `.catch` handler. Flag
|
|
116
|
-
unhandled-rejection risks.
|
|
117
|
-
- Do not mix `await` with `.then(...)` chains inside the same logical block.
|
|
118
|
-
- Long-running loops in `src/proxy/**` must respect the existing cancellation
|
|
119
|
-
/ shutdown signals (look for `idleScheduler.js`, `lifecycle/**`).
|
|
120
|
-
|
|
121
|
-
### Module-load ordering vs. dotenv
|
|
122
|
-
|
|
123
|
-
`src/evolve.js` calls `require('dotenv').config(...)` mid-file (around
|
|
124
|
-
the comment block "Load environment variables from repo root"). Any module
|
|
125
|
-
that reads `process.env.X` at module-load time (e.g.
|
|
126
|
-
`const FOO = process.env.FOO || default` at the top of the file) MUST be
|
|
127
|
-
required AFTER the `dotenv.config()` call, otherwise `process.env.X` is
|
|
128
|
-
empty and the constant freezes to the default for the rest of the process
|
|
129
|
-
lifetime. Block PRs that:
|
|
130
|
-
|
|
131
|
-
- Add a new module-level `const`/`let` initialized from `process.env.*` and
|
|
132
|
-
hoist its `require(...)` above the `dotenv.config()` call in `evolve.js`,
|
|
133
|
-
`index.js`, or any new top-level entry point.
|
|
134
|
-
- Re-introduce eager `require('./evolve/pipeline/<X>')` at the top of
|
|
135
|
-
`src/evolve.js`. The current pattern requires those modules AFTER dotenv;
|
|
136
|
-
see commit 3da07e3 for context.
|
|
137
|
-
|
|
138
|
-
A safe pattern when a module truly needs env at module-load time: read the
|
|
139
|
-
env via `src/config.js`'s `envInt()` / `envStr()` helpers, which are
|
|
140
|
-
re-evaluated lazily on each call instead of frozen at module load.
|
|
141
|
-
|
|
142
|
-
### CLI compatibility
|
|
143
|
-
|
|
144
|
-
`index.js` is the public CLI binary. Any change to CLI flags, default
|
|
145
|
-
behaviour, exit codes, or stdout/stderr format is a breaking change for
|
|
146
|
-
downstream users. Require:
|
|
147
|
-
|
|
148
|
-
- A note in `CHANGELOG.md` describing the user-visible change.
|
|
149
|
-
- Backwards-compatible behaviour behind a feature flag in
|
|
150
|
-
`src/gep/featureFlags.js` whenever possible.
|
|
151
|
-
|
|
152
|
-
### Node version
|
|
153
|
-
|
|
154
|
-
`package.json` does not currently pin an `engines` field. The package is
|
|
155
|
-
distributed as a CLI to end users on a wide range of Node versions. Treat
|
|
156
|
-
Node.js >= 18 as the de-facto floor and flag use of APIs that require Node
|
|
157
|
-
20+ (e.g. `fs.glob`, top-level `using`, `--experimental-strip-types`) unless
|
|
158
|
-
the PR also adds an `engines.node` constraint to `package.json` and notes
|
|
159
|
-
the bump in `CHANGELOG.md`.
|
|
160
|
-
|
|
161
|
-
## Low-severity rules (nit / suggestion)
|
|
162
|
-
|
|
163
|
-
- Use `node:` prefix for built-in module imports (`require('node:fs')`).
|
|
164
|
-
- Prefer named functions over anonymous arrow functions when registering
|
|
165
|
-
event listeners — eases stack traces.
|
|
166
|
-
- Avoid `JSON.stringify(...)` of large objects in hot paths inside
|
|
167
|
-
`src/proxy/server/**`; prefer streaming or pagination.
|
|
168
|
-
|
|
169
|
-
## Context Bugbot should NOT flag
|
|
170
|
-
|
|
171
|
-
- The lack of TypeScript or ESLint config — intentional.
|
|
172
|
-
- Single-dependency `package.json` — intentional minimal supply chain.
|
|
173
|
-
- Files under `assets/gep/*.jsonl` are gitignored; if a PR appears to add
|
|
174
|
-
them, that is a **block**, not a nit (see rule 2).
|
|
175
|
-
- The `dist-public/` and `dist-binaries/` directories are build artifacts —
|
|
176
|
-
do not review them.
|
|
177
|
-
|
|
178
|
-
## Style
|
|
179
|
-
|
|
180
|
-
This repository forbids emoji in code, comments, commit messages, and
|
|
181
|
-
documentation, with a single allowed exception: the DNA glyph used in
|
|
182
|
-
public-facing docs. Flag any PR that adds other emoji.
|
package/.env.example
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# EvoMap Hub connection (optional -- all core features work offline without these)
|
|
2
|
-
# A2A_HUB_URL=https://evomap.ai
|
|
3
|
-
# A2A_NODE_ID=your_node_id_here
|
|
4
|
-
|
|
5
|
-
# Evolution strategy: balanced (default) | innovate | harden | repair-only
|
|
6
|
-
# EVOLVE_STRATEGY=balanced
|
|
7
|
-
|
|
8
|
-
# Bridge mode: controls sessions_spawn() output for host runtimes like OpenClaw.
|
|
9
|
-
# Defaults to off unless OPENCLAW_WORKSPACE is set.
|
|
10
|
-
# EVOLVE_BRIDGE=false
|
|
11
|
-
|
|
12
|
-
# Heartbeat interval in milliseconds (default: 360000 = 6 minutes)
|
|
13
|
-
# HEARTBEAT_INTERVAL_MS=360000
|
|
14
|
-
|
|
15
|
-
# Worker pool: set to 1 to participate as a worker in the EvoMap network
|
|
16
|
-
# WORKER_ENABLED=1
|
|
17
|
-
# WORKER_DOMAINS=repair,harden
|
|
18
|
-
# WORKER_MAX_LOAD=5
|
|
19
|
-
|
|
20
|
-
# Path overrides (usually auto-detected)
|
|
21
|
-
# MEMORY_DIR=./memory
|
|
22
|
-
# EVOLVER_REPO_ROOT=.
|
|
23
|
-
# OPENCLAW_WORKSPACE=
|
|
24
|
-
# When evolver runs as an npm dependency or a skill under a host repo,
|
|
25
|
-
# it auto-detects the host's .git so it can see Hand Agent edits.
|
|
26
|
-
# Set this to 'true' only if you deliberately want evolver to ignore the
|
|
27
|
-
# host repo and treat its own package directory as the work area.
|
|
28
|
-
# EVOLVER_NO_PARENT_GIT=false
|
|
29
|
-
|
|
30
|
-
# Auto GitHub issue reporting (enabled by default)
|
|
31
|
-
# EVOLVER_AUTO_ISSUE=true
|
|
32
|
-
# GITHUB_TOKEN=your_github_token_here
|
|
33
|
-
|
|
34
|
-
# Pre-publish leak check mode: strict (default since v1.69.7) | warn | off
|
|
35
|
-
# - strict: block publish when sensitive data is detected in the capsule/gene payload
|
|
36
|
-
# - warn: log a warning and continue publishing (relies on sanitizePayload redaction)
|
|
37
|
-
# - off: skip the leak scan entirely (not recommended)
|
|
38
|
-
# Set to 'warn' to restore v1.69.6 and earlier behavior.
|
|
39
|
-
# EVOLVER_LEAK_CHECK=strict
|
|
40
|
-
|
|
41
|
-
# Hub URL resolution (v1.69.7+):
|
|
42
|
-
# - A2A_HUB_URL is the primary override (used at runtime by most modules)
|
|
43
|
-
# - EVOMAP_HUB_URL is a secondary override kept for backward compatibility
|
|
44
|
-
# - EVOLVER_DEFAULT_HUB_URL overrides the compile-time default when neither of
|
|
45
|
-
# the above is set. Use this for fully air-gapped deployments that still want
|
|
46
|
-
# to point validator/directory/privacy clients at a private hub endpoint.
|
|
47
|
-
# EVOLVER_DEFAULT_HUB_URL=https://evomap.ai
|
|
48
|
-
|
|
49
|
-
# Verbose logging
|
|
50
|
-
# EVOLVER_VERBOSE=true
|
|
51
|
-
|
|
52
|
-
# Memory graph rotation (issue #519). memory_graph.jsonl accumulates
|
|
53
|
-
# every evolution event and grows unboundedly on long-running nodes.
|
|
54
|
-
# When the active file crosses EVOLVER_MEMORY_GRAPH_MAX_SIZE_MB it is
|
|
55
|
-
# renamed to memory_graph.jsonl.<timestamp>.gz and a fresh file is
|
|
56
|
-
# started. Only the most recent EVOLVER_MEMORY_GRAPH_RETENTION_COUNT
|
|
57
|
-
# archives are kept; older ones are deleted.
|
|
58
|
-
# EVOLVER_MEMORY_GRAPH_AUTO_ROTATE=true
|
|
59
|
-
# EVOLVER_MEMORY_GRAPH_MAX_SIZE_MB=100
|
|
60
|
-
# EVOLVER_MEMORY_GRAPH_RETENTION_COUNT=7
|
|
61
|
-
|
|
62
|
-
# Rollback strategy when a solidify cycle's validation fails.
|
|
63
|
-
# stash (default): git stash push --include-untracked. Recover via 'git stash pop'.
|
|
64
|
-
# hard: git reset --hard. WARNING: discards uncommitted changes irrecoverably.
|
|
65
|
-
# none: do nothing. Leaves the failed cycle's edits in place.
|
|
66
|
-
# Default flipped from 'hard' to 'stash' in 1.80.8 to prevent silent data loss
|
|
67
|
-
# when evolver runs in third-party host repos.
|
|
68
|
-
# EVOLVER_ROLLBACK_MODE=stash
|
package/.git-commit-guard-token
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
SKILL_COMMIT
|
package/.github/CODEOWNERS
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Code owners for this repository
|
|
2
|
-
# Format: each rule grants automatic review-request to the listed owner(s)
|
|
3
|
-
# when a matching path is touched in a PR. Combined with branch protection's
|
|
4
|
-
# "Require review from Code Owners" rule on main, these owners must approve
|
|
5
|
-
# the PR before it can merge.
|
|
6
|
-
#
|
|
7
|
-
# Multiple owners on each line means GitHub will auto-request a review from
|
|
8
|
-
# all listed owners on a matching PR; ANY one of them approving is sufficient
|
|
9
|
-
# to satisfy the branch-protection 'require code owner review' gate. This is
|
|
10
|
-
# the agreed fallback order: autogame-17 primary, forrestlinfeng + cloudcarver
|
|
11
|
-
# as backups when the primary is unavailable.
|
|
12
|
-
#
|
|
13
|
-
# Why we need this: PR #34 (2026-05-10) was self-merged by the author 2 minutes
|
|
14
|
-
# before a maintainer review comment landed, shipping a missing obfuscate
|
|
15
|
-
# registration into main. CODEOWNERS + branch protection make that pattern
|
|
16
|
-
# physically impossible.
|
|
17
|
-
|
|
18
|
-
# Default: every file is owned by autogame-17 unless a more specific rule below
|
|
19
|
-
# overrides it. Keeps coverage complete even for files we forget to call out.
|
|
20
|
-
* @autogame-17 @forrestlinfeng @cloudcarver
|
|
21
|
-
|
|
22
|
-
# High-risk paths -- listed explicitly so GitHub UI surfaces "Owner review
|
|
23
|
-
# required" prominently when these are touched, even if the catch-all above
|
|
24
|
-
# would already cover them. New contributors should treat any change here
|
|
25
|
-
# as a multi-day review cycle.
|
|
26
|
-
|
|
27
|
-
# GEP schemas (Gene / Capsule / Task / future). Validators and defaults must
|
|
28
|
-
# stay in sync with hub-side expectations; shallow-copy bugs and validator-
|
|
29
|
-
# wiring gaps in this directory have a track record (PR #25 / #27 / audit #30).
|
|
30
|
-
/src/gep/schemas/ @autogame-17 @forrestlinfeng @cloudcarver
|
|
31
|
-
|
|
32
|
-
# Pipeline modules. Module-load order vs dotenv is fragile here; refactors
|
|
33
|
-
# in PR #20-#24 introduced multiple dotenv-ordering and missing-import
|
|
34
|
-
# regressions before merge.
|
|
35
|
-
/src/evolve/ @autogame-17 @forrestlinfeng @cloudcarver
|
|
36
|
-
|
|
37
|
-
# Content-addressable storage and integrity primitives. Any change here
|
|
38
|
-
# changes asset_id semantics across all stored capsules.
|
|
39
|
-
/src/gep/contentHash.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
40
|
-
/src/gep/crypto.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
41
|
-
/src/gep/integrityCheck.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
42
|
-
/src/gep/shield.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
43
|
-
/src/gep/hubVerify.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
44
|
-
|
|
45
|
-
# Anything that touches secrets, sanitization, or proxy auth.
|
|
46
|
-
/src/gep/sanitize.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
47
|
-
/src/proxy/ @autogame-17 @forrestlinfeng @cloudcarver
|
|
48
|
-
|
|
49
|
-
# Public-mirror surface. Manifest mistakes leak source / runtime assets to
|
|
50
|
-
# npm; build/publish scripts directly drive npm + GitHub Release.
|
|
51
|
-
/public.manifest.json @autogame-17 @forrestlinfeng @cloudcarver
|
|
52
|
-
/scripts/build_public.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
53
|
-
/scripts/publish_public.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
54
|
-
/scripts/pre_publish_check.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
55
|
-
/scripts/build_binaries.js @autogame-17 @forrestlinfeng @cloudcarver
|
|
56
|
-
/scripts/deploy.sh @autogame-17 @forrestlinfeng @cloudcarver
|
|
57
|
-
|
|
58
|
-
# Repo metadata that gates everything else.
|
|
59
|
-
/.github/ @autogame-17 @forrestlinfeng @cloudcarver
|
|
60
|
-
/.cursor/ @autogame-17 @forrestlinfeng @cloudcarver
|
|
61
|
-
/CODEOWNERS @autogame-17 @forrestlinfeng @cloudcarver
|
|
62
|
-
/package.json @autogame-17 @forrestlinfeng @cloudcarver
|
|
63
|
-
/package-lock.json @autogame-17 @forrestlinfeng @cloudcarver
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Good first issue
|
|
3
|
-
about: Help newcomers get started with a small, self-contained task
|
|
4
|
-
labels: good first issue, help wanted, docs
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Summary
|
|
9
|
-
|
|
10
|
-
Short description of the task to complete.
|
|
11
|
-
|
|
12
|
-
## Steps to reproduce / task
|
|
13
|
-
|
|
14
|
-
1. Steps to reproduce (if a bug) or steps to implement (if feature)
|
|
15
|
-
2. What files to edit
|
|
16
|
-
|
|
17
|
-
## Acceptance criteria
|
|
18
|
-
|
|
19
|
-
- What success looks like
|
|
20
|
-
|
|
21
|
-
## Notes
|
|
22
|
-
|
|
23
|
-
Any pointers / links / helpful context
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
## Summary
|
|
2
|
-
|
|
3
|
-
Short 1-2 sentence summary of the change.
|
|
4
|
-
|
|
5
|
-
## What changed
|
|
6
|
-
|
|
7
|
-
- Bullet list of changes
|
|
8
|
-
|
|
9
|
-
## How to test
|
|
10
|
-
|
|
11
|
-
1. Copy commands
|
|
12
|
-
2. Expected output
|
|
13
|
-
|
|
14
|
-
## Risk
|
|
15
|
-
|
|
16
|
-
Low / Medium / High -- note if it touches infra or public API.
|
|
17
|
-
|
|
18
|
-
## Self-check
|
|
19
|
-
|
|
20
|
-
Tick only the boxes that apply, but every applicable box must be ticked. Bugbot
|
|
21
|
-
reads the project rules and will request changes if anything below is missing.
|
|
22
|
-
|
|
23
|
-
- [ ] If this PR adds a new source file under `src/`, it is registered in
|
|
24
|
-
`public.manifest.json` consistently with its sibling files (e.g. listed
|
|
25
|
-
in `obfuscate` when the rest of the directory is). Build verification
|
|
26
|
-
passed: `node scripts/build_public.js` succeeded and the new file shows
|
|
27
|
-
up in `dist-public/` in the expected (obfuscated or plain) form.
|
|
28
|
-
- [ ] If this PR adds or modifies a schema factory under `src/gep/schemas/`,
|
|
29
|
-
the corresponding `validate*` function is invoked at every write and
|
|
30
|
-
every publish call site (not just defined).
|
|
31
|
-
- [ ] If this PR uses `Object.assign({}, DEFAULTS, partial)` to build an
|
|
32
|
-
object, every reference-typed field (arrays, sub-objects) on the result
|
|
33
|
-
is sliced or cloned -- not held by reference to either source.
|
|
34
|
-
- [ ] If this PR introduces a new module-level constant initialized from
|
|
35
|
-
`process.env.X`, the owning module is loaded after the entry point's
|
|
36
|
-
dotenv configuration step (or the constant is migrated to the lazy
|
|
37
|
-
env helpers in `src/config.js`).
|
|
38
|
-
- [ ] No new runtime dependencies added without a clear justification in the
|
|
39
|
-
"What changed" section above.
|
|
40
|
-
- [ ] Tests added or updated to cover the new behavior; full suite passes
|
|
41
|
-
locally (`node --test test/*.test.js`).
|
|
42
|
-
|
|
43
|
-
## Related
|
|
44
|
-
|
|
45
|
-
Closes #NN
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
name: test
|
|
2
|
-
|
|
3
|
-
# Runs the Node test suite on every PR and on pushes to main. Originally
|
|
4
|
-
# Ubuntu-only (#198): PR checks were Cursor Bugbot + Security, neither of
|
|
5
|
-
# which runs `npm test`, so a green PR did NOT mean the tests passed.
|
|
6
|
-
#
|
|
7
|
-
# This workflow now also runs the suite on Windows + macOS via a second job
|
|
8
|
-
# (test-cross). #198 explicitly flagged Windows / macOS as a follow-up: the
|
|
9
|
-
# suite still has Linux-specific assumptions (symlink reliance, hard-coded
|
|
10
|
-
# ~/.volta layout, POSIX-style path equality) that would fail on those
|
|
11
|
-
# hosts. test-cross runs on PRs in **advisory** mode (continue-on-error)
|
|
12
|
-
# so those red signals are visible to reviewers without blocking merge
|
|
13
|
-
# while the suite is being made hermetic. Each fix can flip its tests
|
|
14
|
-
# from "red on Win/Mac" to "green on Win/Mac" incrementally. Once the
|
|
15
|
-
# remaining failures are cleaned up, drop `continue-on-error: true` and
|
|
16
|
-
# add `test-cross` to required checks to make cross-platform green a
|
|
17
|
-
# hard merge gate.
|
|
18
|
-
#
|
|
19
|
-
# main pushes skip test-cross to keep private-repo billing predictable
|
|
20
|
-
# (macos-latest is 10x and windows-latest is 2x the ubuntu rate).
|
|
21
|
-
|
|
22
|
-
on:
|
|
23
|
-
pull_request:
|
|
24
|
-
push:
|
|
25
|
-
branches: [main]
|
|
26
|
-
|
|
27
|
-
permissions:
|
|
28
|
-
contents: read
|
|
29
|
-
|
|
30
|
-
concurrency:
|
|
31
|
-
group: test-${{ github.workflow }}-${{ github.ref }}
|
|
32
|
-
cancel-in-progress: true
|
|
33
|
-
|
|
34
|
-
jobs:
|
|
35
|
-
test:
|
|
36
|
-
runs-on: ubuntu-latest
|
|
37
|
-
steps:
|
|
38
|
-
- uses: actions/checkout@v4
|
|
39
|
-
|
|
40
|
-
- uses: actions/setup-node@v4
|
|
41
|
-
with:
|
|
42
|
-
node-version: '22' # engines: node >=22.12
|
|
43
|
-
cache: npm
|
|
44
|
-
|
|
45
|
-
- name: Install dependencies
|
|
46
|
-
run: npm ci
|
|
47
|
-
|
|
48
|
-
- name: Run tests (node --test)
|
|
49
|
-
run: npm test
|
|
50
|
-
|
|
51
|
-
test-cross:
|
|
52
|
-
# Advisory cross-platform run: PR-only (skips main push to save billing),
|
|
53
|
-
# continue-on-error so a known Win/Mac regression does not block merge
|
|
54
|
-
# while the suite is being hardened. Reviewers still see the result and
|
|
55
|
-
# can opt-in to wait for a fix on a per-PR basis.
|
|
56
|
-
if: github.event_name == 'pull_request'
|
|
57
|
-
strategy:
|
|
58
|
-
fail-fast: false
|
|
59
|
-
matrix:
|
|
60
|
-
os: [windows-latest, macos-latest]
|
|
61
|
-
runs-on: ${{ matrix.os }}
|
|
62
|
-
continue-on-error: true
|
|
63
|
-
steps:
|
|
64
|
-
- uses: actions/checkout@v4
|
|
65
|
-
|
|
66
|
-
- uses: actions/setup-node@v4
|
|
67
|
-
with:
|
|
68
|
-
node-version: '22'
|
|
69
|
-
cache: npm
|
|
70
|
-
|
|
71
|
-
- name: Install dependencies
|
|
72
|
-
run: npm ci
|
|
73
|
-
|
|
74
|
-
- name: Run tests (node --test)
|
|
75
|
-
run: npm test
|