@remnic/core 9.5.0 → 9.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +12 -12
  3. package/dist/access-boundary.d.ts +6 -6
  4. package/dist/access-boundary.js +13 -13
  5. package/dist/access-cli.js +36 -36
  6. package/dist/access-http.d.ts +6 -6
  7. package/dist/access-http.js +17 -17
  8. package/dist/access-identity-continuity-surface.d.ts +5 -5
  9. package/dist/access-identity-continuity-surface.js +12 -12
  10. package/dist/access-lcm-surface.d.ts +6 -6
  11. package/dist/access-lcm-surface.js +12 -12
  12. package/dist/access-mcp.d.ts +6 -6
  13. package/dist/access-mcp.js +16 -16
  14. package/dist/access-observe-write-surface.d.ts +6 -6
  15. package/dist/access-observe-write-surface.js +12 -12
  16. package/dist/access-operations-batch.js +14 -14
  17. package/dist/access-operations.d.ts +7 -7
  18. package/dist/access-operations.js +15 -15
  19. package/dist/access-recall-surface.d.ts +6 -6
  20. package/dist/access-recall-surface.js +12 -12
  21. package/dist/access-schema.d.ts +4 -4
  22. package/dist/{access-service-DZX0sYAv.d.ts → access-service-CXJaql3A.d.ts} +4 -4
  23. package/dist/access-service.d.ts +6 -6
  24. package/dist/access-service.js +12 -12
  25. package/dist/access-surface-catalog.d.ts +6 -6
  26. package/dist/action-confidence.d.ts +1 -1
  27. package/dist/active-memory-bridge.d.ts +1 -1
  28. package/dist/active-recall.d.ts +1 -1
  29. package/dist/active-recall.js +1 -1
  30. package/dist/{auto-sync-G6IU7L6C.js → auto-sync-4A5YBWYO.js} +3 -3
  31. package/dist/behavior-learner.d.ts +1 -1
  32. package/dist/behavior-signals.d.ts +1 -1
  33. package/dist/bootstrap.d.ts +5 -5
  34. package/dist/briefing.d.ts +2 -2
  35. package/dist/briefing.js +4 -4
  36. package/dist/buffer-surprise-report.d.ts +1 -1
  37. package/dist/buffer.d.ts +2 -2
  38. package/dist/calibration.d.ts +1 -1
  39. package/dist/capabilities.d.ts +1 -1
  40. package/dist/{catalog-DoH2b0OR.d.ts → catalog-C9cu67Ig.d.ts} +1 -1
  41. package/dist/causal-behavior.d.ts +1 -1
  42. package/dist/causal-consolidation.d.ts +1 -1
  43. package/dist/causal-consolidation.js +5 -5
  44. package/dist/causal-trajectory-graph.d.ts +1 -1
  45. package/dist/{chunk-H5PFR5ZT.js → chunk-23JFRB73.js} +2 -2
  46. package/dist/{chunk-BGMSRN6I.js → chunk-3XIY7MDQ.js} +3 -3
  47. package/dist/{chunk-L2QJQSHL.js → chunk-4GNEDXDI.js} +2 -2
  48. package/dist/{chunk-MFDJ63U5.js → chunk-4LV23CHK.js} +2 -2
  49. package/dist/{chunk-AER6MT24.js → chunk-6SXVCD7W.js} +2 -2
  50. package/dist/{chunk-2SFEFR5I.js → chunk-72WG5QKN.js} +2 -2
  51. package/dist/{chunk-7BAJAXGB.js → chunk-7MW3CVLD.js} +2 -2
  52. package/dist/{chunk-SNNIUDRS.js → chunk-AYZJID4S.js} +2 -2
  53. package/dist/{chunk-M7XQSUBB.js → chunk-B3ABVQ36.js} +116 -9
  54. package/dist/chunk-B3ABVQ36.js.map +1 -0
  55. package/dist/{chunk-LNHJ32NK.js → chunk-BEM4D2QG.js} +3 -3
  56. package/dist/{chunk-AOYJVCFN.js → chunk-CYWA2CXR.js} +2 -2
  57. package/dist/{chunk-2JFDHI2K.js → chunk-DEG5ULFJ.js} +2 -2
  58. package/dist/{chunk-L6V3WJ55.js → chunk-DS7MM2ES.js} +3 -3
  59. package/dist/{chunk-CXEL3Y22.js → chunk-FKCRGLRD.js} +184 -29
  60. package/dist/{chunk-CXEL3Y22.js.map → chunk-FKCRGLRD.js.map} +1 -1
  61. package/dist/{chunk-TI7IHDBQ.js → chunk-H2DXDQCQ.js} +5 -5
  62. package/dist/{chunk-KMF67QDQ.js → chunk-HLN7RROI.js} +4 -4
  63. package/dist/{chunk-D2XYYU5Q.js → chunk-J3XHPFEU.js} +2 -2
  64. package/dist/{chunk-ODSYJXDU.js → chunk-JSNVWNGX.js} +2 -2
  65. package/dist/{chunk-7Z2DZNWN.js → chunk-KL4UAXUY.js} +43 -2
  66. package/dist/{chunk-7Z2DZNWN.js.map → chunk-KL4UAXUY.js.map} +1 -1
  67. package/dist/{chunk-4WNLSSHL.js → chunk-LADFWYHY.js} +4 -4
  68. package/dist/{chunk-UBGAOYBP.js → chunk-LR5DZ56F.js} +2 -2
  69. package/dist/{chunk-5K5VEDFY.js → chunk-N3JDIRBW.js} +2 -2
  70. package/dist/{chunk-2B7DP7AP.js → chunk-P454KXD6.js} +93 -15
  71. package/dist/chunk-P454KXD6.js.map +1 -0
  72. package/dist/{chunk-VWEWK2BM.js → chunk-PCLIWBGD.js} +3 -3
  73. package/dist/{chunk-TV7C3HCB.js → chunk-PNLFN2PZ.js} +2 -2
  74. package/dist/{chunk-STCCFQU5.js → chunk-PVUJ6WVV.js} +6 -6
  75. package/dist/{chunk-ITWTKT2R.js → chunk-RGK27ELN.js} +2 -2
  76. package/dist/{chunk-II6WHCCW.js → chunk-SIRPLF54.js} +2 -2
  77. package/dist/{chunk-UDCDGP6A.js → chunk-SVOHGUMI.js} +1188 -112
  78. package/dist/chunk-SVOHGUMI.js.map +1 -0
  79. package/dist/{chunk-NFTABV56.js → chunk-TLUDFPZL.js} +2 -2
  80. package/dist/{chunk-I74ZEBMA.js → chunk-UFUKHGZD.js} +4 -4
  81. package/dist/{chunk-L4UZBJNM.js → chunk-UTRJFDP2.js} +2 -2
  82. package/dist/{chunk-5GPPACXK.js → chunk-VSMRDBFT.js} +2 -1
  83. package/dist/{chunk-SNBEVJBX.js → chunk-XCL57M6Q.js} +3 -3
  84. package/dist/{chunk-DZSAXE3T.js → chunk-Y7UNNAZD.js} +2 -2
  85. package/dist/{chunk-XN3TUUX2.js → chunk-YQB32INI.js} +2 -2
  86. package/dist/{cli-1dghPCO2.d.ts → cli-CqdPA6z9.d.ts} +3 -3
  87. package/dist/cli.d.ts +7 -7
  88. package/dist/cli.js +29 -29
  89. package/dist/compounding/engine.d.ts +2 -2
  90. package/dist/compounding/engine.js +4 -4
  91. package/dist/compounding/preference-consolidator.d.ts +1 -1
  92. package/dist/compression-optimizer.d.ts +1 -1
  93. package/dist/config.d.ts +1 -1
  94. package/dist/config.js +1 -1
  95. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  96. package/dist/connectors/codex-materialize-runner.js +4 -4
  97. package/dist/connectors/codex-materialize.d.ts +1 -1
  98. package/dist/connectors/index.d.ts +1 -1
  99. package/dist/connectors/index.js +4 -4
  100. package/dist/consolidation-provenance-check.d.ts +2 -2
  101. package/dist/consolidation-undo.d.ts +2 -2
  102. package/dist/contradiction/index.d.ts +2 -2
  103. package/dist/conversation-index/backend.d.ts +1 -1
  104. package/dist/conversation-index/chunker.d.ts +1 -1
  105. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  106. package/dist/conversation-index/indexer.d.ts +1 -1
  107. package/dist/conversation-index/search.d.ts +1 -1
  108. package/dist/day-summary.d.ts +1 -1
  109. package/dist/delinearize.d.ts +1 -1
  110. package/dist/direct-answer-wiring.d.ts +1 -1
  111. package/dist/direct-answer.d.ts +1 -1
  112. package/dist/embedding-fallback.d.ts +1 -1
  113. package/dist/enrichment/index.d.ts +1 -1
  114. package/dist/entity-retrieval.d.ts +2 -2
  115. package/dist/entity-retrieval.js +4 -4
  116. package/dist/entity-schema.d.ts +1 -1
  117. package/dist/explicit-capture.d.ts +5 -5
  118. package/dist/extraction-faithfulness.d.ts +1 -1
  119. package/dist/extraction-judge-telemetry.d.ts +1 -1
  120. package/dist/extraction-judge-training.d.ts +1 -1
  121. package/dist/extraction-judge.d.ts +1 -1
  122. package/dist/extraction.d.ts +1 -1
  123. package/dist/fallback-llm.d.ts +1 -1
  124. package/dist/graph-dashboard-diff.d.ts +1 -1
  125. package/dist/graph-dashboard-key.d.ts +1 -1
  126. package/dist/graph-dashboard-parser.d.ts +1 -1
  127. package/dist/graph-edge-reinforcement.d.ts +1 -1
  128. package/dist/graph-snapshot.d.ts +1 -1
  129. package/dist/graph.d.ts +1 -1
  130. package/dist/identity-continuity.d.ts +1 -1
  131. package/dist/importance.d.ts +1 -1
  132. package/dist/index.d.ts +268 -17
  133. package/dist/index.js +80 -38
  134. package/dist/intent.d.ts +1 -1
  135. package/dist/lcm/engine.d.ts +1 -1
  136. package/dist/lcm/index.d.ts +1 -1
  137. package/dist/lcm/tools.d.ts +1 -1
  138. package/dist/lifecycle.d.ts +1 -1
  139. package/dist/live-connectors-runner.d.ts +1 -1
  140. package/dist/local-llm.d.ts +1 -1
  141. package/dist/local-model-endpoint.d.ts +1 -1
  142. package/dist/maintenance/memory-governance.d.ts +1 -1
  143. package/dist/maintenance/memory-governance.js +4 -4
  144. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
  145. package/dist/maintenance/rebuild-memory-projection.js +5 -5
  146. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  147. package/dist/memory-action-policy.d.ts +1 -1
  148. package/dist/memory-cache.d.ts +1 -1
  149. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  150. package/dist/memory-projection-store.d.ts +1 -1
  151. package/dist/memory-provenance.d.ts +1 -1
  152. package/dist/memory-worth-outcomes.d.ts +2 -2
  153. package/dist/models-json.d.ts +1 -1
  154. package/dist/namespaces/migrate.d.ts +3 -3
  155. package/dist/namespaces/migrate.js +11 -11
  156. package/dist/namespaces/principal.d.ts +1 -1
  157. package/dist/namespaces/search.d.ts +1 -1
  158. package/dist/namespaces/search.js +7 -7
  159. package/dist/namespaces/storage.d.ts +3 -3
  160. package/dist/namespaces/storage.js +4 -4
  161. package/dist/native-knowledge.d.ts +1 -1
  162. package/dist/operator-toolkit.d.ts +2 -2
  163. package/dist/operator-toolkit.js +15 -15
  164. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  165. package/dist/orchestration/maintenance.d.ts +2 -2
  166. package/dist/orchestration/maintenance.js +6 -6
  167. package/dist/{orchestrator-Dh3WSW_O.d.ts → orchestrator-CWFrT8AF.d.ts} +91 -60
  168. package/dist/orchestrator.d.ts +5 -5
  169. package/dist/orchestrator.js +36 -36
  170. package/dist/patterns-cli.d.ts +1 -1
  171. package/dist/policy-runtime.d.ts +1 -1
  172. package/dist/provenance.d.ts +1 -1
  173. package/dist/{qmd-DoUVxqND.d.ts → qmd--fnPMK60.d.ts} +1 -1
  174. package/dist/qmd-preflight.d.ts +2 -2
  175. package/dist/qmd-recall-cache.d.ts +1 -1
  176. package/dist/qmd.d.ts +2 -2
  177. package/dist/recall-disclosure-escalation.d.ts +1 -1
  178. package/dist/recall-explain-renderer.d.ts +1 -1
  179. package/dist/recall-planner-llm.d.ts +1 -1
  180. package/dist/recall-state.d.ts +1 -1
  181. package/dist/recall-tag-filter.d.ts +1 -1
  182. package/dist/recall-timings.d.ts +1 -1
  183. package/dist/recall-xray-cli.d.ts +1 -1
  184. package/dist/recall-xray-renderer.d.ts +1 -1
  185. package/dist/recall-xray.d.ts +1 -1
  186. package/dist/resolve-auth-token.d.ts +1 -1
  187. package/dist/resume-bundles.js +2 -2
  188. package/dist/retrieval-agents.d.ts +2 -2
  189. package/dist/retrieval-tiers.d.ts +1 -1
  190. package/dist/routing/engine.d.ts +1 -1
  191. package/dist/routing/store.d.ts +1 -1
  192. package/dist/schemas.d.ts +22 -22
  193. package/dist/search/document-scanner.js +2 -2
  194. package/dist/search/embed-helper.d.ts +1 -1
  195. package/dist/search/factory.d.ts +1 -1
  196. package/dist/search/factory.js +6 -6
  197. package/dist/search/index.d.ts +1 -1
  198. package/dist/search/index.js +6 -6
  199. package/dist/search/lancedb-backend.d.ts +1 -1
  200. package/dist/search/lancedb-backend.js +3 -3
  201. package/dist/search/meilisearch-backend.d.ts +1 -1
  202. package/dist/search/meilisearch-backend.js +3 -3
  203. package/dist/search/noop-backend.d.ts +1 -1
  204. package/dist/search/orama-backend.d.ts +1 -1
  205. package/dist/search/orama-backend.js +3 -3
  206. package/dist/search/port.d.ts +1 -1
  207. package/dist/search/remote-backend.d.ts +1 -1
  208. package/dist/{semantic-consolidation-Dof1865o.d.ts → semantic-consolidation-O5lMZ4LG.d.ts} +1 -1
  209. package/dist/semantic-consolidation.d.ts +2 -2
  210. package/dist/semantic-consolidation.js +5 -5
  211. package/dist/semantic-rule-promotion.js +4 -4
  212. package/dist/semantic-rule-verifier.d.ts +1 -1
  213. package/dist/semantic-rule-verifier.js +4 -4
  214. package/dist/session-observer-bands.d.ts +1 -1
  215. package/dist/session-observer-state.d.ts +1 -1
  216. package/dist/shared-context/manager.d.ts +1 -1
  217. package/dist/signal.d.ts +1 -1
  218. package/dist/storage-C1maCNbc.d.ts +1591 -0
  219. package/dist/storage.d.ts +5 -1239
  220. package/dist/storage.js +3 -3
  221. package/dist/summarizer.d.ts +1 -1
  222. package/dist/summary-snapshot.d.ts +1 -1
  223. package/dist/temporal-supersession.d.ts +2 -2
  224. package/dist/temporal-validity.d.ts +1 -1
  225. package/dist/threading.d.ts +1 -1
  226. package/dist/tier-migration.d.ts +2 -2
  227. package/dist/tier-routing.d.ts +1 -1
  228. package/dist/topics.d.ts +1 -1
  229. package/dist/transcript.d.ts +1 -1
  230. package/dist/transfer/types.d.ts +12 -12
  231. package/dist/trust-score-stage.d.ts +1 -1
  232. package/dist/trust-score.d.ts +1 -1
  233. package/dist/{types-C7HUgOuA.d.ts → types-CGgcNWCG.d.ts} +31 -1
  234. package/dist/types.d.ts +1 -1
  235. package/dist/utility-runtime.d.ts +1 -1
  236. package/dist/verified-recall.js +4 -4
  237. package/package.json +2 -2
  238. package/src/cli-wearables-fuse.test.ts +197 -0
  239. package/src/cli.ts +25 -0
  240. package/src/storage.ts +16 -0
  241. package/src/wearables/cli.test.ts +102 -0
  242. package/src/wearables/cli.ts +65 -0
  243. package/src/wearables/config.test.ts +32 -0
  244. package/src/wearables/config.ts +52 -0
  245. package/src/wearables/day-store.test.ts +246 -0
  246. package/src/wearables/day-store.ts +272 -3
  247. package/src/wearables/fusion/cluster.ts +230 -0
  248. package/src/wearables/fusion/fuse.ts +218 -0
  249. package/src/wearables/fusion/fusion.test.ts +2575 -0
  250. package/src/wearables/fusion/index.ts +50 -0
  251. package/src/wearables/fusion/reconcile.ts +831 -0
  252. package/src/wearables/fusion/reconstruct.ts +251 -0
  253. package/src/wearables/fusion/store.ts +480 -0
  254. package/src/wearables/fusion/types.ts +228 -0
  255. package/src/wearables/index.ts +41 -0
  256. package/src/wearables/service.test.ts +1030 -2
  257. package/src/wearables/service.ts +258 -16
  258. package/src/wearables/speakers.test.ts +128 -0
  259. package/src/wearables/speakers.ts +58 -4
  260. package/src/wearables/storage-io.test.ts +146 -0
  261. package/src/wearables/types.ts +31 -0
  262. package/dist/chunk-2B7DP7AP.js.map +0 -1
  263. package/dist/chunk-M7XQSUBB.js.map +0 -1
  264. package/dist/chunk-UDCDGP6A.js.map +0 -1
  265. /package/dist/{auto-sync-G6IU7L6C.js.map → auto-sync-4A5YBWYO.js.map} +0 -0
  266. /package/dist/{chunk-H5PFR5ZT.js.map → chunk-23JFRB73.js.map} +0 -0
  267. /package/dist/{chunk-BGMSRN6I.js.map → chunk-3XIY7MDQ.js.map} +0 -0
  268. /package/dist/{chunk-L2QJQSHL.js.map → chunk-4GNEDXDI.js.map} +0 -0
  269. /package/dist/{chunk-MFDJ63U5.js.map → chunk-4LV23CHK.js.map} +0 -0
  270. /package/dist/{chunk-AER6MT24.js.map → chunk-6SXVCD7W.js.map} +0 -0
  271. /package/dist/{chunk-2SFEFR5I.js.map → chunk-72WG5QKN.js.map} +0 -0
  272. /package/dist/{chunk-7BAJAXGB.js.map → chunk-7MW3CVLD.js.map} +0 -0
  273. /package/dist/{chunk-SNNIUDRS.js.map → chunk-AYZJID4S.js.map} +0 -0
  274. /package/dist/{chunk-LNHJ32NK.js.map → chunk-BEM4D2QG.js.map} +0 -0
  275. /package/dist/{chunk-AOYJVCFN.js.map → chunk-CYWA2CXR.js.map} +0 -0
  276. /package/dist/{chunk-2JFDHI2K.js.map → chunk-DEG5ULFJ.js.map} +0 -0
  277. /package/dist/{chunk-L6V3WJ55.js.map → chunk-DS7MM2ES.js.map} +0 -0
  278. /package/dist/{chunk-TI7IHDBQ.js.map → chunk-H2DXDQCQ.js.map} +0 -0
  279. /package/dist/{chunk-KMF67QDQ.js.map → chunk-HLN7RROI.js.map} +0 -0
  280. /package/dist/{chunk-D2XYYU5Q.js.map → chunk-J3XHPFEU.js.map} +0 -0
  281. /package/dist/{chunk-ODSYJXDU.js.map → chunk-JSNVWNGX.js.map} +0 -0
  282. /package/dist/{chunk-4WNLSSHL.js.map → chunk-LADFWYHY.js.map} +0 -0
  283. /package/dist/{chunk-UBGAOYBP.js.map → chunk-LR5DZ56F.js.map} +0 -0
  284. /package/dist/{chunk-5K5VEDFY.js.map → chunk-N3JDIRBW.js.map} +0 -0
  285. /package/dist/{chunk-VWEWK2BM.js.map → chunk-PCLIWBGD.js.map} +0 -0
  286. /package/dist/{chunk-TV7C3HCB.js.map → chunk-PNLFN2PZ.js.map} +0 -0
  287. /package/dist/{chunk-STCCFQU5.js.map → chunk-PVUJ6WVV.js.map} +0 -0
  288. /package/dist/{chunk-ITWTKT2R.js.map → chunk-RGK27ELN.js.map} +0 -0
  289. /package/dist/{chunk-II6WHCCW.js.map → chunk-SIRPLF54.js.map} +0 -0
  290. /package/dist/{chunk-NFTABV56.js.map → chunk-TLUDFPZL.js.map} +0 -0
  291. /package/dist/{chunk-I74ZEBMA.js.map → chunk-UFUKHGZD.js.map} +0 -0
  292. /package/dist/{chunk-L4UZBJNM.js.map → chunk-UTRJFDP2.js.map} +0 -0
  293. /package/dist/{chunk-5GPPACXK.js.map → chunk-VSMRDBFT.js.map} +0 -0
  294. /package/dist/{chunk-SNBEVJBX.js.map → chunk-XCL57M6Q.js.map} +0 -0
  295. /package/dist/{chunk-DZSAXE3T.js.map → chunk-Y7UNNAZD.js.map} +0 -0
  296. /package/dist/{chunk-XN3TUUX2.js.map → chunk-YQB32INI.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  dateInTimezone,
3
3
  defaultTimezone
4
- } from "./chunk-D2XYYU5Q.js";
4
+ } from "./chunk-J3XHPFEU.js";
5
5
  import "./chunk-YFBTVOMB.js";
