@evomap/evolver 1.90.0 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +27 -564
  2. package/bin/evolver-llm-proxy.js +3 -0
  3. package/bin/evolver-mcp.js +2 -0
  4. package/bin/evolver-proxy.js +3 -0
  5. package/bin/evolver.js +4 -0
  6. package/index.js +1 -3670
  7. package/package.json +32 -62
  8. package/CONTRIBUTING.md +0 -19
  9. package/LICENSE +0 -641
  10. package/README.ja-JP.md +0 -521
  11. package/README.ko-KR.md +0 -520
  12. package/README.zh-CN.md +0 -531
  13. package/SKILL.md +0 -365
  14. package/assets/cover.png +0 -0
  15. package/assets/gep/genes.seed.json +0 -496
  16. package/conformance/savings-core/constants.json +0 -30
  17. package/conformance/savings-core/golden-vectors.json +0 -333
  18. package/scripts/a2a_export.js +0 -63
  19. package/scripts/a2a_ingest.js +0 -79
  20. package/scripts/a2a_promote.js +0 -118
  21. package/scripts/analyze_by_skill.js +0 -121
  22. package/scripts/build_binaries.js +0 -479
  23. package/scripts/check-changelog.js +0 -166
  24. package/scripts/extract_log.js +0 -85
  25. package/scripts/generate_history.js +0 -75
  26. package/scripts/gep_append_event.js +0 -96
  27. package/scripts/gep_personality_report.js +0 -234
  28. package/scripts/human_report.js +0 -147
  29. package/scripts/recall-verify-report.js +0 -234
  30. package/scripts/recover_loop.js +0 -61
  31. package/scripts/refresh_stars_badge.js +0 -168
  32. package/scripts/seed-merchants.js +0 -91
  33. package/scripts/skill2recipes.js +0 -118
  34. package/scripts/suggest_version.js +0 -89
  35. package/scripts/validate-modules.js +0 -38
  36. package/scripts/validate-suite.js +0 -78
  37. package/src/adapters/claudeCode.js +0 -194
  38. package/src/adapters/codex.js +0 -216
  39. package/src/adapters/cursor.js +0 -91
  40. package/src/adapters/hookAdapter.js +0 -469
  41. package/src/adapters/kiro.js +0 -195
  42. package/src/adapters/opencode.js +0 -326
  43. package/src/adapters/scripts/_lockPaths.js +0 -74
  44. package/src/adapters/scripts/_memoryFiltering.js +0 -35
  45. package/src/adapters/scripts/_runtimePaths.js +0 -440
  46. package/src/adapters/scripts/evolver-session-end.js +0 -321
  47. package/src/adapters/scripts/evolver-session-start.js +0 -587
  48. package/src/adapters/scripts/evolver-signal-detect.js +0 -98
  49. package/src/adapters/scripts/evolver-task-recall.js +0 -173
  50. package/src/atp/atpExecute.js +0 -283
  51. package/src/atp/atpTaskPickup.js +0 -233
  52. package/src/atp/autoBuyer.js +0 -382
  53. package/src/atp/autoDeliver.js +0 -215
  54. package/src/atp/cli.js +0 -354
  55. package/src/atp/cliAutobuyPrompt.js +0 -154
  56. package/src/atp/consumerAgent.js +0 -157
  57. package/src/atp/defaultHandler.js +0 -69
  58. package/src/atp/heartbeatSignalsHandler.js +0 -254
  59. package/src/atp/hubClient.js +0 -317
  60. package/src/atp/index.js +0 -38
  61. package/src/atp/merchantAgent.js +0 -118
  62. package/src/atp/protocol.js +0 -41
  63. package/src/atp/questionComposer.js +0 -133
  64. package/src/atp/serviceHelper.js +0 -92
  65. package/src/canary.js +0 -13
  66. package/src/config.js +0 -351
  67. package/src/evolve/guards.js +0 -1
  68. package/src/evolve/pipeline/collect.js +0 -1
  69. package/src/evolve/pipeline/dispatch.js +0 -1
  70. package/src/evolve/pipeline/enrich.js +0 -1
  71. package/src/evolve/pipeline/hub.js +0 -1
  72. package/src/evolve/pipeline/select.js +0 -1
  73. package/src/evolve/pipeline/signals.js +0 -1
  74. package/src/evolve/utils.js +0 -1
  75. package/src/evolve.js +0 -1
  76. package/src/experiment/agentRunner.js +0 -229
  77. package/src/experiment/cli.js +0 -159
  78. package/src/experiment/comparison.js +0 -233
  79. package/src/experiment/metrics.js +0 -75
  80. package/src/forceUpdate.js +0 -991
  81. package/src/gep/a2a.js +0 -173
  82. package/src/gep/a2aProtocol.js +0 -1
  83. package/src/gep/analyzer.js +0 -35
  84. package/src/gep/antiAbuseTelemetry.js +0 -1
  85. package/src/gep/assetCallLog.js +0 -197
  86. package/src/gep/assetStore.js +0 -723
  87. package/src/gep/assets.js +0 -36
  88. package/src/gep/autoDistillConv.js +0 -1
  89. package/src/gep/autoDistillLlm.js +0 -1
  90. package/src/gep/bridge.js +0 -138
  91. package/src/gep/candidateEval.js +0 -1
  92. package/src/gep/candidates.js +0 -1
  93. package/src/gep/claimNudge.js +0 -121
  94. package/src/gep/cliContracts.js +0 -1190
  95. package/src/gep/contentHash.js +0 -1
  96. package/src/gep/conversationDistiller.js +0 -1
  97. package/src/gep/conversationSniffer.js +0 -1
  98. package/src/gep/crypto.js +0 -1
  99. package/src/gep/curriculum.js +0 -1
  100. package/src/gep/deviceId.js +0 -1
  101. package/src/gep/directoryClient.js +0 -115
  102. package/src/gep/envFingerprint.js +0 -1
  103. package/src/gep/epigenetics.js +0 -1
  104. package/src/gep/execBridge.js +0 -1
  105. package/src/gep/executionTrace.js +0 -291
  106. package/src/gep/explore.js +0 -1
  107. package/src/gep/featureFlags.js +0 -121
  108. package/src/gep/gitOps.js +0 -265
  109. package/src/gep/hash.js +0 -1
  110. package/src/gep/hostErrorClassifier.js +0 -34
  111. package/src/gep/hubFetch.js +0 -1
  112. package/src/gep/hubReview.js +0 -1
  113. package/src/gep/hubSearch.js +0 -1
  114. package/src/gep/hubVerify.js +0 -1
  115. package/src/gep/idleScheduler.js +0 -400
  116. package/src/gep/issueReporter.js +0 -416
  117. package/src/gep/learningSignals.js +0 -1
  118. package/src/gep/llmReview.js +0 -92
  119. package/src/gep/localStateAwareness.js +0 -243
  120. package/src/gep/mailboxTransport.js +0 -119
  121. package/src/gep/memoryGraph.js +0 -1
  122. package/src/gep/memoryGraphAdapter.js +0 -1
  123. package/src/gep/mutation.js +0 -1
  124. package/src/gep/narrativeMemory.js +0 -1
  125. package/src/gep/oauthLogin.js +0 -181
  126. package/src/gep/openPRRegistry.js +0 -1
  127. package/src/gep/paths.js +0 -522
  128. package/src/gep/personality.js +0 -1
  129. package/src/gep/policyCheck.js +0 -1
  130. package/src/gep/portable.js +0 -103
  131. package/src/gep/privacyClient.js +0 -235
  132. package/src/gep/prompt.js +0 -1
  133. package/src/gep/questionGenerator.js +0 -518
  134. package/src/gep/recallInject.js +0 -1
  135. package/src/gep/recallVerifier.js +0 -1
  136. package/src/gep/reflection.js +0 -1
  137. package/src/gep/sanitize.js +0 -264
  138. package/src/gep/savingsCore.js +0 -1
  139. package/src/gep/schemas/capsule.js +0 -170
  140. package/src/gep/schemas/gene.js +0 -154
  141. package/src/gep/schemas/index.js +0 -8
  142. package/src/gep/schemas/protocol.js +0 -51
  143. package/src/gep/schemas/task.js +0 -74
  144. package/src/gep/selector.js +0 -1
  145. package/src/gep/selfPR.js +0 -469
  146. package/src/gep/signals.js +0 -776
  147. package/src/gep/skill2gep.js +0 -1056
  148. package/src/gep/skill2gepAudit.js +0 -303
  149. package/src/gep/skill2recipes.js +0 -511
  150. package/src/gep/skillDistiller.js +0 -1
  151. package/src/gep/skillPublisher.js +0 -358
  152. package/src/gep/solidify.js +0 -1
  153. package/src/gep/strategy.js +0 -1
  154. package/src/gep/taskReceiver.js +0 -575
  155. package/src/gep/tokenSavings.js +0 -1
  156. package/src/gep/trajectoryExport.js +0 -1
  157. package/src/gep/validationReport.js +0 -55
  158. package/src/gep/validator/index.js +0 -411
  159. package/src/gep/validator/reporter.js +0 -210
  160. package/src/gep/validator/sandboxExecutor.js +0 -480
  161. package/src/gep/validator/stakeBootstrap.js +0 -357
  162. package/src/gep/workspaceKeychain.js +0 -1
  163. package/src/ops/cleanup.js +0 -80
  164. package/src/ops/commentary.js +0 -60
  165. package/src/ops/health_check.js +0 -104
  166. package/src/ops/index.js +0 -11
  167. package/src/ops/innovation.js +0 -67
  168. package/src/ops/lifecycle.js +0 -798
  169. package/src/ops/self_repair.js +0 -76
  170. package/src/ops/skills_monitor.js +0 -147
  171. package/src/ops/trigger.js +0 -33
  172. package/src/proxy/clientSettings.js +0 -405
  173. package/src/proxy/envelope.js +0 -59
  174. package/src/proxy/extensions/dmHandler.js +0 -45
  175. package/src/proxy/extensions/sessionHandler.js +0 -141
  176. package/src/proxy/extensions/skillUpdater.js +0 -64
  177. package/src/proxy/extensions/traceControl.js +0 -1
  178. package/src/proxy/index.js +0 -1395
  179. package/src/proxy/inject.js +0 -1
  180. package/src/proxy/lifecycle/manager.js +0 -1568
  181. package/src/proxy/mailbox/state.js +0 -207
  182. package/src/proxy/mailbox/store.js +0 -602
  183. package/src/proxy/router/cache_passthrough.js +0 -26
  184. package/src/proxy/router/features.js +0 -84
  185. package/src/proxy/router/gemini_route.js +0 -154
  186. package/src/proxy/router/messages_route.js +0 -535
  187. package/src/proxy/router/model_router.js +0 -113
  188. package/src/proxy/router/models_route.js +0 -52
  189. package/src/proxy/router/ollama_route.js +0 -103
  190. package/src/proxy/router/responses_route.js +0 -170
  191. package/src/proxy/router/vertex_route.js +0 -110
  192. package/src/proxy/server/http.js +0 -363
  193. package/src/proxy/server/routes.js +0 -558
  194. package/src/proxy/server/settings.js +0 -115
  195. package/src/proxy/sync/engine.js +0 -179
  196. package/src/proxy/sync/inbound.js +0 -211
  197. package/src/proxy/sync/outbound.js +0 -361
  198. package/src/proxy/task/monitor.js +0 -131
  199. package/src/proxy/trace/extractor.js +0 -1
  200. package/src/proxy/trace/usage.js +0 -1
  201. package/src/solo/breaker.js +0 -25
  202. package/src/solo/gitGuard.js +0 -65
  203. package/src/webui/client/clientJs/assets.js +0 -111
  204. package/src/webui/client/clientJs/bootstrap.js +0 -92
  205. package/src/webui/client/clientJs/common.js +0 -77
  206. package/src/webui/client/clientJs/i18n.js +0 -366
  207. package/src/webui/client/clientJs/index.js +0 -35
  208. package/src/webui/client/clientJs/interactions.js +0 -351
  209. package/src/webui/client/clientJs/overview.js +0 -152
  210. package/src/webui/client/clientJs/personality.js +0 -285
  211. package/src/webui/client/clientJs/pipelines.js +0 -330
  212. package/src/webui/client/indexHtml.js +0 -221
  213. package/src/webui/client/static.js +0 -23
  214. package/src/webui/client/stylesCss.js +0 -639
  215. package/src/webui/client/vendor/README.md +0 -15
  216. package/src/webui/client/vendor/echarts.min.js +0 -45
  217. package/src/webui/index.js +0 -14
  218. package/src/webui/observer/assets.js +0 -146
  219. package/src/webui/observer/index.js +0 -37
  220. package/src/webui/observer/interactions.js +0 -127
  221. package/src/webui/observer/jsonl.js +0 -75
  222. package/src/webui/observer/paths.js +0 -46
  223. package/src/webui/observer/personality.js +0 -43
  224. package/src/webui/observer/pipelineEvents.js +0 -58
  225. package/src/webui/observer/redact.js +0 -63
  226. package/src/webui/observer/runs.js +0 -356
  227. package/src/webui/observer/safety.js +0 -57
  228. package/src/webui/observer/skills.js +0 -70
  229. package/src/webui/observer/status.js +0 -71
  230. package/src/webui/server/http.js +0 -138
  231. package/src/webui/server/routes.js +0 -41
