@remnic/core 10.0.77 → 10.0.78

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 (234) hide show
  1. package/dist/access-admin-ops-surface.js +26 -26
  2. package/dist/access-authorization-probe.js +27 -27
  3. package/dist/access-boundary.js +26 -26
  4. package/dist/access-cli.js +77 -76
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +26 -26
  7. package/dist/access-http-briefing.js +27 -27
  8. package/dist/access-http-query.js +28 -28
  9. package/dist/access-http.js +44 -44
  10. package/dist/access-identity-continuity-surface.js +26 -26
  11. package/dist/access-lcm-surface.js +26 -26
  12. package/dist/access-mcp.js +36 -36
  13. package/dist/access-namespace-preflight.js +26 -26
  14. package/dist/access-observe-write-category.js +5 -5
  15. package/dist/access-observe-write-surface.js +26 -26
  16. package/dist/access-operations-batch.js +28 -28
  17. package/dist/access-operations.js +35 -35
  18. package/dist/access-recall-concurrency.js +26 -26
  19. package/dist/access-recall-response.js +26 -26
  20. package/dist/access-recall-surface.js +26 -26
  21. package/dist/access-schema.js +4 -4
  22. package/dist/access-service.js +26 -26
  23. package/dist/access-surface-catalog.js +28 -28
  24. package/dist/active-recall.js +7 -7
  25. package/dist/briefing.js +8 -8
  26. package/dist/calibration.js +1 -1
  27. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  28. package/dist/causal-consolidation.js +9 -9
  29. package/dist/{chunk-Z3CKK5RR.js → chunk-2XG7QECM.js} +3 -3
  30. package/dist/{chunk-BZTA7DR4.js → chunk-35RSL5B4.js} +3 -3
  31. package/dist/{chunk-MUZWS6KB.js → chunk-3RYP4OTZ.js} +2 -2
  32. package/dist/{chunk-TX627XOF.js → chunk-446H5UUO.js} +4 -4
  33. package/dist/{chunk-XC7OYOQC.js → chunk-4BCX6YLW.js} +2 -2
  34. package/dist/{chunk-NUBOY2LQ.js → chunk-4HLPFYF2.js} +7 -7
  35. package/dist/{chunk-WIAXVBQH.js → chunk-65SKM4BF.js} +2 -2
  36. package/dist/{chunk-5HVEYVNQ.js → chunk-6HERQLF4.js} +2 -2
  37. package/dist/{chunk-4DLZ2ITE.js → chunk-6OGFQ5GH.js} +2 -2
  38. package/dist/{chunk-C44DRDZM.js → chunk-6WULHFNJ.js} +2 -2
  39. package/dist/{chunk-IVXOYE43.js → chunk-7IQ5HYBJ.js} +2 -2
  40. package/dist/{chunk-D26XMQP5.js → chunk-A45ZOJV4.js} +2 -2
  41. package/dist/chunk-ADJXJKU6.js +74 -0
  42. package/dist/chunk-ADJXJKU6.js.map +1 -0
  43. package/dist/{chunk-DANFOVQG.js → chunk-B7PLF3HW.js} +2 -2
  44. package/dist/{chunk-PBE7NFB5.js → chunk-BNQJKWWZ.js} +4 -4
  45. package/dist/{chunk-AY2UK5XK.js → chunk-BSBGI4BD.js} +2 -2
  46. package/dist/{chunk-AY2UK5XK.js.map → chunk-BSBGI4BD.js.map} +1 -1
  47. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  48. package/dist/{chunk-2JRLKDHV.js → chunk-CZD654DQ.js} +21 -21
  49. package/dist/{chunk-MBENRPMY.js → chunk-D3WNJF7D.js} +12 -12
  50. package/dist/{chunk-5IQL4N37.js → chunk-D4WBMLPD.js} +2 -2
  51. package/dist/{chunk-FYQUUIPI.js → chunk-DLZGSZVC.js} +4 -4
  52. package/dist/{chunk-YK6SFDP2.js → chunk-DOJBV6WR.js} +4 -4
  53. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  54. package/dist/{chunk-FETPTCQZ.js → chunk-E33UJHY3.js} +2 -2
  55. package/dist/{chunk-LJUQPT5G.js → chunk-EFRMEOZQ.js} +3 -3
  56. package/dist/{chunk-HTDXNIO6.js → chunk-HK3CUTAG.js} +2 -2
  57. package/dist/{chunk-FGUWCE5I.js → chunk-HUF4S4MY.js} +2 -2
  58. package/dist/{chunk-6Q6AQ36B.js → chunk-HWHNQVRV.js} +2 -2
  59. package/dist/{chunk-SYDPJUFR.js → chunk-IDGCL5OP.js} +2 -2
  60. package/dist/{chunk-F3FNXE7C.js → chunk-JHJP2IAU.js} +3 -3
  61. package/dist/{chunk-FQU65RJX.js → chunk-JIGHVQF6.js} +6 -6
  62. package/dist/{chunk-P7HNMNN2.js → chunk-K4SVTZWP.js} +7 -7
  63. package/dist/{chunk-6L62IDS6.js → chunk-KDWO22ZK.js} +2 -2
  64. package/dist/{chunk-4NDDRYBY.js → chunk-KYVBGDGA.js} +2 -2
  65. package/dist/{chunk-HB5TNQMM.js → chunk-L7BOS7KV.js} +2 -2
  66. package/dist/{chunk-3MBSD53O.js → chunk-LE4MQ2WF.js} +2 -2
  67. package/dist/{chunk-I4LJJ44E.js → chunk-LNHBYT3F.js} +2 -2
  68. package/dist/{chunk-SHVLNI4L.js → chunk-LU66I56Q.js} +2 -2
  69. package/dist/{chunk-MXQKGSMW.js → chunk-N2H6VC65.js} +3 -3
  70. package/dist/{chunk-L4QYW2HO.js → chunk-NBFHOQIO.js} +2 -2
  71. package/dist/{chunk-KNZDGZSY.js → chunk-NVYY2TJG.js} +2 -2
  72. package/dist/{chunk-7FFGWIBN.js → chunk-PCSQRQPJ.js} +2 -2
  73. package/dist/{chunk-P3AQ2YSX.js → chunk-PFUXPTBT.js} +4 -4
  74. package/dist/{chunk-KQAFEZQX.js → chunk-R45L4TV6.js} +6 -6
  75. package/dist/{chunk-EYIBIGIU.js → chunk-R63X5BQA.js} +12 -12
  76. package/dist/{chunk-TWHVCSLX.js → chunk-RF7QJ736.js} +2 -2
  77. package/dist/{chunk-ZZSFRWKD.js → chunk-RIBCP4DJ.js} +2 -2
  78. package/dist/{chunk-HDN7IVIO.js → chunk-RIZ5NUNN.js} +16 -62
  79. package/dist/chunk-RIZ5NUNN.js.map +1 -0
  80. package/dist/{chunk-I4W2ADBP.js → chunk-S34XZUTY.js} +36 -36
  81. package/dist/{chunk-DEGE32C3.js → chunk-SLORPQZT.js} +2 -2
  82. package/dist/{chunk-6RPPZL7W.js → chunk-SMSJOWVE.js} +2 -2
  83. package/dist/{chunk-X53HJENJ.js → chunk-SPYFXSFZ.js} +2 -2
  84. package/dist/{chunk-IRFQKR4Y.js → chunk-SW6OAWK7.js} +2 -2
  85. package/dist/{chunk-D3USVQIV.js → chunk-SZEPOUW2.js} +2 -2
  86. package/dist/{chunk-COIQ5N4J.js → chunk-TSITK6QK.js} +2 -2
  87. package/dist/{chunk-HCFNZWFB.js → chunk-VBNXDC7P.js} +2 -2
  88. package/dist/{chunk-G3PBNYDH.js → chunk-VJ3HFCG2.js} +2 -2
  89. package/dist/{chunk-OBQ2NZAR.js → chunk-VKDAJJQP.js} +4 -4
  90. package/dist/{chunk-HZNURRDS.js → chunk-VUROWXFL.js} +2 -2
  91. package/dist/{chunk-G5NH3SSX.js → chunk-X3KFSJLQ.js} +2 -2
  92. package/dist/{chunk-GCJA5KKT.js → chunk-XBNO56HC.js} +2 -2
  93. package/dist/{chunk-GWOFCHPN.js → chunk-YGECOOTF.js} +2 -2
  94. package/dist/{chunk-2R7OCBRR.js → chunk-YK7GOPIE.js} +2 -2
  95. package/dist/{chunk-ELUG6NKQ.js → chunk-YSA4CYTK.js} +2 -2
  96. package/dist/{chunk-233S3MXC.js → chunk-YXUNSOHD.js} +3 -3
  97. package/dist/{chunk-MAURCRPQ.js → chunk-Z3O7ZOCC.js} +30 -30
  98. package/dist/{chunk-LXDERMOU.js → chunk-ZAU2OPDW.js} +2 -2
  99. package/dist/cli.js +62 -61
  100. package/dist/coding/export-okf-codegraph.js +7 -7
  101. package/dist/compounding/engine.js +9 -9
  102. package/dist/config.js +7 -7
  103. package/dist/connectors/codex-materialize-runner.js +8 -8
  104. package/dist/connectors/index.js +8 -8
  105. package/dist/convergence-refresh.js +10 -10
  106. package/dist/corpus-watermark.js +10 -10
  107. package/dist/deep-recall-http-glue.js +5 -5
  108. package/dist/entity-retrieval.js +8 -8
  109. package/dist/external-wiki-access.js +27 -27
  110. package/dist/extraction.js +10 -10
  111. package/dist/harmonic-retrieval.js +8 -8
  112. package/dist/index.js +85 -84
  113. package/dist/lcm/engine.js +2 -2
  114. package/dist/lcm/index.js +5 -5
  115. package/dist/local-llm.js +1 -1
  116. package/dist/location/index.js +10 -10
  117. package/dist/maintenance/memory-governance.js +8 -8
  118. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  119. package/dist/maintenance/rebuild-memory-projection-runner.js +10 -10
  120. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  121. package/dist/memory-browse-operations.js +27 -27
  122. package/dist/namespaces/migrate.js +9 -9
  123. package/dist/namespaces/search.js +6 -6
  124. package/dist/namespaces/storage.js +8 -8
  125. package/dist/operator-doctor-corpus.js +11 -11
  126. package/dist/operator-toolkit.js +16 -16
  127. package/dist/orchestration/backlog-scheduler.js +78 -77
  128. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  129. package/dist/orchestration/buffer-drain-runner.js +78 -77
  130. package/dist/orchestration/maintenance.js +19 -19
  131. package/dist/orchestrator.js +77 -76
  132. package/dist/recall-navigation-operations.js +27 -27
  133. package/dist/recall-navigation.js +26 -26
  134. package/dist/resume-bundles.js +10 -9
  135. package/dist/search/factory.js +5 -5
  136. package/dist/search/index.js +5 -5
  137. package/dist/search/lancedb-backend.js +2 -2
  138. package/dist/search/meilisearch-backend.js +2 -2
  139. package/dist/search/orama-backend.js +2 -2
  140. package/dist/semantic-consolidation.js +9 -9
  141. package/dist/semantic-rule-promotion.js +8 -8
  142. package/dist/semantic-rule-verifier.js +8 -8
  143. package/dist/source-agent-qualifier.js +8 -8
  144. package/dist/standup/build.js +8 -8
  145. package/dist/storage.js +7 -7
  146. package/dist/summarizer.js +2 -2
  147. package/dist/support-passport/index.js +29 -29
  148. package/dist/transcript-ownership-digest.d.ts +31 -0
  149. package/dist/transcript-ownership-digest.d.ts.map +1 -0
  150. package/dist/transcript-ownership-digest.js +10 -0
  151. package/dist/transcript-ownership-digest.js.map +1 -0
  152. package/dist/transcript.d.ts +2 -5
  153. package/dist/transcript.d.ts.map +1 -1
  154. package/dist/transcript.js +2 -1
  155. package/dist/transfer/autodetect.js +1 -1
  156. package/dist/transfer/backup.js +2 -2
  157. package/dist/transfer/capsule-export.js +3 -3
  158. package/dist/transfer/capsule-import.js +2 -2
  159. package/dist/transfer/export-okf.js +8 -8
  160. package/dist/verified-recall.js +8 -8
  161. package/dist/who-knows-cli.js +9 -9
  162. package/dist/who-knows.js +8 -8
  163. package/package.json +2 -2
  164. package/src/local-llm-qos.test.ts +59 -0
  165. package/src/local-llm.ts +1 -1
  166. package/src/transcript-ownership-digest.test.ts +403 -0
  167. package/src/transcript-ownership-digest.ts +99 -0
  168. package/src/transcript.ts +14 -76
  169. package/dist/chunk-HDN7IVIO.js.map +0 -1
  170. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  171. /package/dist/{chunk-Z3CKK5RR.js.map → chunk-2XG7QECM.js.map} +0 -0
  172. /package/dist/{chunk-BZTA7DR4.js.map → chunk-35RSL5B4.js.map} +0 -0
  173. /package/dist/{chunk-MUZWS6KB.js.map → chunk-3RYP4OTZ.js.map} +0 -0
  174. /package/dist/{chunk-TX627XOF.js.map → chunk-446H5UUO.js.map} +0 -0
  175. /package/dist/{chunk-XC7OYOQC.js.map → chunk-4BCX6YLW.js.map} +0 -0
  176. /package/dist/{chunk-NUBOY2LQ.js.map → chunk-4HLPFYF2.js.map} +0 -0
  177. /package/dist/{chunk-WIAXVBQH.js.map → chunk-65SKM4BF.js.map} +0 -0
  178. /package/dist/{chunk-5HVEYVNQ.js.map → chunk-6HERQLF4.js.map} +0 -0
  179. /package/dist/{chunk-4DLZ2ITE.js.map → chunk-6OGFQ5GH.js.map} +0 -0
  180. /package/dist/{chunk-C44DRDZM.js.map → chunk-6WULHFNJ.js.map} +0 -0
  181. /package/dist/{chunk-IVXOYE43.js.map → chunk-7IQ5HYBJ.js.map} +0 -0
  182. /package/dist/{chunk-D26XMQP5.js.map → chunk-A45ZOJV4.js.map} +0 -0
  183. /package/dist/{chunk-DANFOVQG.js.map → chunk-B7PLF3HW.js.map} +0 -0
  184. /package/dist/{chunk-PBE7NFB5.js.map → chunk-BNQJKWWZ.js.map} +0 -0
  185. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  186. /package/dist/{chunk-2JRLKDHV.js.map → chunk-CZD654DQ.js.map} +0 -0
  187. /package/dist/{chunk-MBENRPMY.js.map → chunk-D3WNJF7D.js.map} +0 -0
  188. /package/dist/{chunk-5IQL4N37.js.map → chunk-D4WBMLPD.js.map} +0 -0
  189. /package/dist/{chunk-FYQUUIPI.js.map → chunk-DLZGSZVC.js.map} +0 -0
  190. /package/dist/{chunk-YK6SFDP2.js.map → chunk-DOJBV6WR.js.map} +0 -0
  191. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  192. /package/dist/{chunk-FETPTCQZ.js.map → chunk-E33UJHY3.js.map} +0 -0
  193. /package/dist/{chunk-LJUQPT5G.js.map → chunk-EFRMEOZQ.js.map} +0 -0
  194. /package/dist/{chunk-HTDXNIO6.js.map → chunk-HK3CUTAG.js.map} +0 -0
  195. /package/dist/{chunk-FGUWCE5I.js.map → chunk-HUF4S4MY.js.map} +0 -0
  196. /package/dist/{chunk-6Q6AQ36B.js.map → chunk-HWHNQVRV.js.map} +0 -0
  197. /package/dist/{chunk-SYDPJUFR.js.map → chunk-IDGCL5OP.js.map} +0 -0
  198. /package/dist/{chunk-F3FNXE7C.js.map → chunk-JHJP2IAU.js.map} +0 -0
  199. /package/dist/{chunk-FQU65RJX.js.map → chunk-JIGHVQF6.js.map} +0 -0
  200. /package/dist/{chunk-P7HNMNN2.js.map → chunk-K4SVTZWP.js.map} +0 -0
  201. /package/dist/{chunk-6L62IDS6.js.map → chunk-KDWO22ZK.js.map} +0 -0
  202. /package/dist/{chunk-4NDDRYBY.js.map → chunk-KYVBGDGA.js.map} +0 -0
  203. /package/dist/{chunk-HB5TNQMM.js.map → chunk-L7BOS7KV.js.map} +0 -0
  204. /package/dist/{chunk-3MBSD53O.js.map → chunk-LE4MQ2WF.js.map} +0 -0
  205. /package/dist/{chunk-I4LJJ44E.js.map → chunk-LNHBYT3F.js.map} +0 -0
  206. /package/dist/{chunk-SHVLNI4L.js.map → chunk-LU66I56Q.js.map} +0 -0
  207. /package/dist/{chunk-MXQKGSMW.js.map → chunk-N2H6VC65.js.map} +0 -0
  208. /package/dist/{chunk-L4QYW2HO.js.map → chunk-NBFHOQIO.js.map} +0 -0
  209. /package/dist/{chunk-KNZDGZSY.js.map → chunk-NVYY2TJG.js.map} +0 -0
  210. /package/dist/{chunk-7FFGWIBN.js.map → chunk-PCSQRQPJ.js.map} +0 -0
  211. /package/dist/{chunk-P3AQ2YSX.js.map → chunk-PFUXPTBT.js.map} +0 -0
  212. /package/dist/{chunk-KQAFEZQX.js.map → chunk-R45L4TV6.js.map} +0 -0
  213. /package/dist/{chunk-EYIBIGIU.js.map → chunk-R63X5BQA.js.map} +0 -0
  214. /package/dist/{chunk-TWHVCSLX.js.map → chunk-RF7QJ736.js.map} +0 -0
  215. /package/dist/{chunk-ZZSFRWKD.js.map → chunk-RIBCP4DJ.js.map} +0 -0
  216. /package/dist/{chunk-I4W2ADBP.js.map → chunk-S34XZUTY.js.map} +0 -0
  217. /package/dist/{chunk-DEGE32C3.js.map → chunk-SLORPQZT.js.map} +0 -0
  218. /package/dist/{chunk-6RPPZL7W.js.map → chunk-SMSJOWVE.js.map} +0 -0
  219. /package/dist/{chunk-X53HJENJ.js.map → chunk-SPYFXSFZ.js.map} +0 -0
  220. /package/dist/{chunk-IRFQKR4Y.js.map → chunk-SW6OAWK7.js.map} +0 -0
  221. /package/dist/{chunk-D3USVQIV.js.map → chunk-SZEPOUW2.js.map} +0 -0
  222. /package/dist/{chunk-COIQ5N4J.js.map → chunk-TSITK6QK.js.map} +0 -0
  223. /package/dist/{chunk-HCFNZWFB.js.map → chunk-VBNXDC7P.js.map} +0 -0
  224. /package/dist/{chunk-G3PBNYDH.js.map → chunk-VJ3HFCG2.js.map} +0 -0
  225. /package/dist/{chunk-OBQ2NZAR.js.map → chunk-VKDAJJQP.js.map} +0 -0
  226. /package/dist/{chunk-HZNURRDS.js.map → chunk-VUROWXFL.js.map} +0 -0
  227. /package/dist/{chunk-G5NH3SSX.js.map → chunk-X3KFSJLQ.js.map} +0 -0
  228. /package/dist/{chunk-GCJA5KKT.js.map → chunk-XBNO56HC.js.map} +0 -0
  229. /package/dist/{chunk-GWOFCHPN.js.map → chunk-YGECOOTF.js.map} +0 -0
  230. /package/dist/{chunk-2R7OCBRR.js.map → chunk-YK7GOPIE.js.map} +0 -0
  231. /package/dist/{chunk-ELUG6NKQ.js.map → chunk-YSA4CYTK.js.map} +0 -0
  232. /package/dist/{chunk-233S3MXC.js.map → chunk-YXUNSOHD.js.map} +0 -0
  233. /package/dist/{chunk-MAURCRPQ.js.map → chunk-Z3O7ZOCC.js.map} +0 -0
  234. /package/dist/{chunk-LXDERMOU.js.map → chunk-ZAU2OPDW.js.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ JsonlOwnershipDigestCache
3
+ } from "./chunk-ADJXJKU6.js";
1
4
  import {
2
5
  analyzeSessionIntegrity
3
6
  } from "./chunk-KFY3SGN7.js";
