@remnic/core 9.68.0 → 9.69.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 (220) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +19 -19
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +20 -20
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +19 -19
  7. package/dist/access-cli.js +65 -65
  8. package/dist/access-extraction-force-flush.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.js +19 -19
  10. package/dist/access-http-lcm-compaction.d.ts +1 -1
  11. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  12. package/dist/access-http-offline-stream.d.ts +1 -1
  13. package/dist/access-http-query.js +21 -21
  14. package/dist/access-http.d.ts +2 -2
  15. package/dist/access-http.js +33 -33
  16. package/dist/access-identity-continuity-surface.js +19 -19
  17. package/dist/access-lcm-surface.d.ts +1 -1
  18. package/dist/access-lcm-surface.js +19 -19
  19. package/dist/access-mcp.d.ts +1 -1
  20. package/dist/access-mcp.js +26 -26
  21. package/dist/access-namespace-preflight.js +19 -19
  22. package/dist/access-observe-write-surface.d.ts +1 -1
  23. package/dist/access-observe-write-surface.js +19 -19
  24. package/dist/access-operations-batch.js +20 -20
  25. package/dist/access-operations.d.ts +7 -7
  26. package/dist/access-operations.js +25 -25
  27. package/dist/access-recall-concurrency.d.ts +1 -1
  28. package/dist/access-recall-concurrency.js +19 -19
  29. package/dist/access-recall-response.d.ts +1 -1
  30. package/dist/access-recall-response.js +19 -19
  31. package/dist/access-recall-surface.d.ts +1 -1
  32. package/dist/access-recall-surface.js +19 -19
  33. package/dist/access-schema.d.ts +89 -89
  34. package/dist/access-service-helpers.d.ts +1 -1
  35. package/dist/access-service.d.ts +1 -1
  36. package/dist/access-service.js +19 -19
  37. package/dist/access-surface-catalog.d.ts +1 -1
  38. package/dist/access-surface-catalog.js +21 -21
  39. package/dist/briefing.js +10 -10
  40. package/dist/causal-consolidation.js +11 -11
  41. package/dist/{chunk-KAY2C6VX.js → chunk-2D7S3FZW.js} +2 -2
  42. package/dist/{chunk-WFFGUFFN.js → chunk-2FEBD4LN.js} +148 -41
  43. package/dist/chunk-2FEBD4LN.js.map +1 -0
  44. package/dist/{chunk-HDQQRRCZ.js → chunk-5DSPAWXQ.js} +3 -3
  45. package/dist/{chunk-VLSUKXCJ.js → chunk-5JUSOMNO.js} +3 -3
  46. package/dist/{chunk-P342D5BP.js → chunk-626ILV6J.js} +2 -2
  47. package/dist/{chunk-I6T4SYFW.js → chunk-63Z7D2YJ.js} +3 -3
  48. package/dist/{chunk-XW3G4BJI.js → chunk-6DPAZEGK.js} +7 -7
  49. package/dist/{chunk-XPDWNWH6.js → chunk-6LIILOP3.js} +3 -3
  50. package/dist/{chunk-3IRH5MYM.js → chunk-6OX6SNRC.js} +5 -5
  51. package/dist/{chunk-FOT5GP2U.js → chunk-73CA45TG.js} +2 -2
  52. package/dist/{chunk-2MHMHF76.js → chunk-7GFLU63V.js} +2 -2
  53. package/dist/{chunk-A7NMS5II.js → chunk-7HAZ6GZE.js} +3 -3
  54. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  55. package/dist/{chunk-7KG5V4VV.js → chunk-BZFHCRO6.js} +2 -2
  56. package/dist/{chunk-4PEZMGZD.js → chunk-CUQI6DR3.js} +2 -2
  57. package/dist/{chunk-NFITGYMQ.js → chunk-CX6J53S5.js} +3 -3
  58. package/dist/{chunk-DJ7TZLGU.js → chunk-DHXPZZ5U.js} +2 -2
  59. package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
  60. package/dist/{chunk-ABPCF4MW.js → chunk-HB3GEHGF.js} +1 -1
  61. package/dist/{chunk-6FUMA6AA.js → chunk-JFPUQ3E2.js} +2 -2
  62. package/dist/{chunk-BTRY6UH3.js → chunk-JMMG5K7H.js} +2 -2
  63. package/dist/{chunk-ZDJMCXC7.js → chunk-JRLDQ6WS.js} +12 -12
  64. package/dist/{chunk-BGD3T743.js → chunk-JRYINMLF.js} +2 -2
  65. package/dist/{chunk-F25CL3IQ.js → chunk-KSTLZCR5.js} +2 -2
  66. package/dist/{chunk-363VZTVH.js → chunk-L5QVIATR.js} +2 -2
  67. package/dist/{chunk-BS5BD3DF.js → chunk-LFGSIMFS.js} +2 -2
  68. package/dist/{chunk-YYAWJRGL.js → chunk-MYMME2VL.js} +2 -2
  69. package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
  70. package/dist/{chunk-Z2FXSE5P.js → chunk-NFZUZL44.js} +2 -2
  71. package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
  72. package/dist/{chunk-L7MJJAG2.js → chunk-NRDLOFAI.js} +2 -2
  73. package/dist/{chunk-PIBQIYF2.js → chunk-NX2ECBRG.js} +2 -2
  74. package/dist/{chunk-QOE3EM5Z.js → chunk-PVN6DVWU.js} +8 -8
  75. package/dist/{chunk-327JMA2N.js → chunk-PZY4DLLO.js} +2 -2
  76. package/dist/{chunk-ZVW724ZK.js → chunk-Q4OITLPA.js} +2 -2
  77. package/dist/{chunk-ND6NL2YR.js → chunk-QBZMUF54.js} +2 -2
  78. package/dist/{chunk-25P3LW6U.js → chunk-QLT74C2M.js} +2 -2
  79. package/dist/{chunk-KJUH3QIQ.js → chunk-TITZPONM.js} +2 -2
  80. package/dist/{chunk-YFK64FYK.js → chunk-TPIO36PJ.js} +2 -2
  81. package/dist/{chunk-5UI7WQA6.js → chunk-TX55UTJT.js} +2 -2
  82. package/dist/{chunk-D35XLYQ7.js → chunk-UF65P4GF.js} +6 -6
  83. package/dist/{chunk-BHH736UQ.js → chunk-UJYNT3R2.js} +3 -3
  84. package/dist/{chunk-4PMPOZK3.js → chunk-V5I36Y2F.js} +2 -2
  85. package/dist/{chunk-WQCET3N3.js → chunk-VK7YWP5Q.js} +2 -2
  86. package/dist/{chunk-USQAH6PN.js → chunk-VPYAQYD5.js} +2 -2
  87. package/dist/{chunk-KRNFJKMH.js → chunk-VTEO5T6Z.js} +2 -2
  88. package/dist/{chunk-WSYACIKD.js → chunk-W6PZQY4L.js} +2 -2
  89. package/dist/{chunk-52GQNSLC.js → chunk-WM2N5DRB.js} +7 -7
  90. package/dist/{chunk-ERKFG4RV.js → chunk-XRT7ZG5B.js} +33 -33
  91. package/dist/{chunk-NYQHD7H4.js → chunk-YTWEK6CU.js} +17 -17
  92. package/dist/{cli-Bvy4jdBu.d.ts → cli-DDHGtWI1.d.ts} +1 -1
  93. package/dist/cli.d.ts +2 -2
  94. package/dist/cli.js +48 -48
  95. package/dist/coding/export-okf-codegraph.js +10 -10
  96. package/dist/compounding/engine.js +10 -10
  97. package/dist/connectors/codex-materialize-runner.js +10 -10
  98. package/dist/connectors/index.js +10 -10
  99. package/dist/convergence-refresh.js +12 -12
  100. package/dist/corpus-watermark.js +12 -12
  101. package/dist/entity-retrieval.js +10 -10
  102. package/dist/external-wiki-access.d.ts +1 -1
  103. package/dist/external-wiki-access.js +20 -20
  104. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  105. package/dist/extraction.js +10 -10
  106. package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-UG32BSG2.js} +4 -4
  107. package/dist/harmonic-retrieval.js +1 -1
  108. package/dist/index.d.ts +732 -679
  109. package/dist/index.js +82 -72
  110. package/dist/lcm/engine.js +2 -2
  111. package/dist/lcm/index.js +7 -7
  112. package/dist/location/index.js +12 -12
  113. package/dist/maintenance/memory-governance.js +10 -10
  114. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  115. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  116. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  117. package/dist/memory-subject-cli.d.ts +1 -1
  118. package/dist/memory-subject.d.ts +1 -1
  119. package/dist/namespaces/migrate.js +11 -11
  120. package/dist/namespaces/search.js +7 -7
  121. package/dist/namespaces/storage.js +10 -10
  122. package/dist/operator-doctor-corpus.js +13 -13
  123. package/dist/operator-toolkit.js +18 -18
  124. package/dist/orchestration/maintenance.js +18 -18
  125. package/dist/orchestrator.js +65 -65
  126. package/dist/{public-http-2MyshWxl.d.ts → public-http-Bab7S0ED.d.ts} +1 -1
  127. package/dist/recall-navigate-disclosure.d.ts +44 -0
  128. package/dist/recall-navigate-disclosure.js +30 -0
  129. package/dist/recall-navigate-disclosure.js.map +1 -0
  130. package/dist/recall-state-view-packet.d.ts +30 -0
  131. package/dist/recall-state-view-packet.js +69 -0
  132. package/dist/recall-state-view-packet.js.map +1 -0
  133. package/dist/schemas.d.ts +152 -152
  134. package/dist/search/factory.js +6 -6
  135. package/dist/search/index.js +10 -10
  136. package/dist/search/lancedb-backend.js +2 -2
  137. package/dist/search/meilisearch-backend.js +2 -2
  138. package/dist/search/orama-backend.js +2 -2
  139. package/dist/semantic-consolidation.js +11 -11
  140. package/dist/semantic-rule-promotion.js +10 -10
  141. package/dist/semantic-rule-verifier.js +10 -10
  142. package/dist/shared-context/manager.d.ts +6 -6
  143. package/dist/source-agent-qualifier.js +10 -10
  144. package/dist/standup/build.js +10 -10
  145. package/dist/storage.js +9 -9
  146. package/dist/support-passport/index.d.ts +4 -4
  147. package/dist/support-passport/index.js +22 -22
  148. package/dist/transfer/export-okf.js +11 -11
  149. package/dist/transfer/types.d.ts +78 -78
  150. package/dist/verified-recall.js +10 -10
  151. package/dist/who-knows-cli.d.ts +1 -1
  152. package/dist/who-knows-cli.js +11 -11
  153. package/dist/who-knows.d.ts +1 -1
  154. package/dist/who-knows.js +10 -10
  155. package/package.json +2 -2
  156. package/src/activity/index.ts +1 -0
  157. package/src/activity/timeline/index.ts +1 -0
  158. package/src/activity/timeline/week-recurring.test.ts +177 -0
  159. package/src/activity/timeline/week-recurring.ts +88 -0
  160. package/src/activity/vault-status.test.ts +138 -0
  161. package/src/activity/vault-status.ts +96 -0
  162. package/src/dedup/index.ts +7 -0
  163. package/src/dedup/merge-provenance.test.ts +185 -0
  164. package/src/dedup/merge-provenance.ts +151 -0
  165. package/src/recall-navigate-disclosure.test.ts +128 -0
  166. package/src/recall-navigate-disclosure.ts +45 -0
  167. package/src/recall-state-view-packet.test.ts +158 -0
  168. package/src/recall-state-view-packet.ts +128 -0
  169. package/dist/chunk-WFFGUFFN.js.map +0 -1
  170. package/dist/{access-service-LbwWl05g.d.ts → access-service-CRZHXClX.d.ts} +58 -58
  171. /package/dist/{chunk-KAY2C6VX.js.map → chunk-2D7S3FZW.js.map} +0 -0
  172. /package/dist/{chunk-HDQQRRCZ.js.map → chunk-5DSPAWXQ.js.map} +0 -0
  173. /package/dist/{chunk-VLSUKXCJ.js.map → chunk-5JUSOMNO.js.map} +0 -0
  174. /package/dist/{chunk-P342D5BP.js.map → chunk-626ILV6J.js.map} +0 -0
  175. /package/dist/{chunk-I6T4SYFW.js.map → chunk-63Z7D2YJ.js.map} +0 -0
  176. /package/dist/{chunk-XW3G4BJI.js.map → chunk-6DPAZEGK.js.map} +0 -0
  177. /package/dist/{chunk-XPDWNWH6.js.map → chunk-6LIILOP3.js.map} +0 -0
  178. /package/dist/{chunk-3IRH5MYM.js.map → chunk-6OX6SNRC.js.map} +0 -0
  179. /package/dist/{chunk-FOT5GP2U.js.map → chunk-73CA45TG.js.map} +0 -0
  180. /package/dist/{chunk-2MHMHF76.js.map → chunk-7GFLU63V.js.map} +0 -0
  181. /package/dist/{chunk-A7NMS5II.js.map → chunk-7HAZ6GZE.js.map} +0 -0
  182. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  183. /package/dist/{chunk-7KG5V4VV.js.map → chunk-BZFHCRO6.js.map} +0 -0
  184. /package/dist/{chunk-4PEZMGZD.js.map → chunk-CUQI6DR3.js.map} +0 -0
  185. /package/dist/{chunk-NFITGYMQ.js.map → chunk-CX6J53S5.js.map} +0 -0
  186. /package/dist/{chunk-DJ7TZLGU.js.map → chunk-DHXPZZ5U.js.map} +0 -0
  187. /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
  188. /package/dist/{chunk-ABPCF4MW.js.map → chunk-HB3GEHGF.js.map} +0 -0
  189. /package/dist/{chunk-6FUMA6AA.js.map → chunk-JFPUQ3E2.js.map} +0 -0
  190. /package/dist/{chunk-BTRY6UH3.js.map → chunk-JMMG5K7H.js.map} +0 -0
  191. /package/dist/{chunk-ZDJMCXC7.js.map → chunk-JRLDQ6WS.js.map} +0 -0
  192. /package/dist/{chunk-BGD3T743.js.map → chunk-JRYINMLF.js.map} +0 -0
  193. /package/dist/{chunk-F25CL3IQ.js.map → chunk-KSTLZCR5.js.map} +0 -0
  194. /package/dist/{chunk-363VZTVH.js.map → chunk-L5QVIATR.js.map} +0 -0
  195. /package/dist/{chunk-BS5BD3DF.js.map → chunk-LFGSIMFS.js.map} +0 -0
  196. /package/dist/{chunk-YYAWJRGL.js.map → chunk-MYMME2VL.js.map} +0 -0
  197. /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
  198. /package/dist/{chunk-Z2FXSE5P.js.map → chunk-NFZUZL44.js.map} +0 -0
  199. /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
  200. /package/dist/{chunk-L7MJJAG2.js.map → chunk-NRDLOFAI.js.map} +0 -0
  201. /package/dist/{chunk-PIBQIYF2.js.map → chunk-NX2ECBRG.js.map} +0 -0
  202. /package/dist/{chunk-QOE3EM5Z.js.map → chunk-PVN6DVWU.js.map} +0 -0
  203. /package/dist/{chunk-327JMA2N.js.map → chunk-PZY4DLLO.js.map} +0 -0
  204. /package/dist/{chunk-ZVW724ZK.js.map → chunk-Q4OITLPA.js.map} +0 -0
  205. /package/dist/{chunk-ND6NL2YR.js.map → chunk-QBZMUF54.js.map} +0 -0
  206. /package/dist/{chunk-25P3LW6U.js.map → chunk-QLT74C2M.js.map} +0 -0
  207. /package/dist/{chunk-KJUH3QIQ.js.map → chunk-TITZPONM.js.map} +0 -0
  208. /package/dist/{chunk-YFK64FYK.js.map → chunk-TPIO36PJ.js.map} +0 -0
  209. /package/dist/{chunk-5UI7WQA6.js.map → chunk-TX55UTJT.js.map} +0 -0
  210. /package/dist/{chunk-D35XLYQ7.js.map → chunk-UF65P4GF.js.map} +0 -0
  211. /package/dist/{chunk-BHH736UQ.js.map → chunk-UJYNT3R2.js.map} +0 -0
  212. /package/dist/{chunk-4PMPOZK3.js.map → chunk-V5I36Y2F.js.map} +0 -0
  213. /package/dist/{chunk-WQCET3N3.js.map → chunk-VK7YWP5Q.js.map} +0 -0
  214. /package/dist/{chunk-USQAH6PN.js.map → chunk-VPYAQYD5.js.map} +0 -0
  215. /package/dist/{chunk-KRNFJKMH.js.map → chunk-VTEO5T6Z.js.map} +0 -0
  216. /package/dist/{chunk-WSYACIKD.js.map → chunk-W6PZQY4L.js.map} +0 -0
  217. /package/dist/{chunk-52GQNSLC.js.map → chunk-WM2N5DRB.js.map} +0 -0
  218. /package/dist/{chunk-ERKFG4RV.js.map → chunk-XRT7ZG5B.js.map} +0 -0
  219. /package/dist/{chunk-NYQHD7H4.js.map → chunk-YTWEK6CU.js.map} +0 -0
  220. /package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-UG32BSG2.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/recall-navigate-disclosure.ts"],"sourcesContent":["/**\n * Disclosure-step planning for recall navigation (issue #1956).\n *\n * The ladder itself is NOT redefined here: `types.ts` designates\n * `RECALL_DISCLOSURE_LEVELS` the single source of truth and forbids\n * hard-coding disclosure strings elsewhere, so a second copy could drift out\n * of agreement with recall validation and rendering. This module only adds\n * the rule that an expansion must go strictly deeper, so a caller cannot\n * re-pay recall budget for output it already holds. Pure — no I/O.\n */\n\nimport {\n isRecallDisclosure,\n RECALL_DISCLOSURE_LEVELS,\n type RecallDisclosure,\n} from \"./types.js\";\n\nexport type DisclosureStepResult =\n | { ok: true; from: RecallDisclosure; to: RecallDisclosure; steps: number }\n | { ok: false; error: \"unknown_level\" | \"not_deeper\" };\n\n/** Index in the canonical shallow-to-deep ladder. Throws for a non-level. */\nexport function disclosureRank(level: string): number {\n const index = (RECALL_DISCLOSURE_LEVELS as readonly string[]).indexOf(level);\n if (index < 0) {\n throw new RangeError(\n `unknown disclosure level ${JSON.stringify(level)}; expected one of ${RECALL_DISCLOSURE_LEVELS.join(\", \")}`,\n );\n }\n return index;\n}\n\n/**\n * Plan one expansion. A bad level from an agent is a typed refusal rather\n * than a throw; equal or shallower targets are `not_deeper`.\n */\nexport function planDisclosureStep(input: { from: string; to: string }): DisclosureStepResult {\n if (!isRecallDisclosure(input.from) || !isRecallDisclosure(input.to)) {\n return { ok: false, error: \"unknown_level\" };\n }\n const fromRank = disclosureRank(input.from);\n const toRank = disclosureRank(input.to);\n if (toRank <= fromRank) return { ok: false, error: \"not_deeper\" };\n return { ok: true, from: input.from, to: input.to, steps: toRank - fromRank };\n}\n"],"mappings":";;;;;;;AAsBO,SAAS,eAAe,OAAuB;AACpD,QAAM,QAAS,yBAA+C,QAAQ,KAAK;AAC3E,MAAI,QAAQ,GAAG;AACb,UAAM,IAAI;AAAA,MACR,4BAA4B,KAAK,UAAU,KAAK,CAAC,qBAAqB,yBAAyB,KAAK,IAAI,CAAC;AAAA,IAC3G;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,mBAAmB,OAA2D;AAC5F,MAAI,CAAC,mBAAmB,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,GAAG;AACpE,WAAO,EAAE,IAAI,OAAO,OAAO,gBAAgB;AAAA,EAC7C;AACA,QAAM,WAAW,eAAe,MAAM,IAAI;AAC1C,QAAM,SAAS,eAAe,MAAM,EAAE;AACtC,MAAI,UAAU,SAAU,QAAO,EAAE,IAAI,OAAO,OAAO,aAAa;AAChE,SAAO,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,OAAO,SAAS,SAAS;AAC9E;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { StateLabel } from './recall-state-view.js';
