@remnic/core 9.69.16 → 9.69.17

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 (280) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +43 -39
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +44 -40
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +43 -39
  7. package/dist/access-cli.js +103 -102
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.js +43 -39
  11. package/dist/access-http-lcm-compaction.d.ts +1 -1
  12. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  13. package/dist/access-http-offline-stream.d.ts +1 -1
  14. package/dist/access-http-query.js +45 -41
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +63 -59
  17. package/dist/access-identity-continuity-surface.js +43 -39
  18. package/dist/access-lcm-surface.d.ts +1 -1
  19. package/dist/access-lcm-surface.js +43 -39
  20. package/dist/access-mcp-output-schemas.js +1 -1
  21. package/dist/access-mcp.d.ts +1 -1
  22. package/dist/access-mcp.js +54 -50
  23. package/dist/access-namespace-preflight.js +43 -39
  24. package/dist/access-observe-transcript.d.ts +147 -0
  25. package/dist/access-observe-transcript.js +16 -0
  26. package/dist/access-observe-write-surface.d.ts +2 -1
  27. package/dist/access-observe-write-surface.js +43 -39
  28. package/dist/access-offline-manifest.js +3 -3
  29. package/dist/access-operations-batch.js +46 -42
  30. package/dist/access-operations.d.ts +2 -2
  31. package/dist/access-operations.js +51 -47
  32. package/dist/access-recall-concurrency.d.ts +1 -1
  33. package/dist/access-recall-concurrency.js +43 -39
  34. package/dist/access-recall-response.d.ts +1 -1
  35. package/dist/access-recall-response.js +43 -39
  36. package/dist/access-recall-surface.d.ts +1 -1
  37. package/dist/access-recall-surface.js +43 -39
  38. package/dist/access-schema.d.ts +4 -4
  39. package/dist/access-schema.js +5 -5
  40. package/dist/{access-service-tcC_jK6C.d.ts → access-service-DmDS8Y5P.d.ts} +9 -0
  41. package/dist/access-service-helpers.d.ts +1 -1
  42. package/dist/access-service.d.ts +1 -1
  43. package/dist/access-service.js +43 -39
  44. package/dist/access-surface-catalog.d.ts +1 -1
  45. package/dist/access-surface-catalog.js +45 -41
  46. package/dist/access-surface-catalog.js.map +1 -1
  47. package/dist/active-recall.js +6 -6
  48. package/dist/adapters/index.js +4 -4
  49. package/dist/adapters/registry.js +2 -2
  50. package/dist/{auto-sync-Q6Q2FVSC.js → auto-sync-GRUJFD2F.js} +3 -3
  51. package/dist/briefing.js +13 -13
  52. package/dist/causal-behavior.js +2 -2
  53. package/dist/causal-chain.js +2 -2
  54. package/dist/causal-consolidation.js +15 -15
  55. package/dist/causal-retrieval.js +2 -2
  56. package/dist/causal-trajectory-graph.js +2 -2
  57. package/dist/causal-trajectory.js +1 -1
  58. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  59. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  60. package/dist/{chunk-P6GKRT2H.js → chunk-2Z3DG5CQ.js} +1 -1
  61. package/dist/{chunk-MSDIETFC.js → chunk-376CEAYL.js} +53 -44
  62. package/dist/chunk-376CEAYL.js.map +1 -0
  63. package/dist/{chunk-XMIAU4CO.js → chunk-3ZAZ77WB.js} +2 -2
  64. package/dist/{chunk-3TSU662L.js → chunk-46QMN7I7.js} +5 -5
  65. package/dist/{chunk-LF6SHWVV.js → chunk-5CX3NSR7.js} +2 -2
  66. package/dist/{chunk-QRDSXR3V.js → chunk-5DRBG5U6.js} +2 -2
  67. package/dist/{chunk-I4QAH4SY.js → chunk-5J36BYRI.js} +3 -3
  68. package/dist/{chunk-7JV4JST3.js → chunk-5Z6JYMK4.js} +44 -44
  69. package/dist/{chunk-JGXMA6HL.js → chunk-6FUMA6AA.js} +2 -2
  70. package/dist/{chunk-K2IJH4D3.js → chunk-7RRUHJPG.js} +7 -7
  71. package/dist/{chunk-NNBZS3DY.js → chunk-AG46P24C.js} +4 -4
  72. package/dist/{chunk-QUVWFZOU.js → chunk-AYHPGLG6.js} +2 -2
  73. package/dist/{chunk-S35IIP5P.js → chunk-B67W7CBL.js} +2 -2
  74. package/dist/{chunk-OLBZ2WGG.js → chunk-C2JCVZWX.js} +2 -2
  75. package/dist/{chunk-S5G2LAL7.js → chunk-CHWUICVY.js} +4 -4
  76. package/dist/{chunk-XQGFIAG7.js → chunk-CM3JBYD4.js} +2 -2
  77. package/dist/{chunk-F2ERDKY2.js → chunk-CWPVXVIT.js} +16 -16
  78. package/dist/{chunk-BE4Y6GK6.js → chunk-D35XLYQ7.js} +11 -11
  79. package/dist/{chunk-P7LVYPIX.js → chunk-DBLVQROL.js} +3 -3
  80. package/dist/{chunk-5H2G5X4R.js → chunk-DGKQVGLC.js} +3 -3
  81. package/dist/{chunk-M7DGN6JZ.js → chunk-EQEP23JK.js} +2 -2
  82. package/dist/{chunk-I6DUKBUI.js → chunk-EYKDBZB3.js} +2 -2
  83. package/dist/{chunk-LUDXSSTW.js → chunk-FCL6ENLF.js} +2 -2
  84. package/dist/{chunk-LJAP4KSW.js → chunk-FK2SJX27.js} +2 -2
  85. package/dist/{chunk-4WIKMOE3.js → chunk-GF7QLY6E.js} +1 -1
  86. package/dist/{chunk-B64IVEOH.js → chunk-GI726D4G.js} +2 -2
  87. package/dist/{chunk-NHLEFBE2.js → chunk-I4Y6TBD7.js} +3 -3
  88. package/dist/{chunk-BO4PWIJY.js → chunk-I672YBXY.js} +3 -3
  89. package/dist/{chunk-HODFGQGT.js → chunk-IDZU6I4H.js} +2 -2
  90. package/dist/{chunk-OAKATRAN.js → chunk-IO4OJ73B.js} +10 -10
  91. package/dist/{chunk-CTCGHNWN.js → chunk-J2R275FN.js} +4 -4
  92. package/dist/{chunk-C25N5HWX.js → chunk-J6HRJ37H.js} +2 -2
  93. package/dist/{chunk-XJJYSX6F.js → chunk-JCUG7AXZ.js} +4 -4
  94. package/dist/{chunk-BX6GW4KC.js → chunk-JMAG7WZ7.js} +2 -2
  95. package/dist/{chunk-7LCGFUMB.js → chunk-KQAFEZQX.js} +4 -4
  96. package/dist/{chunk-BEXFNGQ3.js → chunk-LE7B5ETE.js} +3 -3
  97. package/dist/chunk-LVE64P5Y.js +80 -0
  98. package/dist/chunk-LVE64P5Y.js.map +1 -0
  99. package/dist/{chunk-VAMZYOOV.js → chunk-MAIBNEB6.js} +2 -2
  100. package/dist/{chunk-VYD63IFH.js → chunk-N3DSSCOR.js} +2 -2
  101. package/dist/{chunk-IEZ6CGTW.js → chunk-N3SS45OW.js} +115 -55
  102. package/dist/chunk-N3SS45OW.js.map +1 -0
  103. package/dist/{chunk-SXHBZXHK.js → chunk-NAOAZASM.js} +5 -5
  104. package/dist/{chunk-3BS2OGDT.js → chunk-NCUODVUI.js} +5 -5
  105. package/dist/{chunk-63I7LMLG.js → chunk-NISCAOSR.js} +2 -2
  106. package/dist/{chunk-YWN3GYI2.js → chunk-NYFWBYY4.js} +2 -2
  107. package/dist/{chunk-BIJAWZYW.js → chunk-OLT3YTDH.js} +4 -4
  108. package/dist/{chunk-BFDOBESV.js → chunk-QFMFZILG.js} +2 -2
  109. package/dist/{chunk-G7VEQEMG.js → chunk-QVSRE355.js} +65 -39
  110. package/dist/chunk-QVSRE355.js.map +1 -0
  111. package/dist/{chunk-N37X5RU7.js → chunk-RACZB5HT.js} +4 -4
  112. package/dist/{chunk-5JQV4T5Q.js → chunk-ROHBPMWD.js} +2 -2
  113. package/dist/{chunk-ZKZCJRRO.js → chunk-S6ZZOFVJ.js} +2 -2
  114. package/dist/{chunk-KLSPKMIO.js → chunk-SJ5JGIBT.js} +2 -2
  115. package/dist/{chunk-JHTF22NQ.js → chunk-TA7UZZMW.js} +2 -2
  116. package/dist/{chunk-2XJDAEAM.js → chunk-V5RWV5DK.js} +5 -5
  117. package/dist/{chunk-2EHDPHMD.js → chunk-W7M7NKR7.js} +2 -2
  118. package/dist/{chunk-4UVDLNHQ.js → chunk-WHO6ITU7.js} +2 -2
  119. package/dist/{chunk-7ZMU4XQT.js → chunk-WMZ6F7GY.js} +2 -2
  120. package/dist/{chunk-W6GEMUZM.js → chunk-WOEKJPJG.js} +13 -13
  121. package/dist/{chunk-5YQ7RFSO.js → chunk-WP37SBRE.js} +2 -2
  122. package/dist/{chunk-RJ57OOCD.js → chunk-X66BHMAU.js} +2 -2
  123. package/dist/{chunk-W272SWN7.js → chunk-X73YCO3E.js} +6 -6
  124. package/dist/{chunk-PAWIY5OQ.js → chunk-XAJWPB2V.js} +6 -6
  125. package/dist/{chunk-QVI63XSO.js → chunk-XR6LLNLU.js} +48 -48
  126. package/dist/{chunk-GIC6BASP.js → chunk-XZBXINXZ.js} +4 -4
  127. package/dist/{chunk-APZXA4WI.js → chunk-Y7E5SUZ6.js} +2 -2
  128. package/dist/{chunk-LDOQE34V.js → chunk-YCJASQMN.js} +2 -2
  129. package/dist/{chunk-H5IIBGDM.js → chunk-YYE5MKRX.js} +2 -2
  130. package/dist/{chunk-TRLCMLX7.js → chunk-YYP5GM6J.js} +2 -2
  131. package/dist/{chunk-OUKBMQ2O.js → chunk-Z3SQEEB6.js} +2 -2
  132. package/dist/{chunk-NN5CQTAJ.js → chunk-ZEBRENA6.js} +2 -2
  133. package/dist/{cli-BI9YYpKx.d.ts → cli-CYQIKncA.d.ts} +1 -1
  134. package/dist/cli.d.ts +2 -2
  135. package/dist/cli.js +85 -81
  136. package/dist/coding/export-okf-codegraph.js +12 -12
  137. package/dist/coding/pre-action-gate.js +2 -2
  138. package/dist/compounding/engine.js +12 -12
  139. package/dist/config.js +6 -6
  140. package/dist/connectors/codex-materialize-runner.js +12 -12
  141. package/dist/connectors/index.js +12 -12
  142. package/dist/convergence-refresh.js +14 -14
  143. package/dist/conversation-index/backend.js +2 -2
  144. package/dist/corpus-watermark.js +14 -14
  145. package/dist/deep-recall-http-glue.d.ts +1 -1
  146. package/dist/deep-recall-http-glue.js +6 -6
  147. package/dist/deep-recall-mcp-tools.d.ts +1 -1
  148. package/dist/deep-recall.js +2 -2
  149. package/dist/entity-retrieval.js +12 -12
  150. package/dist/external-wiki-access.d.ts +1 -1
  151. package/dist/external-wiki-access.js +44 -40
  152. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  153. package/dist/extraction.js +15 -15
  154. package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-DGTBFALQ.js} +4 -4
  155. package/dist/graph-edge-decay-DGTBFALQ.js.map +1 -0
  156. package/dist/graph-snapshot.js +3 -3
  157. package/dist/graph.js +2 -2
  158. package/dist/harmonic-retrieval.js +1 -1
  159. package/dist/index.d.ts +4 -4
  160. package/dist/index.js +119 -118
  161. package/dist/location/index.js +14 -14
  162. package/dist/maintenance/memory-governance.js +12 -12
  163. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +12 -12
  164. package/dist/maintenance/rebuild-memory-projection.js +13 -13
  165. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  166. package/dist/memory-subject-cli.d.ts +1 -1
  167. package/dist/memory-subject.d.ts +1 -1
  168. package/dist/namespaces/migrate.js +13 -13
  169. package/dist/namespaces/search.js +9 -9
  170. package/dist/namespaces/storage.js +12 -12
  171. package/dist/offline-sync.js +2 -2
  172. package/dist/operator-doctor-corpus.js +15 -15
  173. package/dist/operator-toolkit.js +28 -28
  174. package/dist/orchestration/maintenance.js +20 -20
  175. package/dist/orchestrator.js +103 -102
  176. package/dist/{public-http-Bocro5ZU.d.ts → public-http-C_hWt6I8.d.ts} +1 -1
  177. package/dist/resume-bundles.js +7 -7
  178. package/dist/search/factory.js +8 -8
  179. package/dist/search/index.js +13 -13
  180. package/dist/search/lancedb-backend.js +2 -2
  181. package/dist/search/meilisearch-backend.js +2 -2
  182. package/dist/search/orama-backend.js +2 -2
  183. package/dist/semantic-consolidation.js +13 -13
  184. package/dist/semantic-rule-promotion.js +12 -12
  185. package/dist/semantic-rule-verifier.js +12 -12
  186. package/dist/source-agent-qualifier.js +12 -12
  187. package/dist/standup/build.js +12 -12
  188. package/dist/storage.js +11 -11
  189. package/dist/summarizer.d.ts +29 -3
  190. package/dist/summarizer.js +6 -4
  191. package/dist/support-passport/index.d.ts +4 -4
  192. package/dist/support-passport/index.js +46 -42
  193. package/dist/transfer/capsule-export.js +2 -2
  194. package/dist/transfer/capsule-import.js +2 -2
  195. package/dist/transfer/export-okf.js +13 -13
  196. package/dist/verified-recall.js +12 -12
  197. package/dist/who-knows-cli.d.ts +1 -1
  198. package/dist/who-knows-cli.js +13 -13
  199. package/dist/who-knows.d.ts +1 -1
  200. package/dist/who-knows.js +12 -12
  201. package/package.json +2 -2
  202. package/src/access-mcp-output-schemas.ts +60 -34
  203. package/src/access-observe-transcript-persistence.test.ts +252 -0
  204. package/src/access-observe-transcript.ts +153 -0
  205. package/src/access-observe-write-surface.ts +234 -224
  206. package/src/access-service.ts +33 -28
  207. package/src/summarizer.ts +217 -111
  208. package/src/summary-snapshot.test.ts +8 -6
  209. package/dist/chunk-G7VEQEMG.js.map +0 -1
  210. package/dist/chunk-IEZ6CGTW.js.map +0 -1
  211. package/dist/chunk-MSDIETFC.js.map +0 -1
  212. /package/dist/{graph-edge-decay-FXGELBFA.js.map → access-observe-transcript.js.map} +0 -0
  213. /package/dist/{auto-sync-Q6Q2FVSC.js.map → auto-sync-GRUJFD2F.js.map} +0 -0
  214. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  215. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  216. /package/dist/{chunk-P6GKRT2H.js.map → chunk-2Z3DG5CQ.js.map} +0 -0
  217. /package/dist/{chunk-XMIAU4CO.js.map → chunk-3ZAZ77WB.js.map} +0 -0
  218. /package/dist/{chunk-3TSU662L.js.map → chunk-46QMN7I7.js.map} +0 -0
  219. /package/dist/{chunk-LF6SHWVV.js.map → chunk-5CX3NSR7.js.map} +0 -0
  220. /package/dist/{chunk-QRDSXR3V.js.map → chunk-5DRBG5U6.js.map} +0 -0
  221. /package/dist/{chunk-I4QAH4SY.js.map → chunk-5J36BYRI.js.map} +0 -0
  222. /package/dist/{chunk-7JV4JST3.js.map → chunk-5Z6JYMK4.js.map} +0 -0
  223. /package/dist/{chunk-JGXMA6HL.js.map → chunk-6FUMA6AA.js.map} +0 -0
  224. /package/dist/{chunk-K2IJH4D3.js.map → chunk-7RRUHJPG.js.map} +0 -0
  225. /package/dist/{chunk-NNBZS3DY.js.map → chunk-AG46P24C.js.map} +0 -0
  226. /package/dist/{chunk-QUVWFZOU.js.map → chunk-AYHPGLG6.js.map} +0 -0
  227. /package/dist/{chunk-S35IIP5P.js.map → chunk-B67W7CBL.js.map} +0 -0
  228. /package/dist/{chunk-OLBZ2WGG.js.map → chunk-C2JCVZWX.js.map} +0 -0
  229. /package/dist/{chunk-S5G2LAL7.js.map → chunk-CHWUICVY.js.map} +0 -0
  230. /package/dist/{chunk-XQGFIAG7.js.map → chunk-CM3JBYD4.js.map} +0 -0
  231. /package/dist/{chunk-F2ERDKY2.js.map → chunk-CWPVXVIT.js.map} +0 -0
  232. /package/dist/{chunk-BE4Y6GK6.js.map → chunk-D35XLYQ7.js.map} +0 -0
  233. /package/dist/{chunk-P7LVYPIX.js.map → chunk-DBLVQROL.js.map} +0 -0
  234. /package/dist/{chunk-5H2G5X4R.js.map → chunk-DGKQVGLC.js.map} +0 -0
  235. /package/dist/{chunk-M7DGN6JZ.js.map → chunk-EQEP23JK.js.map} +0 -0
  236. /package/dist/{chunk-I6DUKBUI.js.map → chunk-EYKDBZB3.js.map} +0 -0
  237. /package/dist/{chunk-LUDXSSTW.js.map → chunk-FCL6ENLF.js.map} +0 -0
  238. /package/dist/{chunk-LJAP4KSW.js.map → chunk-FK2SJX27.js.map} +0 -0
  239. /package/dist/{chunk-4WIKMOE3.js.map → chunk-GF7QLY6E.js.map} +0 -0
  240. /package/dist/{chunk-B64IVEOH.js.map → chunk-GI726D4G.js.map} +0 -0
  241. /package/dist/{chunk-NHLEFBE2.js.map → chunk-I4Y6TBD7.js.map} +0 -0
  242. /package/dist/{chunk-BO4PWIJY.js.map → chunk-I672YBXY.js.map} +0 -0
  243. /package/dist/{chunk-HODFGQGT.js.map → chunk-IDZU6I4H.js.map} +0 -0
  244. /package/dist/{chunk-OAKATRAN.js.map → chunk-IO4OJ73B.js.map} +0 -0
  245. /package/dist/{chunk-CTCGHNWN.js.map → chunk-J2R275FN.js.map} +0 -0
  246. /package/dist/{chunk-C25N5HWX.js.map → chunk-J6HRJ37H.js.map} +0 -0
  247. /package/dist/{chunk-XJJYSX6F.js.map → chunk-JCUG7AXZ.js.map} +0 -0
  248. /package/dist/{chunk-BX6GW4KC.js.map → chunk-JMAG7WZ7.js.map} +0 -0
  249. /package/dist/{chunk-7LCGFUMB.js.map → chunk-KQAFEZQX.js.map} +0 -0
  250. /package/dist/{chunk-BEXFNGQ3.js.map → chunk-LE7B5ETE.js.map} +0 -0
  251. /package/dist/{chunk-VAMZYOOV.js.map → chunk-MAIBNEB6.js.map} +0 -0
  252. /package/dist/{chunk-VYD63IFH.js.map → chunk-N3DSSCOR.js.map} +0 -0
  253. /package/dist/{chunk-SXHBZXHK.js.map → chunk-NAOAZASM.js.map} +0 -0
  254. /package/dist/{chunk-3BS2OGDT.js.map → chunk-NCUODVUI.js.map} +0 -0
  255. /package/dist/{chunk-63I7LMLG.js.map → chunk-NISCAOSR.js.map} +0 -0
  256. /package/dist/{chunk-YWN3GYI2.js.map → chunk-NYFWBYY4.js.map} +0 -0
  257. /package/dist/{chunk-BIJAWZYW.js.map → chunk-OLT3YTDH.js.map} +0 -0
  258. /package/dist/{chunk-BFDOBESV.js.map → chunk-QFMFZILG.js.map} +0 -0
  259. /package/dist/{chunk-N37X5RU7.js.map → chunk-RACZB5HT.js.map} +0 -0
  260. /package/dist/{chunk-5JQV4T5Q.js.map → chunk-ROHBPMWD.js.map} +0 -0
  261. /package/dist/{chunk-ZKZCJRRO.js.map → chunk-S6ZZOFVJ.js.map} +0 -0
  262. /package/dist/{chunk-KLSPKMIO.js.map → chunk-SJ5JGIBT.js.map} +0 -0
  263. /package/dist/{chunk-JHTF22NQ.js.map → chunk-TA7UZZMW.js.map} +0 -0
  264. /package/dist/{chunk-2XJDAEAM.js.map → chunk-V5RWV5DK.js.map} +0 -0
  265. /package/dist/{chunk-2EHDPHMD.js.map → chunk-W7M7NKR7.js.map} +0 -0
  266. /package/dist/{chunk-4UVDLNHQ.js.map → chunk-WHO6ITU7.js.map} +0 -0
  267. /package/dist/{chunk-7ZMU4XQT.js.map → chunk-WMZ6F7GY.js.map} +0 -0
  268. /package/dist/{chunk-W6GEMUZM.js.map → chunk-WOEKJPJG.js.map} +0 -0
  269. /package/dist/{chunk-5YQ7RFSO.js.map → chunk-WP37SBRE.js.map} +0 -0
  270. /package/dist/{chunk-RJ57OOCD.js.map → chunk-X66BHMAU.js.map} +0 -0
  271. /package/dist/{chunk-W272SWN7.js.map → chunk-X73YCO3E.js.map} +0 -0
  272. /package/dist/{chunk-PAWIY5OQ.js.map → chunk-XAJWPB2V.js.map} +0 -0
  273. /package/dist/{chunk-QVI63XSO.js.map → chunk-XR6LLNLU.js.map} +0 -0
  274. /package/dist/{chunk-GIC6BASP.js.map → chunk-XZBXINXZ.js.map} +0 -0
  275. /package/dist/{chunk-APZXA4WI.js.map → chunk-Y7E5SUZ6.js.map} +0 -0
  276. /package/dist/{chunk-LDOQE34V.js.map → chunk-YCJASQMN.js.map} +0 -0
  277. /package/dist/{chunk-H5IIBGDM.js.map → chunk-YYE5MKRX.js.map} +0 -0
  278. /package/dist/{chunk-TRLCMLX7.js.map → chunk-YYP5GM6J.js.map} +0 -0
  279. /package/dist/{chunk-OUKBMQ2O.js.map → chunk-Z3SQEEB6.js.map} +0 -0
  280. /package/dist/{chunk-NN5CQTAJ.js.map → chunk-ZEBRENA6.js.map} +0 -0