@@ -46,7 +49,7 @@ var TranscriptManager = class _TranscriptManager {
46
49
  toolUsageDir;
47
50
  config;
48
51
  sessionFootprintCache = /* @__PURE__ */ new Map();
49
- directoryOwnershipCache = /* @__PURE__ */ new Map();
52
+ ownershipDigests = new JsonlOwnershipDigestCache();
50
53
  /** Default checkpoint TTL in hours */
51
54
  static DEFAULT_CHECKPOINT_TTL_HOURS = 24;
52
55
  constructor(config) {
@@ -176,78 +179,31 @@ var TranscriptManager = class _TranscriptManager {
176
179
  } catch {
177
180
  return "occupied";
178
181
  }
179
- const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
180
- if (!fileSizes) return "occupied";
182
+ const filePaths = await this.directoryJsonlFilePaths(root, dir, names);
183
+ if (!filePaths) return "occupied";
181
184
  if (!sessionKey) return "matches";
182
- const cacheKey = this.directoryOwnershipCacheKey(root, dir, sessionKey);
183
- const cached = this.directoryOwnershipCache.get(cacheKey);
184
- if (cached && this.sameFileSizes(cached.fileSizes, fileSizes)) {
185
- return cached.status;
186
- }
187
185
  let hasEntries = false;
188
- let hasMatchingEntry = false;
189
- for (const name of names) {
190
- const filePath = await resolveSafeStoragePath(root, dir, name).catch(() => null);
191
- if (filePath === null) return "occupied";
186
+ for (const filePath of filePaths) {
192
187
  try {
193
- const raw = await readFile(filePath, "utf-8");
194
- for (const line of raw.split("\n")) {
195
- if (!line.trim()) continue;
196
- hasEntries = true;
197
- try {
198
- const obj = JSON.parse(line);
199
- if (obj.sessionKey === sessionKey) {
200
- hasMatchingEntry = true;
201
- } else {
202
- return "occupied";
203
- }
204
- } catch {
205
- return "occupied";
206
- }
207
- }
188
+ const ownership = await this.ownershipDigests.verify(filePath, sessionKey);
189
+ if (ownership === "foreign") return "occupied";
190
+ if (ownership === "matches") hasEntries = true;
208
191
  } catch {
209
192
  return "occupied";
210
193
  }
211
194
  }
212
- const status = hasMatchingEntry ? "matches" : hasEntries ? "occupied" : "empty";
213
- if (status === "matches" || status === "empty") {
214
- this.directoryOwnershipCache.set(cacheKey, { status, fileSizes });
215
- }
216
- return status;
217
- }
218
- directoryOwnershipCacheKey(root, dir, sessionKey) {
219
- return `${path.resolve(root)}\0${dir}\0${sessionKey}`;
220
- }
221
- sameFileSizes(left, right) {
222
- if (left.size !== right.size) return false;
223
- for (const [name, size] of left) {
224
- if (right.get(name) !== size) return false;
225
- }
226
- return true;
195
+ return hasEntries ? "matches" : "empty";
227
196
  }
228
- async directoryJsonlFileSizes(root, dir, names) {
229
- const fileSizes = /* @__PURE__ */ new Map();
197
+ async directoryJsonlFilePaths(root, dir, names) {
198
+ const filePaths = [];
230
199
  for (const name of names) {
231
200
  const filePath = await resolveSafeStoragePath(root, dir, name).catch(() => null);
232
201
  if (filePath === null) return null;
233
202
  const fileInfo = await stat(filePath).catch(() => null);
234
203
  if (!fileInfo?.isFile()) return null;
235
- fileSizes.set(name, Math.max(0, fileInfo.size));
236
- }
237
- return fileSizes;
238
- }
239
- async rememberDirectoryOwnership(root, dir, sessionKey) {
240
- try {
241
- const channelDir = await resolveSafeStoragePath(root, dir);
242
- const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file));
243
- const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
244
- if (!fileSizes) return;
245
- this.directoryOwnershipCache.set(
246
- this.directoryOwnershipCacheKey(root, dir, sessionKey),
247
- { status: "matches", fileSizes }
248
- );
249
- } catch {
204
+ filePaths.push(filePath);
250
205
  }
206
+ return filePaths;
251
207
  }
252
208
  async getSessionStorageFiles(root, dir, legacyDir, alternateDir, readbackDirs = []) {
253
209
  const files = [];
@@ -291,7 +247,6 @@ var TranscriptManager = class _TranscriptManager {
291
247
  await mkdir(channelDir, { recursive: true });
292
248
  const filePath = await resolveSafeStoragePath(this.toolUsageDir, writeDir, file);
293
249
  await appendFile(filePath, JSON.stringify(entry) + "\n", "utf-8");
294
- await this.rememberDirectoryOwnership(this.toolUsageDir, writeDir, entry.sessionKey);
295
250
  }
296
251
  async readToolUse(sessionKey, startTime, endTime) {
297
252
  const { dir, alternateDir, legacyDir, readbackDirs } = this.getToolUsagePath(sessionKey);
@@ -463,7 +418,6 @@ var TranscriptManager = class _TranscriptManager {
463
418
  await mkdir(channelDir, { recursive: true });
464
419
  const line = JSON.stringify(entry) + "\n";
465
420
  await appendFile(filePath, line, "utf-8");
466
- await this.rememberDirectoryOwnership(this.transcriptsDir, writeDir, entry.sessionKey);
467
421
  log.debug(`appended transcript entry for ${entry.sessionKey}: ${entry.turnId}`);
468
422
  } catch (err) {
469
423
  log.error("failed to append transcript entry:", err);
@@ -956,4 +910,4 @@ export {
956
910
  utcDayRange,
957
911
  TranscriptManager
958
912
  };
959
- //# sourceMappingURL=chunk-HDN7IVIO.js.map
913
+ //# sourceMappingURL=chunk-RIZ5NUNN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transcript.ts"],"sourcesContent":["import { appendFile, mkdir, readdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport type { TranscriptEntry, Checkpoint, PluginConfig } from \"./types.js\";\nimport { analyzeSessionIntegrity, type SessionIntegrityReport } from \"./session-integrity.js\";\nimport { isDailyFileDatedBefore, resolveSafeStoragePath } from \"./storage-paths.js\";\nimport { sessionStoragePaths } from \"./session-identity.js\";\nimport { estimateTokenCount } from \"./token-estimate.js\";\nimport { isMacOsReplicationJunkBasename } from \"./utils/macos-replication-junk.js\";\nimport { JsonlOwnershipDigestCache } from \"./transcript-ownership-digest.js\";\n\ntype DirectorySessionStatus = \"missing\" | \"empty\" | \"matches\" | \"occupied\";\n\n/**\n * De-duplicate JSONL lines collected across multiple read-back candidate\n * directories. A partially-applied migration (issue #1496) can leave the SAME\n * raw row in both the primary `session/<hash>` tree and a legacy read-back dir\n * (`other/default` or an old `parts.length >= 3` directory) when the source was\n * copied but not yet trimmed. Without this guard, `readRecent`, `readToolUse`,\n * footprint estimation, and the summarizer fetch would return that row twice\n * (cursor review on PR #1504). The exact raw JSONL line is the stable identity:\n * the migration preserves byte content per session, so a copied-but-not-trimmed\n * row is byte-identical in both locations. Returns `true` the first time a line\n * is seen, `false` for every subsequent duplicate.\n */\nfunction makeRawLineDeduper(): (rawLine: string) => boolean {\n const seen = new Set<string>();\n return (rawLine: string): boolean => {\n if (seen.has(rawLine)) return false;\n seen.add(rawLine);\n return true;\n };\n}\n\n/**\n * Compute the half-open UTC instant range `[start, end)` that covers an entire\n * calendar day, suitable for {@link TranscriptManager.readRange}.\n *\n * `readRange` filters with an EXCLUSIVE upper bound (`entryTime < end`, CLAUDE.md\n * rule #35 / AGENTS.md rule 23). The end is therefore the NEXT day's\n * `00:00:00Z`, not `${date}T23:59:59Z`: a literal `23:59:59Z` end (== `.000Z`)\n * would drop any entry stamped in the final second of the day\n * (`23:59:59.000Z`–`23:59:59.999Z`). Using the next day's midnight keeps the\n * `[start, end)` semantics intact while including the whole day.\n *\n * @param date - A `YYYY-MM-DD` calendar day (UTC).\n */\nexport function utcDayRange(date: string): { start: string; end: string } {\n const start = `${date}T00:00:00Z`;\n const startMs = Date.parse(start);\n if (Number.isNaN(startMs)) {\n // Malformed date: preserve the pre-existing \"empty range\" behavior (an\n // unparseable bound makes `readRange` match nothing) rather than throwing.\n return { start, end: start };\n }\n const next = new Date(startMs);\n next.setUTCDate(next.getUTCDate() + 1);\n return { start, end: `${next.toISOString().slice(0, 10)}T00:00:00Z` };\n}\n\n/**\n * Manages conversation transcript storage, checkpointing, and recall formatting.\n *\n * Transcripts are stored as JSONL files in a hierarchical structure:\n * transcripts/{channelType}/{channelId}.jsonl\n *\n * Channel types are extracted from sessionKey (discord, slack, cron, main, etc.)\n * Checkpoints are used to preserve conversation context across compaction events.\n */\nexport class TranscriptManager {\n private transcriptsDir: string;\n private checkpointPath: string;\n private stateDir: string;\n private toolUsageDir: string;\n private config: PluginConfig;\n private sessionFootprintCache = new Map<\n string,\n {\n totalBytes: number;\n totalTokens: number;\n fileBytes: Map<string, number>;\n fileSizes: Map<string, number>;\n fileTokens: Map<string, number>;\n }\n >();\n private ownershipDigests = new JsonlOwnershipDigestCache();\n\n /** Default checkpoint TTL in hours */\n private static readonly DEFAULT_CHECKPOINT_TTL_HOURS = 24;\n\n constructor(config: PluginConfig) {\n this.config = config;\n this.transcriptsDir = path.join(config.memoryDir, \"transcripts\");\n this.stateDir = path.join(config.memoryDir, \"state\");\n this.checkpointPath = path.join(this.stateDir, \"checkpoint.json\");\n this.toolUsageDir = path.join(this.stateDir, \"tool-usage\");\n }\n\n /**\n * Resolve the storage path pieces for a sessionKey via the shared\n * {@link sessionStoragePaths} helper (issue #1496, rule #22).\n *\n * Legacy `agent:<id>:...` shapes keep their existing readable channel paths.\n * Arbitrary / non-legacy keys (e.g. `pi-geek:abc123`) route to\n * `transcripts/session/<hash>/YYYY-MM-DD.jsonl` from the FIRST write — they\n * never start life in `other/default`. For those keys a list of\n * read-back-only `readbackDirs` is returned so data written by older builds\n * (under `other/default`, or under an old `parts.length >= 3` directory such\n * as `baz/default`) stays discoverable until migrated. New writes never\n * target read-back dirs. See `session-identity.ts`.\n *\n * @returns Object with raw channel identifiers and encoded storage path pieces.\n */\n getTranscriptPath(sessionKey: string): {\n dir: string;\n file: string;\n channelType: string;\n channelId: string;\n alternateDir: string;\n legacyDir?: string;\n readbackDirs: string[];\n } {\n const paths = sessionStoragePaths(sessionKey);\n\n // Daily rotation: transcripts/{channelType}/{channelId}/YYYY-MM-DD.jsonl\n const today = new Date().toISOString().slice(0, 10);\n\n return {\n dir: paths.dir,\n file: `${today}.jsonl`,\n channelType: paths.channelType,\n channelId: paths.channelId,\n alternateDir: paths.alternateDir,\n legacyDir: paths.legacyDir,\n readbackDirs: paths.readbackDirs,\n };\n }\n\n /**\n * Initialize the transcript manager by ensuring directories exist.\n */\n async initialize(): Promise<void> {\n await mkdir(this.transcriptsDir, { recursive: true });\n await mkdir(this.stateDir, { recursive: true });\n await mkdir(this.toolUsageDir, { recursive: true });\n log.info(\"transcript manager initialized\");\n }\n\n /**\n * Best-effort list of sessionKeys that have transcript files on disk.\n * This is used by cron-style tooling (hourly summaries, conversation indexing)\n * to iterate across \"active\" sessions.\n */\n async listSessionKeys(): Promise<string[]> {\n const transcriptDir = this.transcriptsDir;\n const sessionKeys = new Set<string>();\n\n try {\n const typeEntries = await readdir(transcriptDir, { withFileTypes: true });\n for (const typeEnt of typeEntries) {\n if (!typeEnt.isDirectory()) continue;\n const typeDir = path.join(transcriptDir, typeEnt.name);\n const idEntries = await readdir(typeDir, { withFileTypes: true });\n for (const idEnt of idEntries) {\n if (!idEnt.isDirectory()) continue;\n const chanDir = path.join(typeDir, idEnt.name);\n const files = (await readdir(chanDir)).filter((f) => f.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(f)).sort();\n const last = files[files.length - 1];\n if (!last) continue;\n try {\n const raw = await readFile(path.join(chanDir, last), \"utf-8\");\n const firstLine = raw.split(\"\\n\").find((l) => l.trim().length > 0);\n if (!firstLine) continue;\n const entry = JSON.parse(firstLine) as TranscriptEntry;\n if (typeof entry.sessionKey === \"string\" && entry.sessionKey.length > 0) {\n sessionKeys.add(entry.sessionKey);\n }\n } catch {\n // ignore\n }\n }\n }\n } catch {\n return [];\n }\n\n return Array.from(sessionKeys);\n }\n\n getToolUsagePath(sessionKey: string): {\n dir: string;\n file: string;\n alternateDir: string;\n legacyDir?: string;\n readbackDirs: string[];\n } {\n const p = this.getTranscriptPath(sessionKey);\n return {\n dir: p.dir,\n file: p.file,\n alternateDir: p.alternateDir,\n legacyDir: p.legacyDir,\n readbackDirs: p.readbackDirs,\n };\n }\n\n private async selectStorageDirForWrite(\n root: string,\n dir: string,\n legacyDir?: string,\n sessionKey?: string,\n alternateDir?: string,\n ): Promise<{ dir: string; channelDir: string }> {\n const channelDir = await resolveSafeStoragePath(root, dir);\n const encodedStatus = await this.directorySessionStatus(root, dir, sessionKey);\n if (encodedStatus === \"matches\" || encodedStatus === \"empty\") return { dir, channelDir };\n\n if (legacyDir) {\n const legacyChannelDir = await resolveSafeStoragePath(root, legacyDir);\n if ((await this.directorySessionStatus(root, legacyDir, sessionKey)) === \"matches\") {\n return { dir: legacyDir, channelDir: legacyChannelDir };\n }\n }\n\n if (encodedStatus === \"missing\") return { dir, channelDir };\n\n if (alternateDir) {\n const alternateChannelDir = await resolveSafeStoragePath(root, alternateDir);\n const alternateStatus = await this.directorySessionStatus(root, alternateDir, sessionKey);\n if (\n alternateStatus === \"missing\" ||\n alternateStatus === \"empty\" ||\n alternateStatus === \"matches\"\n ) {\n return { dir: alternateDir, channelDir: alternateChannelDir };\n }\n }\n\n throw new Error(`transcript storage path collision for session: ${sessionKey ?? \"(unknown)\"}`);\n }\n\n private async directorySessionStatus(\n root: string,\n dir: string,\n sessionKey?: string,\n ): Promise<DirectorySessionStatus> {\n let channelDir: string;\n try {\n channelDir = await resolveSafeStoragePath(root, dir);\n if (!(await stat(channelDir)).isDirectory()) return \"occupied\";\n } catch (err) {\n const code =\n err && typeof err === \"object\" && \"code\" in err\n ? (err as { code?: string }).code\n : undefined;\n if (code === \"ENOENT\") return \"missing\";\n throw err;\n }\n\n let names: string[];\n try {\n names = (await readdir(channelDir)).filter((file) => file.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(file));\n } catch {\n return \"occupied\";\n }\n\n const filePaths = await this.directoryJsonlFilePaths(root, dir, names);\n if (!filePaths) return \"occupied\";\n\n if (!sessionKey) return \"matches\";\n\n let hasEntries = false;\n for (const filePath of filePaths) {\n try {\n const ownership = await this.ownershipDigests.verify(filePath, sessionKey);\n if (ownership === \"foreign\") return \"occupied\";\n if (ownership === \"matches\") hasEntries = true;\n } catch {\n return \"occupied\";\n }\n }\n return hasEntries ? \"matches\" : \"empty\";\n }\n\n private async directoryJsonlFilePaths(\n root: string,\n dir: string,\n names: string[],\n ): Promise<string[] | null> {\n const filePaths: string[] = [];\n for (const name of names) {\n const filePath = await resolveSafeStoragePath(root, dir, name).catch(() => null);\n if (filePath === null) return null;\n const fileInfo = await stat(filePath).catch(() => null);\n if (!fileInfo?.isFile()) return null;\n filePaths.push(filePath);\n }\n return filePaths;\n }\n\n private async getSessionStorageFiles(\n root: string,\n dir: string,\n legacyDir?: string,\n alternateDir?: string,\n readbackDirs: string[] = [],\n ): Promise<Array<{ cacheKey: string; name: string; path: string }>> {\n const files: Array<{ cacheKey: string; name: string; path: string }> = [];\n const seenDirs = new Set<string>();\n\n for (const candidateDir of [dir, alternateDir, legacyDir, ...readbackDirs]) {\n if (!candidateDir || seenDirs.has(candidateDir)) continue;\n seenDirs.add(candidateDir);\n\n let channelDir: string;\n try {\n channelDir = await resolveSafeStoragePath(root, candidateDir);\n } catch {\n continue;\n }\n\n let names: string[];\n try {\n names = (await readdir(channelDir)).filter((file) => file.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(file)).sort();\n } catch {\n continue;\n }\n\n for (const name of names) {\n const filePath = await resolveSafeStoragePath(root, candidateDir, name).catch(() => null);\n if (filePath === null) continue;\n files.push({\n cacheKey: path.join(candidateDir, name),\n name,\n path: filePath,\n });\n }\n }\n\n return files.sort((a, b) => a.cacheKey.localeCompare(b.cacheKey));\n }\n\n async appendToolUse(entry: { timestamp: string; sessionKey: string; tool: string }): Promise<void> {\n const { dir, file, alternateDir, legacyDir } = this.getToolUsagePath(entry.sessionKey);\n const { dir: writeDir, channelDir } = await this.selectStorageDirForWrite(\n this.toolUsageDir,\n dir,\n legacyDir,\n entry.sessionKey,\n alternateDir,\n );\n await mkdir(channelDir, { recursive: true });\n const filePath = await resolveSafeStoragePath(this.toolUsageDir, writeDir, file);\n await appendFile(filePath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n async readToolUse(\n sessionKey: string,\n startTime: Date,\n endTime: Date,\n ): Promise<Array<{ timestamp: string; sessionKey: string; tool: string }>> {\n const { dir, alternateDir, legacyDir, readbackDirs } = this.getToolUsagePath(sessionKey);\n try {\n const files = await this.getSessionStorageFiles(\n this.toolUsageDir,\n dir,\n legacyDir,\n alternateDir,\n readbackDirs,\n );\n const out: Array<{ timestamp: string; sessionKey: string; tool: string }> = [];\n // Dedup identical raw rows that a partially-applied migration may have left\n // in both the primary dir and a read-back dir (issue #1496, cursor review).\n const keepRawLine = makeRawLineDeduper();\n for (const file of files) {\n const raw = await readFile(file.path, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line) as any;\n const ts = new Date(String(obj.timestamp ?? \"\")).getTime();\n if (!Number.isFinite(ts)) continue;\n if (ts >= startTime.getTime() && ts < endTime.getTime()) {\n if (typeof obj.tool === \"string\" && typeof obj.sessionKey === \"string\") {\n if (obj.sessionKey === sessionKey && keepRawLine(line)) {\n out.push({ timestamp: obj.timestamp, sessionKey: obj.sessionKey, tool: obj.tool });\n }\n }\n }\n } catch {\n // ignore\n }\n }\n }\n return out;\n } catch {\n return [];\n }\n }\n\n async estimateSessionFootprint(sessionKey: string): Promise<{ bytes: number; tokens: number }> {\n const { dir, alternateDir, legacyDir, readbackDirs } = this.getTranscriptPath(sessionKey);\n let bytes = 0;\n let tokens = 0;\n try {\n const files = await this.getSessionStorageFiles(\n this.transcriptsDir,\n dir,\n legacyDir,\n alternateDir,\n readbackDirs,\n );\n const cached = this.sessionFootprintCache.get(sessionKey);\n if (!cached) {\n const fileBytes = new Map<string, number>();\n const fileSizes = new Map<string, number>();\n const fileTokens = new Map<string, number>();\n for (const file of files) {\n try {\n const fileInfo = await stat(file.path);\n const estimate = await this.estimateSessionBytesInFile(file.path, sessionKey);\n fileBytes.set(file.cacheKey, estimate.bytes);\n fileTokens.set(file.cacheKey, estimate.tokens);\n fileSizes.set(file.cacheKey, Math.max(0, fileInfo.size));\n bytes += estimate.bytes;\n tokens += estimate.tokens;\n } catch {\n }\n }\n this.sessionFootprintCache.set(sessionKey, { totalBytes: bytes, totalTokens: tokens, fileBytes, fileSizes, fileTokens });\n } else {\n bytes = cached.totalBytes;\n tokens = cached.totalTokens;\n const seen = new Set(files.map((file) => file.cacheKey));\n\n for (const [cachedFile, cachedSessionBytes] of cached.fileBytes.entries()) {\n if (!seen.has(cachedFile)) {\n bytes -= cachedSessionBytes;\n tokens -= cached.fileTokens.get(cachedFile) ?? 0;\n cached.fileBytes.delete(cachedFile);\n cached.fileTokens.delete(cachedFile);\n cached.fileSizes.delete(cachedFile);\n }\n }\n\n for (const file of files) {\n if (cached.fileBytes.has(file.cacheKey)) continue;\n try {\n const fileInfo = await stat(file.path);\n const estimate = await this.estimateSessionBytesInFile(file.path, sessionKey);\n cached.fileBytes.set(file.cacheKey, estimate.bytes);\n cached.fileTokens.set(file.cacheKey, estimate.tokens);\n cached.fileSizes.set(file.cacheKey, Math.max(0, fileInfo.size));\n bytes += estimate.bytes;\n tokens += estimate.tokens;\n } catch {\n }\n }\n\n for (const file of files) {\n try {\n const fileInfo = await stat(file.path);\n const size = Math.max(0, fileInfo.size);\n const previousEstimate = {\n bytes: cached.fileBytes.get(file.cacheKey) ?? 0,\n tokens: cached.fileTokens.get(file.cacheKey) ?? 0,\n };\n const previousSize = cached.fileSizes.get(file.cacheKey) ?? -1;\n if (size !== previousSize) {\n const estimate = await this.estimateSessionBytesInFile(file.path, sessionKey);\n cached.fileBytes.set(file.cacheKey, estimate.bytes);\n cached.fileTokens.set(file.cacheKey, estimate.tokens);\n cached.fileSizes.set(file.cacheKey, size);\n bytes += estimate.bytes - previousEstimate.bytes;\n tokens += estimate.tokens - previousEstimate.tokens;\n }\n } catch {\n }\n }\n\n bytes = Math.max(0, bytes);\n tokens = Math.max(0, tokens);\n cached.totalBytes = bytes;\n cached.totalTokens = tokens;\n }\n } catch {\n this.sessionFootprintCache.delete(sessionKey);\n }\n\n return { bytes, tokens };\n }\n\n private async estimateSessionBytesInFile(\n filePath: string,\n sessionKey: string,\n ): Promise<{ bytes: number; tokens: number }> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n let bytes = 0;\n let tokens = 0;\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line) as { sessionKey?: string; content?: unknown };\n if (parsed.sessionKey === sessionKey) {\n bytes += Buffer.byteLength(`${line}\\n`, \"utf-8\");\n if (typeof parsed.content === \"string\") tokens += estimateTokenCount(parsed.content);\n }\n } catch {\n // fail-open for malformed lines\n }\n }\n return { bytes, tokens };\n } catch {\n return { bytes: 0, tokens: 0 };\n }\n }\n\n private isLegacyTranscriptFile(filename: string): boolean {\n return /^\\d{4}-\\d{2}-\\d{2}\\.jsonl$/.test(filename);\n }\n\n /**\n * Append a turn to the appropriate transcript file.\n * Files are stored hierarchically: transcripts/{channelType}/{channelId}.jsonl\n *\n * Skips channel types in config.transcriptSkipChannelTypes (e.g., \"cron\").\n */\n async append(entry: TranscriptEntry): Promise<void> {\n try {\n const { dir, file, channelType, alternateDir, legacyDir } = this.getTranscriptPath(entry.sessionKey);\n\n // Skip if this channel type is in the skip list\n if (this.config.transcriptSkipChannelTypes.includes(channelType)) {\n return;\n }\n\n const { dir: writeDir, channelDir } = await this.selectStorageDirForWrite(\n this.transcriptsDir,\n dir,\n legacyDir,\n entry.sessionKey,\n alternateDir,\n );\n const filePath = await resolveSafeStoragePath(this.transcriptsDir, writeDir, file);\n\n // Ensure channel directory exists\n await mkdir(channelDir, { recursive: true });\n\n const line = JSON.stringify(entry) + \"\\n\";\n await appendFile(filePath, line, \"utf-8\");\n log.debug(`appended transcript entry for ${entry.sessionKey}: ${entry.turnId}`);\n } catch (err) {\n log.error(\"failed to append transcript entry:\", err);\n throw err;\n }\n }\n\n /**\n * Get all transcript files from the hierarchical directory structure.\n * Recursively finds all .jsonl files in transcripts/{channelType}/{channelId}/ subdirectories.\n */\n private async getAllTranscriptFiles(): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(this.transcriptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // This is a channel type directory (discord, slack, cron, main, etc.)\n const channelTypeDir = path.join(this.transcriptsDir, entry.name);\n try {\n const channelTypeEntries = await readdir(channelTypeDir, { withFileTypes: true });\n\n for (const channelTypeEntry of channelTypeEntries) {\n if (channelTypeEntry.isDirectory()) {\n // This is a channel ID directory - contains daily transcript files\n const channelDir = path.join(channelTypeDir, channelTypeEntry.name);\n try {\n const channelFiles = await readdir(channelDir);\n for (const file of channelFiles) {\n if (file.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(file)) {\n files.push(path.join(entry.name, channelTypeEntry.name, file));\n }\n }\n } catch {\n // Skip unreadable directories\n }\n } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {\n // Legacy: channel type dir contains .jsonl files directly\n files.push(path.join(entry.name, channelTypeEntry.name));\n }\n }\n } catch {\n // Skip unreadable directories\n }\n } else if (entry.isFile() && entry.name.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(entry.name)) {\n // Legacy flat file - still include for backward compatibility\n files.push(entry.name);\n }\n }\n } catch {\n // Directory doesn't exist or is unreadable\n }\n\n return files;\n }\n\n /**\n * Read transcript entries for a date range.\n * Returns entries within the time range, optionally filtered by sessionKey.\n * Reads from all channel subdirectories in the hierarchical structure.\n *\n * The window is half-open `[start, end)`: the upper bound is exclusive so\n * caller-specified ranges (explicit dates, analytics buckets) don't\n * double-count at shared boundaries (CLAUDE.md rule #35 / AGENTS.md rule 23).\n * readRecent's inclusive-of-now behavior is handled by readRecent itself\n * extending its end, not by relaxing this bound.\n */\n async readRange(startTime: string, endTime: string, sessionKey?: string, skipFilesDatedBefore?: string): Promise<TranscriptEntry[]> {\n const start = new Date(startTime);\n const end = new Date(endTime);\n const entries: TranscriptEntry[] = [];\n\n // When a sessionKey is given, a partially-applied #1496 migration can leave\n // the SAME raw row in both the primary `session/<hash>` dir and a read-back\n // dir (`other/default` or an old `parts.length >= 3` dir). `readRange` scans\n // EVERY transcript file, so it would append that row once per directory.\n // Dedup by exact raw line to give the same exact-once guarantee `readRecent`\n // / `readToolUse` / the summarizer fetch already provide (cursor review on\n // PR #1504). Only applied for the session-scoped path so unfiltered range\n // scans (each file already enumerated once) keep their existing behavior.\n const keepRawLine = sessionKey ? makeRawLineDeduper() : undefined;\n\n try {\n // Get all transcript files from the hierarchical structure\n const transcriptFiles = (await this.getAllTranscriptFiles()).filter((f) => !isDailyFileDatedBefore(f, skipFilesDatedBefore));\n\n // Read each relevant file\n for (const relativePath of transcriptFiles) {\n const filePath = path.join(this.transcriptsDir, relativePath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n const entryTime = new Date(entry.timestamp);\n\n // Check if entry is within time range (half-open: exclusive end)\n if (entryTime >= start && entryTime < end) {\n // Filter by sessionKey if provided\n if (!sessionKey || entry.sessionKey === sessionKey) {\n if (keepRawLine && !keepRawLine(line)) continue;\n entries.push(entry);\n }\n }\n } catch {\n // Skip malformed lines\n log.debug(`skipped malformed transcript line in ${relativePath}`);\n }\n }\n } catch {\n // File doesn't exist or is unreadable - skip\n }\n }\n\n // Sort by timestamp\n entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n\n log.debug(`read ${entries.length} transcript entries from ${transcriptFiles.length} file(s)`);\n return entries;\n } catch (err) {\n log.error(\"failed to read transcript range:\", err);\n return [];\n }\n }\n\n /**\n * Read the last N hours of transcript.\n *\n * Fast path: when sessionKey is given, reads only the 1-2 daily files for that channel. Without one,\n * every channel is scanned but daily files older than the window (less a day of clock skew) are skipped.\n */\n async readRecent(hours: number, sessionKey?: string): Promise<TranscriptEntry[]> {\n const now = new Date();\n // The recent-read window is inclusive of \"now\": a turn that is buffered and\n // then immediately read back can carry the same millisecond timestamp as\n // this read, so a half-open [start, now) filter would drop it. Extend the\n // upper bound by 1ms so the exclusive [start, end) filters in\n // readRecentForSession / readRange (which stay half-open for\n // caller-specified ranges, CLAUDE.md rule #35) still capture an entry\n // stamped at exactly \"now\". This is the only place the \"up to now\" boundary\n // is widened; explicit ranges are unaffected.\n const end = new Date(now.getTime() + 1);\n const start = new Date(now.getTime() - hours * 60 * 60 * 1000);\n\n if (sessionKey) {\n return this.readRecentForSession(start, end, sessionKey);\n }\n return this.readRange(start.toISOString(), end.toISOString(), undefined, new Date(start.getTime() - 86_400_000).toISOString().slice(0, 10));\n }\n\n /**\n * Optimized read for a specific session: only looks in that session's channel\n * directory and only reads files whose date falls within the lookback window.\n */\n private async readRecentForSession(\n start: Date,\n end: Date,\n sessionKey: string,\n ): Promise<TranscriptEntry[]> {\n const { dir, alternateDir, legacyDir, readbackDirs } = this.getTranscriptPath(sessionKey);\n\n // Build set of date strings that overlap with [start, end].\n // Always include end's date to handle midnight-crossing lookbacks\n // (e.g. start=23:30 yesterday, end=00:30 today).\n const dateStrings = new Set<string>();\n const cursor = new Date(start);\n while (cursor <= end) {\n dateStrings.add(cursor.toISOString().slice(0, 10));\n cursor.setDate(cursor.getDate() + 1);\n }\n dateStrings.add(end.toISOString().slice(0, 10));\n\n const entries: TranscriptEntry[] = [];\n const files = await this.getSessionStorageFiles(\n this.transcriptsDir,\n dir,\n legacyDir,\n alternateDir,\n readbackDirs,\n );\n\n // Dedup identical raw rows that a partially-applied migration may have left\n // in both the primary dir and a read-back dir (issue #1496, cursor review).\n const keepRawLine = makeRawLineDeduper();\n for (const file of files) {\n // Only read files whose date is within the window\n const dateStr = file.name.slice(0, 10);\n if (!dateStrings.has(dateStr)) continue;\n\n try {\n const content = await readFile(file.path, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n const ts = new Date(entry.timestamp);\n // Half-open window: exclusive end. readRecent widens its own end by\n // 1ms so a just-written \"now\" entry is still captured here without\n // relaxing this bound for direct callers (tests/transcript-boundary).\n if (ts >= start && ts < end && entry.sessionKey === sessionKey && keepRawLine(line)) {\n entries.push(entry);\n }\n } catch {\n // skip malformed line\n }\n }\n } catch {\n // skip unreadable file\n }\n }\n\n entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n log.debug(`readRecentForSession: ${entries.length} entries from ${files.length} file(s) in ${dir}`);\n return entries;\n }\n\n /**\n * Cleanup old transcript entries that are older than retentionDays.\n * For hierarchical structure, reads each file and rewrites without old entries.\n * Legacy flat files are deleted if their date is older than retentionDays.\n * Returns the number of files processed (cleaned or deleted).\n */\n async cleanup(retentionDays: number): Promise<number> {\n if (retentionDays <= 0) {\n log.warn(\"cleanup called with invalid retentionDays:\", retentionDays);\n return 0;\n }\n\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - retentionDays);\n cutoff.setHours(0, 0, 0, 0);\n\n let processed = 0;\n\n try {\n const entries = await readdir(this.transcriptsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // This is a channel type directory (discord, slack, cron, main, etc.)\n const channelTypeDir = path.join(this.transcriptsDir, entry.name);\n try {\n const channelTypeEntries = await readdir(channelTypeDir, { withFileTypes: true });\n\n for (const channelTypeEntry of channelTypeEntries) {\n if (channelTypeEntry.isDirectory()) {\n // This is a channel ID directory - contains daily transcript files\n const channelDir = path.join(channelTypeDir, channelTypeEntry.name);\n try {\n const channelFiles = await readdir(channelDir);\n for (const file of channelFiles) {\n if (isMacOsReplicationJunkBasename(file) || !file.endsWith(\".jsonl\")) continue;\n\n const filePath = path.join(channelDir, file);\n\n // Check if file is a daily transcript file (YYYY-MM-DD.jsonl)\n if (this.isLegacyTranscriptFile(file)) {\n const dateStr = file.slice(0, 10);\n const fileDate = new Date(dateStr);\n\n if (!isNaN(fileDate.getTime()) && fileDate < cutoff) {\n try {\n await unlink(filePath);\n processed++;\n log.debug(`deleted old daily transcript file: ${entry.name}/${channelTypeEntry.name}/${file}`);\n } catch (err) {\n log.error(`failed to delete transcript file ${filePath}:`, err);\n }\n }\n } else {\n // Legacy file in new structure - clean up old entries\n const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);\n if (cleaned) {\n processed++;\n }\n }\n }\n } catch (err) {\n log.debug(`failed to process channel directory ${entry.name}/${channelTypeEntry.name}:`, err);\n }\n } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {\n // Legacy: channel type dir contains .jsonl files directly\n const filePath = path.join(channelTypeDir, channelTypeEntry.name);\n const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);\n if (cleaned) {\n processed++;\n }\n }\n }\n } catch (err) {\n log.debug(`failed to process channel type directory ${entry.name}:`, err);\n }\n } else if (entry.isFile() && entry.name.endsWith(\".jsonl\") && !isMacOsReplicationJunkBasename(entry.name)) {\n // Handle legacy flat files - delete if older than retentionDays\n if (this.isLegacyTranscriptFile(entry.name)) {\n const dateStr = entry.name.slice(0, 10);\n const fileDate = new Date(dateStr);\n\n if (!isNaN(fileDate.getTime()) && fileDate < cutoff) {\n const filePath = path.join(this.transcriptsDir, entry.name);\n try {\n await unlink(filePath);\n processed++;\n log.debug(`deleted old legacy transcript file: ${entry.name}`);\n } catch (err) {\n log.error(`failed to delete legacy transcript file ${entry.name}:`, err);\n }\n }\n }\n }\n }\n\n if (processed > 0) {\n log.info(`cleaned up ${processed} transcript file(s) older than ${retentionDays} days`);\n }\n\n return processed;\n } catch (err) {\n log.error(\"failed to cleanup old transcripts:\", err);\n return 0;\n }\n }\n\n /**\n * Clean up old entries from a single transcript file.\n * Reads the file, filters out entries older than cutoff, and rewrites if needed.\n * Returns true if the file was processed (cleaned or deleted).\n */\n private async cleanupTranscriptFile(filePath: string, cutoff: Date): Promise<boolean> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n\n const validLines: string[] = [];\n let hasOldEntries = false;\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as TranscriptEntry;\n const entryTime = new Date(entry.timestamp);\n\n if (entryTime >= cutoff) {\n validLines.push(line);\n } else {\n hasOldEntries = true;\n }\n } catch {\n // Keep malformed lines to avoid data loss\n validLines.push(line);\n }\n }\n\n if (validLines.length === 0) {\n // No valid entries left, delete the file\n try {\n await unlink(filePath);\n log.debug(`deleted empty transcript file: ${filePath}`);\n return true;\n } catch (err) {\n log.error(`failed to delete empty transcript file ${filePath}:`, err);\n return false;\n }\n }\n\n if (hasOldEntries) {\n // Rewrite file without old entries\n await writeFile(filePath, validLines.join(\"\\n\") + \"\\n\", \"utf-8\");\n log.debug(`cleaned old entries from transcript file: ${filePath}`);\n return true;\n }\n\n // No old entries found, no action needed\n return false;\n } catch (err) {\n // File doesn't exist or is unreadable\n return false;\n }\n }\n\n /**\n * Save a checkpoint to preserve conversation context.\n * Called when compaction is detected.\n */\n async saveCheckpoint(checkpoint: Checkpoint): Promise<void> {\n try {\n await writeFile(this.checkpointPath, JSON.stringify(checkpoint, null, 2), \"utf-8\");\n log.info(`saved checkpoint for session ${checkpoint.sessionKey} with ${checkpoint.turns.length} turn(s)`);\n } catch (err) {\n log.error(\"failed to save checkpoint:\", err);\n throw err;\n }\n }\n\n /**\n * Load a checkpoint if one exists and is not expired.\n * Returns null if no checkpoint exists or if it has expired.\n */\n async loadCheckpoint(sessionKey?: string): Promise<Checkpoint | null> {\n try {\n const raw = await readFile(this.checkpointPath, \"utf-8\");\n const checkpoint = JSON.parse(raw) as Checkpoint;\n\n // Validate checkpoint structure\n if (!checkpoint.sessionKey || !checkpoint.capturedAt || !checkpoint.ttl || !Array.isArray(checkpoint.turns)) {\n log.warn(\"checkpoint file has invalid structure\");\n return null;\n }\n\n // Check if checkpoint is for the requested session (if specified)\n if (sessionKey && checkpoint.sessionKey !== sessionKey) {\n log.debug(`checkpoint session mismatch: ${checkpoint.sessionKey} vs ${sessionKey}`);\n return null;\n }\n\n // Check if checkpoint has expired\n const ttl = new Date(checkpoint.ttl);\n if (isNaN(ttl.getTime())) {\n log.warn(\"checkpoint has invalid TTL format\");\n return null;\n }\n\n if (ttl < new Date()) {\n log.info(`checkpoint expired at ${checkpoint.ttl}`);\n return null;\n }\n\n log.info(`loaded checkpoint with ${checkpoint.turns.length} turn(s), expires at ${checkpoint.ttl}`);\n return checkpoint;\n } catch (err) {\n // File doesn't exist or is unreadable - that's fine\n log.debug(\"no valid checkpoint found\");\n return null;\n }\n }\n\n /**\n * Clear (delete) the checkpoint file.\n * Called after successful injection of checkpoint context.\n */\n async clearCheckpoint(): Promise<void> {\n try {\n await unlink(this.checkpointPath);\n log.info(\"cleared checkpoint\");\n } catch (err) {\n // File doesn't exist - that's fine\n log.debug(\"no checkpoint to clear\");\n }\n }\n\n /**\n * Format entries for recall injection.\n * Returns a formatted string suitable for injecting into agent context.\n *\n * Format:\n * ## Recent Conversation (last X hours)\n * [10:32] User: message content\n * [10:33] Assistant: response content\n *\n * Content is trimmed to approximately maxTokens.\n */\n formatForRecall(entries: TranscriptEntry[], maxTokens: number): string {\n if (entries.length === 0) {\n return \"\";\n }\n\n const maxTokenBudget = Math.max(0, Math.floor(maxTokens));\n if (maxTokenBudget === 0) return \"\";\n const lines: string[] = [];\n // Calculate time range for header\n const firstEntry = new Date(entries[0].timestamp);\n const lastEntry = new Date(entries[entries.length - 1].timestamp);\n const hoursDiff = Math.round((lastEntry.getTime() - firstEntry.getTime()) / (60 * 60 * 1000));\n\n // Add header\n if (hoursDiff < 1) {\n lines.push(\"## Recent Conversation (last few minutes)\");\n } else {\n lines.push(`## Recent Conversation (last ${hoursDiff} hour${hoursDiff === 1 ? \"\" : \"s\"})`);\n }\n lines.push(\"\");\n if (estimateTokenCount(lines.join(\"\\n\")) > maxTokenBudget) {\n return \"\";\n }\n\n // Format each entry\n const formattedEntries: string[] = [];\n for (const entry of entries) {\n const time = new Date(entry.timestamp);\n const timeStr = time.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n const roleLabel = entry.role === \"user\" ? \"User\" : \"Assistant\";\n formattedEntries.push(`[${timeStr}] ${roleLabel}: ${entry.content}`);\n }\n\n const selectedEntries: string[] = [];\n\n for (let i = formattedEntries.length - 1; i >= 0; i--) {\n const entry = formattedEntries[i];\n const candidate = [...lines, entry, ...selectedEntries, \"\"].join(\"\\n\");\n if (estimateTokenCount(candidate) > maxTokenBudget) {\n if (selectedEntries.length > 0) break;\n return \"\";\n }\n\n selectedEntries.unshift(entry);\n }\n if (selectedEntries.length === 0) return \"\";\n\n lines.push(...selectedEntries);\n lines.push(\"\"); // Trailing newline\n\n const result = lines.join(\"\\n\");\n log.debug(`formatted ${selectedEntries.length}/${entries.length} transcript entries for recall (~${result.length} chars)`);\n\n return result;\n }\n\n /**\n * Create a checkpoint from the current buffer state.\n * Helper method for creating checkpoints before compaction.\n */\n createCheckpoint(sessionKey: string, turns: TranscriptEntry[], ttlHours?: number): Checkpoint {\n const ttl = ttlHours ?? TranscriptManager.DEFAULT_CHECKPOINT_TTL_HOURS;\n const expiresAt = new Date();\n expiresAt.setHours(expiresAt.getHours() + ttl);\n\n return {\n sessionKey,\n capturedAt: new Date().toISOString(),\n turns: [...turns], // Copy turns to avoid mutation\n ttl: expiresAt.toISOString(),\n };\n }\n\n /**\n * Get statistics about stored transcripts.\n * Returns counts from the hierarchical directory structure.\n */\n async getStats(): Promise<{\n totalFiles: number;\n totalEntries: number;\n oldestFile: string | null;\n newestFile: string | null;\n channelTypes: Record<string, number>;\n }> {\n try {\n const allFiles = await this.getAllTranscriptFiles();\n\n if (allFiles.length === 0) {\n return {\n totalFiles: 0,\n totalEntries: 0,\n oldestFile: null,\n newestFile: null,\n channelTypes: {},\n };\n }\n\n // Sort files by path\n const sortedFiles = allFiles.sort();\n\n let totalEntries = 0;\n const channelTypes: Record<string, number> = {};\n\n for (const relativePath of allFiles) {\n const filePath = path.join(this.transcriptsDir, relativePath);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n totalEntries += lines.length;\n\n // Count by channel type (first directory in path)\n const channelType = relativePath.includes(path.sep)\n ? relativePath.split(path.sep)[0]\n : \"legacy\";\n channelTypes[channelType] = (channelTypes[channelType] || 0) + 1;\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n totalFiles: allFiles.length,\n totalEntries,\n oldestFile: sortedFiles[0],\n newestFile: sortedFiles[sortedFiles.length - 1],\n channelTypes,\n };\n } catch (err) {\n log.error(\"failed to get transcript stats:\", err);\n return {\n totalFiles: 0,\n totalEntries: 0,\n oldestFile: null,\n newestFile: null,\n channelTypes: {},\n };\n }\n }\n\n async analyzeIntegrity(): Promise<SessionIntegrityReport> {\n return analyzeSessionIntegrity({ memoryDir: this.config.memoryDir });\n }\n\n async getRecoverySummary(sessionKey?: string): Promise<{\n generatedAt: string;\n sessionKey?: string;\n healthy: boolean;\n issueCount: number;\n incompleteTurns: number;\n brokenChains: number;\n checkpointHealthy: boolean;\n }> {\n const report = await this.analyzeIntegrity();\n const selectedSessions = sessionKey\n ? report.sessions.filter((session) => session.sessionKey === sessionKey)\n : report.sessions;\n const incompleteTurns = selectedSessions.reduce((sum, session) => sum + session.incompleteTurns, 0);\n const brokenChains = selectedSessions.reduce((sum, session) => sum + session.brokenChains, 0);\n const filteredIssues = report.issues.filter((issue) => !sessionKey || issue.sessionKey === sessionKey);\n const issueCount = filteredIssues.length;\n const severeIssueCount = filteredIssues.filter((issue) => issue.severity !== \"info\").length;\n return {\n generatedAt: report.generatedAt,\n sessionKey,\n healthy: sessionKey ? severeIssueCount === 0 && report.checkpoint.healthy : report.healthy,\n issueCount,\n incompleteTurns,\n brokenChains,\n checkpointHealthy: report.checkpoint.healthy,\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  ActivityStore,
15
15
  MaintenanceScheduler
16
- } from "./chunk-MBENRPMY.js";
16
+ } from "./chunk-D3WNJF7D.js";
17
17
  import {
18
18
  runPeerProfileReasoner
19
19
  } from "./chunk-I74SUMNI.js";
@@ -22,7 +22,7 @@ import {
22
22
  } from "./chunk-VZAKYDMJ.js";
23
23
  import {
24
24
  LcmEngine
25
- } from "./chunk-PBE7NFB5.js";
25
+ } from "./chunk-BNQJKWWZ.js";
26
26
  import {
27
27
  chunkTranscriptEntries
28
28
  } from "./chunk-TECVW3JP.js";
@@ -32,18 +32,18 @@ import {
32
32
  import {
33
33
  CompoundingEngine,
34
34
  defaultTierMigrationCycleBudget
35
- } from "./chunk-LJUQPT5G.js";
35
+ } from "./chunk-EFRMEOZQ.js";
36
36
  import {
37
37
  SharedContextManager
38
38
  } from "./chunk-5KBIOI4G.js";
39
- import {
40
- cleanArchivedUserMessage
41
- } from "./chunk-47DU4SGJ.js";
42
39
  import {
43
40
  applyUtilityPromotionRuntimePolicy,
44
41
  applyUtilityRankingRuntimeDelta,
45
42
  loadUtilityRuntimeValues
46
43
  } from "./chunk-3Q3XD3NO.js";
44
+ import {
45
+ cleanArchivedUserMessage
46
+ } from "./chunk-47DU4SGJ.js";
47
47
  import {
48
48
  decideTierTransition
49
49
  } from "./chunk-GCBIXUPT.js";
@@ -179,7 +179,7 @@ import {
179
179
  } from "./chunk-LZIOY7ZU.js";
180
180
  import {
181
181
  ExtractionEngine
182
- } from "./chunk-XC7OYOQC.js";
182
+ } from "./chunk-4BCX6YLW.js";
183
183
  import {
184
184
  parseMemoryActionEligibilityContext
185
185
  } from "./chunk-JHU4EYDV.js";