2
+
3
+ /**
4
+ * Recall state-view evidence packets (issue #1952).
5
+ *
6
+ * Groups labeled state-view entries into per-head evidence packets so
7
+ * superseded records stay visible as ordered history instead of being
8
+ * hidden or interleaved with another packet's entries. Pure. Surfaces wait.
9
+ */
10
+
11
+ interface StateViewEntry {
12
+ memoryId: string;
13
+ stateLabel: StateLabel;
14
+ /** Id of the entry that superseded this one, when any. */
15
+ supersededById?: string;
16
+ }
17
+ interface StateEvidencePacket {
18
+ /** The current (or transition) entry this packet is about. */
19
+ headId: string;
20
+ /** Predecessors, nearest to head first. Never interleaved with other packets. */
21
+ historyIds: string[];
22
+ }
23
+ interface StateEvidencePackets {
24
+ packets: StateEvidencePacket[];
25
+ /** Historical entries whose successor is absent from the input. */
26
+ orphanHistoryIds: string[];
27
+ }
28
+ declare function buildStateEvidencePackets(entries: readonly StateViewEntry[]): StateEvidencePackets;
29
+
30
+ export { type StateEvidencePacket, type StateEvidencePackets, StateLabel, type StateViewEntry, buildStateEvidencePackets };
@@ -0,0 +1,69 @@
1
+ import "./chunk-PZ5AY32C.js";
2
+
3
+ // src/recall-state-view-packet.ts
4
+ var STATE_LABELS = ["current", "historical", "transition"];
5
+ function resolveHead(entry, byId) {
6
+ const visited = /* @__PURE__ */ new Set();
7
+ let current = entry;
8
+ let depth = 0;
9
+ for (; ; ) {
10
+ const successorId = current.supersededById;
11
+ if (successorId === void 0 || successorId.trim() === "") return void 0;
12
+ const successor = byId.get(successorId);
13
+ if (successor === void 0) return void 0;
14
+ depth += 1;
15
+ if (successor.stateLabel !== "historical") return { headId: successorId, depth };
16
+ if (visited.has(successorId)) return void 0;
17
+ visited.add(successorId);
18
+ current = successor;
19
+ }
20
+ }
21
+ function compareStrings(a, b) {
22
+ return a < b ? -1 : a > b ? 1 : 0;
23
+ }
24
+ function compareAttachments(a, b) {
25
+ if (a.headId !== b.headId) return compareStrings(a.headId, b.headId);
26
+ if (a.depth !== b.depth) return a.depth < b.depth ? -1 : 1;
27
+ return compareStrings(a.historyId, b.historyId);
28
+ }
29
+ function buildStateEvidencePackets(entries) {
30
+ for (const entry of entries) {
31
+ if (!STATE_LABELS.includes(entry.stateLabel)) {
32
+ throw new TypeError(
33
+ `unknown state label ${JSON.stringify(entry.stateLabel)}; expected one of "current", "historical", "transition"`
34
+ );
35
+ }
36
+ }
37
+ const byId = /* @__PURE__ */ new Map();
38
+ for (const entry of entries) {
39
+ if (typeof entry.memoryId !== "string" || entry.memoryId.trim() === "") continue;
40
+ if (!byId.has(entry.memoryId)) byId.set(entry.memoryId, entry);
41
+ }
42
+ const packets = [];
43
+ const packetByHead = /* @__PURE__ */ new Map();
44
+ const attachments = [];
45
+ const orphanHistoryIds = [];
46
+ for (const [id, entry] of byId) {
47
+ if (entry.stateLabel !== "historical") {
48
+ const packet = { headId: id, historyIds: [] };
49
+ packetByHead.set(id, packet);
50
+ packets.push(packet);
51
+ continue;
52
+ }
53
+ const head = resolveHead(entry, byId);
54
+ if (head === void 0) orphanHistoryIds.push(id);
55
+ else attachments.push({ headId: head.headId, historyId: id, depth: head.depth });
56
+ }
57
+ attachments.sort(compareAttachments);
58
+ for (const attachment of attachments) {
59
+ const packet = packetByHead.get(attachment.headId);
60
+ if (packet) packet.historyIds.push(attachment.historyId);
61
+ }
62
+ packets.sort((a, b) => compareStrings(a.headId, b.headId));
63
+ orphanHistoryIds.sort(compareStrings);
64
+ return { packets, orphanHistoryIds };
65
+ }
66
+ export {
67
+ buildStateEvidencePackets
68
+ };
69
+ //# sourceMappingURL=recall-state-view-packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/recall-state-view-packet.ts"],"sourcesContent":["/**\n * Recall state-view evidence packets (issue #1952).\n *\n * Groups labeled state-view entries into per-head evidence packets so\n * superseded records stay visible as ordered history instead of being\n * hidden or interleaved with another packet's entries. Pure. Surfaces wait.\n */\nimport type { StateLabel } from \"./recall-state-view.js\";\n\nexport type { StateLabel };\n\nexport interface StateViewEntry {\n memoryId: string;\n stateLabel: StateLabel;\n /** Id of the entry that superseded this one, when any. */\n supersededById?: string;\n}\n\nexport interface StateEvidencePacket {\n /** The current (or transition) entry this packet is about. */\n headId: string;\n /** Predecessors, nearest to head first. Never interleaved with other packets. */\n historyIds: string[];\n}\n\nexport interface StateEvidencePackets {\n packets: StateEvidencePacket[];\n /** Historical entries whose successor is absent from the input. */\n orphanHistoryIds: string[];\n}\n\nconst STATE_LABELS: readonly StateLabel[] = [\"current\", \"historical\", \"transition\"];\n\ninterface HeadResolution {\n headId: string;\n depth: number;\n}\n\ninterface Attachment {\n headId: string;\n historyId: string;\n depth: number;\n}\n\n/**\n * Walk supersededById forward through intermediate historical entries and\n * stop at the first current/transition successor. Returns undefined when the\n * walk dead-ends (no or blank successor, successor id absent from the input)\n * or revisits an id (cycle), so callers treat the entry as an orphan.\n */\nfunction resolveHead(\n entry: StateViewEntry,\n byId: ReadonlyMap<string, StateViewEntry>,\n): HeadResolution | undefined {\n const visited = new Set<string>();\n let current = entry;\n let depth = 0;\n for (;;) {\n const successorId = current.supersededById;\n if (successorId === undefined || successorId.trim() === \"\") return undefined;\n const successor = byId.get(successorId);\n if (successor === undefined) return undefined;\n depth += 1;\n if (successor.stateLabel !== \"historical\") return { headId: successorId, depth };\n if (visited.has(successorId)) return undefined;\n visited.add(successorId);\n current = successor;\n }\n}\n\nfunction compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareAttachments(a: Attachment, b: Attachment): number {\n if (a.headId !== b.headId) return compareStrings(a.headId, b.headId);\n if (a.depth !== b.depth) return a.depth < b.depth ? -1 : 1;\n return compareStrings(a.historyId, b.historyId);\n}\n\nexport function buildStateEvidencePackets(\n entries: readonly StateViewEntry[],\n): StateEvidencePackets {\n // Validate every label before any skip, dedup, or walk.\n for (const entry of entries) {\n if (!(STATE_LABELS as readonly string[]).includes(entry.stateLabel)) {\n throw new TypeError(\n `unknown state label ${JSON.stringify(entry.stateLabel)}; expected one of \"current\", \"historical\", \"transition\"`,\n );\n }\n }\n\n // Blank ids are ignored; on duplicate ids the first entry wins.\n const byId = new Map<string, StateViewEntry>();\n for (const entry of entries) {\n if (typeof entry.memoryId !== \"string\" || entry.memoryId.trim() === \"\") continue;\n if (!byId.has(entry.memoryId)) byId.set(entry.memoryId, entry);\n }\n\n // ponytail: per-entry chain walks are O(n^2) on one long chain; recall-sized\n // result sets stay tiny, memoize if packet building ever moves offline.\n const packets: StateEvidencePacket[] = [];\n const packetByHead = new Map<string, StateEvidencePacket>();\n const attachments: Attachment[] = [];\n const orphanHistoryIds: string[] = [];\n\n for (const [id, entry] of byId) {\n if (entry.stateLabel !== \"historical\") {\n const packet: StateEvidencePacket = { headId: id, historyIds: [] };\n packetByHead.set(id, packet);\n packets.push(packet);\n continue;\n }\n const head = resolveHead(entry, byId);\n if (head === undefined) orphanHistoryIds.push(id);\n else attachments.push({ headId: head.headId, historyId: id, depth: head.depth });\n }\n\n attachments.sort(compareAttachments);\n for (const attachment of attachments) {\n const packet = packetByHead.get(attachment.headId);\n if (packet) packet.historyIds.push(attachment.historyId);\n }\n\n packets.sort((a, b) => compareStrings(a.headId, b.headId));\n orphanHistoryIds.sort(compareStrings);\n return { packets, orphanHistoryIds };\n}\n"],"mappings":";;;AA+BA,IAAM,eAAsC,CAAC,WAAW,cAAc,YAAY;AAmBlF,SAAS,YACP,OACA,MAC4B;AAC5B,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,aAAS;AACP,UAAM,cAAc,QAAQ;AAC5B,QAAI,gBAAgB,UAAa,YAAY,KAAK,MAAM,GAAI,QAAO;AACnE,UAAM,YAAY,KAAK,IAAI,WAAW;AACtC,QAAI,cAAc,OAAW,QAAO;AACpC,aAAS;AACT,QAAI,UAAU,eAAe,aAAc,QAAO,EAAE,QAAQ,aAAa,MAAM;AAC/E,QAAI,QAAQ,IAAI,WAAW,EAAG,QAAO;AACrC,YAAQ,IAAI,WAAW;AACvB,cAAU;AAAA,EACZ;AACF;AAEA,SAAS,eAAe,GAAW,GAAmB;AACpD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,SAAS,mBAAmB,GAAe,GAAuB;AAChE,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO,eAAe,EAAE,QAAQ,EAAE,MAAM;AACnE,MAAI,EAAE,UAAU,EAAE,MAAO,QAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACzD,SAAO,eAAe,EAAE,WAAW,EAAE,SAAS;AAChD;AAEO,SAAS,0BACd,SACsB;AAEtB,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAE,aAAmC,SAAS,MAAM,UAAU,GAAG;AACnE,YAAM,IAAI;AAAA,QACR,uBAAuB,KAAK,UAAU,MAAM,UAAU,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,oBAAI,IAA4B;AAC7C,aAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,MAAM,GAAI;AACxE,QAAI,CAAC,KAAK,IAAI,MAAM,QAAQ,EAAG,MAAK,IAAI,MAAM,UAAU,KAAK;AAAA,EAC/D;AAIA,QAAM,UAAiC,CAAC;AACxC,QAAM,eAAe,oBAAI,IAAiC;AAC1D,QAAM,cAA4B,CAAC;AACnC,QAAM,mBAA6B,CAAC;AAEpC,aAAW,CAAC,IAAI,KAAK,KAAK,MAAM;AAC9B,QAAI,MAAM,eAAe,cAAc;AACrC,YAAM,SAA8B,EAAE,QAAQ,IAAI,YAAY,CAAC,EAAE;AACjE,mBAAa,IAAI,IAAI,MAAM;AAC3B,cAAQ,KAAK,MAAM;AACnB;AAAA,IACF;AACA,UAAM,OAAO,YAAY,OAAO,IAAI;AACpC,QAAI,SAAS,OAAW,kBAAiB,KAAK,EAAE;AAAA,QAC3C,aAAY,KAAK,EAAE,QAAQ,KAAK,QAAQ,WAAW,IAAI,OAAO,KAAK,MAAM,CAAC;AAAA,EACjF;AAEA,cAAY,KAAK,kBAAkB;AACnC,aAAW,cAAc,aAAa;AACpC,UAAM,SAAS,aAAa,IAAI,WAAW,MAAM;AACjD,QAAI,OAAQ,QAAO,WAAW,KAAK,WAAW,SAAS;AAAA,EACzD;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC;AACzD,mBAAiB,KAAK,cAAc;AACpC,SAAO,EAAE,SAAS,iBAAiB;AACrC;","names":[]}