omp-fabric 1.16.0 → 1.18.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 (41) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/chunks/{chunk-3U5ZVAIX.js → chunk-7OAFYAJC.js} +2 -2
  3. package/dist/chunks/{chunk-N2MMGFMD.js → chunk-C5JMLDIM.js} +2 -2
  4. package/dist/chunks/{chunk-XJMS4223.js → chunk-I3XEFTXH.js} +9 -11
  5. package/dist/chunks/chunk-I3XEFTXH.js.map +7 -0
  6. package/dist/chunks/{chunk-BSUEBCAM.js → chunk-QZJB7QTM.js} +2 -2
  7. package/dist/chunks/{chunk-BSUEBCAM.js.map → chunk-QZJB7QTM.js.map} +2 -2
  8. package/dist/chunks/{chunk-3NWBU3K7.js → chunk-VYB7ROEH.js} +2 -2
  9. package/dist/chunks/{chunk-D2ET33NE.js → chunk-WMB6QCWX.js} +2 -5
  10. package/dist/chunks/{chunk-D2ET33NE.js.map → chunk-WMB6QCWX.js.map} +2 -2
  11. package/dist/chunks/{chunk-ARRZTY7E.js → chunk-Z7N4PVTM.js} +2 -2
  12. package/dist/compaction/hook.d.ts +0 -2
  13. package/dist/compaction/hook.d.ts.map +1 -1
  14. package/dist/compaction/hook.js +1 -1
  15. package/dist/compaction/lcm-maintenance.d.ts +7 -7
  16. package/dist/compaction/lcm-maintenance.d.ts.map +1 -1
  17. package/dist/compaction/lcm-runtime.d.ts +4 -7
  18. package/dist/compaction/lcm-runtime.d.ts.map +1 -1
  19. package/dist/compaction/lcm-runtime.js +60 -58
  20. package/dist/compaction/lcm-runtime.js.map +2 -2
  21. package/dist/fabric-runtime-state.d.ts +0 -1
  22. package/dist/fabric-runtime-state.d.ts.map +1 -1
  23. package/dist/fabric-runtime-state.js +5 -5
  24. package/dist/fabric-runtime-state.js.map +2 -2
  25. package/dist/index.js +3 -3
  26. package/dist/memory/lcm-adapter.d.ts +0 -3
  27. package/dist/memory/lcm-adapter.d.ts.map +1 -1
  28. package/dist/providers/memory-provider.js +1 -1
  29. package/dist/residency/host.js +4 -4
  30. package/dist/residency/omp-entry.js +4 -4
  31. package/dist/storage/lcm-ledger.d.ts +1 -0
  32. package/dist/storage/lcm-ledger.d.ts.map +1 -1
  33. package/dist/ui/lcm-dashboard.js +1 -1
  34. package/dist/ui/lcm-panel.js +1 -1
  35. package/docs/compaction.md +10 -0
  36. package/package.json +1 -1
  37. package/dist/chunks/chunk-XJMS4223.js.map +0 -7
  38. /package/dist/chunks/{chunk-3U5ZVAIX.js.map → chunk-7OAFYAJC.js.map} +0 -0
  39. /package/dist/chunks/{chunk-N2MMGFMD.js.map → chunk-C5JMLDIM.js.map} +0 -0
  40. /package/dist/chunks/{chunk-3NWBU3K7.js.map → chunk-VYB7ROEH.js.map} +0 -0
  41. /package/dist/chunks/{chunk-ARRZTY7E.js.map → chunk-Z7N4PVTM.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.18.0
4
+
5
+ ### Fixed
6
+
7
+ - A forked session no longer starts with an empty frontier. LCM identified a source by `sessionId:entryId:revision`, and a fork mints a new session id while keeping the entries it inherited, so every summary the parent built fell out of the fork on its first readback. A source is now identified by its entry id and payload hash, and the live source set decides membership instead of the session id. Measured on a production ledger, a 400-entry branch that covered 160 sources keeps all 160 after the fork; it covered 0 before.
8
+ - `memory.recall` and `memory.expand` accept an inherited summary and its raw sources. The active-branch binding resolved by session id, so a fork was served summaries whose addresses it then refused to open.
9
+ - A summary the parent left pending no longer suppresses the fork's own leaf over the same entries, which previously dropped up to one leaf window from coverage until the parent session was resumed.
10
+
11
+ ### Changed
12
+
13
+ - `LcmLedger.readRawKeys` returns `contentHash` alongside each key so the coverage map builds the same identity the frontier uses.
14
+
15
+ ## 1.17.0
16
+
17
+ ### Fixed
18
+
19
+ - Summaries stopped leaving the frontier one message after they were built. LCM stamped each stored entry with the host's leaf id, which is the id of the newest entry, and then filtered the frontier on it, so a node matched only until the next message arrived. The label is gone from the model: `LcmNode` no longer carries it, leaf and condensed identity no longer hash it, and the four selectors no longer filter on it. A production ledger of 5,400 entries held 106 of 133 nodes behind 36 dead leaf values and served 2 of 400 sources; the same branch now serves 160 of 400. Existing ledgers keep the labels in a column nothing reads, so nothing migrates.
20
+ - Branch isolation now rests where it was already exact: a summary is served only when every source it covers is on the live branch. `selectLeaf` applies that same predicate when it decides which entries are already summarised, so an entry covered only by a node the live branch cannot serve is summarised again instead of being skipped forever.
21
+ - `getFrontier` drops a node whose sources another selected node fully contains, so a rewind that remints a covered prefix can no longer put the same range into a compacted prompt twice.
22
+
23
+ ### Changed
24
+
25
+ - `branch` was removed from `LcmCompactionInput`, `LcmCompactionOutput`, `LcmSummaryNode`, `LcmDashboardNode` and the memory branch binding. `createLeaf` and `createCondensed` now require their arguments rather than defaulting to an unscoped selection.
26
+
3
27
  ## 1.16.0
4
28
 
5
29
  ### Added
@@ -10,7 +10,7 @@ import {
10
10
  lifecycleSourceIdentity,
11
11
  loadModelUsage,
12
12
  useBudgetLedger
13
- } from "./chunk-3NWBU3K7.js";
13
+ } from "./chunk-VYB7ROEH.js";
14
14
  import {
15
15
  normalizeModelAliases,
16
16
  resolveAvailableOmpModel
@@ -685,4 +685,4 @@ if (isMain) {
685
685
  export {
686
686
  runResidentHostFromConfigPath
687
687
  };
688
- //# sourceMappingURL=chunk-3U5ZVAIX.js.map
688
+ //# sourceMappingURL=chunk-7OAFYAJC.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-NX2G7BRO.js";
7
7
  import {
8
8
  rawContextTokens
9
- } from "./chunk-D2ET33NE.js";
9
+ } from "./chunk-WMB6QCWX.js";
10
10
  import {
11
11
  compactionRequestBoundsError,
12
12
  encodeCompactionRequest
@@ -463,4 +463,4 @@ export {
463
463
  buildPeerCards,
464
464
  awaitPeerSettle
465
465
  };
466
- //# sourceMappingURL=chunk-N2MMGFMD.js.map
466
+ //# sourceMappingURL=chunk-C5JMLDIM.js.map
@@ -275,7 +275,7 @@ var excerpt = (text, max = 480) => ({
275
275
  truncated: text.length > max
276
276
  });
277
277
  var isLowSurrogate = (code) => code >= 56320 && code <= 57343;
278
- var sourceKey = (sessionId, entryId, revision) => `${sessionId}:${entryId}:${revision}`;
278
+ var sourceKey = (entryId, contentHash) => `${entryId}:${contentHash}`;
279
279
  var activeBinding = (options, sessionId) => options.branchForSession?.(sessionId);
280
280
  var activeSourceSet = (binding) => binding?.activeSourceKeys === void 0 ? void 0 : new Set(binding.activeSourceKeys);
281
281
  var sessionScope = (args, currentSessionId) => {
@@ -437,7 +437,7 @@ var LcmMemoryAdapter = class {
437
437
  if (page.rows.length === 0) break;
438
438
  for (const entry of page.rows) {
439
439
  consumed += 1;
440
- const allowed = activeAllowed(branches, activeBinding(this.options, entry.sessionId), sourceKey(entry.sessionId, entry.entryId, entry.revision));
440
+ const allowed = activeAllowed(branches, activeBinding(this.options, entry.sessionId), sourceKey(entry.entryId, entry.contentHash));
441
441
  if (!allowed.allowed) {
442
442
  if (allowed.reason) reasons.add(allowed.reason);
443
443
  continue;
@@ -477,8 +477,7 @@ var LcmMemoryAdapter = class {
477
477
  };
478
478
  }
479
479
  summaryHits(selectedSession, branches, predicate, reasons) {
480
- const summaryBranch = branches === "active" && selectedSession !== void 0 ? activeBinding(this.options, selectedSession)?.branch : void 0;
481
- const nodes = selectedSession === void 0 ? this.options.summaries.listNodes({ limit: this.maxSummary + 1 }) : this.options.summaries.listNodes({ sessionId: selectedSession, limit: this.maxSummary + 1, ...summaryBranch === void 0 ? {} : { branch: summaryBranch } });
480
+ const nodes = selectedSession === void 0 ? this.options.summaries.listNodes({ limit: this.maxSummary + 1 }) : this.options.summaries.listNodes({ sessionId: selectedSession, limit: this.maxSummary + 1 });
482
481
  if (nodes.length > this.maxSummary) reasons.add("summary_node_limit");
483
482
  const hits = [];
484
483
  for (const node of nodes.slice(0, this.maxSummary)) {
@@ -497,7 +496,7 @@ var LcmMemoryAdapter = class {
497
496
  continue;
498
497
  }
499
498
  const active = activeSourceSet(binding);
500
- if (active && node.sources.some((source) => !active.has(sourceKey(node.sessionId, source.entryId, source.revision)))) {
499
+ if (active && node.sources.some((source) => !active.has(sourceKey(source.entryId, source.contentHash)))) {
501
500
  reasons.add("summary_off_active_branch");
502
501
  continue;
503
502
  }
@@ -544,7 +543,7 @@ var LcmMemoryAdapter = class {
544
543
  const active = activeSourceSet(binding);
545
544
  if (branches === "active") {
546
545
  if (!binding || !binding.ready) return { entries: [], next: null, error: { code: "incomplete_coverage", message: "summary lineage is not ready" } };
547
- if (active && node.sources.some((source) => !active.has(sourceKey(node.sessionId, source.entryId, source.revision)))) {
546
+ if (active && node.sources.some((source) => !active.has(sourceKey(source.entryId, source.contentHash)))) {
548
547
  return { entries: [], next: null, error: { code: "stale_pointer", message: "summary is outside the active branch" } };
549
548
  }
550
549
  }
@@ -638,7 +637,6 @@ var LcmMemoryAdapter = class {
638
637
  node: {
639
638
  nodeId: node.nodeId,
640
639
  sessionId: node.sessionId,
641
- branch: node.branch,
642
640
  kind: node.kind ?? (node.sources.length > 0 ? "leaf" : "condensed"),
643
641
  state: node.state,
644
642
  text: node.text,
@@ -667,7 +665,7 @@ var LcmMemoryAdapter = class {
667
665
  const reachable = [];
668
666
  let unavailable = 0;
669
667
  for (const source of node.sources) {
670
- const key = sourceKey(node.sessionId, source.entryId, source.revision);
668
+ const key = sourceKey(source.entryId, source.contentHash);
671
669
  if (branches === "active" && active && !active.has(key)) {
672
670
  unavailable += 1;
673
671
  continue;
@@ -716,7 +714,7 @@ var LcmMemoryAdapter = class {
716
714
  }
717
715
  if (branches === "active") {
718
716
  const active = activeSourceSet(activeBinding(this.options, child.sessionId));
719
- if (active && child.sources.some((source) => !active.has(sourceKey(child.sessionId, source.entryId, source.revision)))) {
717
+ if (active && child.sources.some((source) => !active.has(sourceKey(source.entryId, source.contentHash)))) {
720
718
  unavailable += 1;
721
719
  continue;
722
720
  }
@@ -745,7 +743,7 @@ var LcmMemoryAdapter = class {
745
743
  const entry = this.options.ledger.readRawEntry(sessionId, entryId, revision);
746
744
  if (!entry) return { entries: [], next: null, error: { code: "stale_pointer", message: "raw source is unavailable" } };
747
745
  const binding = activeBinding(this.options, sessionId);
748
- const allowed = activeAllowed(branches, binding, sourceKey(sessionId, entryId, revision));
746
+ const allowed = activeAllowed(branches, binding, sourceKey(entryId, entry.contentHash));
749
747
  if (!allowed.allowed) return { entries: [], next: null, error: { code: allowed.reason === "source_off_active_branch" ? "stale_pointer" : "incomplete_coverage", message: allowed.reason ?? "raw lineage is unavailable" } };
750
748
  const payload = JSON.parse(entry.payloadJson);
751
749
  const sourceHash = hashLcmPayload(payload);
@@ -2472,4 +2470,4 @@ export {
2472
2470
  normalizeMemoryArgs,
2473
2471
  MemoryProvider
2474
2472
  };
2475
- //# sourceMappingURL=chunk-XJMS4223.js.map
2473
+ //# sourceMappingURL=chunk-I3XEFTXH.js.map