loki-mode 7.111.0 → 7.113.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.
package/mcp/__init__.py CHANGED
@@ -57,4 +57,4 @@ try:
57
57
  except ImportError:
58
58
  __all__ = ['mcp']
59
59
 
60
- __version__ = '7.111.0'
60
+ __version__ = '7.113.0'
@@ -1360,6 +1360,33 @@ class MemoryRetrieval:
1360
1360
  optimized = optimize_context(full_details, budget_remaining)
1361
1361
  selected_memories.extend(optimized)
1362
1362
 
1363
+ # Cross-layer dedup by id. A Layer-2 summary and a Layer-3 full record
1364
+ # can carry the SAME memory id (the summary is built from the same
1365
+ # episode/pattern/skill that retrieve_task_aware later surfaces), so
1366
+ # without this pass the same id appears twice. Every other merge path
1367
+ # dedups by id (see _merge_results seen_ids); this one must too. Prefer
1368
+ # the fuller record when both exist: keep the highest _layer for an id
1369
+ # (Layer 3 full > Layer 2 summary > Layer 1 topic). Records without an
1370
+ # id are never collapsed (each keeps its own slot), mirroring
1371
+ # _merge_results. Insertion order of first-seen ids is preserved.
1372
+ deduped: List[Dict[str, Any]] = []
1373
+ best_index_for_id: Dict[Any, int] = {}
1374
+ for item in selected_memories:
1375
+ item_id = item.get("id")
1376
+ if item_id is None:
1377
+ deduped.append(item)
1378
+ continue
1379
+ if item_id in best_index_for_id:
1380
+ existing = deduped[best_index_for_id[item_id]]
1381
+ # Higher layer = fuller record; replace the summary in place so
1382
+ # the first-seen slot keeps the richest entry for this id.
1383
+ if item.get("_layer", 0) > existing.get("_layer", 0):
1384
+ deduped[best_index_for_id[item_id]] = item
1385
+ continue
1386
+ best_index_for_id[item_id] = len(deduped)
1387
+ deduped.append(item)
1388
+ selected_memories = deduped
1389
+
1363
1390
  # Calculate final metrics
1364
1391
  total_available = self._estimate_total_available_tokens()
1365
1392
  metrics = get_context_efficiency(selected_memories, token_budget, total_available)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "7.111.0",
4
+ "version": "7.113.0",
5
5
  "description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider).",
6
6
  "keywords": [
7
7
  "agent",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "7.111.0",
5
+ "version": "7.113.0",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",