@@ -4,30 +4,30 @@ import {
4
4
  exportOkfBundle,
5
5
  firstHeading,
6
6
  parseIncludeStatus
7
- } from "../chunk-I4QAH4SY.js";
7
+ } from "../chunk-5J36BYRI.js";
8
8
  import {
9
9
  OKF_EXPORT_VERSION
10
- } from "../chunk-YWN3GYI2.js";
10
+ } from "../chunk-NYFWBYY4.js";
11
11
  import "../chunk-D24OXEPB.js";
12
12
  import "../chunk-3UXOZBHV.js";
13
- import "../chunk-VYD63IFH.js";
13
+ import "../chunk-N3DSSCOR.js";
14
14
  import "../chunk-UHVXE24Y.js";
15
15
  import "../chunk-4ZWCQJNM.js";
16
16
  import "../chunk-WVGXCBOC.js";
17
- import "../chunk-JGXMA6HL.js";
18
- import "../chunk-BE4Y6GK6.js";
19
- import "../chunk-N37X5RU7.js";
20
- import "../chunk-NNBZS3DY.js";
21
- import "../chunk-CYEPCZN5.js";
22
- import "../chunk-GIC6BASP.js";
17
+ import "../chunk-6FUMA6AA.js";
18
+ import "../chunk-D35XLYQ7.js";
23
19
  import "../chunk-YQNNHLCG.js";