6
6
  import "./chunk-JXS5PDQ7.js";
7
7
  import "./chunk-NDAH7BJ5.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-V7IZKJI3.js";
11
11
  import "./chunk-QDW3E4RD.js";
12
12
  import "./chunk-ZBJMUXZH.js";
13
- import "./chunk-M7XQSUBB.js";
13
+ import "./chunk-B3ABVQ36.js";
14
14
  import "./chunk-RL6NEVXT.js";
15
15
  import "./chunk-JIKJPDQJ.js";
16
16
  import "./chunk-K2ZLHESQ.js";
@@ -72,4 +72,4 @@ function startWearablesAutoSync(settings, deps) {
72
72
  export {
73
73
  startWearablesAutoSync
74
74
  };
75
- //# sourceMappingURL=auto-sync-G6IU7L6C.js.map
75
+ //# sourceMappingURL=auto-sync-4A5YBWYO.js.map
@@ -1,4 +1,4 @@
1
- import { B as BehaviorSignalEvent, P as PluginConfig, g as BehaviorLoopPolicyState } from './types-C7HUgOuA.js';
1
+ import { B as BehaviorSignalEvent, P as PluginConfig, g as BehaviorLoopPolicyState } from './types-CGgcNWCG.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { t as MemoryCategory, B as BehaviorSignalEvent } from './types-C7HUgOuA.js';
1
+ import { t as MemoryCategory, B as BehaviorSignalEvent } from './types-CGgcNWCG.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,9 +1,9 @@
1
- import { P as PluginConfig } from './types-C7HUgOuA.js';
2
- import { O as Orchestrator } from './orchestrator-Dh3WSW_O.js';
1
+ import { P as PluginConfig } from './types-CGgcNWCG.js';
2
+ import { O as Orchestrator } from './orchestrator-CWFrT8AF.js';
3
3
  import './types-gb_SNtjR.js';
4
4
  import './message-parts/index.js';
5
5
  import './briefing.js';
6
- import './storage.js';
6
+ import './storage-C1maCNbc.js';
7
7
  import './page-versioning.js';
8
8
  import './consolidation-operator.js';
9
9
  import './memory-projection-store.js';
@@ -23,7 +23,7 @@ import './session-integrity.js';
23
23
  import './summarizer.js';
24
24
  import './orchestration/maintenance.js';
25
25
  import './namespaces/search.js';
26
- import './catalog-DoH2b0OR.js';
26
+ import './catalog-C9cu67Ig.js';
27
27
  import './recall-state.js';
28
28
  import './compounding/engine.js';
29
29
  import './shared-context/manager.js';
@@ -33,7 +33,7 @@ import './utility-runtime.js';
33
33
  import './tier-routing.js';
34
34
  import './lifecycle.js';
35
35
  import './orchestration/compression-guideline-coordinator.js';
36
- import './semantic-consolidation-Dof1865o.js';
36
+ import './semantic-consolidation-O5lMZ4LG.js';
37
37
  import './connectors/codex-materialize.js';
38
38
  import './logger.js';
39
39
  import './embedding-fallback.js';
@@ -1,5 +1,5 @@
1
- import { StorageManager } from './storage.js';
2
- import { h as BriefingSections, i as BriefingFollowup, j as BriefingFocus, C as CalendarSource, k as CalendarEvent, M as MemoryFile, l as BriefingActiveThread, m as BriefingResult, E as EntityFile, n as BriefingRecentEntity } from './types-C7HUgOuA.js';
1
+ import { S as StorageManager } from './storage-C1maCNbc.js';
2
+ import { h as BriefingSections, i as BriefingFollowup, j as BriefingFocus, C as CalendarSource, k as CalendarEvent, M as MemoryFile, l as BriefingActiveThread, m as BriefingResult, E as EntityFile, n as BriefingRecentEntity } from './types-CGgcNWCG.js';
3
3
  import './page-versioning.js';
4
4
  import './consolidation-operator.js';
5
5
  import './memory-projection-store.js';
package/dist/briefing.js CHANGED
@@ -17,12 +17,12 @@ import {
17
17
  renderBriefingMarkdown,
18
18
  resolveBriefingSaveDir,
19
19
  validateBriefingFormat
20
- } from "./chunk-DZSAXE3T.js";
21
- import "./chunk-UDCDGP6A.js";
22
- import "./chunk-M7XQSUBB.js";
20
+ } from "./chunk-Y7UNNAZD.js";
21
+ import "./chunk-SVOHGUMI.js";
22
+ import "./chunk-B3ABVQ36.js";
23
23
  import "./chunk-L2B3EE7B.js";
