@evomap/evolver 1.90.0 → 2.0.0-beta.1

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,166 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * CHANGELOG release-section integrity guard.
5
- *
6
- * Catches the misattribution pattern that bit us with #540 / PR #107:
7
- * an entry filed under `## [X.Y.Z]` AFTER v1.85.0 was already published
8
- * to npm, so the changelog claimed a fix the binary didn't contain.
9
- *
10
- * Algorithm: for every `## [X.Y.Z]` heading in CHANGELOG.md that has a
11
- * matching git tag (`vX.Y.Z`), compare the section content at HEAD
12
- * against the section content at that tag. If they differ, somebody
13
- * edited a frozen-and-released section — fail loud.
14
- *
15
- * Notes:
16
- * - `## [Unreleased]` is exempt (it's the staging area, no tag).
17
- * - Version headings without a corresponding tag are exempt — that's
18
- * usually the "preparing X.Y.Z" state right before the tag exists.
19
- * - Tag lookup is local-only (`git rev-parse`); CI must `git fetch
20
- * --tags` first if it runs on a shallow clone.
21
- * - `repoRoot` is injectable so tests don't need to monkey-patch the
22
- * module by re-evaluating source (see PR #115 review).
23
- *
24
- * Usage:
25
- * node scripts/check-changelog.js # CLI mode, exits 0/1
26
- * const { checkChangelogIntegrity } = require('./check-changelog');
27
- * const result = checkChangelogIntegrity({ repoRoot });
28
- */
29
-
30
- const { execFileSync } = require('child_process');
31
- const fs = require('fs');
32
- const path = require('path');
33
-
34
- const DEFAULT_REPO_ROOT = path.resolve(__dirname, '..');
35
-
36
- function readChangelogAtHead(repoRoot) {
37
- return fs.readFileSync(path.join(repoRoot, 'CHANGELOG.md'), 'utf8');
38
- }
39
-
40
- function readChangelogAtRef(repoRoot, ref) {
41
- try {
42
- return execFileSync('git', ['show', `${ref}:CHANGELOG.md`], {
43
- cwd: repoRoot,
44
- encoding: 'utf8',
45
- stdio: ['ignore', 'pipe', 'ignore'],
46
- });
47
- } catch {
48
- return null;
49
- }
50
- }
51
-
52
- function tagExists(repoRoot, tag) {
53
- try {
54
- execFileSync('git', ['rev-parse', '--verify', `refs/tags/${tag}`], {
55
- cwd: repoRoot,
56
- stdio: ['ignore', 'ignore', 'ignore'],
57
- });
58
- return true;
59
- } catch {
60
- return false;
61
- }
62
- }
63
-
64
- // Pull every `## [X.Y.Z]` heading from the file, skipping `[Unreleased]`.
65
- function listReleasedVersionHeadings(text) {
66
- const versions = [];
67
- const re = /^## \[(\d+\.\d+\.\d+(?:[-+][\w.]+)?)\]/gm;
68
- let m;
69
- while ((m = re.exec(text)) !== null) {
70
- versions.push(m[1]);
71
- }
72
- return versions;
73
- }
74
-
75
- // Extract the body between `## [X.Y.Z]` and the next `## [` (or EOF).
76
- // Normalises trailing whitespace and trailing blank lines so a stray
77
- // newline doesn't fail the equality check.
78
- //
79
- // Heading match is line-anchored (`/^## \[X\.Y\.Z\]/m`) so a fenced
80
- // code block or quoted text containing `## [X.Y.Z]` mid-line cannot be
81
- // mistaken for the section start (Bugbot PR #115 review).
82
- function extractSection(text, version) {
83
- const escaped = version.replace(/[.+]/g, (c) => '\\' + c);
84
- const re = new RegExp(`^## \\[${escaped}\\]`, 'm');
85
- const match = re.exec(text);
86
- if (!match) return null;
87
- const after = match.index + match[0].length;
88
- const rest = text.slice(after);
89
- const nextRel = rest.search(/\n## \[/);
90
- const raw = nextRel === -1 ? rest : rest.slice(0, nextRel);
91
- return raw
92
- .split('\n')
93
- .map((line) => line.replace(/\s+$/, ''))
94
- .join('\n')
95
- .replace(/\n+$/, '');
96
- }
97
-
98
- function checkChangelogIntegrity(opts) {
99
- const repoRoot = (opts && opts.repoRoot) || DEFAULT_REPO_ROOT;
100
- const head = readChangelogAtHead(repoRoot);
101
- const versions = listReleasedVersionHeadings(head);
102
-
103
- const drift = [];
104
- const skipped = [];
105
-
106
- for (const version of versions) {
107
- const tag = `v${version}`;
108
- if (!tagExists(repoRoot, tag)) {
109
- skipped.push({ version, reason: 'no matching git tag (probably preparing this release)' });
110
- continue;
111
- }
112
- const tagText = readChangelogAtRef(repoRoot, tag);
113
- if (tagText == null) {
114
- skipped.push({ version, reason: `tag ${tag} exists but its CHANGELOG.md is unreadable` });
115
- continue;
116
- }
117
- const headSection = extractSection(head, version);
118
- const tagSection = extractSection(tagText, version);
119
- if (headSection == null || tagSection == null) {
120
- skipped.push({ version, reason: 'section parse failed' });
121
- continue;
122
- }
123
- if (headSection !== tagSection) {
124
- drift.push({ version, tag });
125
- }
126
- }
127
-
128
- return { drift, skipped, checked: versions.length - skipped.length };
129
- }
130
-
131
- function main() {
132
- const result = checkChangelogIntegrity();
133
-
134
- process.stdout.write(`\n=== CHANGELOG release-section guard ===\n`);
135
- process.stdout.write(`Checked ${result.checked} released version section(s); skipped ${result.skipped.length}.\n`);
136
-
137
- for (const s of result.skipped) {
138
- process.stdout.write(` [skip] ${s.version}: ${s.reason}\n`);
139
- }
140
-
141
- if (result.drift.length === 0) {
142
- process.stdout.write(`\n[OK] No released CHANGELOG section was edited after its release tag.\n`);
143
- return 0;
144
- }
145
-
146
- process.stderr.write(`\n[FAIL] ${result.drift.length} CHANGELOG section(s) diverged from their release tag:\n`);
147
- for (const d of result.drift) {
148
- process.stderr.write(` - ## [${d.version}] differs from ${d.tag}:CHANGELOG.md\n`);
149
- }
150
- process.stderr.write(
151
- `\nReleased sections must stay frozen. Move any new entries under ## [Unreleased],\n` +
152
- `or, if the entry was genuinely missing from the release, amend it on a hotfix\n` +
153
- `branch and tag a patch release.\n`
154
- );
155
- return 1;
156
- }
157
-
158
- if (require.main === module) {
159
- process.exit(main());
160
- }
161
-
162
- module.exports = {
163
- checkChangelogIntegrity,
164
- extractSection, // for tests
165
- listReleasedVersionHeadings, // for tests
166
- };
@@ -1,85 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const REPO_ROOT = path.resolve(__dirname, '..');
5
- const LOG_FILE = path.join(REPO_ROOT, 'memory', 'mad_dog_evolution.log');
6
- const OUT_FILE = path.join(REPO_ROOT, 'evolution_history.md');
7
-
8
- function parseLog() {
9
- if (!fs.existsSync(LOG_FILE)) {
10
- console.log("Log file not found.");
11
- return;
12
- }
13
-
14
- const content = fs.readFileSync(LOG_FILE, 'utf8');
15
- const lines = content.split('\n');
16
-
17
- const reports = [];
18
- let currentTimestamp = null;
19
-
20
- // Regex for Feishu command
21
- // node skills/feishu-card/send.js --title "..." --color ... --text "..."
22
- const cmdRegex = /node skills\/feishu-card\/send\.js --title "(.*?)" --color \w+ --text "(.*?)"/;
23
-
24
- for (let i = 0; i < lines.length; i++) {
25
- const line = lines[i];
26
-
27
- // 1. Capture Timestamp
28
- if (line.includes('Cycle Start:')) {
29
- // Format: Cycle Start: Sun Feb 1 19:17:44 UTC 2026
30
- const dateStr = line.split('Cycle Start: ')[1].trim();
31
- try {
32
- currentTimestamp = new Date(dateStr);
33
- } catch (e) {
34
- currentTimestamp = null;
35
- }
36
- }
37
-
38
- const match = line.match(cmdRegex);
39
- if (match) {
40
- const title = match[1];
41
- let text = match[2];
42
-
43
- // Clean up text (unescape newlines)
44
- text = text.replace(/\\n/g, '\n').replace(/\\"/g, '"');
45
-
46
- if (currentTimestamp) {
47
- reports.push({
48
- ts: currentTimestamp,
49
- title: title,
50
- text: text,
51
- id: title // Cycle ID is in title
52
- });
53
- }
54
- }
55
- }
56
-
57
- // Deduplicate by ID (keep latest timestamp?)
58
- const uniqueReports = {};
59
- reports.forEach(r => {
60
- uniqueReports[r.id] = r;
61
- });
62
-
63
- const sortedReports = Object.values(uniqueReports).sort((a, b) => a.ts - b.ts);
64
-
65
- let md = "# Evolution History (Extracted)\n\n";
66
- sortedReports.forEach(r => {
67
- // Convert to CST (UTC+8)
68
- const cstDate = r.ts.toLocaleString("zh-CN", {
69
- timeZone: "Asia/Shanghai",
70
- hour12: false,
71
- year: 'numeric', month: '2-digit', day: '2-digit',
72
- hour: '2-digit', minute: '2-digit', second: '2-digit'
73
- });
74
-
75
- md += `### ${r.title} (${cstDate})\n`;
76
- md += `${r.text}\n\n`;
77
- md += `---\n\n`;
78
- });
79
-
80
- fs.writeFileSync(OUT_FILE, md);
81
- console.log(`Extracted ${sortedReports.length} reports to ${OUT_FILE}`);
82
- }
83
-
84
- parseLog();
85
-
@@ -1,75 +0,0 @@
1
- const { execSync } = require('child_process');
2
- const fs = require('fs');
3
- const path = require('path');
4
-
5
- // Separator for git log parsing (something unlikely to be in commit messages)
6
- const SEP = '|||';
7
- const REPO_ROOT = path.resolve(__dirname, '..');
8
-
9
- try {
10
- // Git command:
11
- // --reverse: Oldest to Newest (Time Sequence)
12
- // --grep: Filter by keyword
13
- // --format: Hash, Date (ISO), Author, Subject, Body
14
- const cmd = `git log --reverse --grep="Evolution" --format="%H${SEP}%ai${SEP}%an${SEP}%s${SEP}%b"`;
15
-
16
- console.log('Executing git log...');
17
- const output = execSync(cmd, {
18
- encoding: 'utf8',
19
- cwd: REPO_ROOT,
20
- maxBuffer: 1024 * 1024 * 10 // 10MB buffer just in case
21
- });
22
-
23
- const entries = output.split('\n').filter(line => line.trim().length > 0);
24
-
25
- let markdown = '# Evolution History (Time Sequence)\n\n';
26
- markdown += '> Filter: "Evolution"\n';
27
- markdown += '> Timezone: CST (UTC+8)\n\n';
28
-
29
- let count = 0;
30
-
31
- entries.forEach(entry => {
32
- const parts = entry.split(SEP);
33
- if (parts.length < 4) return;
34
-
35
- const hash = parts[0];
36
- const dateStr = parts[1];
37
- const author = parts[2];
38
- const subject = parts[3];
39
- const body = parts[4] || '';
40
-
41
- // Parse Date and Convert to UTC+8
42
- const date = new Date(dateStr);
43
- // Add 8 hours (28800000 ms) to UTC timestamp to shift it
44
- // Then formatting it as ISO will look like UTC but represent CST values
45
- const cstDate = new Date(date.getTime() + 8 * 60 * 60 * 1000);
46
-
47
- // Format: YYYY-MM-DD HH:mm:ss
48
- const timeStr = cstDate.toISOString().replace('T', ' ').substring(0, 19);
49
-
50
- markdown += `## ${timeStr}\n`;
51
- markdown += `- Commit: \`${hash.substring(0, 7)}\`\n`;
52
- markdown += `- Subject: ${subject}\n`;
53
-
54
- if (body.trim()) {
55
- // Indent body for better readability
56
- const formattedBody = body.trim().split('\n').map(l => `> ${l}`).join('\n');
57
- markdown += `- Details:\n${formattedBody}\n`;
58
- }
59
- markdown += '\n';
60
- count++;
61
- });
62
-
63
- const outDir = path.join(REPO_ROOT, 'memory');
64
- if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });
65
- const outPath = path.join(outDir, 'evolution_history.md');
66
- fs.writeFileSync(outPath, markdown);
67
-
68
- console.log(`Successfully generated report with ${count} entries.`);
69
- console.log(`Saved to: ${outPath}`);
70
-
71
- } catch (e) {
72
- console.error('Error generating history:', e.message);
73
- process.exit(1);
74
- }
75
-
@@ -1,96 +0,0 @@
1
- const fs = require('fs');
2
- const { appendEventJsonl } = require('../src/gep/assetStore');
3
-
4
- function readStdin() {
5
- try {
6
- return fs.readFileSync(0, 'utf8');
7
- } catch {
8
- return '';
9
- }
10
- }
11
-
12
- function readTextIfExists(p) {
13
- try {
14
- if (!p) return '';
15
- if (!fs.existsSync(p)) return '';
16
- return fs.readFileSync(p, 'utf8');
17
- } catch {
18
- return '';
19
- }
20
- }
21
-
22
- function parseInput(text) {
23
- const raw = String(text || '').trim();
24
- if (!raw) return [];
25
-
26
- // Accept JSON array or single JSON.
27
- try {
28
- const maybe = JSON.parse(raw);
29
- if (Array.isArray(maybe)) return maybe;
30
- if (maybe && typeof maybe === 'object') return [maybe];
31
- } catch (e) {}
32
-
33
- // Fallback: JSONL.
34
- const lines = raw.split('\n').map(l => l.trim()).filter(Boolean);
35
- const out = [];
36
- for (const line of lines) {
37
- try {
38
- const obj = JSON.parse(line);
39
- out.push(obj);
40
- } catch (e) {}
41
- }
42
- return out;
43
- }
44
-
45
- function isValidEvolutionEvent(ev) {
46
- if (!ev || ev.type !== 'EvolutionEvent') return false;
47
- if (!ev.id || typeof ev.id !== 'string') return false;
48
- // parent may be null or string
49
- if (!(ev.parent === null || typeof ev.parent === 'string')) return false;
50
- if (!ev.intent || typeof ev.intent !== 'string') return false;
51
- if (!Array.isArray(ev.signals)) return false;
52
- if (!Array.isArray(ev.genes_used)) return false;
53
- // GEP v1.4: mutation + personality are mandatory evolution dimensions
54
- if (!ev.mutation_id || typeof ev.mutation_id !== 'string') return false;
55
- if (!ev.personality_state || typeof ev.personality_state !== 'object') return false;
56
- if (ev.personality_state.type !== 'PersonalityState') return false;
57
- for (const k of ['rigor', 'creativity', 'verbosity', 'risk_tolerance', 'obedience']) {
58
- const v = Number(ev.personality_state[k]);
59
- if (!Number.isFinite(v) || v < 0 || v > 1) return false;
60
- }
61
- if (!ev.blast_radius || typeof ev.blast_radius !== 'object') return false;
62
- if (!Number.isFinite(Number(ev.blast_radius.files))) return false;
63
- if (!Number.isFinite(Number(ev.blast_radius.lines))) return false;
64
- if (!ev.outcome || typeof ev.outcome !== 'object') return false;
65
- if (!ev.outcome.status || typeof ev.outcome.status !== 'string') return false;
66
- const score = Number(ev.outcome.score);
67
- if (!Number.isFinite(score) || score < 0 || score > 1) return false;
68
-
69
- // capsule_id is optional, but if present must be string or null.
70
- if (!('capsule_id' in ev)) return true;
71
- return ev.capsule_id === null || typeof ev.capsule_id === 'string';
72
- }
73
-
74
- function main() {
75
- const args = process.argv.slice(2);
76
- const inputPath = args.find(a => a && !a.startsWith('--')) || '';
77
- const text = inputPath ? readTextIfExists(inputPath) : readStdin();
78
- const items = parseInput(text);
79
-
80
- let appended = 0;
81
- for (const it of items) {
82
- if (!isValidEvolutionEvent(it)) continue;
83
- appendEventJsonl(it);
84
- appended += 1;
85
- }
86
-
87
- process.stdout.write(`appended=${appended}\n`);
88
- }
89
-
90
- try {
91
- main();
92
- } catch (e) {
93
- process.stderr.write(`${e && e.message ? e.message : String(e)}\n`);
94
- process.exit(1);
95
- }
96
-
@@ -1,234 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const { getRepoRoot, getMemoryDir, getGepAssetsDir } = require('../src/gep/paths');
4
- const { normalizePersonalityState, personalityKey, defaultPersonalityState } = require('../src/gep/personality');
5
-
6
- function readJsonIfExists(p, fallback) {
7
- try {
8
- if (!fs.existsSync(p)) return fallback;
9
- const raw = fs.readFileSync(p, 'utf8');
10
- if (!raw.trim()) return fallback;
11
- return JSON.parse(raw);
12
- } catch {
13
- return fallback;
14
- }
15
- }
16
-
17
- function readJsonlIfExists(p, limitLines = 5000) {
18
- try {
19
- if (!fs.existsSync(p)) return [];
20
- const raw = fs.readFileSync(p, 'utf8');
21
- const lines = raw
22
- .split('\n')
23
- .map(l => l.trim())
24
- .filter(Boolean);
25
- const recent = lines.slice(Math.max(0, lines.length - limitLines));
26
- return recent
27
- .map(l => {
28
- try {
29
- return JSON.parse(l);
30
- } catch {
31
- return null;
32
- }
33
- })
34
- .filter(Boolean);
35
- } catch {
36
- return [];
37
- }
38
- }
39
-
40
- function clamp01(x) {
41
- const n = Number(x);
42
- if (!Number.isFinite(n)) return 0;
43
- return Math.max(0, Math.min(1, n));
44
- }
45
-
46
- function pct(x) {
47
- const n = Number(x);
48
- if (!Number.isFinite(n)) return '0.0%';
49
- return `${(n * 100).toFixed(1)}%`;
50
- }
51
-
52
- function pad(s, n) {
53
- const str = String(s == null ? '' : s);
54
- if (str.length >= n) return str.slice(0, n);
55
- return str + ' '.repeat(n - str.length);
56
- }
57
-
58
- function scoreFromCounts(success, fail, avgScore) {
59
- const succ = Number(success) || 0;
60
- const fl = Number(fail) || 0;
61
- const total = succ + fl;
62
- const p = (succ + 1) / (total + 2); // Laplace smoothing
63
- const sampleWeight = Math.min(1, total / 8);
64
- const q = avgScore == null ? 0.5 : clamp01(avgScore);
65
- return p * 0.75 + q * 0.25 * sampleWeight;
66
- }
67
-
68
- function aggregateFromEvents(events) {
69
- const map = new Map();
70
- for (const ev of Array.isArray(events) ? events : []) {
71
- if (!ev || ev.type !== 'EvolutionEvent') continue;
72
- const ps = ev.personality_state && typeof ev.personality_state === 'object' ? ev.personality_state : null;
73
- if (!ps) continue;
74
- const key = personalityKey(normalizePersonalityState(ps));
75
- const cur = map.get(key) || {
76
- key,
77
- success: 0,
78
- fail: 0,
79
- n: 0,
80
- avg_score: 0.5,
81
- last_event_id: null,
82
- last_at: null,
83
- mutation: { repair: 0, optimize: 0, innovate: 0 },
84
- mutation_success: { repair: 0, optimize: 0, innovate: 0 },
85
- };
86
- const st = ev.outcome && ev.outcome.status ? String(ev.outcome.status) : 'unknown';
87
- if (st === 'success') cur.success += 1;
88
- else if (st === 'failed') cur.fail += 1;
89
-
90
- const sc = ev.outcome && Number.isFinite(Number(ev.outcome.score)) ? clamp01(Number(ev.outcome.score)) : null;
91
- if (sc != null) {
92
- cur.n += 1;
93
- cur.avg_score = cur.avg_score + (sc - cur.avg_score) / cur.n;
94
- }
95
-
96
- const cat = ev.intent ? String(ev.intent) : null;
97
- if (cat && cur.mutation[cat] != null) {
98
- cur.mutation[cat] += 1;
99
- if (st === 'success') cur.mutation_success[cat] += 1;
100
- }
101
-
102
- cur.last_event_id = ev.id || cur.last_event_id;
103
- const at = ev.meta && ev.meta.at ? String(ev.meta.at) : null;
104
- cur.last_at = at || cur.last_at;
105
- map.set(key, cur);
106
- }
107
- return Array.from(map.values());
108
- }
109
-
110
- function main() {
111
- const repoRoot = getRepoRoot();
112
- const memoryDir = getMemoryDir();
113
- const assetsDir = getGepAssetsDir();
114
-
115
- const personalityPath = path.join(memoryDir, 'personality_state.json');
116
- const model = readJsonIfExists(personalityPath, null);
117
- const current = model && model.current ? normalizePersonalityState(model.current) : defaultPersonalityState();
118
- const currentKey = personalityKey(current);
119
-
120
- const eventsPath = path.join(assetsDir, 'events.jsonl');
121
- const events = readJsonlIfExists(eventsPath, 10000);
122
- const evs = events.filter(e => e && e.type === 'EvolutionEvent');
123
- const agg = aggregateFromEvents(evs);
124
-
125
- // Prefer model.stats if present, but still show event-derived aggregation (ground truth).
126
- const stats = model && model.stats && typeof model.stats === 'object' ? model.stats : {};
127
- const statRows = Object.entries(stats).map(([key, e]) => {
128
- const entry = e && typeof e === 'object' ? e : {};
129
- const success = Number(entry.success) || 0;
130
- const fail = Number(entry.fail) || 0;
131
- const total = success + fail;
132
- const avg = Number.isFinite(Number(entry.avg_score)) ? clamp01(Number(entry.avg_score)) : null;
133
- const score = scoreFromCounts(success, fail, avg);
134
- return { key, success, fail, total, avg_score: avg, score, updated_at: entry.updated_at || null, source: 'model' };
135
- });
136
-
137
- const evRows = agg.map(e => {
138
- const success = Number(e.success) || 0;
139
- const fail = Number(e.fail) || 0;
140
- const total = success + fail;
141
- const avg = Number.isFinite(Number(e.avg_score)) ? clamp01(Number(e.avg_score)) : null;
142
- const score = scoreFromCounts(success, fail, avg);
143
- return { key: e.key, success, fail, total, avg_score: avg, score, updated_at: e.last_at || null, source: 'events', _ev: e };
144
- });
145
-
146
- // Merge rows by key (events take precedence for total/success/fail; model provides updated_at if events missing).
147
- const byKey = new Map();
148
- for (const r of [...statRows, ...evRows]) {
149
- const prev = byKey.get(r.key);
150
- if (!prev) {
151
- byKey.set(r.key, r);
152
- continue;
153
- }
154
- // Prefer events for counts and avg_score
155
- if (r.source === 'events') byKey.set(r.key, { ...prev, ...r });
156
- else byKey.set(r.key, { ...r, ...prev });
157
- }
158
-
159
- const merged = Array.from(byKey.values()).sort((a, b) => b.score - a.score);
160
-
161
- process.stdout.write(`Repo: ${repoRoot}\n`);
162
- process.stdout.write(`MemoryDir: ${memoryDir}\n`);
163
- process.stdout.write(`AssetsDir: ${assetsDir}\n\n`);
164
-
165
- process.stdout.write(`[Current Personality]\n`);
166
- process.stdout.write(`${currentKey}\n`);
167
- process.stdout.write(`${JSON.stringify(current, null, 2)}\n\n`);
168
-
169
- process.stdout.write(`[Personality Stats] (ranked by score)\n`);
170
- if (merged.length === 0) {
171
- process.stdout.write('(no stats yet; run a few cycles and solidify)\n');
172
- return;
173
- }
174
-
175
- const header =
176
- pad('rank', 5) +
177
- pad('total', 8) +
178
- pad('succ', 8) +
179
- pad('fail', 8) +
180
- pad('succ_rate', 11) +
181
- pad('avg', 7) +
182
- pad('score', 8) +
183
- 'key';
184
- process.stdout.write(header + '\n');
185
- process.stdout.write('-'.repeat(Math.min(140, header.length + 40)) + '\n');
186
-
187
- const topN = Math.min(25, merged.length);
188
- for (let i = 0; i < topN; i++) {
189
- const r = merged[i];
190
- const succ = Number(r.success) || 0;
191
- const fail = Number(r.fail) || 0;
192
- const total = Number(r.total) || succ + fail;
193
- const succRate = total > 0 ? succ / total : 0;
194
- const avg = r.avg_score == null ? '-' : Number(r.avg_score).toFixed(2);
195
- const line =
196
- pad(String(i + 1), 5) +
197
- pad(String(total), 8) +
198
- pad(String(succ), 8) +
199
- pad(String(fail), 8) +
200
- pad(pct(succRate), 11) +
201
- pad(String(avg), 7) +
202
- pad(Number(r.score).toFixed(3), 8) +
203
- String(r.key);
204
- process.stdout.write(line + '\n');
205
-
206
- if (r._ev) {
207
- const ev = r._ev;
208
- const ms = ev.mutation || {};
209
- const mSucc = ev.mutation_success || {};
210
- const parts = [];
211
- for (const cat of ['repair', 'optimize', 'innovate']) {
212
- const n = Number(ms[cat]) || 0;
213
- if (n <= 0) continue;
214
- const s = Number(mSucc[cat]) || 0;
215
- parts.push(`${cat}:${s}/${n}`);
216
- }
217
- if (parts.length) process.stdout.write(` mutation_success: ${parts.join(' | ')}\n`);
218
- }
219
- }
220
-
221
- process.stdout.write('\n');
222
- process.stdout.write(`[Notes]\n`);
223
- process.stdout.write(`- score is a smoothed composite of success_rate + avg_score (sample-weighted)\n`);
224
- process.stdout.write(`- current_key appears in the ranking once enough data accumulates\n`);
225
- }
226
-
227
- try {
228
- main();
229
- } catch (e) {
230
- process.stderr.write((e && e.message) || String(e));
231
- process.stderr.write('\n');
232
- process.exit(1);
233
- }
234
-