24
- import "../chunk-W7IGLX4G.js";
25
20
  import "../chunk-6KTXE6A3.js";
21
+ import "../chunk-RACZB5HT.js";
22
+ import "../chunk-AG46P24C.js";
23
+ import "../chunk-CYEPCZN5.js";
24
+ import "../chunk-XZBXINXZ.js";
26
25
  import "../chunk-GUMZC2BO.js";
27
- import "../chunk-LEPOP46W.js";
26
+ import "../chunk-W7IGLX4G.js";
27
+ import "../chunk-227UFSEQ.js";
28
+ import "../chunk-ET356KSB.js";
28
29
  import "../chunk-72A4L5JJ.js";
29
30
  import "../chunk-A7Q43EUZ.js";
30
- import "../chunk-ET356KSB.js";
31
31
  import "../chunk-S2V7RUCL.js";
32
32
  import "../chunk-OYV6RKPM.js";
33
33
  import "../chunk-S2HLHAZ4.js";
@@ -38,8 +38,8 @@ import "../chunk-LDXUBPMO.js";
38
38
  import "../chunk-XSTNGNJP.js";
39
39
  import "../chunk-AAD2ZS6P.js";
40
40
  import "../chunk-LUDBXTBJ.js";
41
- import "../chunk-3ONXXHQO.js";
42
41
  import "../chunk-YXZG5TVN.js";