@@ -210,7 +210,7 @@ import {
210
210
  buildEntityRecallSection,
211
211
  entityRecentTranscriptLookbackHours,
212
212
  readRecentEntityTranscriptEntries
213
- } from "./chunk-7FFGWIBN.js";
213
+ } from "./chunk-PCSQRQPJ.js";
214
214
  import {
215
215
  planEpisodeWindowsWithFallback
216
216
  } from "./chunk-T3GIETKV.js";
@@ -225,7 +225,7 @@ import {
225
225
  } from "./chunk-7G5NTS7F.js";
226
226
  import {
227
227
  refreshConvergedNamespaces
228
- } from "./chunk-HB5TNQMM.js";
228
+ } from "./chunk-L7BOS7KV.js";
229
229
  import {
230
230
  builtInConnectorPackageSpecifier,
231
231
  ensureBuiltInWearableConnectors,
@@ -234,40 +234,40 @@ import {
234
234
  runTimelinePublishCli,
235
235
  screenCandidateFact,
236
236
  summarizeVaultPublish
237
- } from "./chunk-MAURCRPQ.js";
238
- import {
239
- RoutingRulesStore
240
- } from "./chunk-TBUEE7XF.js";
237
+ } from "./chunk-Z3O7ZOCC.js";
241
238
  import {
242
239
  normalizeReplaySessionKey
243
240
  } from "./chunk-AJVLDJU6.js";