24
24
  import "./chunk-5UZXUTVO.js";
25
- import "./chunk-5GPPACXK.js";
25
+ import "./chunk-VSMRDBFT.js";
26
26
  import "./chunk-EHK6KZHK.js";
27
27
  import "./chunk-6CIAGZ6X.js";
28
28
  import "./chunk-J6A3CX5N.js";
@@ -1,4 +1,4 @@
1
- import { X as BufferSurpriseEvent } from './types-C7HUgOuA.js';
1
+ import { X as BufferSurpriseEvent } from './types-CGgcNWCG.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
package/dist/buffer.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { StorageManager } from './storage.js';
2
- import { P as PluginConfig, o as BufferTurn } from './types-C7HUgOuA.js';
1
+ import { S as StorageManager } from './storage-C1maCNbc.js';
2
+ import { P as PluginConfig, o as BufferTurn } from './types-CGgcNWCG.js';
3
3
  import './page-versioning.js';
4
4
  import './consolidation-operator.js';
5
5
  import './memory-projection-store.js';
@@ -1,5 +1,5 @@
1
1
  import { FallbackLlmClient } from './fallback-llm.js';
2
- import { G as GatewayConfig, r as AgentPersonaModelConfig } from './types-C7HUgOuA.js';
2
+ import { G as GatewayConfig, r as AgentPersonaModelConfig } from './types-CGgcNWCG.js';
3
3
  import './resolve-provider-secret.js';
4
4
  import './types-gb_SNtjR.js';