42
+ import "../chunk-3ONXXHQO.js";
43
43
  import "../chunk-5GINB5LC.js";
44
44
  import "../chunk-3WU7XOFN.js";
45
45
  import "../chunk-G7D6GZ5J.js";
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-LJAP4KSW.js";
4
+ } from "./chunk-FK2SJX27.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-VYD63IFH.js";
6
+ import "./chunk-N3DSSCOR.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-4ZWCQJNM.js";
9
9
  import "./chunk-WVGXCBOC.js";
10
- import "./chunk-JGXMA6HL.js";
11
- import "./chunk-BE4Y6GK6.js";
12
- import "./chunk-N37X5RU7.js";
13
- import "./chunk-NNBZS3DY.js";
14
- import "./chunk-CYEPCZN5.js";
15
- import "./chunk-GIC6BASP.js";
10
+ import "./chunk-6FUMA6AA.js";
11
+ import "./chunk-D35XLYQ7.js";
16
12
  import "./chunk-YQNNHLCG.js";
17
- import "./chunk-W7IGLX4G.js";
18
13
  import "./chunk-6KTXE6A3.js";
14
+ import "./chunk-RACZB5HT.js";
15
+ import "./chunk-AG46P24C.js";
16
+ import "./chunk-CYEPCZN5.js";
17
+ import "./chunk-XZBXINXZ.js";
19
18
  import "./chunk-GUMZC2BO.js";