241
+ import {
242
+ RoutingRulesStore
243
+ } from "./chunk-TBUEE7XF.js";
244
244
  import {
245
245
  compareVerifiedEpisodeResults,
246
246
  searchVerifiedEpisodes
247
- } from "./chunk-GCJA5KKT.js";
247
+ } from "./chunk-XBNO56HC.js";
248
248
  import {
249
249
  ThreadingManager
250
250
  } from "./chunk-VHSQU3RO.js";
251
251
  import {
252
252
  compareVerifiedSemanticRuleResults,
253
253
  searchVerifiedSemanticRules
254
- } from "./chunk-X53HJENJ.js";
254
+ } from "./chunk-SPYFXSFZ.js";
255
255
  import {
256
256
  searchWorkProductLedgerEntries
257
257
  } from "./chunk-B2NXOVZN.js";
258
258
  import {
259
259
  TranscriptManager
260
- } from "./chunk-HDN7IVIO.js";
260
+ } from "./chunk-RIZ5NUNN.js";
261
261
  import {
262
262
  PolicyRuntimeManager
263
263
  } from "./chunk-2LA3H54D.js";
264
264
  import {
265
265
  runNamespaceMaintenanceFanout,
266
266
  summarizeNamespaceMaintenanceHealth
267
- } from "./chunk-P7HNMNN2.js";
267
+ } from "./chunk-K4SVTZWP.js";
268
268
  import {
269
269
  planNamespaceMaintenance
270
- } from "./chunk-Z3CKK5RR.js";
270
+ } from "./chunk-2XG7QECM.js";
271
271
  import {
272
272
  isAboveImportanceThreshold,
273
273
  scoreImportance
@@ -296,7 +296,7 @@ import {
296
296
  materializeAfterSemanticConsolidation,
297
297
  parseConsolidationResponse,
298
298
  parseOperatorAwareConsolidationResponse
299
- } from "./chunk-L4QYW2HO.js";
299
+ } from "./chunk-NBFHOQIO.js";
300
300
  import {
301
301
  semanticChunkContent
302
302
  } from "./chunk-2GBFKHBZ.js";