@@ -1,264 +0,0 @@
1
- // Pre-publish payload sanitization.
2
- // Removes sensitive tokens, local paths, emails, and env references
3
- // from capsule payloads before broadcasting to the hub.
4
-
5
- // Patterns to redact (replaced with placeholder)
6
- const REDACT_PATTERNS = [
7
- // API keys & tokens (generic)
8
- /Bearer\s+[A-Za-z0-9\-._~+\/]+=*/g,
9
- /sk-[A-Za-z0-9]{20,}/g,
10
- /"?token"?[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
11
- /api[_-]?key[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
12
- /secret[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi,
13
- /password[=:]\s*["']?[^\s"',;)}\]]{6,}["']?/gi,
14
- // GitHub tokens (ghp_, gho_, ghu_, ghs_, github_pat_)
15
- /ghp_[A-Za-z0-9]{36,}/g,
16
- /gho_[A-Za-z0-9]{36,}/g,
17
- /ghu_[A-Za-z0-9]{36,}/g,
18
- /ghs_[A-Za-z0-9]{36,}/g,
19
- /github_pat_[A-Za-z0-9_]{22,}/g,
20
- // AWS access keys
21
- /AKIA[0-9A-Z]{16}/g,
22
- // OpenAI / Anthropic tokens
23
- /sk-proj-[A-Za-z0-9\-_]{20,}/g,
24
- /sk-ant-[A-Za-z0-9\-_]{20,}/g,
25
- // npm tokens
26
- /npm_[A-Za-z0-9]{36,}/g,
27
- // Slack tokens (bot/user/app/refresh/verification)
28
- /xox[baprsv]-[A-Za-z0-9-]{10,}/g,
29
- // JSON Web Tokens (header.payload.signature)
30
- /eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]{20,}/g,
31
- // Azure storage connection strings (redact the key field only)
32
- /AccountKey=[^;\s]+/gi,
33
- // Azure AD client secret + App Insights instrumentation key (value only)
34
- /client_secret=[A-Za-z0-9~._\-]{8,}/gi,
35
- /instrumentationkey=[0-9a-fA-F-]{20,}/gi,
36
- // Discord bot tokens. Three base64url segments:
37
- // 1. 24+ chars starting with [MNO] (user-id snowflake, base64-encoded)
38
- // 2. exactly 6 chars (timestamp)
39
- // 3. 27+ chars (HMAC signature)
40
- // Requiring an uppercase leading char avoids false-matching dotted
41
- // lowercase identifiers (Python module paths, hostnames, etc.).
42
- /\b[MNO][A-Za-z0-9_\-]{23,}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27,}\b/g,
43
- // Private keys
44
- /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----[\s\S]*?-----END\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g,
45
- // Basic auth in URLs (redact only credentials, keep :// and @)
46
- /(?<=:\/\/)[^@\s]+:[^@\s]+(?=@)/g,
47
- // Local filesystem paths
48
- /\/home\/[^\s"',;)}\]]+/g,
49
- /\/Users\/[^\s"',;)}\]]+/g,
50
- /[A-Z]:\\[^\s"',;)}\]]+/g,
51
- // Email addresses
52
- /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
53
- // .env file references — only when the dot-env token looks like a real
54
- // path (preceded by a path separator) or carries a suffix like
55
- // `.env.production`. Bare prose mentions such as "Read from `.env` file"
56
- // are intentionally NOT matched: the filename itself is a convention, not
57
- // a secret, and over-redacting it strips useful debugging context from
58
- // capsules without protecting anything the other patterns above don't
59
- // already cover (API keys / tokens inside the env file).
60
- /\.env\.[a-zA-Z]+\b/g,
61
- /(?<=[\\/])\.env\b/g,
62
- ];
63
-
64
- // Post-filter allowlist: matches that the regexes above will catch but that
65
- // are not actually sensitive. Each entry is tested against the captured
66
- // match — if any allowlist entry matches, the match is kept as-is instead of
67
- // being replaced with [REDACTED]. Keeping this as a post-filter rather than
68
- // bolting more lookaheads into the patterns keeps the redaction regexes
69
- // readable and the allowlist easy to audit.
70
- const REDACT_ALLOWLIST = [
71
- // --- CI runner paths --- (well-known, no user PII)
72
- /^\/home\/runner(?:[/]|$)/, // GitHub Actions Linux
73
- /^\/Users\/runner(?:[/]|$)/, // GitHub Actions macOS
74
- /^\/home\/circleci(?:[/]|$)/, // CircleCI Linux
75
- /^\/Users\/distiller(?:[/]|$)/, // CircleCI macOS
76
- /^\/home\/vsts(?:[/]|$)/, // Azure Pipelines
77
- /^\/home\/travis(?:[/]|$)/, // Travis CI
78
- /^\/home\/jenkins(?:[/]|$)/, // Jenkins default
79
- // --- Bot / no-reply email addresses --- (not personal addresses)
80
- // Domain MUST be anchored to a well-known public code host. An open
81
- // `noreply@<anything>` allowlist would leak internal corp infra domains
82
- // like `noreply@internal-codename.corp` (Bugbot PR #151 Low).
83
- /^(?:noreply|no-reply|donotreply|do-not-reply)@(?:github\.com|users\.noreply\.github\.com|gitlab\.com|bitbucket\.org|npmjs\.com|claude\.ai|anthropic\.com)$/i,
84
- /^[0-9]+\+[a-zA-Z0-9._-]+@users\.noreply\.github\.com$/i, // GitHub commit-author noreply (full form)
85
- // The ssh_target leak scanner uses `[a-zA-Z0-9_.-]+` (no `+`) for the
86
- // email local part, so `8275028+user@users.noreply.github.com` is
87
- // captured as just `user@users.noreply.github.com` — the full-form
88
- // anchor above can't match. Allowlist any local part on this domain
89
- // since the domain itself is by design non-personal (Bugbot PR #151
90
- // round 2 Medium).
91
- /^[a-zA-Z0-9_.-]+@users\.noreply\.github\.com$/i,
92
- /^git@github\.com$/i, // SSH alias, not a real mailbox
93
- /^git@gitlab\.com$/i,
94
- /^git@bitbucket\.org$/i,
95
- ];
96
-
97
- function _isAllowlisted(match) {
98
- for (let i = 0; i < REDACT_ALLOWLIST.length; i++) {
99
- if (REDACT_ALLOWLIST[i].test(match)) return true;
100
- }
101
- return false;
102
- }
103
-
104
- const REDACTED = '[REDACTED]';
105
-
106
- function redactString(str) {
107
- if (typeof str !== 'string') return str;
108
- let result = str;
109
- for (const pattern of REDACT_PATTERNS) {
110
- // Reset lastIndex for global regexes
111
- pattern.lastIndex = 0;
112
- result = result.replace(pattern, (match) => (_isAllowlisted(match) ? match : REDACTED));
113
- }
114
- return result;
115
- }
116
-
117
- /**
118
- * Deep-clone and sanitize a capsule payload.
119
- * Returns a new object with sensitive values redacted.
120
- * Does NOT modify the original.
121
- */
122
- function sanitizePayload(capsule) {
123
- if (!capsule || typeof capsule !== 'object') return capsule;
124
- return sanitizePayloadValue(capsule);
125
- }
126
-
127
- function sanitizePayloadValue(value) {
128
- if (typeof value === 'string') return redactString(value);
129
- if (!value || typeof value !== 'object') return value;
130
- if (Array.isArray(value)) return value.map(sanitizePayloadValue);
131
- const out = {};
132
- for (const key of Object.keys(value)) {
133
- const cleanKey = redactString(String(key)) || REDACTED;
134
- out[uniqueObjectKey(out, cleanKey)] = sanitizePayloadValue(value[key]);
135
- }
136
- return out;
137
- }
138
-
139
- function uniqueObjectKey(target, key) {
140
- if (!Object.prototype.hasOwnProperty.call(target, key)) return key;
141
- let i = 2;
142
- while (Object.prototype.hasOwnProperty.call(target, key + '_' + i)) i++;
143
- return key + '_' + i;
144
- }
145
-
146
- // --- Leak scanning (detection without destructive replacement) ---
147
-
148
- const LEAK_SCANNERS = [
149
- // API keys & tokens
150
- { type: 'api_key', pattern: /sk-[A-Za-z0-9]{20,}/g, suggest: 'process.env.OPENAI_API_KEY' },
151
- { type: 'api_key', pattern: /sk-proj-[A-Za-z0-9\-_]{20,}/g, suggest: 'process.env.OPENAI_API_KEY' },
152
- { type: 'api_key', pattern: /sk-ant-[A-Za-z0-9\-_]{20,}/g, suggest: 'process.env.ANTHROPIC_API_KEY' },
153
- { type: 'api_key', pattern: /AKIA[0-9A-Z]{16}/g, suggest: 'process.env.AWS_ACCESS_KEY_ID' },
154
- { type: 'github_token', pattern: /ghp_[A-Za-z0-9]{36,}/g, suggest: 'process.env.GITHUB_TOKEN' },
155
- { type: 'github_token', pattern: /github_pat_[A-Za-z0-9_]{22,}/g, suggest: 'process.env.GITHUB_TOKEN' },
156
- { type: 'npm_token', pattern: /npm_[A-Za-z0-9]{36,}/g, suggest: 'process.env.NPM_TOKEN' },
157
- { type: 'slack_token', pattern: /xox[baprsv]-[A-Za-z0-9-]{10,}/g, suggest: 'process.env.SLACK_TOKEN' },
158
- { type: 'jwt', pattern: /eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]{20,}/g, suggest: 'process.env.JWT' },
159
- { type: 'azure_key', pattern: /AccountKey=[^;\s]+/gi, suggest: 'process.env.AZURE_STORAGE_KEY' },
160
- { type: 'azure_client_secret', pattern: /client_secret=[A-Za-z0-9~._\-]{8,}/gi, suggest: 'process.env.AZURE_CLIENT_SECRET' },
161
- { type: 'azure_instrumentation_key', pattern: /instrumentationkey=[0-9a-fA-F-]{20,}/gi, suggest: 'process.env.APPINSIGHTS_INSTRUMENTATIONKEY' },
162
- { type: 'discord_token', pattern: /\b[MNO][A-Za-z0-9_\-]{23,}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27,}\b/g, suggest: 'process.env.DISCORD_TOKEN' },
163
- { type: 'bearer_token', pattern: /Bearer\s+[A-Za-z0-9\-._~+\/]{20,}=*/g, suggest: 'process.env.AUTH_TOKEN' },
164
- { type: 'proxy_token', pattern: /"?token"?[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi, suggest: 'proxy token (ephemeral, stored in settings.json)' },
165
- { type: 'private_key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g, suggest: 'process.env.PRIVATE_KEY_PATH' },
166
- // Database connection strings with credentials
167
- { type: 'db_url', pattern: /(?:mongodb|postgres|postgresql|mysql|redis|amqp):\/\/[^\s"',;)}\]]{10,}/gi, suggest: 'process.env.DATABASE_URL' },
168
- // Local filesystem paths with usernames
169
- { type: 'local_path', pattern: /\/home\/[a-zA-Z0-9_.-]+\//g, suggest: 'process.env.HOME' },
170
- { type: 'local_path', pattern: /\/Users\/[a-zA-Z0-9_.-]+\//g, suggest: 'process.env.HOME' },
171
- { type: 'local_path', pattern: /[A-Z]:\\Users\\[a-zA-Z0-9_.-]+\\/g, suggest: 'process.env.USERPROFILE' },
172
- // Internal IP addresses
173
- { type: 'internal_ip', pattern: /\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3})(?::\d{2,5})?\b/g, suggest: 'process.env.SERVICE_HOST' },
174
- // SSH connection strings
175
- { type: 'ssh_target', pattern: /[a-zA-Z0-9_.-]+@(?:(?:\d{1,3}\.){3}\d{1,3}|[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, suggest: 'process.env.SSH_HOST' },
176
- // Generic password/secret assignments
177
- { type: 'password', pattern: /password[=:]\s*["']?[^\s"',;)}\]]{6,}["']?/gi, suggest: 'process.env.PASSWORD' },
178
- { type: 'secret', pattern: /secret[=:]\s*["']?[A-Za-z0-9\-._~+\/]{16,}["']?/gi, suggest: 'process.env.SECRET' },
179
- // Basic auth in URLs
180
- { type: 'basic_auth', pattern: /:\/\/[^@\s:]+:[^@\s]+@/g, suggest: 'process.env.SERVICE_URL' },
181
- ];
182
-
183
- const ENV_SCAN_SKIP_KEYS = new Set([
184
- 'PATH', 'HOME', 'SHELL', 'TERM', 'LANG', 'USER', 'LOGNAME',
185
- 'PWD', 'OLDPWD', 'SHLVL', 'HOSTNAME', 'DISPLAY', 'EDITOR',
186
- 'PAGER', 'LESS', 'LS_COLORS', 'COLORTERM', 'TERM_PROGRAM',
187
- 'XDG_SESSION_ID', 'XDG_RUNTIME_DIR', 'DBUS_SESSION_BUS_ADDRESS',
188
- 'SSH_AUTH_SOCK', 'SSH_AGENT_PID', '_',
189
- // Public CI identity — GitHub Actions sets these to usernames / org names,
190
- // never secrets. Without skipping them, detectEnvValueLeaks flags any content
191
- // that merely contains the actor's username (e.g. a commit-author noreply
192
- // email) as an env-value leak: a false positive that fails only under CI.
193
- 'GITHUB_ACTOR', 'GITHUB_TRIGGERING_ACTOR', 'GITHUB_REPOSITORY_OWNER',
194
- ]);
195
-
196
- /**
197
- * Scan content for potential sensitive information leaks.
198
- * Returns structured results with suggested env var replacements.
199
- * Does NOT modify the content.
200
- */
201
- function scanForLeaks(content) {
202
- if (typeof content !== 'string' || !content) return { found: false, leaks: [] };
203
- const leaks = [];
204
- const seen = new Set();
205
- for (const scanner of LEAK_SCANNERS) {
206
- scanner.pattern.lastIndex = 0;
207
- let match;
208
- while ((match = scanner.pattern.exec(content)) !== null) {
209
- const val = match[0];
210
- // Apply the same allowlist the redactor uses, otherwise selfPR's
211
- // fullLeakCheck would block a self-PR over /home/runner/ paths or
212
- // noreply@github.com — exactly the false positives the allowlist
213
- // was introduced to fix (Bugbot PR #151 Medium: contradiction
214
- // between redactString saying "safe" and scanForLeaks saying
215
- // "leak").
216
- if (_isAllowlisted(val)) continue;
217
- const key = scanner.type + ':' + val;
218
- if (seen.has(key)) continue;
219
- seen.add(key);
220
- leaks.push({ type: scanner.type, value: val.length > 60 ? val.slice(0, 57) + '...' : val, suggestion: scanner.suggest });
221
- }
222
- }
223
- return { found: leaks.length > 0, leaks };
224
- }
225
-
226
- /**
227
- * Reverse-detect: check if any current process.env values (length >= 8)
228
- * appear verbatim in the content. If so, the env var's actual value
229
- * has been hardcoded -- it should be replaced with the env var reference.
230
- */
231
- function detectEnvValueLeaks(content) {
232
- if (typeof content !== 'string' || !content) return [];
233
- const leaks = [];
234
- for (const [key, val] of Object.entries(process.env)) {
235
- if (!val || val.length < 8) continue;
236
- if (ENV_SCAN_SKIP_KEYS.has(key)) continue;
237
- // Filesystem paths and URLs are not secrets, and CI tooling exports dozens
238
- // of env vars whose value is the repo checkout path — the runner
239
- // (GITHUB_WORKSPACE, RUNNER_WORKSPACE) and, when tests run via `npm test`,
240
- // npm itself (INIT_CWD, npm_config_local_prefix, npm_package_json, PWD).
241
- // Reverse-flagging them is a false positive whenever capsule content
242
- // legitimately references the build path: it blocks self-PRs and fails only
243
- // under CI. Genuine sensitive paths in content are still caught by the
244
- // local_path pattern scanner, and credentialed URLs by db_url / basic_auth.
245
- if (/^(\/|[A-Za-z]:\\|[a-z][a-z0-9+.-]*:\/\/)/i.test(val)) continue;
246
- if (content.includes(val)) {
247
- leaks.push({ type: 'env_value_leak', envKey: key, value: val.length > 60 ? val.slice(0, 57) + '...' : val, suggestion: 'process.env.' + key });
248
- }
249
- }
250
- return leaks;
251
- }
252
-
253
- /**
254
- * Full leak check: pattern-based scan + env value reverse detection.
255
- * Returns combined results.
256
- */
257
- function fullLeakCheck(content) {
258
- const scan = scanForLeaks(content);
259
- const envLeaks = detectEnvValueLeaks(content);
260
- const allLeaks = scan.leaks.concat(envLeaks);
261
- return { found: allLeaks.length > 0, leaks: allLeaks };
262
- }
263
-
264
- module.exports = { sanitizePayload, redactString, scanForLeaks, detectEnvValueLeaks, fullLeakCheck };
@@ -1 +0,0 @@
1
- const _0x4a43fc=_0x3270;(function(_0x4c1a72,_0x2087b3){const _0x31ee97=_0x3270,_0x448c4e=_0x4c1a72();while(!![]){try{const _0xaa2d6f=parseInt(_0x31ee97(0x264,'\x73\x72\x50\x68'))/(0x1176+0x1d48*0x1+-0x2ebd)*(-parseInt(_0x31ee97(0x267,'\x41\x62\x36\x59'))/(-0x2*0x835+0x919+-0x19*-0x4b))+-parseInt(_0x31ee97(0x1f4,'\x70\x36\x75\x56'))/(-0xb7d+0x1c0b*-0x1+0x278b)+parseInt(_0x31ee97(0x261,'\x42\x4f\x48\x49'))/(0xb78*-0x2+0x1a22+-0x32e)*(parseInt(_0x31ee97(0x244,'\x6a\x50\x78\x6b'))/(0x5*-0x17b+0x1949+-0x11dd))+-parseInt(_0x31ee97(0x263,'\x25\x6e\x73\x57'))/(-0x26da*0x1+-0x400*-0x4+0x18*0xf4)*(-parseInt(_0x31ee97(0x255,'\x4a\x57\x35\x75'))/(-0xff0+0x10d1+-0x6d*0x2))+parseInt(_0x31ee97(0x27a,'\x33\x5b\x57\x6e'))/(0x3*0xbed+-0x5*0x588+-0x817)*(parseInt(_0x31ee97(0x249,'\x6e\x40\x32\x4e'))/(0x1875*0x1+-0x1abd+0x1*0x251))+parseInt(_0x31ee97(0x225,'\x5e\x33\x28\x5d'))/(0x210+-0x246d+0x2267)+-parseInt(_0x31ee97(0x274,'\x21\x46\x67\x6c'))/(-0x1730+0x10ef*0x1+0x64c)*(parseInt(_0x31ee97(0x1fa,'\x4a\x57\x35\x75'))/(-0x741*0x3+-0x1745+0x2d14));if(_0xaa2d6f===_0x2087b3)break;else _0x448c4e['push'](_0x448c4e['shift']());}catch(_0x512194){_0x448c4e['push'](_0x448c4e['shift']());}}}(_0x5660,0x4582c+0xc446b+0x4b47c*-0x2));const _0x228b8e=(function(){const _0x580dbd=_0x3270,_0x2bc267={'\x6a\x54\x6a\x70\x6a':function(_0x2cd0ae,_0x157963){return _0x2cd0ae*_0x157963;},'\x59\x74\x74\x6c\x70':function(_0x5d783d,_0x11365c){return _0x5d783d===_0x11365c;},'\x77\x42\x50\x46\x76':function(_0x37b230,_0x459b84){return _0x37b230(_0x459b84);},'\x79\x67\x65\x76\x56':_0x580dbd(0x22f,'\x48\x36\x68\x70')};let _0x498b31=!![];return function(_0x531f0b,_0x24cee6){const _0x4a510e=_0x580dbd;if(_0x2bc267[_0x4a510e(0x22c,'\x70\x36\x75\x56')]!==_0x2bc267[_0x4a510e(0x238,'\x36\x51\x65\x34')]){const _0x251345=_0x1c4e4b[_0x4a510e(0x260,'\x62\x79\x44\x74')+_0x4a510e(0x23e,'\x33\x40\x38\x56')+_0x4a510e(0x1fd,'\x72\x6c\x32\x38')][_0x2960ba];_0x1f6474+=_0x2bc267['\x6a\x54\x6a\x70\x6a'](_0x2bc267['\x59\x74\x74\x6c\x70'](_0x251345,_0x3a17f6)?-0x11b*-0x14+0xf55+-0x87*0x47:_0x251345,_0x2bc267['\x77\x42\x50\x46\x76'](_0x412cd7,_0x29f6d3));}else{const _0x2a7390=_0x498b31?function(){const _0x23e110=_0x4a510e;if(_0x24cee6){const _0x179cac=_0x24cee6[_0x23e110(0x211,'\x6e\x40\x32\x4e')](_0x531f0b,arguments);return _0x24cee6=null,_0x179cac;}}:function(){};return _0x498b31=![],_0x2a7390;}};}()),_0x1f2d8d=_0x228b8e(this,function(){const _0x5d2760=_0x3270,_0x4fcf73={};_0x4fcf73[_0x5d2760(0x232,'\x32\x74\x48\x40')]=_0x5d2760(0x235,'\x4d\x59\x77\x52')+_0x5d2760(0x25c,'\x48\x36\x68\x70');const _0x57b78e=_0x4fcf73;return _0x1f2d8d[_0x5d2760(0x229,'\x70\x65\x2a\x44')]()[_0x5d2760(0x24c,'\x48\x31\x57\x54')](_0x5d2760(0x24e,'\x4e\x51\x76\x50')+_0x5d2760(0x239,'\x50\x29\x68\x61'))[_0x5d2760(0x25a,'\x28\x4b\x69\x33')]()[_0x5d2760(0x21f,'\x32\x74\x48\x40')+_0x5d2760(0x279,'\x66\x77\x6a\x30')](_0x1f2d8d)[_0x5d2760(0x22d,'\x33\x5b\x57\x6e')](_0x57b78e[_0x5d2760(0x25d,'\x36\x51\x65\x34')]);});function _0x3270(_0x1ec50e,_0x49ade5){_0x1ec50e=_0x1ec50e-(0x5c9+-0xa89+0x154*0x5);const _0x54304b=_0x5660();let _0x48ae7c=_0x54304b[_0x1ec50e];if(_0x3270['\x50\x59\x72\x65\x46\x65']===undefined){var _0x4a970d=function(_0x6e4de){const _0x3e2ebd='\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 _0x4fdc35='',_0x87ee0d='',_0x99d6c7=_0x4fdc35+_0x4a970d,_0x4f3130=(''+function(){return 0x1*0x241+-0x1f2f+0x1cee;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(0x1939+0x17d9+-0x3111);for(let _0x508cb2=0x1baf*-0x1+0x1494*0x1+0x71b,_0x2a54d7,_0x2064fd,_0x519b2a=-0x373*0x8+-0x266+0x1dfe*0x1;_0x2064fd=_0x6e4de['\x63\x68\x61\x72\x41\x74'](_0x519b2a++);~_0x2064fd&&(_0x2a54d7=_0x508cb2%(0x4f*-0x26+0x1d2c*0x1+-0xc2*0x17)?_0x2a54d7*(-0x929*0x1+-0x2b9+-0xc22*-0x1)+_0x2064fd:_0x2064fd,_0x508cb2++%(0x1c68+0x4e5+-0x2149))?_0x4fdc35+=_0x4f3130||_0x99d6c7['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x519b2a+(-0x5e2+-0x49d*-0x1+0x14f))-(0x10ed*-0x1+-0x53*-0x6b+-0x11ba)!==-0x1*0x1573+0x1*0x2425+-0xeb2?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](-0xea0+-0x79*0x3+0x110a&_0x2a54d7>>(-(-0x52c*0x1+-0xd5a+0x8*0x251)*_0x508cb2&0xa32+0x62b*0x1+-0x1*0x1057)):_0x508cb2:-0xe6d*-0x2+0xa2e*-0x1+-0x12ac){_0x2064fd=_0x3e2ebd['\x69\x6e\x64\x65\x78\x4f\x66'](_0x2064fd);}for(let _0x3e4640=-0x1*0x13e+0x1899+-0x175b,_0x39697c=_0x4fdc35['\x6c\x65\x6e\x67\x74\x68'];_0x3e4640<_0x39697c;_0x3e4640++){_0x87ee0d+='\x25'+('\x30\x30'+_0x4fdc35['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x3e4640)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x420+0x1a8a+0x2*-0xb2d))['\x73\x6c\x69\x63\x65'](-(0x7*-0x4ee+-0x1*-0x4ca+0x1dba));}return decodeURIComponent(_0x87ee0d);};const _0x3f8c6a=function(_0x567718,_0x4899f2){let _0x55dd2a=[],_0x9be3df=-0x1155+-0x1f*-0xb3+0x8*-0x8b,_0x22cb5b,_0x4e04d6='';_0x567718=_0x4a970d(_0x567718);let _0x4c5b39;for(_0x4c5b39=-0x637*-0x5+0xdb2+-0x2cc5;_0x4c5b39<-0x251*-0x9+-0x20cc+0xcf3;_0x4c5b39++){_0x55dd2a[_0x4c5b39]=_0x4c5b39;}for(_0x4c5b39=-0x86*-0x34+0xde9+-0x1*0x2921;_0x4c5b39<-0x4*-0x45a+0xfbd*0x2+-0x2fe2;_0x4c5b39++){_0x9be3df=(_0x9be3df+_0x55dd2a[_0x4c5b39]+_0x4899f2['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x4c5b39%_0x4899f2['\x6c\x65\x6e\x67\x74\x68']))%(0x974+0x17*0x118+0x3*-0xb34),_0x22cb5b=_0x55dd2a[_0x4c5b39],_0x55dd2a[_0x4c5b39]=_0x55dd2a[_0x9be3df],_0x55dd2a[_0x9be3df]=_0x22cb5b;}_0x4c5b39=-0x1*-0x4e8+-0x1e*-0xc5+0x1bfe*-0x1,_0x9be3df=0x15*0x21+0x7d9*0x2+0x1267*-0x1;for(let _0x5bcc68=-0x185b+0x1d33+-0x4d8;_0x5bcc68<_0x567718['\x6c\x65\x6e\x67\x74\x68'];_0x5bcc68++){_0x4c5b39=(_0x4c5b39+(-0xb*0x131+0x2f7+0xa25))%(0x41*-0x40+-0x813+0x871*0x3),_0x9be3df=(_0x9be3df+_0x55dd2a[_0x4c5b39])%(-0x44e*-0x2+-0x636+-0x166*0x1),_0x22cb5b=_0x55dd2a[_0x4c5b39],_0x55dd2a[_0x4c5b39]=_0x55dd2a[_0x9be3df],_0x55dd2a[_0x9be3df]=_0x22cb5b,_0x4e04d6+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x567718['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5bcc68)^_0x55dd2a[(_0x55dd2a[_0x4c5b39]+_0x55dd2a[_0x9be3df])%(0x1c77+-0x65e+-0x1*0x1519)]);}return _0x4e04d6;};_0x3270['\x53\x50\x58\x69\x63\x64']=_0x3f8c6a,_0x3270['\x6c\x68\x58\x58\x42\x65']={},_0x3270['\x50\x59\x72\x65\x46\x65']=!![];}const _0x3eaa89=_0x54304b[0x1f54+-0x9*-0x3b9+0x40d5*-0x1],_0xc4225e=_0x1ec50e+_0x3eaa89,_0x416840=_0x3270['\x6c\x68\x58\x58\x42\x65'][_0xc4225e];if(!_0x416840){if(_0x3270['\x42\x46\x67\x7a\x4f\x4c']===undefined){const _0x4b6712=function(_0x49a161){this['\x66\x6e\x49\x72\x67\x77']=_0x49a161,this['\x75\x70\x4a\x73\x6a\x76']=[-0xd6b+0x1193+-0x427,-0x744+-0xb*-0x300+0xc*-0x225,-0x5ad*-0x1+0x87+-0x1*0x634],this['\x49\x4d\x42\x73\x58\x72']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x6b\x62\x57\x64\x42\x55']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x44\x50\x4c\x49\x6c\x4f']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x66\x54\x49\x6f\x69\x56']=function(){const _0x5e328a=new RegExp(this['\x6b\x62\x57\x64\x42\x55']+this['\x44\x50\x4c\x49\x6c\x4f']),_0x5b3af1=_0x5e328a['\x74\x65\x73\x74'](this['\x49\x4d\x42\x73\x58\x72']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x75\x70\x4a\x73\x6a\x76'][0x23*-0x2b+-0x292*0x1+-0x1*-0x874]:--this['\x75\x70\x4a\x73\x6a\x76'][-0x3*0x9f5+0x4d*0x5+0x1c5e];return this['\x59\x68\x71\x6a\x4f\x64'](_0x5b3af1);},_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x59\x68\x71\x6a\x4f\x64']=function(_0xbf70ba){if(!Boolean(~_0xbf70ba))return _0xbf70ba;return this['\x6b\x73\x4b\x6f\x6b\x6d'](this['\x66\x6e\x49\x72\x67\x77']);},_0x4b6712['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x6b\x73\x4b\x6f\x6b\x6d']=function(_0x1d9fb6){for(let _0x582b6e=-0x629+-0x904+0xf2d,_0x3168b5=this['\x75\x70\x4a\x73\x6a\x76']['\x6c\x65\x6e\x67\x74\x68'];_0x582b6e<_0x3168b5;_0x582b6e++){this['\x75\x70\x4a\x73\x6a\x76']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0x3168b5=this['\x75\x70\x4a\x73\x6a\x76']['\x6c\x65\x6e\x67\x74\x68'];}return _0x1d9fb6(this['\x75\x70\x4a\x73\x6a\x76'][-0x1*-0x1a85+-0x1e33+0x3ae]);},(''+function(){return 0x19a4+-0x2*0x839+0x16*-0x6b;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x53a+-0x65*-0x62+0x7*-0x645)&&new _0x4b6712(_0x3270)['\x66\x54\x49\x6f\x69\x56'](),_0x3270['\x42\x46\x67\x7a\x4f\x4c']=!![];}_0x48ae7c=_0x3270['\x53\x50\x58\x69\x63\x64'](_0x48ae7c,_0x49ade5),_0x3270['\x6c\x68\x58\x58\x42\x65'][_0xc4225e]=_0x48ae7c;}else _0x48ae7c=_0x416840;return _0x48ae7c;}_0x1f2d8d();'use strict';const _0x27543e=require(_0x4a43fc(0x1f9,'\x32\x74\x48\x40')),_0x12cc6d=require(_0x27543e[_0x4a43fc(0x26c,'\x21\x46\x67\x6c')](__dirname,'\x2e\x2e','\x2e\x2e','\x63\x6f\x6e\x66\x6f\x72\x6d\x61'+_0x4a43fc(0x221,'\x67\x55\x42\x63'),_0x4a43fc(0x20e,'\x35\x25\x56\x47')+_0x4a43fc(0x25b,'\x26\x66\x41\x62'),_0x4a43fc(0x278,'\x21\x46\x67\x6c')+_0x4a43fc(0x247,'\x38\x61\x31\x6f'))),_0x55a8f4=_0x5a44b9=>Math[_0x4a43fc(0x233,'\x73\x72\x50\x68')]((_0x5a44b9+Number[_0x4a43fc(0x272,'\x6a\x50\x78\x6b')])*(0x19*0xc7+-0x18d9+0x1*0x5ce))/(-0x119c+-0x905*-0x3+0x1*-0x90f),_0x498bb7=_0x5c19bd=>Math[_0x4a43fc(0x222,'\x35\x25\x56\x47')]((_0x5c19bd+Number[_0x4a43fc(0x216,'\x72\x6e\x58\x6d')])*(0x3*-0x199+0x5*0x3de+0x1*0x1885))/(0x1657*0x1+-0x1*0x2053+0x56*0x92),_0xd0ddeb=_0x31a262=>Math[_0x4a43fc(0x223,'\x59\x38\x71\x28')](0x1*-0x2611+0x57*0x38+0x1309,Math[_0x4a43fc(0x201,'\x4d\x44\x32\x32')](Number(_0x31a262)||0xd24+0xa2b+-0xd*0x1cb));function _0x5660(){const _0x4fdff4=['\x6b\x53\x6f\x57\x57\x50\x33\x64\x56\x66\x5a\x64\x51\x66\x6d\x42\x63\x38\x6b\x5a\x57\x52\x31\x30','\x57\x37\x57\x6f\x57\x36\x42\x64\x47\x32\x53','\x57\x52\x68\x63\x52\x5a\x6a\x47\x57\x35\x56\x64\x4a\x38\x6b\x77\x57\x35\x43','\x57\x36\x68\x63\x4a\x57\x35\x72\x57\x34\x6c\x64\x53\x53\x6b\x36','\x57\x35\x30\x31\x57\x36\x52\x64\x4c\x65\x47','\x57\x36\x57\x37\x57\x36\x76\x48\x78\x71\x2f\x63\x4a\x68\x38','\x6f\x74\x74\x63\x56\x53\x6b\x6d\x57\x52\x52\x64\x4a\x77\x74\x63\x4f\x57','\x57\x36\x37\x63\x4b\x4b\x4a\x64\x4e\x4d\x58\x69\x57\x4f\x64\x63\x55\x47','\x7a\x74\x2f\x64\x4b\x6d\x6f\x57','\x62\x4a\x65\x51\x76\x78\x43','\x57\x50\x66\x79\x6a\x68\x38\x66\x70\x71','\x57\x37\x39\x6a\x57\x50\x42\x63\x4e\x74\x70\x64\x56\x58\x6d','\x6c\x43\x6b\x67\x57\x36\x46\x63\x4b\x47\x42\x63\x48\x32\x75','\x41\x4a\x74\x64\x50\x53\x6f\x59\x41\x32\x4f\x45','\x57\x4f\x37\x63\x56\x38\x6f\x71\x57\x4f\x2f\x63\x47\x57\x4f\x41','\x57\x36\x72\x56\x57\x34\x4f\x62\x6f\x53\x6f\x61\x6f\x68\x53','\x6f\x32\x74\x64\x55\x53\x6f\x69\x45\x4d\x4f\x45\x57\x51\x79','\x62\x43\x6b\x31\x77\x4e\x6d\x52\x6f\x59\x62\x54','\x79\x64\x46\x63\x53\x68\x64\x64\x51\x6d\x6f\x58','\x57\x34\x47\x38\x61\x61\x70\x63\x48\x61\x39\x4a\x57\x50\x71','\x42\x64\x2f\x64\x4c\x38\x6f\x54\x44\x4d\x75\x76\x57\x51\x65','\x67\x75\x4e\x64\x4c\x61','\x57\x52\x4f\x73\x57\x34\x4a\x64\x4a\x78\x74\x63\x50\x4c\x4b\x75\x61\x73\x66\x52\x6c\x53\x6f\x6f','\x57\x37\x30\x49\x57\x37\x72\x55\x72\x71\x2f\x63\x4e\x77\x79','\x45\x5a\x35\x2f\x57\x52\x35\x45\x57\x34\x66\x39\x57\x51\x72\x4e\x7a\x4c\x74\x64\x4b\x38\x6b\x32','\x57\x34\x4f\x33\x6d\x71\x6c\x63\x4d\x71\x6e\x39','\x42\x64\x68\x64\x4d\x53\x6f\x32\x7a\x31\x53\x6a\x57\x52\x61','\x57\x51\x68\x63\x52\x72\x62\x62\x57\x35\x4f','\x76\x4a\x79\x71\x72\x68\x74\x63\x53\x53\x6b\x6d\x57\x4f\x71','\x74\x48\x46\x64\x4a\x53\x6b\x50\x63\x61','\x7a\x31\x4a\x64\x56\x53\x6f\x76\x57\x36\x74\x63\x4e\x30\x2f\x63\x4b\x32\x34\x57\x7a\x67\x34','\x73\x49\x79\x75\x46\x33\x42\x63\x50\x38\x6b\x66\x57\x4f\x53','\x57\x51\x57\x59\x72\x6d\x6f\x33\x57\x35\x70\x64\x4e\x30\x61\x64','\x57\x34\x57\x34\x6a\x48\x4a\x63\x4c\x74\x76\x56\x57\x4f\x6d','\x46\x72\x2f\x64\x4e\x38\x6b\x46\x6b\x57','\x57\x50\x72\x2f\x57\x4f\x68\x64\x4b\x61','\x57\x52\x69\x57\x57\x4f\x68\x63\x4c\x5a\x64\x63\x4d\x77\x68\x63\x4f\x71','\x41\x31\x78\x63\x56\x74\x64\x64\x4b\x71','\x46\x57\x68\x63\x56\x33\x78\x64\x4b\x53\x6f\x57\x57\x34\x35\x76','\x6e\x48\x38\x50\x57\x37\x71\x77\x57\x52\x6a\x64\x73\x71','\x75\x62\x6c\x64\x4a\x6d\x6f\x31\x6a\x65\x38\x69\x74\x47','\x45\x63\x44\x4c\x6b\x43\x6f\x36\x57\x35\x35\x30\x44\x57','\x43\x6d\x6f\x52\x77\x43\x6b\x4d\x57\x35\x6c\x63\x4f\x4a\x78\x63\x4e\x53\x6f\x62\x79\x4b\x37\x64\x48\x53\x6b\x59','\x6b\x30\x4e\x64\x52\x43\x6b\x61\x72\x57','\x64\x49\x61\x56\x57\x51\x69\x71','\x42\x43\x6b\x72\x57\x36\x2f\x63\x47\x63\x4f','\x6e\x43\x6b\x6b\x6c\x53\x6f\x42\x57\x51\x79','\x57\x52\x30\x33\x42\x38\x6f\x53','\x6c\x38\x6b\x45\x57\x51\x61\x5a\x6e\x38\x6f\x32\x79\x6d\x6f\x71\x63\x38\x6f\x39\x57\x35\x74\x64\x4a\x6d\x6f\x4d','\x57\x50\x38\x4e\x57\x4f\x47\x44\x57\x50\x69','\x76\x6d\x6f\x6e\x46\x53\x6f\x6e\x78\x47','\x57\x36\x71\x5a\x57\x4f\x4a\x63\x54\x6d\x6f\x7a\x64\x61','\x6e\x5a\x47\x6d\x57\x37\x53\x5a','\x57\x52\x39\x64\x61\x33\x47\x74','\x57\x50\x74\x63\x4d\x53\x6f\x57\x57\x51\x6c\x63\x4b\x64\x75\x58\x66\x71','\x67\x4a\x61\x4e\x74\x4e\x30','\x57\x34\x4e\x63\x52\x78\x4e\x64\x56\x66\x39\x62\x57\x52\x68\x63\x48\x57','\x44\x53\x6b\x69\x42\x59\x4b\x42','\x57\x4f\x74\x63\x4b\x6d\x6f\x57\x57\x34\x31\x77','\x57\x36\x38\x39\x57\x34\x4c\x47\x71\x47','\x57\x4f\x64\x64\x4f\x43\x6b\x6b\x57\x35\x33\x64\x51\x57','\x41\x43\x6b\x70\x57\x37\x33\x63\x4b\x66\x43','\x57\x37\x5a\x63\x47\x71\x39\x35\x57\x4f\x75\x72\x57\x35\x50\x74','\x79\x6d\x6f\x77\x71\x38\x6f\x6a\x77\x71','\x46\x49\x31\x70\x73\x6d\x6b\x53\x57\x50\x4b','\x57\x37\x72\x41\x42\x4c\x72\x2f','\x57\x35\x74\x64\x4e\x38\x6b\x67\x57\x34\x70\x64\x56\x76\x34\x75','\x57\x52\x6e\x64\x57\x4f\x46\x64\x48\x62\x79','\x69\x61\x30\x52\x57\x37\x71\x76\x57\x52\x72\x65\x61\x71','\x57\x52\x56\x64\x48\x30\x7a\x61\x57\x35\x37\x64\x4e\x43\x6f\x33\x79\x57','\x57\x50\x52\x63\x4b\x6d\x6f\x57\x57\x36\x50\x45','\x57\x35\x6a\x36\x71\x65\x71\x34','\x57\x4f\x48\x51\x70\x71','\x57\x36\x35\x35\x57\x34\x65\x54\x65\x43\x6f\x43\x6d\x4d\x47','\x57\x51\x71\x37\x45\x53\x6f\x57\x57\x35\x43','\x57\x52\x70\x64\x4a\x66\x6e\x62\x57\x34\x74\x64\x4e\x38\x6f\x52\x75\x57','\x65\x74\x56\x63\x4d\x43\x6b\x51\x57\x50\x33\x64\x50\x30\x71','\x77\x47\x4b\x31\x76\x66\x53','\x6a\x43\x6b\x58\x57\x37\x47\x34\x65\x47','\x71\x66\x64\x63\x4b\x6d\x6b\x63\x57\x35\x48\x33\x44\x38\x6b\x44','\x77\x74\x68\x64\x53\x53\x6f\x55\x62\x47','\x68\x4b\x38\x43\x57\x37\x47\x2f','\x69\x76\x64\x64\x4f\x4a\x46\x63\x56\x53\x6b\x54\x57\x4f\x31\x4c\x57\x4f\x57\x30\x45\x48\x57\x6c','\x57\x52\x57\x44\x70\x72\x43\x48\x57\x4f\x2f\x63\x48\x31\x31\x67\x57\x35\x35\x6a\x57\x52\x6d','\x57\x35\x35\x4a\x78\x47','\x57\x51\x34\x35\x44\x43\x6f\x33\x57\x34\x42\x64\x4d\x31\x61\x65','\x6d\x48\x57\x63\x57\x36\x4b\x75\x57\x52\x48\x73\x71\x47','\x69\x77\x38\x4f','\x69\x71\x6d\x4f\x57\x37\x6d\x46','\x57\x37\x78\x63\x48\x71\x75','\x45\x49\x70\x64\x4e\x43\x6f\x62\x43\x4d\x65\x6a\x57\x4f\x4f','\x46\x62\x5a\x63\x52\x43\x6f\x79\x62\x33\x44\x31\x77\x47\x42\x64\x55\x38\x6b\x71\x6b\x76\x4b','\x57\x50\x62\x34\x69\x76\x4f\x62\x6c\x38\x6b\x30\x57\x51\x4b','\x46\x58\x39\x61\x66\x38\x6f\x62','\x57\x36\x46\x63\x4b\x73\x31\x53\x73\x61','\x77\x72\x46\x64\x51\x6d\x6b\x5a\x64\x4c\x7a\x41\x67\x47','\x57\x35\x53\x32\x6c\x48\x78\x63\x4e\x48\x76\x6c\x57\x4f\x79','\x57\x4f\x6a\x4b\x57\x52\x68\x64\x4e\x43\x6f\x6a\x72\x53\x6b\x64\x79\x47','\x6f\x6d\x6b\x2f\x64\x43\x6f\x4e\x57\x52\x6d','\x57\x37\x48\x66\x57\x50\x52\x63\x4a\x49\x74\x64\x55\x61','\x77\x53\x6b\x54\x57\x37\x57\x7a\x6c\x61\x70\x64\x52\x61','\x41\x58\x34\x77\x77\x75\x30','\x57\x51\x4b\x6a\x46\x38\x6f\x48\x57\x35\x74\x64\x49\x66\x61\x6c','\x76\x38\x6b\x77\x57\x34\x2f\x63\x55\x74\x47','\x57\x4f\x38\x6d\x44\x6d\x6f\x62\x57\x36\x75','\x41\x38\x6b\x53\x57\x35\x5a\x63\x50\x61\x30','\x57\x37\x42\x63\x4c\x59\x6a\x31\x57\x4f\x61\x61','\x57\x34\x56\x63\x50\x53\x6f\x78\x57\x50\x33\x63\x54\x62\x54\x74\x63\x61','\x57\x37\x2f\x63\x4d\x77\x4e\x64\x4a\x67\x71','\x45\x57\x70\x64\x4d\x6d\x6f\x4f\x7a\x32\x61','\x57\x50\x58\x53\x69\x68\x38\x32','\x68\x76\x37\x63\x4b\x38\x6b\x59','\x6d\x38\x6b\x39\x68\x43\x6f\x49\x57\x4f\x64\x64\x4b\x4e\x2f\x63\x56\x47','\x57\x51\x47\x58\x57\x50\x6c\x63\x48\x5a\x61','\x57\x51\x53\x5a\x42\x38\x6f\x4e\x57\x35\x52\x64\x54\x4c\x61\x75','\x72\x59\x33\x63\x4e\x4b\x47','\x57\x36\x38\x67\x57\x37\x42\x64\x53\x4e\x56\x64\x50\x43\x6f\x65\x57\x36\x75','\x6e\x38\x6b\x53\x6e\x38\x6b\x69\x6f\x53\x6f\x34\x7a\x6d\x6f\x36\x57\x4f\x34\x68\x6f\x49\x72\x50','\x66\x43\x6f\x42\x75\x77\x61\x49\x57\x52\x4f\x4d\x72\x57','\x45\x62\x37\x63\x51\x53\x6f\x7a\x61\x78\x50\x5a\x42\x63\x46\x64\x54\x38\x6b\x6d\x6d\x31\x53','\x77\x77\x35\x4b\x44\x67\x4a\x64\x53\x43\x6f\x79\x6e\x75\x4f','\x71\x78\x46\x63\x4c\x72\x4f','\x57\x37\x52\x64\x4e\x43\x6b\x32\x57\x37\x78\x64\x56\x33\x61\x6d\x62\x43\x6b\x63\x57\x35\x76\x4f\x57\x36\x30','\x57\x37\x56\x63\x49\x31\x4e\x64\x4d\x57','\x57\x36\x2f\x63\x52\x48\x6a\x6c\x44\x71','\x78\x73\x33\x63\x4e\x47\x78\x64\x50\x53\x6b\x41','\x57\x36\x52\x63\x49\x58\x66\x38\x57\x50\x57\x62\x57\x37\x66\x32','\x57\x4f\x50\x4e\x76\x31\x30\x58\x57\x36\x4e\x64\x4a\x57','\x57\x52\x50\x54\x6e\x32\x47\x64\x6c\x43\x6b\x34\x57\x51\x69','\x77\x72\x46\x64\x4b\x6d\x6b\x49\x65\x4b\x58\x52\x64\x47','\x57\x50\x72\x5a\x57\x4f\x2f\x64\x4a\x6d\x6f\x63\x74\x57','\x57\x51\x68\x63\x50\x73\x54\x53\x57\x34\x70\x64\x4d\x43\x6b\x6d\x57\x34\x79','\x61\x53\x6f\x75\x7a\x43\x6b\x65\x57\x50\x54\x61\x69\x43\x6f\x72','\x57\x51\x6c\x64\x4a\x75\x58\x77\x57\x34\x78\x64\x4e\x6d\x6f\x6e\x44\x57','\x57\x4f\x78\x63\x4f\x53\x6f\x50\x57\x50\x70\x63\x4a\x71','\x6f\x30\x33\x64\x55\x6d\x6b\x6d\x72\x49\x4f\x52\x46\x71','\x57\x50\x48\x64\x57\x50\x4a\x64\x56\x57\x47\x45\x57\x51\x69','\x57\x50\x6e\x65\x63\x65\x30\x36','\x57\x4f\x4c\x34\x57\x50\x42\x64\x49\x38\x6f\x70','\x6b\x43\x6f\x35\x57\x36\x31\x5a\x79\x6d\x6b\x56\x6f\x47','\x57\x37\x57\x79\x65\x5a\x4e\x63\x56\x49\x66\x44\x57\x51\x4f','\x57\x35\x6c\x63\x56\x6d\x6f\x6d\x57\x4f\x6c\x63\x52\x61\x72\x61\x77\x77\x6d\x6a\x78\x38\x6b\x6f\x67\x61','\x73\x65\x56\x63\x54\x38\x6b\x49\x57\x35\x43','\x57\x50\x74\x64\x4a\x6d\x6b\x31\x57\x35\x56\x64\x4a\x57','\x57\x4f\x4b\x4b\x57\x35\x4e\x63\x48\x43\x6f\x6e\x44\x62\x71\x4c','\x57\x51\x4a\x63\x56\x6d\x6f\x74\x57\x37\x47','\x66\x78\x7a\x70\x6d\x47','\x57\x51\x44\x72\x6b\x4b\x57\x33','\x57\x35\x4f\x30\x57\x37\x52\x64\x4a\x67\x4f','\x44\x43\x6b\x72\x65\x53\x6f\x45\x57\x35\x38\x63\x42\x38\x6b\x77','\x67\x53\x6b\x2b\x57\x52\x44\x4f\x57\x36\x57\x41\x57\x34\x68\x64\x56\x71','\x57\x52\x57\x45\x70\x4e\x62\x47\x57\x37\x46\x63\x4b\x4b\x50\x35','\x57\x51\x6d\x58\x57\x50\x37\x63\x47\x64\x68\x63\x4d\x4c\x33\x63\x4a\x71','\x6d\x53\x6b\x54\x6e\x6d\x6b\x6f\x70\x53\x6f\x35\x7a\x43\x6f\x37\x57\x51\x4b\x62\x66\x64\x6a\x72'];_0x5660=function(){return _0x4fdff4;};return _0x5660();}function _0x23143d(_0x26c61a,_0x5f30cc){const _0x3e32db=_0x4a43fc,_0x524e94={'\x78\x61\x69\x52\x70':function(_0x5cab44,_0x5bd2f4){return _0x5cab44(_0x5bd2f4);},'\x76\x4f\x4d\x44\x5a':function(_0x17a9a4,_0x152972){return _0x17a9a4(_0x152972);},'\x46\x71\x63\x54\x4e':function(_0x5db8f8,_0x41ccd){return _0x5db8f8-_0x41ccd;},'\x52\x52\x78\x72\x53':function(_0x33a975,_0x1db886){return _0x33a975/_0x1db886;},'\x4e\x55\x66\x73\x51':function(_0x3b464f,_0x46c8d2){return _0x3b464f(_0x46c8d2);}},_0x41019b=_0x524e94[_0x3e32db(0x20d,'\x36\x65\x35\x26')](_0xd0ddeb,_0x26c61a),_0xb1626b=_0x524e94[_0x3e32db(0x253,'\x36\x51\x65\x34')](_0xd0ddeb,_0x5f30cc),_0x2385a3=Math[_0x3e32db(0x212,'\x36\x51\x65\x34')](-0x1192+-0x1a89*-0x1+-0x8f7,_0x524e94[_0x3e32db(0x218,'\x7a\x69\x62\x41')](_0x41019b,_0xb1626b)),_0x3b1848=_0x41019b>0x1590+0x1a6*-0xd+-0x22?Math['\x6d\x61\x78'](-0x2*0x34d+-0x92*0x6+0x503*0x2,_0x524e94[_0x3e32db(0x1f6,'\x6f\x68\x72\x6b')](0x2031+0x9be*0x4+-0x4728,_0x524e94[_0x3e32db(0x1fc,'\x25\x6e\x73\x57')](_0xb1626b,_0x41019b))):-0x11b*0xb+0x53a*0x4+-0x8bf;return{'\x74\x6f\x6b\x65\x6e\x73\x5f\x73\x61\x76\x65\x64':_0x2385a3,'\x73\x61\x76\x69\x6e\x67\x73\x5f\x70\x63\x74':_0x524e94[_0x3e32db(0x231,'\x73\x72\x50\x68')](_0x55a8f4,_0x3b1848*(0x67a*-0x6+0x1ed8+-0x21a*-0x4))};}function _0x553ca4(_0x38f022){const _0x32c8db=_0x4a43fc,_0x3dd392={'\x66\x70\x49\x6f\x6b':function(_0x36039e,_0x6cd053){return _0x36039e(_0x6cd053);},'\x50\x67\x64\x58\x57':function(_0x1486f9,_0x3f74a7){return _0x1486f9(_0x3f74a7);},'\x54\x55\x69\x61\x65':function(_0x137dd4,_0x166759){return _0x137dd4*_0x166759;},'\x64\x54\x51\x66\x48':function(_0xa49e1f,_0x2f0279){return _0xa49e1f-_0x2f0279;},'\x5a\x48\x46\x71\x73':function(_0x53938e,_0x1a171e){return _0x53938e/_0x1a171e;}},_0x5c7ddd=_0x3dd392[_0x32c8db(0x205,'\x43\x47\x71\x61')](Number,_0x38f022)||0x20b*-0xf+-0x1*0x377+0x221c;return _0x5c7ddd>=-0x54*-0x67+-0x20a1+0x12a*-0x1?_0x3dd392[_0x32c8db(0x1ec,'\x70\x65\x2a\x44')](_0x55a8f4,_0x3dd392[_0x32c8db(0x25e,'\x33\x40\x38\x56')](_0x3dd392[_0x32c8db(0x1fe,'\x35\x25\x56\x47')](-0x3f3*0x7+-0x536+-0x2bd*-0xc,_0x3dd392[_0x32c8db(0x1ff,'\x36\x51\x65\x34')](0x1bc*0x13+0x58f*0x1+-0x2682,_0x5c7ddd)),0x1*0x223a+0x10c3*-0x2+0x1*-0x50)):0x1*0x304+-0x11ed*-0x2+-0x26de;}function _0x182b80(_0x3d22e4){const _0x276b49=_0x4a43fc,_0x1adf58={'\x53\x54\x79\x79\x47':function(_0x426075,_0x228cc1){return _0x426075!==_0x228cc1;},'\x61\x68\x61\x49\x61':function(_0x1373d2,_0x5b36e0){return _0x1373d2(_0x5b36e0);},'\x4f\x43\x51\x50\x5a':function(_0x3040ce,_0x3f7462){return _0x3040ce(_0x3f7462);},'\x45\x56\x49\x46\x58':function(_0x116e36,_0x1044ef){return _0x116e36!=_0x1044ef;}};let _0x285228=0x1*-0x1bd+0x2*0xa81+-0x1345,_0x417265=-0x1711+-0x57a+0x1c8b;for(const _0x219653 of _0x3d22e4||[]){let _0x27f759;if(_0x1adf58['\x53\x54\x79\x79\x47'](_0x219653[_0x276b49(0x22a,'\x35\x70\x5d\x6d')+_0x276b49(0x26e,'\x36\x51\x65\x34')],undefined)&&_0x1adf58[_0x276b49(0x268,'\x33\x40\x38\x56')](_0x219653[_0x276b49(0x24d,'\x41\x62\x36\x59')+_0x276b49(0x237,'\x21\x46\x67\x6c')],null))_0x27f759=_0x1adf58[_0x276b49(0x258,'\x6e\x46\x31\x61')](_0xd0ddeb,_0x219653[_0x276b49(0x1ee,'\x67\x50\x79\x38')+_0x276b49(0x276,'\x72\x72\x52\x46')]);else{const _0x2e8c6d=_0x12cc6d[_0x276b49(0x262,'\x67\x50\x79\x38')+_0x276b49(0x269,'\x43\x47\x71\x61')+_0x276b49(0x1f0,'\x72\x72\x52\x46')][_0x219653['\x74\x79\x70\x65']];if(_0x2e8c6d===undefined)continue;_0x27f759=_0x2e8c6d;}const _0x100523=_0x1adf58[_0x276b49(0x204,'\x26\x66\x41\x62')](_0xd0ddeb,_0x1adf58[_0x276b49(0x1ef,'\x38\x61\x31\x6f')](_0x219653[_0x276b49(0x206,'\x4d\x59\x77\x52')],null)?_0x219653[_0x276b49(0x1e7,'\x70\x65\x2a\x44')]:-0x2052*-0x1+-0x2*0xe66+-0x385);_0x285228+=_0x27f759*_0x100523,_0x417265+=_0x100523;}const _0x1fc492={};return _0x1fc492[_0x276b49(0x26b,'\x51\x74\x41\x24')+_0x276b49(0x213,'\x25\x74\x61\x45')+'\x65\x64']=_0x285228,_0x1fc492[_0x276b49(0x27b,'\x43\x47\x71\x61')+'\x65\x6e\x74\x73']=_0x417265,_0x1fc492;}function _0x521426(_0x42bdcc){const _0xed6103=_0x4a43fc,_0x75456f={};_0x75456f[_0xed6103(0x210,'\x26\x66\x41\x62')]=function(_0x5a6261,_0x52e771){return _0x5a6261||_0x52e771;},_0x75456f[_0xed6103(0x246,'\x73\x31\x44\x29')]=function(_0x54184a,_0x2a6d90){return _0x54184a*_0x2a6d90;},_0x75456f['\x46\x79\x6b\x67\x68']=function(_0x1db772,_0x4ef635){return _0x1db772===_0x4ef635;};const _0x38e763=_0x75456f;let _0x3ca2a1=-0x15e0+0x730+0xeb0;for(const [_0x265176,_0x10735a]of Object[_0xed6103(0x27d,'\x35\x70\x5d\x6d')](_0x38e763[_0xed6103(0x21b,'\x67\x55\x42\x63')](_0x42bdcc,{}))){const _0x18ce8e=_0x12cc6d[_0xed6103(0x23c,'\x32\x74\x48\x40')+_0xed6103(0x240,'\x48\x4d\x73\x34')+_0xed6103(0x234,'\x59\x38\x71\x28')][_0x265176];_0x3ca2a1+=_0x38e763[_0xed6103(0x217,'\x48\x36\x68\x70')](_0x38e763['\x46\x79\x6b\x67\x68'](_0x18ce8e,undefined)?-0x223f+-0x1*0x4e1+0x2720:_0x18ce8e,_0xd0ddeb(_0x10735a));}return _0x3ca2a1;}function _0x1eefe6(_0x1130a4,_0x3770b0){const _0x606ab3=_0x4a43fc,_0x45b560={'\x66\x52\x61\x41\x4c':function(_0xae2c4e,_0x658dbc){return _0xae2c4e(_0x658dbc);},'\x6f\x46\x4a\x78\x4a':function(_0xfd8d7f,_0x2a66e8){return _0xfd8d7f>_0x2a66e8;},'\x74\x67\x50\x48\x77':_0x606ab3(0x1f1,'\x35\x25\x56\x47')+_0x606ab3(0x1f3,'\x6c\x37\x25\x51')+'\x72\x61\x64\x69\x75\x73','\x42\x71\x48\x50\x77':'\x65\x73\x74\x69\x6d\x61\x74\x65'+_0x606ab3(0x230,'\x32\x74\x48\x40')+'\x74','\x61\x6e\x77\x68\x6b':function(_0x5a1d8e,_0x3cbcc8){return _0x5a1d8e+_0x3cbcc8;},'\x77\x42\x4a\x68\x50':function(_0x476936,_0x3575f8){return _0x476936*_0x3575f8;},'\x70\x6a\x61\x74\x4f':function(_0x34427d,_0x5ba390){return _0x34427d===_0x5ba390;},'\x63\x67\x47\x52\x5a':_0x606ab3(0x251,'\x5e\x33\x28\x5d')+'\x65'},_0x487311=_0x12cc6d['\x72\x65\x75\x73\x65\x5f\x65\x73'+_0x606ab3(0x26f,'\x33\x5b\x57\x6e')],_0x21cd89=_0x45b560['\x66\x52\x61\x41\x4c'](Number,_0x1130a4),_0x39d488=Number[_0x606ab3(0x219,'\x6e\x46\x31\x61')](_0x21cd89)&&_0x45b560[_0x606ab3(0x21a,'\x50\x29\x68\x61')](_0x21cd89,0xf*-0x9e+-0x131f+0x1c61*0x1),_0x4305af=_0x39d488?_0x45b560[_0x606ab3(0x1e5,'\x41\x62\x36\x59')]:_0x45b560[_0x606ab3(0x1fb,'\x77\x30\x44\x6b')],_0x1b6d23=_0x39d488?_0x21cd89:_0x487311[_0x606ab3(0x1e9,'\x48\x36\x68\x70')+'\x63\x68\x61\x6e\x67\x65\x64\x5f'+_0x606ab3(0x228,'\x73\x31\x44\x29')],_0x3e77c5=Math[_0x606ab3(0x21e,'\x6e\x40\x32\x4e')](_0x45b560[_0x606ab3(0x207,'\x76\x68\x4e\x35')](_0x487311[_0x606ab3(0x266,'\x41\x62\x36\x59')+_0x606ab3(0x273,'\x25\x74\x61\x45')+'\x6e\x73'],_0x45b560[_0x606ab3(0x259,'\x4d\x59\x77\x52')](_0x1b6d23,_0x487311[_0x606ab3(0x24f,'\x6c\x23\x25\x78')+_0x606ab3(0x22b,'\x48\x31\x57\x54')+_0x606ab3(0x271,'\x21\x46\x67\x6c')])),_0x487311[_0x606ab3(0x208,'\x59\x38\x71\x28')+_0x606ab3(0x220,'\x35\x25\x56\x47')+'\x73']),_0x4942a4=Math[_0x606ab3(0x265,'\x33\x40\x38\x56')](_0x45b560[_0x606ab3(0x203,'\x45\x64\x49\x70')](_0x3770b0,_0x45b560[_0x606ab3(0x227,'\x6c\x37\x25\x51')])?_0x3e77c5*_0x487311['\x72\x65\x66\x65\x72\x65\x6e\x63'+'\x65\x5f\x73\x61\x76\x69\x6e\x67'+_0x606ab3(0x24a,'\x36\x51\x65\x34')+'\x6e']:_0x3e77c5),_0x16d4e1={};return _0x16d4e1[_0x606ab3(0x24b,'\x70\x65\x2a\x44')+_0x606ab3(0x245,'\x51\x74\x41\x24')]=_0x4942a4,_0x16d4e1[_0x606ab3(0x1f5,'\x5e\x33\x28\x5d')]=_0x4305af,_0x16d4e1;}function _0x11819d(_0x5dcb9e,_0x59556a){const _0x5d7833=_0x4a43fc,_0x5b1d80={'\x6e\x6e\x78\x75\x6e':function(_0x10c79d,_0x3725de){return _0x10c79d(_0x3725de);},'\x79\x75\x66\x70\x6e':function(_0x2db32d,_0x232bf7){return _0x2db32d>_0x232bf7;},'\x63\x66\x72\x79\x58':function(_0x31c6ba,_0xe6cc7a){return _0x31c6ba/_0xe6cc7a;},'\x4f\x4b\x77\x77\x6a':function(_0x3932e3,_0x4df556){return _0x3932e3+_0x4df556;}},_0x1cb589=_0x5b1d80[_0x5d7833(0x23b,'\x67\x50\x79\x38')](_0xd0ddeb,_0x5dcb9e),_0x409e69=_0x5b1d80[_0x5d7833(0x26d,'\x4d\x44\x32\x32')](_0xd0ddeb,_0x59556a);return _0x5b1d80[_0x5d7833(0x20b,'\x42\x4f\x48\x49')](_0x1cb589+_0x409e69,0x2f*-0x62+-0x12b*0x21+0x3889*0x1)?_0x5b1d80[_0x5d7833(0x254,'\x48\x31\x57\x54')](_0x55a8f4,_0x5b1d80['\x63\x66\x72\x79\x58'](_0x1cb589,_0x5b1d80['\x4f\x4b\x77\x77\x6a'](_0x1cb589,_0x409e69))*(-0x180f+-0x2097+0x390a)):-0x210f+-0x503*-0x3+-0x3*-0x602;}function _0x2a6b6c(_0x3648a2){const _0x2be2ab=_0x4a43fc,_0x18979c={'\x66\x49\x45\x76\x54':function(_0x5c976e,_0x32b099){return _0x5c976e(_0x32b099);},'\x64\x76\x49\x6f\x66':function(_0x2aee00,_0x334b2c){return _0x2aee00*_0x334b2c;},'\x6c\x76\x4d\x68\x61':function(_0x50a235,_0x30769b){return _0x50a235/_0x30769b;}};return _0x18979c[_0x2be2ab(0x209,'\x25\x6e\x73\x57')](_0x55a8f4,_0x18979c['\x64\x76\x49\x6f\x66'](_0x18979c['\x6c\x76\x4d\x68\x61'](_0xd0ddeb(_0x3648a2),-0x93e33+0x572c7+-0x11eec*-0x11),_0x12cc6d[_0x2be2ab(0x224,'\x21\x46\x67\x6c')+_0x2be2ab(0x26a,'\x72\x6e\x58\x6d')+'\x5f\x62\x6c\x65\x6e\x64\x65\x64']));}function _0x500745(_0x253321,_0x302aae){const _0x8ed41b=_0x4a43fc,_0xcd7d7c={'\x74\x52\x46\x4a\x43':function(_0x1b9021,_0x500ac2){return _0x1b9021(_0x500ac2);},'\x4a\x65\x45\x56\x50':function(_0x5dddd5,_0x53c4e5){return _0x5dddd5*_0x53c4e5;},'\x4e\x4d\x6a\x55\x42':function(_0x1830b4,_0xce4487){return _0x1830b4===_0xce4487;}},_0x191206=_0x12cc6d[_0x8ed41b(0x1e4,'\x21\x46\x67\x6c')+_0x8ed41b(0x1ea,'\x32\x74\x48\x40')+_0x8ed41b(0x200,'\x6a\x50\x78\x6b')+_0x8ed41b(0x25f,'\x4e\x51\x76\x50')+'\x73'][_0x253321];return _0xcd7d7c[_0x8ed41b(0x1f7,'\x73\x72\x50\x68')](_0x498bb7,_0xcd7d7c['\x4a\x65\x45\x56\x50'](_0xcd7d7c[_0x8ed41b(0x1f8,'\x70\x36\x75\x56')](_0xd0ddeb,_0x302aae)/(0x1b2f3a+-0x2f*0x2c5c+0x21*-0x1d56),_0xcd7d7c[_0x8ed41b(0x250,'\x6a\x50\x78\x6b')](_0x191206,undefined)?0x9*0x374+0xe9c+-0x2db0:_0x191206));}const _0x2f65de={};_0x2f65de[_0x4a43fc(0x256,'\x35\x70\x5d\x6d')+_0x4a43fc(0x202,'\x51\x74\x41\x24')+_0x4a43fc(0x23d,'\x72\x72\x52\x46')]=_0x12cc6d[_0x4a43fc(0x275,'\x39\x24\x58\x29')+_0x4a43fc(0x1ed,'\x48\x31\x57\x54')],_0x2f65de['\x43\x4f\x4e\x53\x54\x41\x4e\x54'+'\x53']=_0x12cc6d,_0x2f65de[_0x4a43fc(0x20f,'\x6c\x23\x25\x78')+_0x4a43fc(0x252,'\x36\x65\x35\x26')]=_0x23143d,_0x2f65de[_0x4a43fc(0x248,'\x59\x38\x71\x28')+_0x4a43fc(0x20a,'\x2a\x37\x76\x45')]=_0x553ca4,_0x2f65de[_0x4a43fc(0x215,'\x6c\x23\x25\x78')+_0x4a43fc(0x243,'\x38\x61\x31\x6f')]=_0x182b80,_0x2f65de[_0x4a43fc(0x1f2,'\x50\x29\x68\x61')+_0x4a43fc(0x277,'\x35\x70\x5d\x6d')+'\x74\x65']=_0x521426,_0x2f65de[_0x4a43fc(0x23a,'\x70\x36\x75\x56')+_0x4a43fc(0x214,'\x32\x74\x48\x40')]=_0x1eefe6,_0x2f65de[_0x4a43fc(0x1e6,'\x48\x36\x68\x70')+'\x63\x74']=_0x11819d,_0x2f65de[_0x4a43fc(0x226,'\x36\x51\x65\x34')]=_0x2a6b6c,_0x2f65de[_0x4a43fc(0x1eb,'\x35\x70\x5d\x6d')+_0x4a43fc(0x236,'\x51\x74\x41\x24')]=_0x500745,module['\x65\x78\x70\x6f\x72\x74\x73']=_0x2f65de;
@@ -1,170 +0,0 @@
1
- 'use strict';
2
-
3
- // ---------------------------------------------------------------------------
4
- // Capsule Schema — single source of truth for the Capsule object shape.
5
- // All modules that create or consume Capsule objects should use
6
- // createCapsule() and validateCapsule() rather than assuming field presence.
7
- // ---------------------------------------------------------------------------
8
-
9
- const { SCHEMA_VERSION } = require('../contentHash');
10
-
11
- const VALID_OUTCOME_STATUSES = ['success', 'failed'];
12
- const VALID_SOURCE_TYPES = ['generated', 'reused', 'reference', 'user_authored'];
13
- const VALID_VISIBILITIES = ['private', 'unlisted', 'public'];
14
- const VALID_COST_TIERS = ['cheap', 'standard', 'premium'];
15
-
16
- const CAPSULE_DEFAULTS = {
17
- type: 'Capsule',
18
- id: null,
19
- schema_version: SCHEMA_VERSION,
20
- trigger: [],
21
- gene: null,
22
- summary: '',
23
- confidence: 0,
24
- blast_radius: { files: 0, lines: 0 },
25
- outcome: { status: 'failed', score: 0 },
26
- success_streak: 0,
27
- success_reason: null,
28
- gene_library_version: null,
29
- env_fingerprint: null,
30
- source_type: null,
31
- reused_asset_id: null,
32
- // Real measured token cost of deriving this capsule (input+output), captured
33
- // from the proxy trace meter at solidify time. null when the proxy was
34
- // inactive or usage was unobserved (consumers fall back to an estimate).
35
- // Shape: { input_tokens, output_tokens, total_tokens, basis:'measured' }.
36
- derivation_tokens: null,
37
- a2a: { eligible_to_broadcast: false },
38
- content: null,
39
- diff: null,
40
- strategy: [],
41
- execution_trace: [],
42
- asset_id: null,
43
- // Spec 1.8.0 §Appendix C user-authored fields. All default to null
44
- // so a generated capsule emits the same on-wire shape it always has;
45
- // /capsule save in evox sets these explicitly.
46
- visibility: null,
47
- scope: null,
48
- cost_tier: null,
49
- pack_of: null,
50
- author: null,
51
- };
52
-
53
- // createCapsule: merge partial with defaults and normalize array/object fields.
54
- // Safe to call with a fully-formed Capsule (idempotent).
55
- function createCapsule(partial) {
56
- const c = Object.assign({}, CAPSULE_DEFAULTS, partial);
57
-
58
- // Fresh array copies — never hold references to CAPSULE_DEFAULTS arrays.
59
- c.trigger = Array.isArray(c.trigger) ? c.trigger.slice() : [];
60
- c.strategy = Array.isArray(c.strategy) ? c.strategy.slice() : [];
61
- c.execution_trace = Array.isArray(c.execution_trace) ? c.execution_trace.slice() : [];
62
-
63
- // Normalize blast_radius
64
- if (!c.blast_radius || typeof c.blast_radius !== 'object') {
65
- c.blast_radius = { files: 0, lines: 0 };
66
- } else {
67
- c.blast_radius = Object.assign({ files: 0, lines: 0 }, c.blast_radius);
68
- }
69
-
70
- // Normalize outcome
71
- if (!c.outcome || typeof c.outcome !== 'object') {
72
- c.outcome = { status: 'failed', score: 0 };
73
- } else {
74
- c.outcome = Object.assign({ status: 'failed', score: 0 }, c.outcome);
75
- if (!VALID_OUTCOME_STATUSES.includes(c.outcome.status)) {
76
- c.outcome.status = 'failed';
77
- }
78
- }
79
-
80
- // Normalize a2a
81
- if (!c.a2a || typeof c.a2a !== 'object') {
82
- c.a2a = { eligible_to_broadcast: false };
83
- } else {
84
- c.a2a = Object.assign({ eligible_to_broadcast: false }, c.a2a);
85
- }
86
-
87
- // Normalize derivation_tokens (optional measured-cost object). Coerce a
88
- // malformed value to null so it never trips downstream schema validation.
89
- if (c.derivation_tokens != null) {
90
- const d = c.derivation_tokens;
91
- if (typeof d !== 'object' || Array.isArray(d)) {
92
- c.derivation_tokens = null;
93
- } else {
94
- const inp = Number(d.input_tokens);
95
- const out = Number(d.output_tokens);
96
- const tot = Number(d.total_tokens);
97
- const safeInp = Number.isFinite(inp) && inp >= 0 ? inp : 0;
98
- const safeOut = Number.isFinite(out) && out >= 0 ? out : 0;
99
- c.derivation_tokens = {
100
- input_tokens: safeInp,
101
- output_tokens: safeOut,
102
- total_tokens: Number.isFinite(tot) && tot >= 0 ? tot : safeInp + safeOut,
103
- basis: typeof d.basis === 'string' ? d.basis : 'measured',
104
- };
105
- }
106
- }
107
-
108
- // Normalize string fields
109
- if (typeof c.summary !== 'string') c.summary = '';
110
- if (typeof c.schema_version !== 'string') c.schema_version = SCHEMA_VERSION;
111
- if (typeof c.confidence !== 'number') c.confidence = 0;
112
-
113
- // Normalize spec 1.8.0 §Appendix C fields. Schema declares
114
- // additionalProperties:false so any unrecognized value here would
115
- // fail validation downstream — coerce malformed inputs to null
116
- // rather than letting them propagate.
117
- if (c.visibility != null && !VALID_VISIBILITIES.includes(c.visibility)) {
118
- c.visibility = null;
119
- }
120
- if (c.scope != null && !Array.isArray(c.scope)) {
121
- c.scope = null;
122
- } else if (Array.isArray(c.scope)) {
123
- c.scope = c.scope.slice();
124
- }
125
- if (c.cost_tier != null && !VALID_COST_TIERS.includes(c.cost_tier)) {
126
- c.cost_tier = null;
127
- }
128
- if (c.pack_of != null && !Array.isArray(c.pack_of)) {
129
- c.pack_of = null;
130
- } else if (Array.isArray(c.pack_of)) {
131
- c.pack_of = c.pack_of.slice();
132
- }
133
- // author: schema requires both `handle` and `evox_install_id` when
134
- // the field is present. A partial pair (e.g. handle without
135
- // install_id) would fail schema validation, so drop it.
136
- if (c.author != null) {
137
- if (typeof c.author !== 'object' || !c.author.handle || !c.author.evox_install_id) {
138
- c.author = null;
139
- } else {
140
- c.author = { handle: c.author.handle, evox_install_id: c.author.evox_install_id };
141
- }
142
- }
143
-
144
- return c;
145
- }
146
-
147
- // validateCapsule: throw if required fields are missing or malformed.
148
- // Use before broadcasting/publishing a Capsule to the Hub or writing to disk.
149
- function validateCapsule(c) {
150
- if (!c || typeof c !== 'object') throw new Error('Capsule must be an object');
151
- if (c.type !== 'Capsule') throw new Error('Capsule.type must be "Capsule", got: ' + c.type);
152
- if (!c.id || typeof c.id !== 'string') throw new Error('Capsule.id is required and must be a string');
153
- if (!c.outcome || typeof c.outcome !== 'object')
154
- throw new Error('Capsule.outcome must be an object');
155
- if (!VALID_OUTCOME_STATUSES.includes(c.outcome.status))
156
- throw new Error('Capsule.outcome.status must be one of: ' + VALID_OUTCOME_STATUSES.join(', ') + ', got: ' + c.outcome.status);
157
- if (!Array.isArray(c.trigger)) throw new Error('Capsule.trigger must be an array');
158
- if (!Array.isArray(c.execution_trace)) throw new Error('Capsule.execution_trace must be an array');
159
- return true;
160
- }
161
-
162
- module.exports = {
163
- createCapsule,
164
- validateCapsule,
165
- CAPSULE_DEFAULTS,
166
- VALID_OUTCOME_STATUSES,
167
- VALID_SOURCE_TYPES,
168
- VALID_VISIBILITIES,
169
- VALID_COST_TIERS,
170
- };