20
- import "./chunk-LEPOP46W.js";
19
+ import "./chunk-W7IGLX4G.js";
20
+ import "./chunk-227UFSEQ.js";
21
+ import "./chunk-ET356KSB.js";
21
22
  import "./chunk-72A4L5JJ.js";
22
23
  import "./chunk-A7Q43EUZ.js";
23
- import "./chunk-ET356KSB.js";
24
24
  import "./chunk-S2V7RUCL.js";
25
25
  import "./chunk-OYV6RKPM.js";
26
26
  import "./chunk-S2HLHAZ4.js";
@@ -31,8 +31,8 @@ import "./chunk-LDXUBPMO.js";
31
31
  import "./chunk-XSTNGNJP.js";
32
32
  import "./chunk-AAD2ZS6P.js";
33
33
  import "./chunk-LUDBXTBJ.js";
34
- import "./chunk-3ONXXHQO.js";
35
34
  import "./chunk-YXZG5TVN.js";
35
+ import "./chunk-3ONXXHQO.js";
36
36
  import "./chunk-5GINB5LC.js";
37
37
  import "./chunk-3WU7XOFN.js";
38
38
  import "./chunk-G7D6GZ5J.js";
@@ -1,4 +1,4 @@
1
- import { W as WhoKnowsResult } from './access-service-tcC_jK6C.js';
1
+ import { W as WhoKnowsResult } from './access-service-DmDS8Y5P.js';
2
2
  import './types-Cy1l6fzp.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
@@ -4,26 +4,26 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-TRLCMLX7.js";
8
- import "./chunk-LUDXSSTW.js";
9
- import "./chunk-VYD63IFH.js";
7
+ } from "./chunk-YYP5GM6J.js";
8
+ import "./chunk-FCL6ENLF.js";
9
+ import "./chunk-N3DSSCOR.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-4ZWCQJNM.js";
12
12
  import "./chunk-WVGXCBOC.js";
13
- import "./chunk-JGXMA6HL.js";
14
- import "./chunk-BE4Y6GK6.js";
15
- import "./chunk-N37X5RU7.js";
16
- import "./chunk-NNBZS3DY.js";
17
- import "./chunk-CYEPCZN5.js";
18
- import "./chunk-GIC6BASP.js";
13
+ import "./chunk-6FUMA6AA.js";
14
+ import "./chunk-D35XLYQ7.js";
19
15
  import "./chunk-YQNNHLCG.js";
20
- import "./chunk-W7IGLX4G.js";
21
16
  import "./chunk-6KTXE6A3.js";
17
+ import "./chunk-RACZB5HT.js";
18
+ import "./chunk-AG46P24C.js";
19
+ import "./chunk-CYEPCZN5.js";
20
+ import "./chunk-XZBXINXZ.js";
22
21
  import "./chunk-GUMZC2BO.js";
23
- import "./chunk-LEPOP46W.js";
22
+ import "./chunk-W7IGLX4G.js";
23
+ import "./chunk-227UFSEQ.js";
24
+ import "./chunk-ET356KSB.js";
24
25
  import "./chunk-72A4L5JJ.js";
25
26
  import "./chunk-A7Q43EUZ.js";
26
- import "./chunk-ET356KSB.js";
27
27
  import "./chunk-S2V7RUCL.js";
28
28
  import "./chunk-OYV6RKPM.js";
29
29
  import "./chunk-S2HLHAZ4.js";
@@ -34,8 +34,8 @@ import "./chunk-LDXUBPMO.js";
34
34
  import "./chunk-XSTNGNJP.js";
35
35
  import "./chunk-AAD2ZS6P.js";
36
36
  import "./chunk-LUDBXTBJ.js";
37
- import "./chunk-3ONXXHQO.js";
38
37
  import "./chunk-YXZG5TVN.js";
38
+ import "./chunk-3ONXXHQO.js";
39
39
  import "./chunk-5GINB5LC.js";
40
40
  import "./chunk-3WU7XOFN.js";
41
41
  import "./chunk-G7D6GZ5J.js";
@@ -1,4 +1,4 @@
1
- export { bA as WHO_KNOWS_AUTHORSHIP_BONUS, bB as WHO_KNOWS_DEFAULT_LIMIT, bC as WHO_KNOWS_MAX_EVIDENCE, bD as WHO_KNOWS_MAX_LIMIT, bE as WHO_KNOWS_MCP_TOOLS, bF as WhoKnowsEntity, bG as WhoKnowsEvidence, bH as WhoKnowsHit, bI as WhoKnowsHttpOutcome, W as WhoKnowsResult, bJ as WhoKnowsStorage, bT as computeWhoKnows, bZ as handleWhoKnowsHttpQuery, c2 as loadWhoKnowsEntities, c9 as tokenizeTopic, ca as validateWhoKnowsInput } from './access-service-tcC_jK6C.js';
1
+ export { bA as WHO_KNOWS_AUTHORSHIP_BONUS, bB as WHO_KNOWS_DEFAULT_LIMIT, bC as WHO_KNOWS_MAX_EVIDENCE, bD as WHO_KNOWS_MAX_LIMIT, bE as WHO_KNOWS_MCP_TOOLS, bF as WhoKnowsEntity, bG as WhoKnowsEvidence, bH as WhoKnowsHit, bI as WhoKnowsHttpOutcome, W as WhoKnowsResult, bJ as WhoKnowsStorage, bT as computeWhoKnows, bZ as handleWhoKnowsHttpQuery, c2 as loadWhoKnowsEntities, c9 as tokenizeTopic, ca as validateWhoKnowsInput } from './access-service-DmDS8Y5P.js';
2
2
  import './types-Cy1l6fzp.js';
3
3
  import './orchestrator-DqLcuNMP.js';
4
4
  import './recall-state.js';
package/dist/who-knows.js CHANGED
@@ -9,25 +9,25 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-LUDXSSTW.js";
13
- import "./chunk-VYD63IFH.js";
12
+ } from "./chunk-FCL6ENLF.js";
13
+ import "./chunk-N3DSSCOR.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-4ZWCQJNM.js";
16
16
  import "./chunk-WVGXCBOC.js";