@@ -373,7 +373,7 @@ import {
373
373
  } from "./chunk-MI2OTWV5.js";
374
374
  import {
375
375
  MeetingsInputError
376
- } from "./chunk-EYIBIGIU.js";
376
+ } from "./chunk-R63X5BQA.js";
377
377
  import {
378
378
  WearablesInputError,
379
379
  describeErrorForOperator
@@ -391,7 +391,7 @@ import {
391
391
  } from "./chunk-HQPFACXO.js";
392
392
  import {
393
393
  NamespaceCatalog
394
- } from "./chunk-DEGE32C3.js";
394
+ } from "./chunk-SLORPQZT.js";
395
395
  import {
396
396
  RecallResultFormatter,
397
397
  SessionContextCoordinator,
@@ -400,17 +400,13 @@ import {
400
400
  detectPassiveCorrections,
401
401
  renderSessionExperiencePreview,
402
402
  scoreSessionExperienceForPrompt
403
- } from "./chunk-2JRLKDHV.js";
403
+ } from "./chunk-CZD654DQ.js";
404
404
  import {
405
405
  importCapsule
406
- } from "./chunk-2R7OCBRR.js";
406
+ } from "./chunk-YK7GOPIE.js";
407
407
  import {
408
408
  isCodingGraphInstalled
409
409
  } from "./chunk-VQ7B2Q6M.js";