5
5
  import './message-parts/index.js';
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig } from './types-C7HUgOuA.js';
1
+ import { P as PluginConfig } from './types-CGgcNWCG.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig } from './types-C7HUgOuA.js';
1
+ import { P as PluginConfig } from './types-CGgcNWCG.js';
2
2
 
3
3
  /**
4
4
  * Rebuildable namespace catalog (issue #1499).
@@ -2,7 +2,7 @@ import { CausalChainIndex } from './causal-chain.js';
2
2
  import { ConsolidatedPreference } from './compounding/preference-consolidator.js';
3
3
  import './causal-trajectory.js';
4
4
  import './objective-state.js';
5
- import './types-C7HUgOuA.js';
5
+ import './types-CGgcNWCG.js';
6
6
  import './types-gb_SNtjR.js';
7
7
  import './message-parts/index.js';
8
8
  import './lcm/engine.js';
@@ -1,4 +1,4 @@
1
- import { G as GatewayConfig, r as AgentPersonaModelConfig, P as PluginConfig, M as MemoryFile } from './types-C7HUgOuA.js';
1
+ import { G as GatewayConfig, r as AgentPersonaModelConfig, P as PluginConfig, M as MemoryFile } from './types-CGgcNWCG.js';
2
2
  import { RolloutSummaryInput, MaterializeResult } from './connectors/codex-materialize.js';
3
3
  import './types-gb_SNtjR.js';
4
4
  import './message-parts/index.js';
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-NKCPUHCI.js";
5
5
  import {
6
6
  buildExtensionsBlockForConsolidation
7
- } from "./chunk-UBGAOYBP.js";
7
+ } from "./chunk-LR5DZ56F.js";
8
8
  import {
9
9
  runPostConsolidationMaterialize
10
- } from "./chunk-ODSYJXDU.js";
10
+ } from "./chunk-JSNVWNGX.js";
11
11
  import "./chunk-QLULYKWZ.js";
12
12
  import "./chunk-JLNBQWZ2.js";
13
13
  import "./chunk-3UXOZBHV.js";
@@ -16,11 +16,11 @@ import {
16
16
  resolveCausalTrajectoryStoreDir
17
17
  } from "./chunk-7XGSIUP5.js";
18
18
  import "./chunk-ZBJMUXZH.js";
19
- import "./chunk-UDCDGP6A.js";
20
- import "./chunk-M7XQSUBB.js";
19
+ import "./chunk-SVOHGUMI.js";
20
+ import "./chunk-B3ABVQ36.js";
21
21
  import "./chunk-L2B3EE7B.js";
22
22
  import "./chunk-5UZXUTVO.js";
23
- import "./chunk-5GPPACXK.js";
23
+ import "./chunk-VSMRDBFT.js";
24
24
  import "./chunk-EHK6KZHK.js";
25
25
  import "./chunk-6CIAGZ6X.js";
26
26
  import "./chunk-J6A3CX5N.js";
@@ -1,7 +1,7 @@
1
1
  import { GraphEdge } from './graph.js';
2
2
  import { CausalTrajectoryRecord } from './causal-trajectory.js';
3
3
  import './capabilities.js';
4
- import './types-C7HUgOuA.js';
4
+ import './types-CGgcNWCG.js';
5
5
  import './types-gb_SNtjR.js';
6
6
  import './message-parts/index.js';
7
7
  import './objective-state.js';
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  planNamespaceMaintenance,
12
12
  runNamespaceMaintenanceBatchPlan
13
- } from "./chunk-MFDJ63U5.js";
13
+ } from "./chunk-4LV23CHK.js";
14
14
  import {
15
15
  resolveConsolidationCapabilities,
16
16
  resolveNamespaceCapabilities,
@@ -447,4 +447,4 @@ var MaintenanceScheduler = class {
447
447
  export {
448
448
  MaintenanceScheduler
449
449
  };
450
- //# sourceMappingURL=chunk-H5PFR5ZT.js.map
450
+ //# sourceMappingURL=chunk-23JFRB73.js.map
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-TBBDFYXW.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-UDCDGP6A.js";
6
+ } from "./chunk-SVOHGUMI.js";
7
7
  import {
8
8
  assertPathInsideRoot
9
- } from "./chunk-5GPPACXK.js";
9
+ } from "./chunk-VSMRDBFT.js";
10
10
  import {
11
11
  RECALL_FALLBACK_DIRS
12
12
  } from "./chunk-VS2IYZRU.js";
@@ -751,4 +751,4 @@ export {
751
751
  listMemoryGovernanceRuns,
752
752
  readMemoryGovernanceRunArtifact
753
753
  };
754
- //# sourceMappingURL=chunk-BGMSRN6I.js.map
754
+ //# sourceMappingURL=chunk-3XIY7MDQ.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-D7FOKIY5.js";
6
6
  import {
7
7
  EngramAccessInputError
8
- } from "./chunk-TI7IHDBQ.js";
8
+ } from "./chunk-H2DXDQCQ.js";
9
9
  import {
10
10
  expandTildePath
11
11
  } from "./chunk-EYIEWJNI.js";
@@ -274,4 +274,4 @@ export {
274
274
  listRegisteredOperations,
275
275
  __resetRegistryForTest
276
276
  };
277
- //# sourceMappingURL=chunk-L2QJQSHL.js.map
277
+ //# sourceMappingURL=chunk-4GNEDXDI.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-TV7C3HCB.js";
4
+ } from "./chunk-PNLFN2PZ.js";
5
5
  import {
6
6
  getConfiguredNamespaces
7
7
  } from "./chunk-BAVVI5GP.js";
@@ -2042,4 +2042,4 @@ export {
2042
2042
  runNamespaceMaintenancePlan,
2043
2043
  runNamespaceMaintenanceBatchPlan
2044
2044
  };
2045
- //# sourceMappingURL=chunk-MFDJ63U5.js.map
2045
+ //# sourceMappingURL=chunk-4LV23CHK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  assertPathInsideRoot
3
- } from "./chunk-5GPPACXK.js";
3
+ } from "./chunk-VSMRDBFT.js";
4
4
  import {
5
5
  RECALL_FALLBACK_DIRS
6
6
  } from "./chunk-VS2IYZRU.js";
@@ -92,4 +92,4 @@ async function scanMemoryDir(memoryDir) {
92
92
  export {
93
93
  scanMemoryDir
94
94
  };
95
- //# sourceMappingURL=chunk-AER6MT24.js.map
95
+ //# sourceMappingURL=chunk-6SXVCD7W.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-UDCDGP6A.js";
3
+ } from "./chunk-SVOHGUMI.js";
4
4
 
5
5
  // src/semantic-rule-promotion.ts
6
6
  import { createHash, randomUUID } from "crypto";
@@ -529,4 +529,4 @@ export {
529
529
  setSemanticRulePromotionTestHooks,
530
530
  promoteSemanticRuleFromMemory
531
531
  };
532
- //# sourceMappingURL=chunk-2SFEFR5I.js.map
532
+ //# sourceMappingURL=chunk-72WG5QKN.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  scanMemoryDir
3
- } from "./chunk-AER6MT24.js";
3
+ } from "./chunk-6SXVCD7W.js";
4
4
  import {
5
5
  isSearchAborted,
6
6
  throwIfSearchAborted
@@ -613,4 +613,4 @@ export {
613
613
  resolveOramaCollectionDbFilePath,
614
614
  OramaBackend
615
615
  };
616
- //# sourceMappingURL=chunk-7BAJAXGB.js.map
616
+ //# sourceMappingURL=chunk-7MW3CVLD.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-UI4FVU6T.js";
5
5
  import {
6
6
  StorageManager
7
- } from "./chunk-UDCDGP6A.js";
7
+ } from "./chunk-SVOHGUMI.js";
8
8
  import {
9
9
  parseContinuityImprovementLoops
10
10
  } from "./chunk-LDXUBPMO.js";
@@ -1276,4 +1276,4 @@ export {
1276
1276
  defaultTierMigrationCycleBudget,
1277
1277
  CompoundingEngine
1278
1278
  };
1279
- //# sourceMappingURL=chunk-SNNIUDRS.js.map
1279
+ //# sourceMappingURL=chunk-AYZJID4S.js.map
@@ -2,6 +2,16 @@
2
2
  import { promises as fsPromises } from "fs";
3
3
  import * as path from "path";
4
4
  var DEFAULT_SELF_NAME = "Me";
5
+ var SELF_MARKER_SUFFIX = " (you)";
6
+ var SELF_MARKER = "(you)";
7
+ function stripSelfMarker(name) {
8
+ const trimmed = name.trimEnd();
9
+ if (!trimmed.endsWith(SELF_MARKER)) return trimmed;
10
+ return trimmed.slice(0, -SELF_MARKER.length).trimEnd();
11
+ }
12
+ function hasSelfMarker(label) {
13
+ return label.trimEnd().endsWith(SELF_MARKER);
14
+ }
5
15
  function emptySpeakerRegistry() {
6
16
  return { version: 1, selfName: DEFAULT_SELF_NAME, speakers: {} };
7
17
  }
@@ -63,18 +73,22 @@ function resolveSpeaker(sourceId, segment, registry) {
63
73
  const override = registry.speakers[speakerRegistryKey(sourceId, segment.speakerKey)];
64
74
  if (override) {
65
75
  const isSelf = override.isSelf === true;
76
+ const base = stripSelfMarker(override.name);
66
77
  return {
67
- label: isSelf ? `${override.name} (you)` : override.name,
78
+ label: isSelf ? `${base}${SELF_MARKER_SUFFIX}` : base,
68
79
  isSelf
69
80
  };
70
81
  }
71
82
  if (segment.isWearer === true) {
72
- return { label: `${registry.selfName} (you)`, isSelf: true };
83
+ return {
84
+ label: `${stripSelfMarker(registry.selfName)}${SELF_MARKER_SUFFIX}`,
85
+ isSelf: true
86
+ };
73
87
  }
74
88
  if (typeof segment.speakerName === "string" && segment.speakerName.trim().length > 0) {
75
- return { label: segment.speakerName.trim(), isSelf: false };
89
+ return { label: stripSelfMarker(segment.speakerName.trim()), isSelf: false };
76
90
  }
77
- const key = segment.speakerKey.trim();
91
+ const key = stripSelfMarker(segment.speakerKey.trim());
78
92
  if (/^\d+$/.test(key)) {
79
93
  return { label: `Speaker ${key}`, isSelf: false };
80
94
  }
@@ -97,13 +111,46 @@ function distinctSpeakerLabels(sourceId, segments, registry) {
97
111
  import { createHash } from "crypto";
98
112
  var WEARABLES_DIR_NAME = "wearables";
99
113
  var DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
114
+ var TRANSCRIPT_FORMAT_VERSION = 2;
115
+ function isRegexWhitespace(code) {
116
+ return code >= 9 && code <= 13 || code === 32 || code === 160 || code === 5760 || code >= 8192 && code <= 8202 || code === 8232 || code === 8233 || code === 8239 || code === 8287 || code === 12288 || code === 65279;
117
+ }
118
+ function parseTranscriptSegmentLine(line) {
119
+ if (!line.startsWith("**")) return null;
120
+ let labelEnd = -1;
121
+ for (let i = 3; i < line.length; i++) {
122
+ if (line.charCodeAt(i) !== 42 || i + 3 >= line.length || line.charCodeAt(i + 1) !== 42 || !isRegexWhitespace(line.charCodeAt(i + 2)) || line.charCodeAt(i + 3) !== 91) {
123
+ continue;
124
+ }
125
+ labelEnd = i;
126
+ break;
127
+ }
128
+ if (labelEnd === -1) return null;
129
+ const label = line.slice(2, labelEnd);
130
+ const clockStart = labelEnd + 4;
131
+ let clockEnd = -1;
132
+ for (let i = clockStart + 1; i < line.length; i++) {
133
+ if (line.charCodeAt(i) !== 93 || i + 2 >= line.length || line.charCodeAt(i + 1) !== 58 || !isRegexWhitespace(line.charCodeAt(i + 2))) {
134
+ continue;
135
+ }
136
+ clockEnd = i;
137
+ break;
138
+ }
139
+ if (clockEnd === -1) return null;
140
+ return {
141
+ label,
142
+ clock: line.slice(clockStart, clockEnd),
143
+ text: line.slice(clockEnd + 3)
144
+ };
145
+ }
100
146
  function isValidTranscriptDate(date) {
101
147
  if (!DATE_PATTERN.test(date)) return false;
102
148
  const parsed = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
103
149
  return !Number.isNaN(parsed.getTime()) && parsed.toISOString().slice(0, 10) === date;
104
150
  }
105
151
  function hashTranscriptBody(body) {
106
- return createHash("sha256").update(body, "utf-8").digest("hex");
152
+ return createHash("sha256").update(`v${TRANSCRIPT_FORMAT_VERSION}
153
+ ${body}`, "utf-8").digest("hex");
107
154
  }
108
155
  function formatClockTime(iso, timezone) {
109
156
  if (!iso) return "--:--";
@@ -126,6 +173,48 @@ function conversationDurationMinutes(conversation) {
126
173
  if (Number.isNaN(start) || Number.isNaN(end) || end <= start) return 0;
127
174
  return (end - start) / 6e4;
128
175
  }
176
+ function escapeSegmentText(text) {
177
+ return text.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
178
+ }
179
+ function unescapeSegmentText(text) {
180
+ return text.replace(/\\(.)/g, (_match, ch) => {
181
+ if (ch === "n") return "\n";
182
+ if (ch === "r") return "\r";
183
+ if (ch === "\\") return "\\";
184
+ return "\\" + ch;
185
+ });
186
+ }
187
+ function escapeSpeakerLabel(label) {
188
+ return label.replace(/\\/g, "\\\\").replace(/\*/g, "\\*").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
189
+ }
190
+ function unescapeSpeakerLabel(label) {
191
+ return label.replace(/\\(.)/g, (_match, ch) => {
192
+ if (ch === "\\") return "\\";
193
+ if (ch === "*") return "*";
194
+ if (ch === "[") return "[";
195
+ if (ch === "]") return "]";
196
+ if (ch === "n") return "\n";
197
+ if (ch === "r") return "\r";
198
+ return "\\" + ch;
199
+ });
200
+ }
201
+ function bodyIsEscaped(meta) {
202
+ return meta !== null && meta !== void 0 && typeof meta.formatVersion === "number" && meta.formatVersion >= TRANSCRIPT_FORMAT_VERSION;
203
+ }
204
+ function decodeTranscriptBody(body, escaped = false) {
205
+ if (!escaped) return body;
206
+ const lines = body.split("\n");
207
+ for (let i = 0; i < lines.length; i++) {
208
+ const match = parseTranscriptSegmentLine(lines[i]);
209
+ if (match === null) continue;
210
+ const { label, clock, text: rawText } = match;
211
+ const decodedText = unescapeSegmentText(rawText);
212
+ const decodedLabel = unescapeSpeakerLabel(label);
213
+ if (decodedText === rawText && decodedLabel === label) continue;
214
+ lines[i] = `**${decodedLabel}** [${clock}]: ${decodedText}`;
215
+ }
216
+ return lines.join("\n");
217
+ }
129
218
  function composeDayTranscriptBody(sourceId, date, timezone, conversations, registry) {
130
219
  const lines = [];
131
220
  lines.push(`# ${sourceId} transcript \u2014 ${date}`);
@@ -150,7 +239,9 @@ function composeDayTranscriptBody(sourceId, date, timezone, conversations, regis
150
239
  for (const segment of conversation.segments) {
151
240
  const { label } = resolveSpeaker(sourceId, segment, registry);
152
241
  const at = formatClockTime(segment.startIso, timezone);
153
- lines.push(`**${label}** [${at}]: ${segment.text}`);
242
+ lines.push(
243
+ `**${escapeSpeakerLabel(label)}** [${at}]: ${escapeSegmentText(segment.text)}`
244
+ );
154
245
  }
155
246
  lines.push("");
156
247
  }
@@ -172,12 +263,16 @@ function composeDayTranscriptMeta(sourceId, date, timezone, conversations, regis
172
263
  speakers: distinctSpeakerLabels(sourceId, allSegments, registry),
173
264
  durationMinutes,
174
265
  contentHash: hashTranscriptBody(body),
175
- syncedAt
266
+ syncedAt,
267
+ formatVersion: TRANSCRIPT_FORMAT_VERSION
176
268
  };
177
269
  }