17
- import "./chunk-JGXMA6HL.js";
18
- import "./chunk-BE4Y6GK6.js";
19
- import "./chunk-N37X5RU7.js";
20
- import "./chunk-NNBZS3DY.js";
21
- import "./chunk-CYEPCZN5.js";
22
- import "./chunk-GIC6BASP.js";
17
+ import "./chunk-6FUMA6AA.js";
18
+ import "./chunk-D35XLYQ7.js";
23
19
  import "./chunk-YQNNHLCG.js";
24
- import "./chunk-W7IGLX4G.js";
25
20
  import "./chunk-6KTXE6A3.js";
21
+ import "./chunk-RACZB5HT.js";
22
+ import "./chunk-AG46P24C.js";
23
+ import "./chunk-CYEPCZN5.js";
24
+ import "./chunk-XZBXINXZ.js";
26
25
  import "./chunk-GUMZC2BO.js";
27
- import "./chunk-LEPOP46W.js";
26
+ import "./chunk-W7IGLX4G.js";
27
+ import "./chunk-227UFSEQ.js";
28
+ import "./chunk-ET356KSB.js";
28
29
  import "./chunk-72A4L5JJ.js";
29
30
  import "./chunk-A7Q43EUZ.js";
30
- import "./chunk-ET356KSB.js";
31
31
  import "./chunk-S2V7RUCL.js";
32
32
  import "./chunk-OYV6RKPM.js";
33
33
  import "./chunk-S2HLHAZ4.js";
@@ -38,8 +38,8 @@ import "./chunk-LDXUBPMO.js";
38
38
  import "./chunk-XSTNGNJP.js";
39
39
  import "./chunk-AAD2ZS6P.js";
40
40
  import "./chunk-LUDBXTBJ.js";
41
- import "./chunk-3ONXXHQO.js";
42
41
  import "./chunk-YXZG5TVN.js";
42
+ import "./chunk-3ONXXHQO.js";
43
43
  import "./chunk-5GINB5LC.js";
44
44
  import "./chunk-3WU7XOFN.js";
45
45
  import "./chunk-G7D6GZ5J.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.69.16",
3
+ "version": "9.69.17",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3227,7 +3227,7 @@
3227
3227
  "core"
3228
3228
  ],
3229
3229
  "peerDependencies": {
3230
- "@remnic/coding-graph": "^9.69.16"
3230
+ "@remnic/coding-graph": "^9.69.17"
3231
3231
  },