410
- import {
411
- listTrustZoneRecords,
412
- searchTrustZoneRecords
413
- } from "./chunk-JWX2Q6HS.js";
414
410
  import {
415
411
  applyTrustScoreStage,
416
412
  buildTrustSignalsForRerank,
@@ -418,9 +414,13 @@ import {
418
414
  trustResultFor,
419
415
  trustResultKey
420
416
  } from "./chunk-GNVZQ5JN.js";
417
+ import {
418
+ listTrustZoneRecords,
419
+ searchTrustZoneRecords
420
+ } from "./chunk-JWX2Q6HS.js";
421
421
  import {
422
422
  HourlySummarizer
423
- } from "./chunk-G5NH3SSX.js";
423
+ } from "./chunk-X3KFSJLQ.js";
424
424
  import {
425
425
  LastRecallStore,
426
426
  RecallHandleHistoryStore,
@@ -439,7 +439,7 @@ import {
439
439
  } from "./chunk-ORVPS4ZW.js";
440
440
  import {
441
441
  searchHarmonicRetrieval
442
- } from "./chunk-C44DRDZM.js";
442
+ } from "./chunk-6WULHFNJ.js";
443
443
  import {
444
444
  ProfilingCollector
445
445
  } from "./chunk-DOWACHYO.js";
