@evomap/evolver 1.78.8 → 1.78.10

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.
@@ -1,2 +1 @@
1
- {"type":"CapabilityCandidate","id":"cand_b9a66a5c","title":"Harden session log detection and fallback behavior","source":"signals","created_at":"2026-05-04T02:31:43.197Z","signals":["memory_missing","user_missing","session_logs_missing"],"tags":["memory_missing","user_missing","session_logs_missing","area:memory"],"shape":{"title":"Harden session log detection and fallback behavior","input":"Recent session transcript + memory snippets + user instructions","output":"A safe, auditable evolution patch guided by GEP assets","invariants":"Protocol order, small reversible patches, validation, append-only events","params":"Signals: memory_missing, user_missing, session_logs_missing","failure_points":"Missing signals, over-broad changes, skipped validation, missing knowledge solidification","evidence":"Signal present: session_logs_missing"}}
2
- {"type":"CapabilityCandidate","id":"cand_b9a66a5c","title":"Harden session log detection and fallback behavior","source":"signals","created_at":"2026-05-04T02:32:12.505Z","signals":["memory_missing","user_missing","session_logs_missing"],"tags":["memory_missing","user_missing","session_logs_missing","area:memory"],"shape":{"title":"Harden session log detection and fallback behavior","input":"Recent session transcript + memory snippets + user instructions","output":"A safe, auditable evolution patch guided by GEP assets","invariants":"Protocol order, small reversible patches, validation, append-only events","params":"Signals: memory_missing, user_missing, session_logs_missing","failure_points":"Missing signals, over-broad changes, skipped validation, missing knowledge solidification","evidence":"Signal present: session_logs_missing"}}
1
+ {"type":"CapabilityCandidate","id":"cand_b9a66a5c","title":"Harden session log detection and fallback behavior","source":"signals","created_at":"2026-05-05T01:31:11.544Z","signals":["memory_missing","user_missing","session_logs_missing"],"tags":["memory_missing","user_missing","session_logs_missing","area:memory"],"shape":{"title":"Harden session log detection and fallback behavior","input":"Recent session transcript + memory snippets + user instructions","output":"A safe, auditable evolution patch guided by GEP assets","invariants":"Protocol order, small reversible patches, validation, append-only events","params":"Signals: memory_missing, user_missing, session_logs_missing","failure_points":"Missing signals, over-broad changes, skipped validation, missing knowledge solidification","evidence":"Signal present: session_logs_missing"}}
package/index.js CHANGED
@@ -1097,6 +1097,7 @@ async function main() {
1097
1097
  })();
1098
1098
  const dryRun = args.includes('--dry-run');
1099
1099
  const listUnpublished = !args.includes('--no-unpublished-list');
1100
+ const force = args.includes('--force');
1100
1101
  const limitPerPage = 100;
1101
1102
 
1102
1103
  const validScopes = new Set(['all', 'purchased', 'published']);
