@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.
Files changed (98) hide show
  1. package/CONTRIBUTING.md +19 -0
  2. package/README.ja-JP.md +9 -32
  3. package/README.ko-KR.md +9 -32
  4. package/README.md +530 -86
  5. package/README.zh-CN.md +4 -31
  6. package/SKILL.md +1 -1
  7. package/assets/cover.png +0 -0
  8. package/index.js +14 -1
  9. package/package.json +17 -6
  10. package/scripts/a2a_export.js +63 -0
  11. package/scripts/a2a_ingest.js +79 -0
  12. package/scripts/a2a_promote.js +118 -0
  13. package/scripts/analyze_by_skill.js +121 -0
  14. package/scripts/build_binaries.js +479 -0
  15. package/scripts/check-changelog.js +166 -0
  16. package/scripts/extract_log.js +85 -0
  17. package/scripts/generate_history.js +75 -0
  18. package/scripts/gep_append_event.js +96 -0
  19. package/scripts/gep_personality_report.js +234 -0
  20. package/scripts/human_report.js +147 -0
  21. package/scripts/recall-verify-report.js +234 -0
  22. package/scripts/recover_loop.js +61 -0
  23. package/scripts/seed-merchants.js +91 -0
  24. package/scripts/suggest_version.js +89 -0
  25. package/scripts/validate-modules.js +38 -0
  26. package/scripts/validate-suite.js +78 -0
  27. package/skills/index.json +14 -0
  28. package/src/evolve/guards.js +1 -721
  29. package/src/evolve/pipeline/collect.js +1 -1283
  30. package/src/evolve/pipeline/dispatch.js +1 -421
  31. package/src/evolve/pipeline/enrich.js +1 -434
  32. package/src/evolve/pipeline/hub.js +1 -319
  33. package/src/evolve/pipeline/select.js +1 -274
  34. package/src/evolve/pipeline/signals.js +1 -206
  35. package/src/evolve/utils.js +1 -264
  36. package/src/evolve.js +1 -350
  37. package/src/forceUpdate.js +105 -20
  38. package/src/gep/a2aProtocol.js +1 -4395
  39. package/src/gep/autoDistillConv.js +1 -205
  40. package/src/gep/autoDistillLlm.js +1 -315
  41. package/src/gep/candidateEval.js +1 -92
  42. package/src/gep/candidates.js +1 -198
  43. package/src/gep/contentHash.js +1 -30
  44. package/src/gep/conversationSniffer.js +1 -266
  45. package/src/gep/crypto.js +1 -89
  46. package/src/gep/curriculum.js +1 -163
  47. package/src/gep/deviceId.js +1 -218
  48. package/src/gep/envFingerprint.js +1 -118
  49. package/src/gep/epigenetics.js +1 -31
  50. package/src/gep/execBridge.js +1 -711
  51. package/src/gep/explore.js +1 -289
  52. package/src/gep/hash.js +1 -15
  53. package/src/gep/hubFetch.js +1 -359
  54. package/src/gep/hubReview.js +1 -207
  55. package/src/gep/hubSearch.js +1 -526
  56. package/src/gep/hubVerify.js +1 -306
  57. package/src/gep/learningSignals.js +1 -89
  58. package/src/gep/memoryGraph.js +1 -1374
  59. package/src/gep/memoryGraphAdapter.js +1 -203
  60. package/src/gep/mutation.js +1 -203
  61. package/src/gep/narrativeMemory.js +1 -108
  62. package/src/gep/oauthLogin.js +34 -0
  63. package/src/gep/openPRRegistry.js +1 -205
  64. package/src/gep/personality.js +1 -423
  65. package/src/gep/policyCheck.js +1 -599
  66. package/src/gep/prompt.js +1 -836
  67. package/src/gep/recallInject.js +1 -409
  68. package/src/gep/recallVerifier.js +1 -318
  69. package/src/gep/reflection.js +1 -177
  70. package/src/gep/selector.js +1 -602
  71. package/src/gep/skillDistiller.js +1 -1294
  72. package/src/gep/skillPublisher.js +1 -1
  73. package/src/gep/solidify.js +1 -1699
  74. package/src/gep/strategy.js +1 -136
  75. package/src/gep/tokenSavings.js +1 -88
  76. package/src/gep/workspaceKeychain.js +1 -174
  77. package/src/proxy/extensions/traceControl.js +1 -99
  78. package/src/proxy/inject.js +1 -52
  79. package/src/proxy/lifecycle/manager.js +2 -0
  80. package/src/proxy/trace/extractor.js +1 -534
  81. package/src/proxy/trace/usage.js +1 -105
  82. package/.cursor/BUGBOT.md +0 -182
  83. package/.env.example +0 -68
  84. package/.git-commit-guard-token +0 -1
  85. package/.github/CODEOWNERS +0 -63
  86. package/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -23
  87. package/.github/pull_request_template.md +0 -45
  88. package/.github/workflows/test.yml +0 -75
  89. package/CHANGELOG.md +0 -1123
  90. package/README.public.md +0 -594
  91. package/SECURITY.md +0 -108
  92. package/assets/gep/events.jsonl +0 -3
  93. package/examples/atp-consumer-quickstart.md +0 -100
  94. package/examples/hello-world.md +0 -38
  95. package/proxy-package.json +0 -39
  96. package/public.manifest.json +0 -141
  97. /package/assets/gep/{genes.json → genes.seed.json} +0 -0
  98. /package/{bundled-skills → skills}/_meta/SKILL.md +0 -0
@@ -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
@@ -1 +0,0 @@
1
- SKILL_COMMIT
@@ -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