@@ -465,7 +465,7 @@ import {
465
465
  } from "./chunk-LXATZLSC.js";
466
466
  import {
467
467
  NamespaceStorageRouter
468
- } from "./chunk-DANFOVQG.js";
468
+ } from "./chunk-B7PLF3HW.js";
469
469
  import {
470
470
  GraphIndex
471
471
  } from "./chunk-BFBS7OFQ.js";
@@ -526,10 +526,10 @@ import {
526
526
  } from "./chunk-CSAKJVXW.js";
527
527
  import {
528
528
  LocalLlmClient
529
- } from "./chunk-AY2UK5XK.js";
529
+ } from "./chunk-BSBGI4BD.js";
530
530
  import {
531
531
  buildChainFollowupGenerator
532
- } from "./chunk-FGUWCE5I.js";
532
+ } from "./chunk-HUF4S4MY.js";
533
533
  import {
534
534
  capStateViewPackets,
535
535
  reconcileStateViewPairs,
@@ -567,7 +567,7 @@ import {
567
567
  reconstructFusionInputs,
568
568
  selfDeps,
569
569
  serializeFusionDay
570
- } from "./chunk-5IQL4N37.js";
570
+ } from "./chunk-D4WBMLPD.js";
571
571
  import {
572
572
  bodyIsEscaped,
573
573
  decodeTranscriptBody,
@@ -584,12 +584,12 @@ import {
584
584
  import {
585
585
  NamespaceSearchRouter,
586
586
  namespaceCollectionName
587
- } from "./chunk-SHVLNI4L.js";
587
+ } from "./chunk-LU66I56Q.js";
588
588
  import {
589
589
  createConversationIndexRuntime,
590
590
  createSearchBackend,
591
591
  isSearchBackendEnabled
592
- } from "./chunk-OBQ2NZAR.js";
592
+ } from "./chunk-VKDAJJQP.js";
593
593
  import {
594
594
  NoopSearchBackend
595
595
  } from "./chunk-CYEPCZN5.js";