@@ -1173,11 +1174,25 @@ async function main() {
1173
1174
 
1174
1175
  const existingGenes = loadGenes();
1175
1176
  const existingCapsules = loadCapsules();
1177
+ // Dedup by Hub asset_id is the only safe key. Local-facing `id` (e.g.
1178
+ // `gene_gep_repair_from_errors`) collides between bundled default seed
1179
+ // genes and identically-named assets that the user later published, so
1180
+ // dedup-by-id silently skips legitimate Hub copies on first sync. Track
1181
+ // hub_asset_id (set by previous syncs / publishes) and only skip when
1182
+ // we've already seen the same Hub-side identity.
1183
+ const localHubAssetIds = new Set();
1184
+ for (const g of existingGenes) {
1185
+ if (g && g.hub_asset_id) localHubAssetIds.add(String(g.hub_asset_id));
1186
+ }
1187
+ for (const c of existingCapsules) {
1188
+ if (c && c.hub_asset_id) localHubAssetIds.add(String(c.hub_asset_id));
1189
+ }
1176
1190
  const localGeneIds = new Set(existingGenes.filter(function (g) { return g && g.id; }).map(function (g) { return g.id; }));
1177
1191
  const localCapsuleIds = new Set(existingCapsules.filter(function (c) { return c && c.id; }).map(function (c) { return c.id; }));
1178
1192
 
1179
1193
  let synced = 0;
1180
- let skipped = 0;
1194
+ let skippedAlreadySynced = 0;
1195
+ let skippedIdCollision = 0;
1181
1196
  let fetchErrors = 0;
1182
1197
 
1183
1198
  for (const asset of allAssets) {
@@ -1186,14 +1201,37 @@ async function main() {
1186
1201
  const localId = asset.local_id || assetId;
1187
1202
 
1188
1203
  if (assetType !== 'Gene' && assetType !== 'Capsule') {
1189
- skipped++;
1204
+ skippedAlreadySynced++;
1205
+ continue;
1206
+ }
1207
+
1208
+ // Already-synced check: same Hub asset_id is already in our local
1209
+ // store. Idempotent skip; safe to no-op even with --force because
1210
+ // re-fetching the same payload would only rewrite identical bytes.
1211
+ if (!force && localHubAssetIds.has(String(assetId))) {
1212
+ skippedAlreadySynced++;
1190
1213
  continue;
1191
1214
  }
1192
- if (assetType === 'Gene' && localGeneIds.has(localId)) { skipped++; continue; }
1193
- if (assetType === 'Capsule' && localCapsuleIds.has(localId)) { skipped++; continue; }
1215
+
1216
+ // Local-id collision: a local entry with the same user-facing id
1217
+ // already exists but has no hub_asset_id (e.g. bundled default seed
1218
+ // gene, or a hand-edited entry). Without --force we keep the
1219
+ // user-owned entry and warn so the user can decide.
1220
+ if (!force) {
1221
+ if (assetType === 'Gene' && localGeneIds.has(localId)) {
1222
+ if (isVerbose) console.warn(' [sync] Skipping ' + localId + ' (local id collision; pass --force to overwrite with Hub copy)');
1223
+ skippedIdCollision++;
1224
+ continue;
1225
+ }
1226
+ if (assetType === 'Capsule' && localCapsuleIds.has(localId)) {
1227
+ if (isVerbose) console.warn(' [sync] Skipping ' + localId + ' (local id collision; pass --force to overwrite with Hub copy)');
1228
+ skippedIdCollision++;
1229
+ continue;
1230
+ }
1231
+ }
1194
1232
 
1195
1233
  if (dryRun) {
1196
- console.log(' [dry-run] Would sync: ' + assetType + ' ' + assetId);
1234
+ console.log(' [dry-run] Would sync: ' + assetType + ' ' + assetId + (force ? ' (force)' : ''));
1197
1235
  synced++;
1198
1236
  continue;
1199
1237
  }
@@ -1230,6 +1268,7 @@ async function main() {
1230
1268
  };
1231
1269
  upsertGene(geneObj);
1232
1270
  localGeneIds.add(geneObj.id);
1271
+ localHubAssetIds.add(String(assetId));
1233
1272
  } else {
1234
1273
  const capsuleObj = {
1235
1274
  type: 'Capsule',
@@ -1244,6 +1283,7 @@ async function main() {
1244
1283
  };
1245
1284
  upsertCapsule(capsuleObj);
1246
1285
  localCapsuleIds.add(capsuleObj.id);
1286
+ localHubAssetIds.add(String(assetId));
1247
1287
  }
1248
1288
  synced++;
1249
1289
  } catch (fetchErr) {
@@ -1252,7 +1292,12 @@ async function main() {
1252
1292
  }
1253
1293
  }
1254
1294
 
1255
- console.log('[sync] Done. scope=' + scopeArg + ' synced=' + synced + ' skipped=' + skipped + ' errors=' + fetchErrors);
1295
+ const skippedTotal = skippedAlreadySynced + skippedIdCollision;
1296
+ console.log('[sync] Done. scope=' + scopeArg + ' synced=' + synced + ' skipped=' + skippedTotal + ' (already_synced=' + skippedAlreadySynced + ', id_collision=' + skippedIdCollision + ') errors=' + fetchErrors);
1297
+ if (skippedIdCollision > 0 && !force) {
1298
+ console.log('[sync] ' + skippedIdCollision + ' Hub asset(s) share a local id with an existing local entry that has no hub_asset_id.');
1299
+ console.log('[sync] Re-run with --force to overwrite those local entries with the Hub copies.');
1300
+ }
1256
1301
  if (dryRun) console.log('[sync] (dry-run mode: no files were modified)');
1257
1302
 
1258
1303
  if (listUnpublished && doPublished) {
@@ -1467,6 +1512,7 @@ async function main() {
1467
1512
  - --status=draft,promoted,all (only for published scope; default promoted+draft)
1468
1513
  - --export=<path.gepx> (also bundle local assets into a .gepx archive)
1469
1514
  - --no-unpublished-list (suppress local-only asset list)
1515
+ - --force (overwrite local entries that share an id with a Hub asset; bypasses default-seed dedup)
1470
1516
  - --dry-run (preview without writing to local store)
1471
1517
  - solidify flags:
1472
1518
  - --dry-run
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evomap/evolver",
3
- "version": "1.78.8",
3
+ "version": "1.78.10",
4
4
  "description": "A GEP-powered self-evolution engine for AI agents. Features automated log analysis and Genome Evolution Protocol (GEP) for auditable, reusable evolution assets.",
5
5
  "main": "index.js",
6
6
  "bin": {