178
270
  function serializeDayTranscript(meta, body) {
179
271
  const lines = ["---"];
180
272
  lines.push(`kind: ${meta.kind}`);
273
+ if (typeof meta.formatVersion === "number") {
274
+ lines.push(`formatVersion: ${meta.formatVersion}`);
275
+ }
181
276
  lines.push(`source: ${JSON.stringify(meta.source)}`);
182
277
  lines.push(`date: ${JSON.stringify(meta.date)}`);
183
278
  lines.push(`timezone: ${JSON.stringify(meta.timezone)}`);
@@ -230,9 +325,13 @@ function parseDayTranscript(raw) {
230
325
  if (!source || !date) return null;
231
326
  const meta = {
232
327
  kind: "wearable-transcript",
328
+ ...scalars.has("formatVersion") ? { formatVersion: parseNonNegativeInt(scalars.get("formatVersion")) } : {},
233
329
  source,
234
330
  date,
235
- timezone: scalars.get("timezone") ?? "UTC",
331
+ // Preserve a missing timezone field as "" rather than coercing to a
332
+ // default: the fusion identity guard must see "no resolvable tz id"
333
+ // and skip, never silently match a known zone.
334
+ timezone: scalars.get("timezone") ?? "",
236
335
  conversationCount: parseNonNegativeInt(scalars.get("conversationCount")),
237
336
  segmentCount: parseNonNegativeInt(scalars.get("segmentCount")),
238
337
  speakers,
@@ -262,6 +361,7 @@ function parseNonNegativeInt(value) {
262
361
 
263
362
  export {
264
363
  DEFAULT_SELF_NAME,
364
+ hasSelfMarker,
265
365
  emptySpeakerRegistry,
266
366
  speakersFilePath,
267
367
  loadSpeakerRegistry,
@@ -270,11 +370,18 @@ export {
270
370
  resolveSpeaker,
271
371
  distinctSpeakerLabels,
272
372
  WEARABLES_DIR_NAME,
373
+ TRANSCRIPT_FORMAT_VERSION,
374
+ parseTranscriptSegmentLine,
273
375
  isValidTranscriptDate,
274
376
  hashTranscriptBody,
377
+ escapeSegmentText,
378
+ unescapeSegmentText,
379
+ unescapeSpeakerLabel,
380
+ bodyIsEscaped,
381
+ decodeTranscriptBody,
275
382
  composeDayTranscriptBody,
276
383
  composeDayTranscriptMeta,
277
384
  serializeDayTranscript,
278
385
  parseDayTranscript
279
386
  };
280
- //# sourceMappingURL=chunk-M7XQSUBB.js.map
387
+ //# sourceMappingURL=chunk-B3ABVQ36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wearables/speakers.ts","../src/wearables/day-store.ts"],"sourcesContent":["/**\n * Wearable speaker registry — maps provider diarization labels to\n * human names, persistently, per source.\n *\n * Providers expose speakers differently (Limitless: names + a \"user\"\n * marker; Bee: opaque labels like \"0\"/\"1\"; Omi: \"SPEAKER_00\" + is_user\n * + optional person ids). The registry stores operator-confirmed\n * mappings keyed `<sourceId>:<speakerKey>` in\n * `state/wearables/speakers.json`, plus the wearer's display name.\n *\n * Resolution precedence (most-authoritative first):\n * 1. registry override for `<sourceId>:<speakerKey>`\n * 2. provider-identified wearer -> selfName\n * 3. provider-supplied speaker name\n * 4. the raw speaker key, prefixed \"Speaker\" when it is bare digits\n */\n\nimport { promises as fsPromises } from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport interface SpeakerOverride {\n name: string;\n /** Mark this speaker as the wearer (their words become \"you\"). */\n isSelf?: boolean;\n updatedAt: string;\n}\n\nexport interface SpeakerRegistry {\n version: 1;\n /** Display name used for the wearer across all sources. */\n selfName: string;\n /** Overrides keyed `<sourceId>:<speakerKey>`. */\n speakers: Record<string, SpeakerOverride>;\n}\n\nexport const DEFAULT_SELF_NAME = \"Me\";\n\n/**\n * Reserved self marker appended to a wearer's display label so the\n * rendered transcript carries explicit, parseable self metadata. It is\n * RESERVED: a non-self display label can never carry it (see\n * `stripSelfMarker`), so when `reconstructFusionInputs` reads it back it\n * is authoritative self metadata — never a coincidental display-name\n * suffix that would misattribute another speaker as the wearer\n * (issue #1849).\n */\nexport const SELF_MARKER_SUFFIX = \" (you)\";\nconst SELF_MARKER = \"(you)\";\n\n/**\n * Remove a reserved `(you)` self marker from a display name. Applied to\n * every base name before it becomes a label so the marker can only ever\n * appear as the renderer-appended self flag, never as part of a stored\n * non-self display name.\n *\n * Implemented with plain string ops instead of a regex so the leading\n * `\\s*` (no anchor) cannot cause the O(n²) backtracking CodeQL flags\n * on whitespace-only input (js/polynomial-redos).\n */\nexport function stripSelfMarker(name: string): string {\n const trimmed = name.trimEnd();\n if (!trimmed.endsWith(SELF_MARKER)) return trimmed;\n return trimmed.slice(0, -SELF_MARKER.length).trimEnd();\n}\n\n/**\n * Whether a rendered label carries the reserved self marker. This is the\n * single authoritative self-status detector shared by the renderer and\n * the fusion reconstructor (issue #1849).\n */\nexport function hasSelfMarker(label: string): boolean {\n return label.trimEnd().endsWith(SELF_MARKER);\n}\n\nexport function emptySpeakerRegistry(): SpeakerRegistry {\n return { version: 1, selfName: DEFAULT_SELF_NAME, speakers: {} };\n}\n\nexport function speakersFilePath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"wearables\", \"speakers.json\");\n}\n\nexport async function loadSpeakerRegistry(\n memoryDir: string,\n): Promise<SpeakerRegistry> {\n const filePath = speakersFilePath(memoryDir);\n let raw: string;\n try {\n raw = await fsPromises.readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return emptySpeakerRegistry();\n }\n throw err;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `wearables speakers file is not valid JSON (state/wearables/speakers.json): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as SpeakerRegistry).speakers !== \"object\" ||\n (parsed as SpeakerRegistry).speakers === null\n ) {\n throw new Error(\n 'wearables speakers file has an unexpected shape (state/wearables/speakers.json); expected {\"version\":1,\"selfName\":\"...\",\"speakers\":{}}',\n );\n }\n const registry = parsed as SpeakerRegistry;\n return {\n version: 1,\n selfName:\n typeof registry.selfName === \"string\" && registry.selfName.trim().length > 0\n ? registry.selfName.trim()\n : DEFAULT_SELF_NAME,\n speakers: registry.speakers,\n };\n}\n\nexport async function saveSpeakerRegistry(\n memoryDir: string,\n registry: SpeakerRegistry,\n): Promise<void> {\n const filePath = speakersFilePath(memoryDir);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n const tmpPath = `${filePath}.tmp-${process.pid}-${Date.now().toString(36)}`;\n await fsPromises.writeFile(\n tmpPath,\n `${JSON.stringify(registry, null, 2)}\\n`,\n \"utf-8\",\n );\n try {\n await fsPromises.rename(tmpPath, filePath);\n } catch (err) {\n await fsPromises.unlink(tmpPath).catch(() => undefined);\n throw err;\n }\n}\n\nexport function speakerRegistryKey(\n sourceId: string,\n speakerKey: string,\n): string {\n return `${sourceId}:${speakerKey}`;\n}\n\nexport interface ResolvedSpeaker {\n /** Display label used in transcripts, e.g. \"Jane\" or \"Me (you)\". */\n label: string;\n /** Whether this speaker is the wearer. */\n isSelf: boolean;\n}\n\nexport function resolveSpeaker(\n sourceId: string,\n segment: { speakerKey: string; speakerName?: string; isWearer?: boolean },\n registry: SpeakerRegistry,\n): ResolvedSpeaker {\n const override = registry.speakers[speakerRegistryKey(sourceId, segment.speakerKey)];\n if (override) {\n const isSelf = override.isSelf === true;\n // Reserve the `(you)` marker: strip any pre-existing marker from the\n // base name so a NON-self label can never carry it. Without this, a\n // speaker override like \"Pat (you)\" set WITHOUT --self would render\n // as \"Pat (you)\" and the fusion reconstructor would read the suffix\n // as self metadata, attributing Pat's words to the wearer (issue\n // #1849).\n const base = stripSelfMarker(override.name);\n return {\n label: isSelf ? `${base}${SELF_MARKER_SUFFIX}` : base,\n isSelf,\n };\n }\n if (segment.isWearer === true) {\n return {\n label: `${stripSelfMarker(registry.selfName)}${SELF_MARKER_SUFFIX}`,\n isSelf: true,\n };\n }\n if (\n typeof segment.speakerName === \"string\" &&\n segment.speakerName.trim().length > 0\n ) {\n // Provider-supplied names are never self here; strip a stray marker\n // so a provider label cannot masquerade as the reserved self flag.\n return { label: stripSelfMarker(segment.speakerName.trim()), isSelf: false };\n }\n // Strip the reserved `(you)` marker from the raw key so a provider\n // speakerKey like \"Pat (you)\" can never leak the marker into a non-self\n // rendered label — the fusion reconstructor reads the suffix as\n // authoritative self metadata and would misattribute the speaker as the\n // wearer (issue #1849).\n const key = stripSelfMarker(segment.speakerKey.trim());\n // Bare diarization indexes read better with a prefix.\n if (/^\\d+$/.test(key)) {\n return { label: `Speaker ${key}`, isSelf: false };\n }\n return { label: key.length > 0 ? key : \"Unknown speaker\", isSelf: false };\n}\n\n/**\n * Distinct speaker labels for a set of segments, in first-appearance\n * order — used for day-transcript frontmatter.\n */\nexport function distinctSpeakerLabels(\n sourceId: string,\n segments: Array<{ speakerKey: string; speakerName?: string; isWearer?: boolean }>,\n registry: SpeakerRegistry,\n): string[] {\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const segment of segments) {\n const { label } = resolveSpeaker(sourceId, segment, registry);\n if (!seen.has(label)) {\n seen.add(label);\n labels.push(label);\n }\n }\n return labels;\n}\n","/**\n * Wearable day-transcript composition and parsing.\n *\n * One markdown file per source per day, stored under\n * `<memoryDir>/wearables/<source>/<YYYY-MM-DD>.md` with YAML\n * frontmatter. The location is deliberate:\n *\n * - it is OUTSIDE the memory scan roots (facts/, procedures/,\n * reasoning-traces/, corrections/), so transcripts never appear as\n * memories in recall or governance passes;\n * - it is INSIDE the QMD collection root (the memory dir), so day\n * transcripts are full-text searchable after the next index update.\n *\n * Files are rebuilt idempotently from provider data on every sync; the\n * body hash in frontmatter lets the pipeline skip rewriting (and\n * re-extracting) unchanged days.\n *\n * This module is pure composition/parsing — file IO lives in\n * `StorageManager` so encrypted-at-rest deployments and atomic write\n * semantics are inherited from the same code paths memories use.\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport type { SpeakerRegistry } from \"./speakers.js\";\nimport { distinctSpeakerLabels, resolveSpeaker } from \"./speakers.js\";\nimport type {\n WearableConversation,\n WearableDayTranscript,\n WearableDayTranscriptMeta,\n} from \"./types.js\";\n\nexport const WEARABLES_DIR_NAME = \"wearables\";\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Day-transcript body serialization format version. Folded into\n * `hashTranscriptBody` so a version bump invalidates files written by an\n * older serializer and forces an idempotent rewrite. Decoders gate on this:\n * only bodies whose parsed meta carries >= this version have escape\n * sequences decoded; legacy bodies (absent / older) are left byte-for-byte\n * unchanged so a literal two-character `\\n`/`\\r` in a pre-escaper\n * transcript is never altered (issue #1849).\n */\nexport const TRANSCRIPT_FORMAT_VERSION = 2;\n\n/**\n * Result of parsing a rendered transcript segment line.\n */\nexport interface TranscriptSegmentMatch {\n /** Speaker label text between the `**` delimiters. */\n label: string;\n /** Clock text between the `[` `]` delimiters. */\n clock: string;\n /** Segment text after the colon. */\n text: string;\n}\n\n/**\n * Test a single character code point against the JavaScript regex `\\s`\n * whitespace class without invoking a regex. Used by the linear segment\n * line parser so no quantified pattern is ever evaluated on untrusted\n * transcript content (CodeQL polynomial-redos, issue #1849).\n */\nfunction isRegexWhitespace(code: number): boolean {\n return (\n (code >= 0x09 && code <= 0x0d) ||\n code === 0x20 ||\n code === 0xa0 ||\n code === 0x1680 ||\n (code >= 0x2000 && code <= 0x200a) ||\n code === 0x2028 ||\n code === 0x2029 ||\n code === 0x202f ||\n code === 0x205f ||\n code === 0x3000 ||\n code === 0xfeff\n );\n}\n\n/**\n * Parse a rendered transcript segment line (`**label** [clock]: text`)\n * into its three components using a linear, bounded scan — a CodeQL-safe\n * replacement for the polynomial-risk regex that previously matched this\n * format. Returns null when the line is not a segment line.\n *\n * The scan finds the FIRST occurrence of each structural delimiter\n * (`**` after the label, `]` after the clock) exactly as the original\n * non-greedy regex did, and verifies the fixed separator characters\n * (`\\s`, `[`, `:`, `\\s`) by single-character code-point comparison.\n * No quantified regex is evaluated on the line (#1849).\n *\n * Escaped labels (formatVersion >= 2) never contain an unescaped `**`,\n * `[`, or `]`, and rendered clocks are always `HH:MM` / `--:--`, so the\n * first delimiter is always the correct one for every well-formed\n * transcript. Legacy unescaped labels are used verbatim by the caller\n * and parsed identically here.\n */\nexport function parseTranscriptSegmentLine(\n line: string,\n): TranscriptSegmentMatch | null {\n // Must start with '**'.\n if (!line.startsWith(\"**\")) return null;\n\n // Find the closing '**' of the label: the first '**' at index >= 3\n // (label is at least 1 char) that is immediately followed by \\s and\n // then '['. This mirrors the non-greedy regex: the engine tries the\n // shortest label first and extends only when the subsequent fixed\n // delimiters do not line up. An escaped label ending with '\\*' is\n // correctly handled because the spurious '**' (escape-star + close-\n // star) is not followed by \\s and the scan continues.\n let labelEnd = -1;\n for (let i = 3; i < line.length; i++) {\n if (\n line.charCodeAt(i) !== 0x2a /* '*' */ ||\n i + 3 >= line.length ||\n line.charCodeAt(i + 1) !== 0x2a /* '*' */ ||\n !isRegexWhitespace(line.charCodeAt(i + 2)) ||\n line.charCodeAt(i + 3) !== 0x5b /* '[' */\n ) {\n continue;\n }\n labelEnd = i;\n break;\n }\n if (labelEnd === -1) return null;\n\n const label = line.slice(2, labelEnd);\n // Clock content starts after the closing '**', the \\s, and the '['.\n const clockStart = labelEnd + 4;\n\n // Find the closing ']' of the clock: the first ']' at index >=\n // clockStart + 1 (clock is at least 1 char) that is immediately\n // followed by ':' and \\s — matching the non-greedy regex.\n let clockEnd = -1;\n for (let i = clockStart + 1; i < line.length; i++) {\n if (\n line.charCodeAt(i) !== 0x5d /* ']' */ ||\n i + 2 >= line.length ||\n line.charCodeAt(i + 1) !== 0x3a /* ':' */ ||\n !isRegexWhitespace(line.charCodeAt(i + 2))\n ) {\n continue;\n }\n clockEnd = i;\n break;\n }\n if (clockEnd === -1) return null;\n\n return {\n label,\n clock: line.slice(clockStart, clockEnd),\n text: line.slice(clockEnd + 3),\n };\n}\n\nexport function isValidTranscriptDate(date: string): boolean {\n if (!DATE_PATTERN.test(date)) return false;\n const parsed = new Date(`${date}T00:00:00Z`);\n return !Number.isNaN(parsed.getTime()) && parsed.toISOString().slice(0, 10) === date;\n}\n\nexport function hashTranscriptBody(body: string): string {\n // The version prefix makes the hash an idempotency key for the body AS\n // SERIALIZED under the current format: when the escape encoding changes\n // (version bump) every existing file's stored hash no longer matches and\n // the pipeline rewrites it with the new marker — no separate migration\n // pass needed (issue #1849).\n return createHash(\"sha256\")\n .update(`v${TRANSCRIPT_FORMAT_VERSION}\\n${body}`, \"utf-8\")\n .digest(\"hex\");\n}\n\nfunction formatClockTime(iso: string | undefined, timezone: string): string {\n if (!iso) return \"--:--\";\n const ms = Date.parse(iso);\n if (Number.isNaN(ms)) return \"--:--\";\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n timeZone: timezone,\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(ms));\n } catch {\n // Unknown timezone identifiers fall back to UTC rather than\n // crashing a sync that already fetched data.\n return new Date(ms).toISOString().slice(11, 16);\n }\n}\n\nfunction conversationDurationMinutes(conversation: WearableConversation): number {\n const start = Date.parse(conversation.startIso);\n const end = conversation.endIso ? Date.parse(conversation.endIso) : NaN;\n if (Number.isNaN(start) || Number.isNaN(end) || end <= start) return 0;\n return (end - start) / 60_000;\n}\n\n/**\n * Escape segment text for the line-based markdown format so that embedded\n * newlines, carriage returns, and backslashes survive the serialize →\n * reconstruct round-trip losslessly. Reversed by `unescapeSegmentText`\n * (this module — the single decode primitive shared with the fusion\n * reconstruct path and every view/search/index surface).\n *\n * Without this, a segment whose text contains a newline is split across\n * multiple physical lines; the reconstruct path treats each line\n * independently and the continuation is silently dropped (or worse, a\n * continuation line that looks like a heading/clock is mis-parsed).\n */\nexport function escapeSegmentText(text: string): string {\n return text\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n}\n\n/**\n * Reverse `escapeSegmentText`. Unknown escape sequences (a lone\n * backslash followed by a character the escaper never emits) are passed\n * through literally so legacy transcripts that never went through the\n * escaper still round-trip their original text. This is the SINGLE\n * decode primitive: the fusion reconstruct path and every user-facing\n * view/search/index surface call it so escaped storage never leaks to\n * display (#1849).\n */\nexport function unescapeSegmentText(text: string): string {\n return text.replace(/\\\\(.)/g, (_match, ch: string) => {\n if (ch === \"n\") return \"\\n\";\n if (ch === \"r\") return \"\\r\";\n if (ch === \"\\\\\") return \"\\\\\";\n return \"\\\\\" + ch;\n });\n}\n\n/**\n * Escape a speaker label for the line-based markdown format so that\n * markdown-delimiter characters in an arbitrary user/provider label\n * (`**`, `[`, `]`), the escape character (`\\`), and embedded newlines/\n * carriage returns cannot break `parseTranscriptSegmentLine` parsing.\n * Without this, a label containing `**` (or `** [clock]:`) can make the\n * non-greedy delimiter match land on the wrong `**` and mis-parse the\n * clock/text — or fail to parse the line at all. Reversed by\n * `unescapeSpeakerLabel` (this module). Legacy transcripts whose labels\n * were never escaped still parse: `unescapeSpeakerLabel` is a no-op on\n * any label without a backslash escape sequence (#1849).\n */\nexport function escapeSpeakerLabel(label: string): string {\n return label\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\*/g, \"\\\\*\")\n .replace(/\\[/g, \"\\\\[\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n}\n\n/**\n * Reverse `escapeSpeakerLabel`. Unknown escape sequences (a backslash\n * followed by a character the escaper never emits) are passed through\n * literally so legacy transcripts with raw labels still round-trip\n * their original text, mirroring `unescapeSegmentText` for segment text.\n */\nexport function unescapeSpeakerLabel(label: string): string {\n return label.replace(/\\\\(.)/g, (_match, ch: string) => {\n if (ch === \"\\\\\") return \"\\\\\";\n if (ch === \"*\") return \"*\";\n if (ch === \"[\") return \"[\";\n if (ch === \"]\") return \"]\";\n if (ch === \"n\") return \"\\n\";\n if (ch === \"r\") return \"\\r\";\n return \"\\\\\" + ch;\n });\n}\n\n/**\n * Whether a parsed day-transcript's body was written by the escape-aware\n * serializer (meta carries `formatVersion` >= `TRANSCRIPT_FORMAT_VERSION`).\n * Legacy bodies (no marker, or an older version) must NOT be decoded: their\n * literal two-character `\\n`, `\\r`, and lone backslashes are original\n * content, not escape sequences (issue #1849).\n */\nexport function bodyIsEscaped(\n meta: { formatVersion?: number } | null | undefined,\n): boolean {\n return (\n meta !== null &&\n meta !== undefined &&\n typeof meta.formatVersion === \"number\" &&\n meta.formatVersion >= TRANSCRIPT_FORMAT_VERSION\n );\n}\n\n/**\n * Decode the escaped segment text AND speaker label of a stored\n * transcript body into the ORIGINAL forms for user-facing\n * view/search/index surfaces. Only segment lines are touched: the text\n * is decoded via `unescapeSegmentText` and the label via\n * `unescapeSpeakerLabel`; headings, locations, and the H1 header are\n * NOT escaped on write and pass through unchanged, so a title or\n * location containing a literal backslash is never altered. The fusion\n * reconstruct path does NOT use this — it decodes each segment once\n * during parse — so callers feeding bodies back into reconstruct must\n * pass the RAW stored body, not a decoded one, to avoid double-decoding.\n *\n * FORMAT-AWARE (issue #1849): when `escaped` is falsy (the default) the\n * body is returned byte-for-byte unchanged. Only bodies written by the\n * escape-aware serializer (`escaped = true`, derived from\n * `bodyIsEscaped(meta)`) are decoded, so a legacy transcript's literal\n * two-character `\\n`/`\\r` or lone backslash is never altered. Callers\n * that have the parsed meta should pass `bodyIsEscaped(meta)`.\n */\nexport function decodeTranscriptBody(body: string, escaped = false): string {\n if (!escaped) return body;\n const lines = body.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const match = parseTranscriptSegmentLine(lines[i]);\n if (match === null) continue;\n const { label, clock, text: rawText } = match;\n const decodedText = unescapeSegmentText(rawText);\n const decodedLabel = unescapeSpeakerLabel(label);\n if (decodedText === rawText && decodedLabel === label) continue;\n lines[i] = `**${decodedLabel}** [${clock}]: ${decodedText}`;\n }\n return lines.join(\"\\n\");\n}\n\n/** Compose the markdown body (no frontmatter) for one source/day. */\nexport function composeDayTranscriptBody(\n sourceId: string,\n date: string,\n timezone: string,\n conversations: WearableConversation[],\n registry: SpeakerRegistry,\n): string {\n const lines: string[] = [];\n lines.push(`# ${sourceId} transcript — ${date}`);\n lines.push(\"\");\n const ordered = [...conversations].sort((a, b) => {\n const aMs = Date.parse(a.startIso);\n const bMs = Date.parse(b.startIso);\n if (aMs < bMs) return -1;\n if (aMs > bMs) return 1;\n // Stable secondary key so equal start times order deterministically.\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n });\n for (const conversation of ordered) {\n const start = formatClockTime(conversation.startIso, timezone);\n const end = formatClockTime(conversation.endIso, timezone);\n const title = conversation.title?.trim();\n const heading = title && title.length > 0 ? ` · ${title}` : \"\";\n lines.push(`## ${start}–${end}${heading} (conversation ${conversation.id})`);\n if (conversation.location) {\n lines.push(`*Location: ${conversation.location}*`);\n }\n lines.push(\"\");\n for (const segment of conversation.segments) {\n const { label } = resolveSpeaker(sourceId, segment, registry);\n const at = formatClockTime(segment.startIso, timezone);\n lines.push(\n `**${escapeSpeakerLabel(label)}** [${at}]: ${escapeSegmentText(segment.text)}`,\n );\n }\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function composeDayTranscriptMeta(\n sourceId: string,\n date: string,\n timezone: string,\n conversations: WearableConversation[],\n registry: SpeakerRegistry,\n body: string,\n syncedAt: string,\n): WearableDayTranscriptMeta {\n const allSegments = conversations.flatMap((c) => c.segments);\n const durationMinutes = Math.round(\n conversations.reduce((sum, c) => sum + conversationDurationMinutes(c), 0),\n );\n return {\n kind: \"wearable-transcript\",\n source: sourceId,\n date,\n timezone,\n conversationCount: conversations.length,\n segmentCount: allSegments.length,\n speakers: distinctSpeakerLabels(sourceId, allSegments, registry),\n durationMinutes,\n contentHash: hashTranscriptBody(body),\n syncedAt,\n formatVersion: TRANSCRIPT_FORMAT_VERSION,\n };\n}\n\n/** Serialize meta + body into the persisted file format. */\nexport function serializeDayTranscript(\n meta: WearableDayTranscriptMeta,\n body: string,\n): string {\n const lines: string[] = [\"---\"];\n lines.push(`kind: ${meta.kind}`);\n if (typeof meta.formatVersion === \"number\") {\n lines.push(`formatVersion: ${meta.formatVersion}`);\n }\n lines.push(`source: ${JSON.stringify(meta.source)}`);\n lines.push(`date: ${JSON.stringify(meta.date)}`);\n lines.push(`timezone: ${JSON.stringify(meta.timezone)}`);\n lines.push(`conversationCount: ${meta.conversationCount}`);\n lines.push(`segmentCount: ${meta.segmentCount}`);\n if (meta.speakers.length === 0) {\n lines.push(\"speakers: []\");\n } else {\n lines.push(\"speakers:\");\n for (const speaker of meta.speakers) {\n lines.push(` - ${JSON.stringify(speaker)}`);\n }\n }\n lines.push(`durationMinutes: ${meta.durationMinutes}`);\n lines.push(`contentHash: ${JSON.stringify(meta.contentHash)}`);\n lines.push(`syncedAt: ${JSON.stringify(meta.syncedAt)}`);\n lines.push(\"---\");\n lines.push(\"\");\n return `${lines.join(\"\\n\")}${body}`;\n}\n\n/**\n * Parse a persisted day-transcript file. Returns null when the content\n * does not look like a wearable transcript (wrong kind, missing\n * frontmatter) so callers can distinguish \"not a transcript\" from a\n * read error.\n */\nexport function parseDayTranscript(raw: string): WearableDayTranscript | null {\n if (!raw.startsWith(\"---\\n\")) return null;\n const closeIndex = raw.indexOf(\"\\n---\\n\", 4);\n if (closeIndex === -1) return null;\n const header = raw.slice(4, closeIndex);\n const body = raw.slice(closeIndex + 5).replace(/^\\n/, \"\");\n\n const scalars = new Map<string, string>();\n const speakers: string[] = [];\n let inSpeakers = false;\n for (const line of header.split(\"\\n\")) {\n if (inSpeakers) {\n const item = line.match(/^ {2}- (.*)$/);\n if (item) {\n speakers.push(parseYamlScalar(item[1]));\n continue;\n }\n inSpeakers = false;\n }\n if (line === \"speakers:\") {\n inSpeakers = true;\n continue;\n }\n if (line === \"speakers: []\") continue;\n const match = line.match(/^([A-Za-z][A-Za-z0-9]*): (.*)$/);\n if (match) scalars.set(match[1], parseYamlScalar(match[2]));\n }\n\n if (scalars.get(\"kind\") !== \"wearable-transcript\") return null;\n const source = scalars.get(\"source\");\n const date = scalars.get(\"date\");\n if (!source || !date) return null;\n\n const meta: WearableDayTranscriptMeta = {\n kind: \"wearable-transcript\",\n ...(scalars.has(\"formatVersion\")\n ? { formatVersion: parseNonNegativeInt(scalars.get(\"formatVersion\")) }\n : {}),\n source,\n date,\n // Preserve a missing timezone field as \"\" rather than coercing to a\n // default: the fusion identity guard must see \"no resolvable tz id\"\n // and skip, never silently match a known zone.\n timezone: scalars.get(\"timezone\") ?? \"\",\n conversationCount: parseNonNegativeInt(scalars.get(\"conversationCount\")),\n segmentCount: parseNonNegativeInt(scalars.get(\"segmentCount\")),\n speakers,\n durationMinutes: parseNonNegativeInt(scalars.get(\"durationMinutes\")),\n contentHash: scalars.get(\"contentHash\") ?? \"\",\n syncedAt: scalars.get(\"syncedAt\") ?? \"\",\n };\n return { meta, body };\n}\n\nfunction parseYamlScalar(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length >= 2) {\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed === \"string\") return parsed;\n } catch {\n // Fall through to the raw value below.\n }\n }\n return trimmed;\n}\n\nfunction parseNonNegativeInt(value: string | undefined): number {\n if (value === undefined) return 0;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed < 0) return 0;\n return Math.floor(parsed);\n}\n"],"mappings":"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","names":[]}
@@ -10,10 +10,10 @@ import {
10
10
  import {
11
11
  listMemoryGovernanceRuns,
12
12
  readMemoryGovernanceRunArtifact
13
- } from "./chunk-BGMSRN6I.js";
13
+ } from "./chunk-3XIY7MDQ.js";
14
14
  import {
15
15
  StorageManager
16
- } from "./chunk-UDCDGP6A.js";
16
+ } from "./chunk-SVOHGUMI.js";
17
17
  import {
18
18
  MEMORY_PROJECTION_SCHEMA_VERSION,
19
19
  getMemoryProjectionPath,
@@ -1023,4 +1023,4 @@ export {
1023
1023
  verifyMemoryProjection,
1024
1024
  repairMemoryProjection
1025
1025
  };
1026
- //# sourceMappingURL=chunk-LNHJ32NK.js.map
1026
+ //# sourceMappingURL=chunk-BEM4D2QG.js.map