@@ -32218,4 +32218,4 @@ export {
32218
32218
  qmdStartupCollectionChecksWithTimeout,
32219
32219
  Orchestrator
32220
32220
  };
32221
- //# sourceMappingURL=chunk-I4W2ADBP.js.map
32221
+ //# sourceMappingURL=chunk-S34XZUTY.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-DANFOVQG.js";
4
+ } from "./chunk-B7PLF3HW.js";
5
5
  import {
6
6
  MutationSerializer,
7
7
  withHeldFileLock
@@ -1596,4 +1596,4 @@ export {
1596
1596
  isNamespaceKind,
1597
1597
  NamespaceCatalog
1598
1598
  };
1599
- //# sourceMappingURL=chunk-DEGE32C3.js.map
1599
+ //# sourceMappingURL=chunk-SLORPQZT.js.map
@@ -2,7 +2,7 @@ import {
2
2
  WHO_KNOWS_DEFAULT_LIMIT,
3
3
  WHO_KNOWS_MAX_LIMIT,
4
4
  validateWhoKnowsInput
5
- } from "./chunk-ELUG6NKQ.js";
5
+ } from "./chunk-YSA4CYTK.js";
6
6
 
7
7
  // src/who-knows-cli.ts
8
8
  function extractWhoKnowsRawArgs(rest) {
@@ -74,4 +74,4 @@ export {
74
74
  renderWhoKnowsText,
75
75
  renderWhoKnows
76
76
  };
77
- //# sourceMappingURL=chunk-6RPPZL7W.js.map
77
+ //# sourceMappingURL=chunk-SMSJOWVE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-5IQL4N37.js";
3
+ } from "./chunk-D4WBMLPD.js";
4
4
  import {
5
5
  getCachedRuleMemories,
6
6
  setCachedRuleMemories
@@ -119,4 +119,4 @@ export {
119
119
  compareVerifiedSemanticRuleResults,
120
120
  searchVerifiedSemanticRules
121
121
  };
122
- //# sourceMappingURL=chunk-X53HJENJ.js.map
122
+ //# sourceMappingURL=chunk-SPYFXSFZ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runLocationSync
3
- } from "./chunk-233S3MXC.js";
3
+ } from "./chunk-YXUNSOHD.js";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-3WCASNQZ.js";
@@ -58,4 +58,4 @@ export {
58
58
  LOCATION_SYNC_DEFAULT_INTERVAL_MS,
59
59
  startLocationAutoSync
60
60
  };
61
- //# sourceMappingURL=chunk-IRFQKR4Y.js.map
61
+ //# sourceMappingURL=chunk-SW6OAWK7.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-2JRLKDHV.js";
6
+ } from "./chunk-CZD654DQ.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-D3USVQIV.js.map
29
+ //# sourceMappingURL=chunk-SZEPOUW2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-5IQL4N37.js";
3
+ } from "./chunk-D4WBMLPD.js";
4
4
  import {
5
5
  composeMemoryEnvelope
6
6
  } from "./chunk-JRVMCZE3.js";
@@ -546,4 +546,4 @@ export {
546
546
  setSemanticRulePromotionTestHooks,
547
547
  promoteSemanticRuleFromMemory
548
548
  };
549
- //# sourceMappingURL=chunk-COIQ5N4J.js.map
549
+ //# sourceMappingURL=chunk-TSITK6QK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listNamespaces
3
- } from "./chunk-BZTA7DR4.js";
3
+ } from "./chunk-35RSL5B4.js";
4
4
  import {
5
5
  corpusScanWorker
6
6
  } from "./chunk-4LZ7SVKM.js";
@@ -292,4 +292,4 @@ export {
292
292
  computeServiceCorpusWatermarks,
293
293
  computeServiceCorpusCensus
294
294
  };
295
- //# sourceMappingURL=chunk-HCFNZWFB.js.map
295
+ //# sourceMappingURL=chunk-VBNXDC7P.js.map
@@ -3,7 +3,7 @@ import {
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace,
5
5
  operationUsesPrincipalNamespace
6
- } from "./chunk-2JRLKDHV.js";
6
+ } from "./chunk-CZD654DQ.js";
7
7
  import {
8
8
  assertOperationAuthorizationAllowed
9
9
  } from "./chunk-YO2JEX2Z.js";
@@ -60,4 +60,4 @@ export {
60
60
  authorizationProbeNamespaces,
61
61
  authorizationProbeRequiresPrincipalNamespace
62
62
  };
63
- //# sourceMappingURL=chunk-G3PBNYDH.js.map
63
+ //# sourceMappingURL=chunk-VJ3HFCG2.js.map