3232
3232
  "peerDependenciesMeta": {
3233
3233
  "@remnic/coding-graph": {
@@ -18,7 +18,7 @@ const T_NULLABLE_STRING = { type: ["string", "null"] } as const;
18
18
  /** Build a JSON Schema object type with the given properties. */
19
19
  function objectSchema(
20
20
  properties: Record<string, Readonly<Record<string, unknown>>>,
21
- required?: readonly string[],
21
+ required?: readonly string[]
22
22
  ): Record<string, unknown> {
23
23
  return {
24
24
  type: "object",
@@ -82,8 +82,20 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
82
82
  skipped: T_NUMBER,
83
83
  removed: T_ARRAY,
84
84
  }),
85
- deep_recall: objectSchema({ ok: T_BOOLEAN, error: T_NULLABLE_STRING, entries: T_ARRAY, trace: T_ARRAY, rendered: T_STRING }, ["entries", "trace"]),
86
- standup: objectSchema({ date: T_STRING, yesterday: T_STRING, today: T_STRING, highlights: T_ARRAY, priorities: T_ARRAY, blockers: T_ARRAY, activityGrid: T_STRING, markdown: T_STRING }),
85
+ deep_recall: objectSchema(
86
+ { ok: T_BOOLEAN, error: T_NULLABLE_STRING, entries: T_ARRAY, trace: T_ARRAY, rendered: T_STRING },
87
+ ["entries", "trace"]
88
+ ),
89
+ standup: objectSchema({
90
+ date: T_STRING,
91
+ yesterday: T_STRING,
92
+ today: T_STRING,
93
+ highlights: T_ARRAY,
94
+ priorities: T_ARRAY,
95
+ blockers: T_ARRAY,
96
+ activityGrid: T_STRING,
97
+ markdown: T_STRING,
98
+ }),
87
99
  action_confidence: objectSchema({
88
100
  schemaVersion: T_NUMBER,
89
101
  decision: T_STRING,
@@ -176,6 +188,7 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
176
188
  effectiveNamespace: T_STRING,
177
189
  lcmArchived: T_BOOLEAN,
178
190
  extractionQueued: T_BOOLEAN,
191
+ transcriptPersisted: T_BOOLEAN,
179
192
  }),
180
193
  lcm_search: objectSchema({
181
194
  query: T_STRING,
@@ -274,42 +287,45 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
274
287
  guidelineVersion: { type: ["number", "null"] } as const,
275
288
  }),
276
289
  memory_search: objectSchema({ query: T_STRING, results: T_ARRAY, count: T_NUMBER }),
277
- external_wiki_search: objectSchema({
278
- query: T_STRING,
279
- hits: {
280
- type: "array",
281
- items: {
282
- type: "object",
283
- properties: {
284
- wikiId: T_STRING,
285
- title: T_STRING,
286
- path: T_STRING,
287
- snippet: T_STRING,
288
- score: T_NUMBER,
289
- rank: T_NUMBER,
290
- citations: {
291
- type: "array",
292
- items: {
293
- type: "object",
294
- properties: {
295
- path: T_STRING,
296
- lineStart: T_NUMBER,
297
- lineEnd: T_NUMBER,
298
- note: T_STRING,
290
+ external_wiki_search: objectSchema(
291
+ {
292
+ query: T_STRING,
293
+ hits: {
294
+ type: "array",
295
+ items: {
296
+ type: "object",
297
+ properties: {
298
+ wikiId: T_STRING,
299
+ title: T_STRING,
300
+ path: T_STRING,
301
+ snippet: T_STRING,
302
+ score: T_NUMBER,
303
+ rank: T_NUMBER,
304
+ citations: {
305
+ type: "array",
306
+ items: {
307
+ type: "object",
308
+ properties: {
309
+ path: T_STRING,
310
+ lineStart: T_NUMBER,
311
+ lineEnd: T_NUMBER,
312
+ note: T_STRING,
313
+ },
314
+ required: ["path", "lineStart", "lineEnd", "note"],
315
+ additionalProperties: false,
299
316
  },
300
- required: ["path", "lineStart", "lineEnd", "note"],
301
- additionalProperties: false,
302
317
  },
318
+ indexBlurb: T_STRING,
303
319
  },
304
- indexBlurb: T_STRING,
320
+ required: ["wikiId", "title", "path", "snippet", "score", "rank", "citations"],
321
+ additionalProperties: false,
305
322
  },
306
- required: ["wikiId", "title", "path", "snippet", "score", "rank", "citations"],
307
- additionalProperties: false,
308
323
  },
324
+ count: T_NUMBER,
325
+ degradedWikiIds: T_ARRAY,
309
326
  },
310
- count: T_NUMBER,
311
- degradedWikiIds: T_ARRAY,
312
- }, ["query", "hits", "count", "degradedWikiIds"]),
327
+ ["query", "hits", "count", "degradedWikiIds"]
328
+ ),
313
329
  memory_profile: objectSchema({ profile: T_STRING }),
314
330
  memory_entities_list: objectSchema({ entities: T_ARRAY, count: T_NUMBER }),
315
331
  memory_questions: objectSchema({ questions: T_ARRAY, count: T_NUMBER }),
@@ -408,7 +424,17 @@ const TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {
408
424
  elapsedMs: T_NUMBER,
409
425
  skippedReason: T_STRING,
410
426
  }),
411
- memory_summarize_hourly: objectSchema({ ok: T_BOOLEAN, message: T_STRING }),
427
+ memory_summarize_hourly: objectSchema({
428
+ ok: T_BOOLEAN,
429
+ message: T_STRING,
430
+ sessionsConsidered: T_NUMBER,
431
+ sessionsWithEntries: T_NUMBER,
432
+ summariesWritten: T_NUMBER,
433
+ staleStore: T_BOOLEAN,
434
+ newestEntryTimestamp: T_NULLABLE_STRING,
435
+ scanFailed: T_BOOLEAN,
436
+ warning: T_STRING,
437
+ }),
412
438
  conversation_index_update: objectSchema({
413
439
  enabled: T_BOOLEAN,
414
440
  sessions: T_NUMBER,
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Issue #2783: the daemon's observe path must persist observe-derived turns
3
+ * into the transcript store, and `memory_summarize_hourly` must report an
4
+ * empty/stale transcript store distinctly instead of a bare unconditional
5
+ * ok. Delegate-mode gateways (and any observe-only client) starve the
6
+ * hourly summarizer otherwise — 11 days of silent empty runs in the field.
7
+ */
8
+ import assert from "node:assert/strict";
9
+ import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
10
+ import { tmpdir } from "node:os";
11
+ import path from "node:path";
12
+ import test from "node:test";
13
+
14
+ import { EngramAccessService } from "./access-service.js";
15
+ import { HourlySummarizer } from "./summarizer.js";
16
+ import { Orchestrator } from "./orchestrator.js";
17
+ import { TranscriptManager } from "./transcript.js";
18
+ import type { CodingContext, PluginConfig } from "./types.js";
19
+
20
+ interface StubOrchestrator {
21
+ config: PluginConfig;
22
+ transcript: TranscriptManager;
23
+ summarizer: HourlySummarizer;
24
+ lcmEngine?: undefined;
25
+ ingestReplayBatch: () => Promise<unknown[]>;
26
+ _codingContextBySession: Map<string, CodingContext>;
27
+ }
28
+
29
+ function makeService(
30
+ memoryDir: string,
31
+ transcriptEnabled: boolean,
32
+ transcriptSkipChannelTypes: string[] = []
33
+ ): { service: EngramAccessService; orchestrator: StubOrchestrator } {
34
+ const config = {
35
+ memoryDir,
36
+ transcriptEnabled,
37
+ transcriptSkipChannelTypes,
38
+ namespacesEnabled: false,
39
+ defaultNamespace: "default",
40
+ } as unknown as PluginConfig;
41
+ const orch = Object.create(Orchestrator.prototype) as Orchestrator;
42
+ const stub: StubOrchestrator = {
43
+ config,
44
+ transcript: new TranscriptManager(config),
45
+ summarizer: new HourlySummarizer(config),
46
+ lcmEngine: undefined,
47
+ ingestReplayBatch: async () => [],
48
+ _codingContextBySession: new Map<string, CodingContext>(),
49
+ };
50
+ Object.assign(orch as unknown as Record<string, unknown>, stub);
51
+ return { service: new EngramAccessService(orch), orchestrator: stub };
52
+ }
53
+
54
+ async function withTempDir(fn: (dir: string) => Promise<void>): Promise<void> {
55
+ const dir = await mkdtemp(path.join(tmpdir(), "remnic-2783-"));
56
+ try {
57
+ await fn(dir);
58
+ } finally {
59
+ await rm(dir, { recursive: true, force: true });
60
+ }
61
+ }
62
+
63
+ async function readAllTranscriptLines(dir: string): Promise<Array<Record<string, unknown>>> {
64
+ const root = path.join(dir, "transcripts");
65
+ const entries: Array<Record<string, unknown>> = [];
66
+ const typeDirs = await readdir(root, { withFileTypes: true }).catch(() => []);
67
+ for (const typeEnt of typeDirs) {
68
+ if (!typeEnt.isDirectory()) continue;
69
+ const idDirs = await readdir(path.join(root, typeEnt.name), { withFileTypes: true });
70
+ for (const idEnt of idDirs) {
71
+ if (!idEnt.isDirectory()) continue;
72
+ const files = await readdir(path.join(root, typeEnt.name, idEnt.name));
73
+ for (const file of files) {
74
+ if (!file.endsWith(".jsonl")) continue;
75
+ const raw = await readFile(path.join(root, typeEnt.name, idEnt.name, file), "utf-8");
76
+ for (const line of raw.split("\n")) {
77
+ if (line.trim().length === 0) continue;
78
+ entries.push(JSON.parse(line) as Record<string, unknown>);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return entries;
84
+ }
85
+
86
+ const USER_TURN = "please summarize the replication topology for the fleet";
87
+ const ASSISTANT_TURN = "the fleet uses one primary daemon with a replicated failover copy";
88
+
89
+ test("observe persists user and assistant turns into the transcript store (#2783)", async () => {
90
+ await withTempDir(async (dir) => {
91
+ const { service } = makeService(dir, true);
92
+ const response = await service.observe({
93
+ sessionKey: "agent:delegate-test:session-1",
94
+ messages: [
95
+ { role: "user", content: USER_TURN },
96
+ { role: "assistant", content: ASSISTANT_TURN },
97
+ ],
98
+ });
99
+ assert.equal(response.transcriptPersisted, true);
100
+ const entries = await readAllTranscriptLines(dir);
101
+ assert.equal(entries.length, 2);
102
+ assert.equal(entries[0]?.role, "user");
103
+ assert.equal(entries[0]?.content, USER_TURN);
104
+ assert.equal(entries[0]?.sessionKey, "agent:delegate-test:session-1");
105
+ assert.equal(entries[1]?.role, "assistant");
106
+ assert.equal(entries[1]?.content, ASSISTANT_TURN);
107
+ assert.equal(typeof entries[0]?.turnId, "string");
108
+ assert.equal(typeof entries[0]?.timestamp, "string");
109
+ });
110
+ });
111
+
112
+ test("observe filters short messages below the embedded parity noise floor (#2783)", async () => {
113
+ await withTempDir(async (dir) => {
114
+ const { service } = makeService(dir, true);
115
+ const response = await service.observe({
116
+ sessionKey: "agent:delegate-test:session-2",
117
+ messages: [
118
+ { role: "user", content: "ok" },
119
+ { role: "assistant", content: ASSISTANT_TURN },
120
+ ],
121
+ });
122
+ assert.equal(response.transcriptPersisted, true);
123
+ const entries = await readAllTranscriptLines(dir);
124
+ assert.equal(entries.length, 1);
125
+ assert.equal(entries[0]?.role, "assistant");
126
+ });
127
+ });
128
+
129
+ test("a re-POST of the same user turn is deduped; new turns still append (#2783)", async () => {
130
+ await withTempDir(async (dir) => {
131
+ const { service } = makeService(dir, true);
132
+ await service.observe({
133
+ sessionKey: "agent:delegate-test:session-3",
134
+ messages: [
135
+ { role: "user", content: USER_TURN },
136
+ { role: "assistant", content: ASSISTANT_TURN },
137
+ ],
138
+ });
139
+ // Un-keyed client retry of the SAME turn (no idempotencyKey).
140
+ await service.observe({
141
+ sessionKey: "agent:delegate-test:session-3",
142
+ messages: [
143
+ { role: "user", content: USER_TURN },
144
+ { role: "assistant", content: ASSISTANT_TURN },
145
+ ],
146
+ });
147
+ const afterRetry = await readAllTranscriptLines(dir);
148
+ assert.equal(afterRetry.length, 2);
149
+
150
+ // A genuinely new turn still appends.
151
+ await service.observe({
152
+ sessionKey: "agent:delegate-test:session-3",
153
+ messages: [{ role: "user", content: "now check the failover read path end to end please" }],
154
+ });
155
+ const afterNew = await readAllTranscriptLines(dir);
156
+ assert.equal(afterNew.length, 3);
157
+ });
158
+ });
159
+
160
+ test("transcript persistence is gated on the transcriptEnabled capability (#2783)", async () => {
161
+ await withTempDir(async (dir) => {
162
+ const { service } = makeService(dir, false);
163
+ const response = await service.observe({
164
+ sessionKey: "agent:delegate-test:session-4",
165
+ messages: [{ role: "user", content: USER_TURN }],
166
+ });
167
+ assert.equal(response.transcriptPersisted, false);
168
+ const entries = await readAllTranscriptLines(dir);
169
+ assert.equal(entries.length, 0);
170
+ });
171
+ });
172
+
173
+ test("memory_summarize_hourly warns distinctly when the transcript store is empty (#2783)", async () => {
174
+ await withTempDir(async (dir) => {
175
+ const { service } = makeService(dir, true);
176
+ const result = await service.memorySummarizeHourly();
177
+ assert.equal(result.ok, true);
178
+ assert.equal(result.sessionsConsidered, 0);
179
+ assert.equal(result.warning, "transcript store is empty");
180
+ assert.match(result.message, /transcript store is empty/);
181
+ });
182
+ });
183
+
184
+ test("memory_summarize_hourly warns distinctly when the store is stale and the hour was idle (#2783)", async () => {
185
+ await withTempDir(async (dir) => {
186
+ const { service, orchestrator } = makeService(dir, true);
187
+ // Seed one transcript entry far in the past: the store is non-empty but
188
+ // stale, and the target hour has no entries.
189
+ await orchestrator.transcript.append({
190
+ timestamp: new Date(Date.now() - 6 * 60 * 60 * 1000).toISOString(),
191
+ role: "user",
192
+ content: "an old turn from a much earlier hour",
193
+ sessionKey: "agent:delegate-test:session-5",
194
+ turnId: "seed-turn",
195
+ });
196
+ const result = await service.memorySummarizeHourly();
197
+ assert.equal(result.ok, true);
198
+ assert.ok(result.sessionsConsidered > 0);
199
+ assert.equal(result.sessionsWithEntries, 0);
200
+ assert.equal(result.staleStore, true);
201
+ assert.equal(result.warning, "no transcript entries for the target hour and no new entries recently");
202
+ });
203
+ });
204
+
205
+ test("observeTranscriptSessionKey scopes transcripts to the effective write namespace (#2783 review)", async () => {
206
+ const { observeTranscriptSessionKey } = await import("./access-observe-transcript.js");
207
+ const config = { defaultNamespace: "generalist" } as { defaultNamespace: string };
208
+ // Same client-controlled sessionKey from two principals in different
209
+ // namespaces must not share one transcript identity.
210
+ const a = observeTranscriptSessionKey("agent:shared-key:s1", "project-origin-aaa", config);
211
+ const b = observeTranscriptSessionKey("agent:shared-key:s1", "project-origin-bbb", config);
212
+ assert.notEqual(a, b);
213
+ assert.ok(a.includes("project-origin-aaa"));
214
+ assert.ok(b.includes("project-origin-bbb"));
215
+ // A default-store write keeps the raw key (single-store deployments
216
+ // unchanged, mirroring the LCM archive key rules).
217
+ assert.equal(observeTranscriptSessionKey("agent:shared-key:s1", "generalist", config), "agent:shared-key:s1");
218
+ });
219
+
220
+ test("skip-listed channel types report transcriptPersisted=false, not a silent success (#2783 review)", async () => {
221
+ await withTempDir(async (dir) => {
222
+ // cron is in the default skip list; a session whose channel type
223
+ // resolves to it must not report persisted=true for a no-op append.
224
+ const { service } = makeService(dir, true, ["cron"]);
225
+ const response = await service.observe({
226
+ sessionKey: "agent:nightly:cron:job-1",
227
+ messages: [{ role: "user", content: "this nightly cron turn must not claim transcript persistence" }],
228
+ });
229
+ assert.equal(response.transcriptPersisted, false);
230
+ const entries = await readAllTranscriptLines(dir);
231
+ assert.equal(entries.length, 0);
232
+ });
233
+ });
234
+
235
+ test("overlapping identical observes do not double-append the same turn (#2783 review)", async () => {
236
+ await withTempDir(async (dir) => {
237
+ const { service } = makeService(dir, true);
238
+ const [a, b] = await Promise.all([
239
+ service.observe({
240
+ sessionKey: "agent:overlap:s1",
241
+ messages: [{ role: "user", content: "the same turn submitted concurrently by a retrying client" }],
242
+ }),
243
+ service.observe({
244
+ sessionKey: "agent:overlap:s1",
245
+ messages: [{ role: "user", content: "the same turn submitted concurrently by a retrying client" }],
246
+ }),
247
+ ]);
248
+ const entries = await readAllTranscriptLines(dir);
249
+ assert.equal(entries.length, 1);
250
+ assert.equal(a.transcriptPersisted !== b.transcriptPersisted, true);
251
+ });
252
+ });