@remnic/core 1.1.8 → 1.1.9

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 (237) hide show
  1. package/dist/access-cli.js +30 -30
  2. package/dist/access-http.d.ts +7 -7
  3. package/dist/access-http.js +13 -13
  4. package/dist/access-mcp.d.ts +7 -7
  5. package/dist/access-mcp.js +12 -12
  6. package/dist/{access-service-C0Rkioec.d.ts → access-service-BJCIjVRY.d.ts} +9 -9
  7. package/dist/access-service.d.ts +7 -7
  8. package/dist/access-service.js +11 -11
  9. package/dist/active-memory-bridge.d.ts +1 -1
  10. package/dist/active-recall.d.ts +2 -2
  11. package/dist/active-recall.js +2 -2
  12. package/dist/active-recall.js.map +1 -1
  13. package/dist/behavior-learner.d.ts +1 -1
  14. package/dist/behavior-signals.d.ts +1 -1
  15. package/dist/bootstrap.d.ts +6 -6
  16. package/dist/briefing.d.ts +2 -2
  17. package/dist/briefing.js +6 -6
  18. package/dist/buffer-surprise-report.d.ts +1 -1
  19. package/dist/buffer.d.ts +2 -2
  20. package/dist/calibration.d.ts +1 -1
  21. package/dist/calibration.js +2 -2
  22. package/dist/causal-behavior.d.ts +1 -1
  23. package/dist/causal-consolidation.d.ts +2 -2
  24. package/dist/causal-consolidation.js +8 -8
  25. package/dist/{chunk-ETA2JXP5.js → chunk-2MVUXO4H.js} +2 -2
  26. package/dist/{chunk-GZCUW5IC.js → chunk-3IQ2TR4N.js} +5 -5
  27. package/dist/chunk-3IQ2TR4N.js.map +1 -0
  28. package/dist/{chunk-KNQ5YJTO.js → chunk-3VRIIII5.js} +149 -1
  29. package/dist/chunk-3VRIIII5.js.map +1 -0
  30. package/dist/{chunk-TUFG6VXY.js → chunk-4DWOBS2A.js} +2 -2
  31. package/dist/chunk-4DWOBS2A.js.map +1 -0
  32. package/dist/{chunk-L2IO2QPY.js → chunk-4IS4SXIQ.js} +17 -13
  33. package/dist/chunk-4IS4SXIQ.js.map +1 -0
  34. package/dist/{chunk-RLV2F337.js → chunk-6OAQEOGV.js} +2 -2
  35. package/dist/{chunk-QJZ77K7F.js → chunk-6Z6UH6TK.js} +26 -12
  36. package/dist/chunk-6Z6UH6TK.js.map +1 -0
  37. package/dist/{chunk-4IT6WL23.js → chunk-7SFAENUZ.js} +2 -2
  38. package/dist/{chunk-ODWDQNRE.js → chunk-7SI52C65.js} +7 -3
  39. package/dist/chunk-7SI52C65.js.map +1 -0
  40. package/dist/{chunk-Q5TJRAGE.js → chunk-A6PGANSE.js} +3 -3
  41. package/dist/{chunk-OJMD2LIW.js → chunk-BIHCWSWA.js} +3 -3
  42. package/dist/{chunk-MYH2IBSP.js → chunk-CTYRIJ5E.js} +3 -3
  43. package/dist/{chunk-T65SHTJP.js → chunk-ET4BL42V.js} +1 -1
  44. package/dist/chunk-ET4BL42V.js.map +1 -0
  45. package/dist/{chunk-DWMXVUGO.js → chunk-FLBYSB2V.js} +6 -4
  46. package/dist/chunk-FLBYSB2V.js.map +1 -0
  47. package/dist/{chunk-GRDDGNYQ.js → chunk-FPWUENQH.js} +34 -32
  48. package/dist/chunk-FPWUENQH.js.map +1 -0
  49. package/dist/chunk-FVQJYWH7.js +52 -0
  50. package/dist/chunk-FVQJYWH7.js.map +1 -0
  51. package/dist/{chunk-STB3GUYU.js → chunk-G3G3LY22.js} +2 -2
  52. package/dist/{chunk-FIXIX6DE.js → chunk-G6NX57V2.js} +33 -43
  53. package/dist/chunk-G6NX57V2.js.map +1 -0
  54. package/dist/{chunk-3FPTCC3Z.js → chunk-GVPWB7EY.js} +2 -2
  55. package/dist/{chunk-AV2WSYZY.js → chunk-ICULSMDG.js} +2 -2
  56. package/dist/{chunk-WXPPM426.js → chunk-J3P6WSFZ.js} +2 -2
  57. package/dist/{chunk-FCGWNWG4.js → chunk-KIF7QNKL.js} +28 -28
  58. package/dist/chunk-KIF7QNKL.js.map +1 -0
  59. package/dist/{chunk-XVOIMCVW.js → chunk-KMWZXT5T.js} +2 -2
  60. package/dist/{chunk-SWRJFKYW.js → chunk-M3DK45UM.js} +5 -5
  61. package/dist/{chunk-XGX4TUF6.js → chunk-MJLUHRSF.js} +5 -5
  62. package/dist/{chunk-4KAN3GZ3.js → chunk-NN2DKE4T.js} +1 -1
  63. package/dist/chunk-NN2DKE4T.js.map +1 -0
  64. package/dist/{chunk-R2XRID2N.js → chunk-NN3LPQ5D.js} +5 -5
  65. package/dist/chunk-NN3LPQ5D.js.map +1 -0
  66. package/dist/{chunk-RJSVRPNU.js → chunk-OWGGXPKV.js} +16 -9
  67. package/dist/chunk-OWGGXPKV.js.map +1 -0
  68. package/dist/{chunk-WSZIHQBK.js → chunk-P77UEOU2.js} +4 -1
  69. package/dist/{chunk-WSZIHQBK.js.map → chunk-P77UEOU2.js.map} +1 -1
  70. package/dist/{chunk-65ZPH7QA.js → chunk-PHQH2VUO.js} +4 -4
  71. package/dist/{chunk-KHJRMWO4.js → chunk-QPLYTPYL.js} +15 -15
  72. package/dist/{chunk-FEMOX5AD.js → chunk-QR3C7BKQ.js} +7 -7
  73. package/dist/chunk-QR3C7BKQ.js.map +1 -0
  74. package/dist/{chunk-3LCWFNVS.js → chunk-SKE7JYKA.js} +2 -2
  75. package/dist/{chunk-E27HOXMX.js → chunk-U4SZXGEO.js} +2 -2
  76. package/dist/{chunk-67YLUWLG.js → chunk-XJKFSSDW.js} +3 -3
  77. package/dist/chunk-XJKFSSDW.js.map +1 -0
  78. package/dist/{chunk-SYWJJTNL.js → chunk-XL3UCAZA.js} +22 -22
  79. package/dist/{chunk-ASIQZXYO.js → chunk-XMVFHBHT.js} +2 -2
  80. package/dist/{chunk-SRIDOT64.js → chunk-XN4D6Z7X.js} +3 -3
  81. package/dist/{chunk-S5SQDIF5.js → chunk-Y3VT6ZCP.js} +4 -4
  82. package/dist/{cli-CIATRu8o.d.ts → cli-BojuyOOp.d.ts} +4 -4
  83. package/dist/cli.d.ts +8 -8
  84. package/dist/cli.js +24 -24
  85. package/dist/{codex-materialize-xVqbEmcm.d.ts → codex-materialize-YVC2wb6n.d.ts} +1 -1
  86. package/dist/compression-optimizer.d.ts +1 -1
  87. package/dist/config.d.ts +1 -1
  88. package/dist/config.js +1 -1
  89. package/dist/consolidation-provenance-check.d.ts +2 -2
  90. package/dist/consolidation-undo.d.ts +2 -2
  91. package/dist/day-summary.d.ts +1 -1
  92. package/dist/day-summary.js +1 -1
  93. package/dist/delinearize.d.ts +1 -1
  94. package/dist/direct-answer-wiring.d.ts +1 -1
  95. package/dist/direct-answer.d.ts +1 -1
  96. package/dist/embedding-fallback.d.ts +1 -1
  97. package/dist/{engine-MEAYUA7A.js → engine-EDFFOWDD.js} +7 -7
  98. package/dist/entity-retrieval.d.ts +2 -2
  99. package/dist/entity-retrieval.js +6 -6
  100. package/dist/entity-schema.d.ts +1 -1
  101. package/dist/explicit-capture.d.ts +6 -6
  102. package/dist/explicit-capture.js +2 -2
  103. package/dist/explicit-cue-recall.js +1 -1
  104. package/dist/extraction-judge-telemetry.d.ts +1 -1
  105. package/dist/extraction-judge-training.d.ts +1 -1
  106. package/dist/extraction-judge.d.ts +1 -1
  107. package/dist/extraction.d.ts +1 -1
  108. package/dist/extraction.js +7 -7
  109. package/dist/fallback-llm.d.ts +1 -1
  110. package/dist/fallback-llm.js +2 -2
  111. package/dist/identity-continuity.d.ts +1 -1
  112. package/dist/importance.d.ts +1 -1
  113. package/dist/index.d.ts +13 -13
  114. package/dist/index.js +147 -147
  115. package/dist/index.js.map +1 -1
  116. package/dist/intent.d.ts +1 -1
  117. package/dist/lifecycle.d.ts +1 -1
  118. package/dist/live-connectors-runner.d.ts +1 -1
  119. package/dist/live-connectors-runner.js +2 -2
  120. package/dist/local-llm.d.ts +1 -1
  121. package/dist/local-llm.js +1 -1
  122. package/dist/memory-action-policy.d.ts +1 -1
  123. package/dist/memory-cache.d.ts +1 -1
  124. package/dist/{memory-governance-G3XODEXW.js → memory-governance-AAQPBZEP.js} +7 -7
  125. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  126. package/dist/{memory-projection-store-lCzmu4JX.d.ts → memory-projection-store-BW8u5U0u.d.ts} +1 -1
  127. package/dist/memory-projection-store.d.ts +2 -2
  128. package/dist/memory-projection-store.js +1 -1
  129. package/dist/memory-worth-outcomes.d.ts +2 -2
  130. package/dist/{migrate-from-identity-anchor-TTEDEJGX.js → migrate-from-identity-anchor-G27MCD6A.js} +2 -2
  131. package/dist/model-registry.js +1 -1
  132. package/dist/models-json.d.ts +1 -1
  133. package/dist/models-json.js +1 -1
  134. package/dist/native-knowledge.d.ts +1 -1
  135. package/dist/operator-toolkit.d.ts +2 -2
  136. package/dist/operator-toolkit.js +10 -10
  137. package/dist/opik-exporter.js +2 -2
  138. package/dist/opik-exporter.js.map +1 -1
  139. package/dist/{orchestrator-CvUYwuaL.d.ts → orchestrator-CYqmqxco.d.ts} +5 -5
  140. package/dist/orchestrator.d.ts +6 -6
  141. package/dist/orchestrator.js +25 -25
  142. package/dist/patterns-cli.d.ts +1 -1
  143. package/dist/{peers-6OSQ3NK6.js → peers-HCVGHMAE.js} +3 -3
  144. package/dist/policy-runtime.d.ts +1 -1
  145. package/dist/{port-BkWL7hqo.d.ts → port-Br27H8dy.d.ts} +7 -1
  146. package/dist/qmd-recall-cache.d.ts +2 -2
  147. package/dist/qmd.d.ts +3 -2
  148. package/dist/qmd.js +1 -1
  149. package/dist/recall-disclosure-escalation.d.ts +1 -1
  150. package/dist/recall-explain-renderer.d.ts +1 -1
  151. package/dist/recall-explain-renderer.js +3 -3
  152. package/dist/recall-state.d.ts +1 -1
  153. package/dist/recall-tag-filter.d.ts +1 -1
  154. package/dist/recall-xray-cli.d.ts +1 -1
  155. package/dist/recall-xray-cli.js +4 -4
  156. package/dist/recall-xray-renderer.d.ts +1 -1
  157. package/dist/recall-xray-renderer.js +3 -3
  158. package/dist/recall-xray.d.ts +1 -1
  159. package/dist/recall-xray.js +2 -2
  160. package/dist/resolve-auth-token.d.ts +1 -1
  161. package/dist/resume-bundles.js +2 -2
  162. package/dist/retrieval-agents.d.ts +2 -2
  163. package/dist/retrieval-tiers.d.ts +1 -1
  164. package/dist/sanitize.js +1 -1
  165. package/dist/schemas.d.ts +22 -22
  166. package/dist/{semantic-consolidation-CGiH52qa.d.ts → semantic-consolidation-GPcLr9BQ.d.ts} +2 -2
  167. package/dist/semantic-consolidation.d.ts +3 -3
  168. package/dist/semantic-consolidation.js +6 -6
  169. package/dist/semantic-rule-promotion.js +6 -6
  170. package/dist/semantic-rule-verifier.d.ts +1 -1
  171. package/dist/semantic-rule-verifier.js +6 -6
  172. package/dist/session-observer-bands.d.ts +1 -1
  173. package/dist/session-observer-state.d.ts +1 -1
  174. package/dist/signal.d.ts +1 -1
  175. package/dist/source-attribution.d.ts +1 -1
  176. package/dist/source-attribution.js +1 -1
  177. package/dist/storage.d.ts +2 -2
  178. package/dist/storage.js +5 -5
  179. package/dist/summarizer.d.ts +1 -1
  180. package/dist/summarizer.js +5 -5
  181. package/dist/summary-snapshot.d.ts +1 -1
  182. package/dist/temporal-supersession.d.ts +2 -2
  183. package/dist/temporal-validity.d.ts +1 -1
  184. package/dist/threading.d.ts +1 -1
  185. package/dist/tier-migration.d.ts +3 -3
  186. package/dist/tier-routing.d.ts +1 -1
  187. package/dist/topics.d.ts +1 -1
  188. package/dist/transcript.d.ts +1 -1
  189. package/dist/{types-H85grL1f.d.ts → types-Bmp9ssU2.d.ts} +3 -3
  190. package/dist/types.d.ts +1 -1
  191. package/dist/types.js +1 -1
  192. package/dist/utility-runtime.d.ts +1 -1
  193. package/dist/verified-recall.js +6 -6
  194. package/package.json +1 -1
  195. package/dist/chunk-4KAN3GZ3.js.map +0 -1
  196. package/dist/chunk-67YLUWLG.js.map +0 -1
  197. package/dist/chunk-DWMXVUGO.js.map +0 -1
  198. package/dist/chunk-FCGWNWG4.js.map +0 -1
  199. package/dist/chunk-FEMOX5AD.js.map +0 -1
  200. package/dist/chunk-FIXIX6DE.js.map +0 -1
  201. package/dist/chunk-GRDDGNYQ.js.map +0 -1
  202. package/dist/chunk-GZCUW5IC.js.map +0 -1
  203. package/dist/chunk-KNQ5YJTO.js.map +0 -1
  204. package/dist/chunk-L2IO2QPY.js.map +0 -1
  205. package/dist/chunk-M62O4P4T.js +0 -41
  206. package/dist/chunk-M62O4P4T.js.map +0 -1
  207. package/dist/chunk-ODWDQNRE.js.map +0 -1
  208. package/dist/chunk-QJZ77K7F.js.map +0 -1
  209. package/dist/chunk-R2XRID2N.js.map +0 -1
  210. package/dist/chunk-RJSVRPNU.js.map +0 -1
  211. package/dist/chunk-T65SHTJP.js.map +0 -1
  212. package/dist/chunk-TUFG6VXY.js.map +0 -1
  213. /package/dist/{chunk-ETA2JXP5.js.map → chunk-2MVUXO4H.js.map} +0 -0
  214. /package/dist/{chunk-RLV2F337.js.map → chunk-6OAQEOGV.js.map} +0 -0
  215. /package/dist/{chunk-4IT6WL23.js.map → chunk-7SFAENUZ.js.map} +0 -0
  216. /package/dist/{chunk-Q5TJRAGE.js.map → chunk-A6PGANSE.js.map} +0 -0
  217. /package/dist/{chunk-OJMD2LIW.js.map → chunk-BIHCWSWA.js.map} +0 -0
  218. /package/dist/{chunk-MYH2IBSP.js.map → chunk-CTYRIJ5E.js.map} +0 -0
  219. /package/dist/{chunk-STB3GUYU.js.map → chunk-G3G3LY22.js.map} +0 -0
  220. /package/dist/{chunk-3FPTCC3Z.js.map → chunk-GVPWB7EY.js.map} +0 -0
  221. /package/dist/{chunk-AV2WSYZY.js.map → chunk-ICULSMDG.js.map} +0 -0
  222. /package/dist/{chunk-WXPPM426.js.map → chunk-J3P6WSFZ.js.map} +0 -0
  223. /package/dist/{chunk-XVOIMCVW.js.map → chunk-KMWZXT5T.js.map} +0 -0
  224. /package/dist/{chunk-SWRJFKYW.js.map → chunk-M3DK45UM.js.map} +0 -0
  225. /package/dist/{chunk-XGX4TUF6.js.map → chunk-MJLUHRSF.js.map} +0 -0
  226. /package/dist/{chunk-65ZPH7QA.js.map → chunk-PHQH2VUO.js.map} +0 -0
  227. /package/dist/{chunk-KHJRMWO4.js.map → chunk-QPLYTPYL.js.map} +0 -0
  228. /package/dist/{chunk-3LCWFNVS.js.map → chunk-SKE7JYKA.js.map} +0 -0
  229. /package/dist/{chunk-E27HOXMX.js.map → chunk-U4SZXGEO.js.map} +0 -0
  230. /package/dist/{chunk-SYWJJTNL.js.map → chunk-XL3UCAZA.js.map} +0 -0
  231. /package/dist/{chunk-ASIQZXYO.js.map → chunk-XMVFHBHT.js.map} +0 -0
  232. /package/dist/{chunk-SRIDOT64.js.map → chunk-XN4D6Z7X.js.map} +0 -0
  233. /package/dist/{chunk-S5SQDIF5.js.map → chunk-Y3VT6ZCP.js.map} +0 -0
  234. /package/dist/{engine-MEAYUA7A.js.map → engine-EDFFOWDD.js.map} +0 -0
  235. /package/dist/{memory-governance-G3XODEXW.js.map → memory-governance-AAQPBZEP.js.map} +0 -0
  236. /package/dist/{migrate-from-identity-anchor-TTEDEJGX.js.map → migrate-from-identity-anchor-G27MCD6A.js.map} +0 -0
  237. /package/dist/{peers-6OSQ3NK6.js.map → peers-HCVGHMAE.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/active-recall.ts"],"sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collapseWhitespace, truncateCodePointSafe } from \"./whitespace.js\";\nimport type {\n ActiveRecallChatType,\n ActiveRecallModelFallbackPolicy,\n ActiveRecallPromptStyle,\n ActiveRecallQueryMode,\n ActiveRecallThinking,\n} from \"./types.js\";\n\nexport interface ActiveRecallTurn {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ActiveRecallInput {\n sessionKey: string;\n agentId: string;\n chatType: ActiveRecallChatType;\n recentTurns: ActiveRecallTurn[];\n currentMessage: string;\n}\n\nexport interface ActiveRecallConfig {\n enabled: boolean;\n agents: string[] | null;\n allowedChatTypes: ActiveRecallChatType[];\n queryMode: ActiveRecallQueryMode;\n promptStyle: ActiveRecallPromptStyle;\n promptOverride: string | null;\n promptAppend: string | null;\n maxSummaryChars: number;\n recentUserTurns: number;\n recentAssistantTurns: number;\n recentUserChars: number;\n recentAssistantChars: number;\n thinking: ActiveRecallThinking;\n timeoutMs: number;\n cacheTtlMs: number;\n persistTranscripts: boolean;\n transcriptDir: string;\n entityGraphDepth: number;\n includeCausalTrajectories: boolean;\n includeDaySummary: boolean;\n attachRecallExplain: boolean;\n modelOverride: string | null;\n modelFallbackPolicy: ActiveRecallModelFallbackPolicy;\n}\n\nexport interface ActiveRecallResult {\n summary: string | null;\n citations: Array<{ memoryId: string; relevance: number }>;\n latencyMs: number;\n cacheHit: boolean;\n modelUsed: string;\n transcriptPath: string | null;\n}\n\nexport interface ActiveRecallDependencies {\n recall(query: string, sessionKey: string): Promise<string | null>;\n getLastRecallSnapshot?(sessionKey: string): { memoryIds?: string[] } | null;\n walkEntityGraph?(params: {\n sessionKey: string;\n query: string;\n depth: number;\n }): Promise<string[]>;\n loadCausalTrajectories?(params: {\n sessionKey: string;\n query: string;\n }): Promise<string[]>;\n loadDaySummary?(sessionKey: string): Promise<string | null>;\n explainLastRecall?(sessionKey: string): Promise<string | null>;\n generateSummary?(params: {\n prompt: string;\n sessionKey: string;\n agentId: string;\n model: string;\n timeoutMs: number;\n thinking: ActiveRecallThinking;\n fallbackPolicy: ActiveRecallModelFallbackPolicy;\n }): Promise<{ text: string | null; modelUsed?: string; cacheHit?: boolean }>;\n now?: () => number;\n}\n\ninterface CachedRecallResult {\n expiresAt: number;\n value: ActiveRecallResult;\n}\n\ninterface ActiveRecallTurnWithIndex {\n index: number;\n role: ActiveRecallTurn[\"role\"];\n content: string;\n}\n\nconst ACTIVE_RECALL_CACHE_MAX_ENTRIES = 256;\n\nconst NONE_SET = new Set([\n \"\",\n \"none\",\n \"no_reply\",\n \"nothing useful\",\n \"no relevant memory\",\n \"timeout\",\n \"[]\",\n \"{}\",\n \"null\",\n \"n/a\",\n]);\n\nconst STYLE_INSTRUCTIONS: Record<ActiveRecallPromptStyle, string> = {\n balanced: \"Summarize the most relevant memory context in a compact, neutral way.\",\n strict: \"Only include memory that is directly supported by the retrieved context.\",\n contextual: \"Prefer concise context that helps the next reply stay grounded in recent work.\",\n \"recall-heavy\": \"Bias toward richer recall coverage when multiple retrieved items reinforce each other.\",\n \"precision-heavy\": \"Bias toward precision. Omit anything uncertain or weakly supported.\",\n \"preference-only\": \"Only surface user preference or operating-style memory when present.\",\n};\n\nfunction cloneRecallResult(value: ActiveRecallResult): ActiveRecallResult {\n return {\n ...value,\n citations: [...value.citations],\n };\n}\n\nfunction buildCacheKey(input: ActiveRecallInput, config: ActiveRecallConfig, queryBundle: string): string {\n return JSON.stringify({\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n queryMode: config.queryMode,\n promptStyle: config.promptStyle,\n promptOverride: config.promptOverride,\n promptAppend: config.promptAppend,\n maxSummaryChars: config.maxSummaryChars,\n entityGraphDepth: config.entityGraphDepth,\n includeCausalTrajectories: config.includeCausalTrajectories,\n includeDaySummary: config.includeDaySummary,\n attachRecallExplain: config.attachRecallExplain,\n modelOverride: config.modelOverride,\n modelFallbackPolicy: config.modelFallbackPolicy,\n thinking: config.thinking,\n queryBundle,\n });\n}\n\nfunction pruneExpiredCache(\n cache: Map<string, CachedRecallResult>,\n currentTime: number,\n): void {\n for (const [key, entry] of cache.entries()) {\n if (entry.expiresAt <= currentTime) {\n cache.delete(key);\n }\n }\n}\n\nfunction enforceCacheLimit(cache: Map<string, CachedRecallResult>): void {\n while (cache.size > ACTIVE_RECALL_CACHE_MAX_ENTRIES) {\n const oldestKey = cache.keys().next().value;\n if (typeof oldestKey !== \"string\") {\n break;\n }\n cache.delete(oldestKey);\n }\n}\n\nfunction cropTurns(\n turns: ActiveRecallTurn[],\n role: \"user\" | \"assistant\",\n maxTurns: number,\n maxChars: number,\n): ActiveRecallTurnWithIndex[] {\n if (maxTurns <= 0) {\n return [];\n }\n\n const selected: ActiveRecallTurnWithIndex[] = [];\n for (let index = turns.length - 1; index >= 0 && selected.length < maxTurns; index -= 1) {\n const turn = turns[index];\n if (turn?.role === role) {\n selected.push({\n index,\n role: turn.role,\n content: collapseWhitespace(truncateCodePointSafe(turn.content, maxChars)),\n });\n }\n }\n\n return selected.reverse();\n}\n\nfunction mergeChronologicalTurns(\n userTurns: ActiveRecallTurnWithIndex[],\n assistantTurns: ActiveRecallTurnWithIndex[],\n): ActiveRecallTurnWithIndex[] {\n return [...userTurns, ...assistantTurns]\n .sort((left, right) => left.index - right.index)\n .filter((value) => value.content.length > 0);\n}\n\nexport function buildActiveRecallQueryBundle(\n input: ActiveRecallInput,\n config: ActiveRecallConfig,\n): string {\n if (config.queryMode === \"message\") {\n return collapseWhitespace(input.currentMessage);\n }\n\n const userTurns = cropTurns(\n input.recentTurns,\n \"user\",\n config.recentUserTurns,\n config.recentUserChars,\n );\n const assistantTurns = cropTurns(\n input.recentTurns,\n \"assistant\",\n config.recentAssistantTurns,\n config.recentAssistantChars,\n );\n const mergedTurns = mergeChronologicalTurns(userTurns, assistantTurns);\n\n const parts = [\n ...mergedTurns.map((turn) => `${turn.role}: ${turn.content}`),\n ];\n\n if (config.queryMode === \"full\") {\n return [...parts, `current: ${collapseWhitespace(input.currentMessage)}`]\n .filter((value) => value.trim().length > 0)\n .join(\"\\n\");\n }\n\n return [`current: ${collapseWhitespace(input.currentMessage)}`, ...parts]\n .filter((value) => value.trim().length > 0)\n .join(\"\\n\");\n}\n\nexport function normalizeActiveRecallSummary(value: string | null, maxChars: number): string | null {\n if (value == null) return null;\n const compact = collapseWhitespace(value);\n if (NONE_SET.has(compact.toLowerCase())) return null;\n return truncateCodePointSafe(compact, maxChars);\n}\n\nfunction sanitizeTranscriptPathSegment(value: string): string {\n const normalized = collapseWhitespace(value);\n return encodeURIComponent(normalized.length > 0 ? normalized : \"unknown\").replaceAll(\n \".\",\n \"%2E\",\n );\n}\n\nexport function buildActiveRecallPrompt(params: {\n config: ActiveRecallConfig;\n queryBundle: string;\n recallContext: string | null;\n graphContext: string[];\n causalContext: string[];\n daySummary: string | null;\n recallExplain: string | null;\n}): string {\n const sections = [\n params.config.promptOverride?.trim() || STYLE_INSTRUCTIONS[params.config.promptStyle],\n `Query bundle:\\n${params.queryBundle}`,\n params.recallContext ? `Retrieved memory:\\n${params.recallContext}` : null,\n params.graphContext.length > 0 ? `Entity graph:\\n${params.graphContext.join(\"\\n\")}` : null,\n params.causalContext.length > 0 ? `Causal trajectories:\\n${params.causalContext.join(\"\\n\")}` : null,\n params.daySummary ? `Day summary:\\n${params.daySummary}` : null,\n params.recallExplain ? `Recall explain:\\n${params.recallExplain}` : null,\n params.config.promptAppend?.trim() || null,\n \"Return either NONE or a compact summary grounded only in the supplied context.\",\n ];\n return sections.filter((value): value is string => !!value && value.trim().length > 0).join(\"\\n\\n\");\n}\n\nasync function appendActiveRecallTranscript(\n transcriptRoot: string,\n input: ActiveRecallInput,\n config: ActiveRecallConfig,\n result: ActiveRecallResult,\n queryBundle: string,\n): Promise<string> {\n const date = new Date().toISOString().slice(0, 10);\n const filePath = path.join(\n transcriptRoot,\n \"agents\",\n sanitizeTranscriptPathSegment(input.agentId),\n date,\n `${sanitizeTranscriptPathSegment(input.sessionKey)}.jsonl`,\n );\n await mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(\n filePath,\n `${JSON.stringify({\n ts: new Date().toISOString(),\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n queryMode: config.queryMode,\n promptStyle: config.promptStyle,\n queryBundle,\n summary: result.summary,\n citations: result.citations,\n latencyMs: result.latencyMs,\n cacheHit: result.cacheHit,\n modelUsed: result.modelUsed,\n })}\\n`,\n \"utf8\",\n );\n return filePath;\n}\n\nexport function createActiveRecallEngine(\n deps: ActiveRecallDependencies,\n config: ActiveRecallConfig,\n) {\n const cache = new Map<string, CachedRecallResult>();\n const now = deps.now ?? (() => Date.now());\n\n return {\n async run(input: ActiveRecallInput): Promise<ActiveRecallResult> {\n if (!config.enabled) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"disabled\",\n transcriptPath: null,\n };\n }\n if (config.agents && !config.agents.includes(input.agentId)) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"filtered\",\n transcriptPath: null,\n };\n }\n if (!config.allowedChatTypes.includes(input.chatType)) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"filtered\",\n transcriptPath: null,\n };\n }\n\n const queryBundle = buildActiveRecallQueryBundle(input, config);\n const cacheKey = buildCacheKey(input, config, queryBundle);\n const currentTime = now();\n const cacheEnabled = config.cacheTtlMs > 0;\n if (cacheEnabled) {\n pruneExpiredCache(cache, currentTime);\n }\n const cached = cache.get(cacheKey);\n if (cacheEnabled && cached) {\n return {\n ...cloneRecallResult(cached.value),\n latencyMs: Math.max(0, now() - currentTime),\n cacheHit: true,\n };\n }\n\n const start = currentTime;\n const recallContext = await deps.recall(queryBundle, input.sessionKey);\n const graphContext =\n config.entityGraphDepth > 0 && deps.walkEntityGraph\n ? await deps.walkEntityGraph({\n sessionKey: input.sessionKey,\n query: queryBundle,\n depth: config.entityGraphDepth,\n })\n : [];\n const causalContext =\n config.includeCausalTrajectories && deps.loadCausalTrajectories\n ? await deps.loadCausalTrajectories({\n sessionKey: input.sessionKey,\n query: queryBundle,\n })\n : [];\n const daySummary =\n config.includeDaySummary && deps.loadDaySummary\n ? await deps.loadDaySummary(input.sessionKey)\n : null;\n const recallExplain =\n config.attachRecallExplain && deps.explainLastRecall\n ? await deps.explainLastRecall(input.sessionKey)\n : null;\n const prompt = buildActiveRecallPrompt({\n config,\n queryBundle,\n recallContext,\n graphContext,\n causalContext,\n daySummary,\n recallExplain,\n });\n\n const generated = deps.generateSummary\n ? await deps.generateSummary({\n prompt,\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n model: config.modelOverride ?? \"gpt-5.2\",\n timeoutMs: config.timeoutMs,\n thinking: config.thinking,\n fallbackPolicy: config.modelFallbackPolicy,\n })\n : {\n text: recallContext,\n modelUsed: config.modelOverride ?? \"gpt-5.2\",\n cacheHit: false,\n };\n const summary = normalizeActiveRecallSummary(\n generated.text,\n config.maxSummaryChars,\n );\n const snapshot = deps.getLastRecallSnapshot?.(input.sessionKey);\n const citations = (snapshot?.memoryIds ?? []).map((memoryId, index) => ({\n memoryId,\n relevance: Number((1 / (index + 1)).toFixed(3)),\n }));\n const result: ActiveRecallResult = {\n summary,\n citations,\n latencyMs: Math.max(0, now() - start),\n cacheHit: generated.cacheHit === true,\n modelUsed: generated.modelUsed ?? config.modelOverride ?? \"gpt-5.2\",\n transcriptPath: null,\n };\n if (config.persistTranscripts) {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n }\n\n if (cacheEnabled) {\n const completedAt = now();\n cache.set(cacheKey, {\n expiresAt: completedAt + config.cacheTtlMs,\n value: cloneRecallResult(result),\n });\n enforceCacheLimit(cache);\n }\n return result;\n },\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/active-recall.ts"],"sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collapseWhitespace, truncateCodePointSafe } from \"./whitespace.js\";\nimport type {\n ActiveRecallChatType,\n ActiveRecallModelFallbackPolicy,\n ActiveRecallPromptStyle,\n ActiveRecallQueryMode,\n ActiveRecallThinking,\n} from \"./types.js\";\n\nexport interface ActiveRecallTurn {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ActiveRecallInput {\n sessionKey: string;\n agentId: string;\n chatType: ActiveRecallChatType;\n recentTurns: ActiveRecallTurn[];\n currentMessage: string;\n}\n\nexport interface ActiveRecallConfig {\n enabled: boolean;\n agents: string[] | null;\n allowedChatTypes: ActiveRecallChatType[];\n queryMode: ActiveRecallQueryMode;\n promptStyle: ActiveRecallPromptStyle;\n customInstruction: string | null;\n promptAppend: string | null;\n maxSummaryChars: number;\n recentUserTurns: number;\n recentAssistantTurns: number;\n recentUserChars: number;\n recentAssistantChars: number;\n thinking: ActiveRecallThinking;\n timeoutMs: number;\n cacheTtlMs: number;\n persistTranscripts: boolean;\n transcriptDir: string;\n entityGraphDepth: number;\n includeCausalTrajectories: boolean;\n includeDaySummary: boolean;\n attachRecallExplain: boolean;\n modelOverride: string | null;\n modelFallbackPolicy: ActiveRecallModelFallbackPolicy;\n}\n\nexport interface ActiveRecallResult {\n summary: string | null;\n citations: Array<{ memoryId: string; relevance: number }>;\n latencyMs: number;\n cacheHit: boolean;\n modelUsed: string;\n transcriptPath: string | null;\n}\n\nexport interface ActiveRecallDependencies {\n recall(query: string, sessionKey: string): Promise<string | null>;\n getLastRecallSnapshot?(sessionKey: string): { memoryIds?: string[] } | null;\n walkEntityGraph?(params: {\n sessionKey: string;\n query: string;\n depth: number;\n }): Promise<string[]>;\n loadCausalTrajectories?(params: {\n sessionKey: string;\n query: string;\n }): Promise<string[]>;\n loadDaySummary?(sessionKey: string): Promise<string | null>;\n explainLastRecall?(sessionKey: string): Promise<string | null>;\n generateSummary?(params: {\n prompt: string;\n sessionKey: string;\n agentId: string;\n model: string;\n timeoutMs: number;\n thinking: ActiveRecallThinking;\n fallbackPolicy: ActiveRecallModelFallbackPolicy;\n }): Promise<{ text: string | null; modelUsed?: string; cacheHit?: boolean }>;\n now?: () => number;\n}\n\ninterface CachedRecallResult {\n expiresAt: number;\n value: ActiveRecallResult;\n}\n\ninterface ActiveRecallTurnWithIndex {\n index: number;\n role: ActiveRecallTurn[\"role\"];\n content: string;\n}\n\nconst ACTIVE_RECALL_CACHE_MAX_ENTRIES = 256;\n\nconst NONE_SET = new Set([\n \"\",\n \"none\",\n \"no_reply\",\n \"nothing useful\",\n \"no relevant memory\",\n \"timeout\",\n \"[]\",\n \"{}\",\n \"null\",\n \"n/a\",\n]);\n\nconst STYLE_INSTRUCTIONS: Record<ActiveRecallPromptStyle, string> = {\n balanced: \"Summarize the most relevant memory context in a compact, neutral way.\",\n strict: \"Only include memory that is directly supported by the retrieved context.\",\n contextual: \"Prefer concise context that helps the next reply stay grounded in recent work.\",\n \"recall-heavy\": \"Bias toward richer recall coverage when multiple retrieved items reinforce each other.\",\n \"precision-heavy\": \"Bias toward precision. Omit anything uncertain or weakly supported.\",\n \"preference-only\": \"Only surface user preference or operating-style memory when present.\",\n};\n\nfunction cloneRecallResult(value: ActiveRecallResult): ActiveRecallResult {\n return {\n ...value,\n citations: [...value.citations],\n };\n}\n\nfunction buildCacheKey(input: ActiveRecallInput, config: ActiveRecallConfig, queryBundle: string): string {\n return JSON.stringify({\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n queryMode: config.queryMode,\n promptStyle: config.promptStyle,\n customInstruction: config.customInstruction,\n promptAppend: config.promptAppend,\n maxSummaryChars: config.maxSummaryChars,\n entityGraphDepth: config.entityGraphDepth,\n includeCausalTrajectories: config.includeCausalTrajectories,\n includeDaySummary: config.includeDaySummary,\n attachRecallExplain: config.attachRecallExplain,\n modelOverride: config.modelOverride,\n modelFallbackPolicy: config.modelFallbackPolicy,\n thinking: config.thinking,\n queryBundle,\n });\n}\n\nfunction pruneExpiredCache(\n cache: Map<string, CachedRecallResult>,\n currentTime: number,\n): void {\n for (const [key, entry] of cache.entries()) {\n if (entry.expiresAt <= currentTime) {\n cache.delete(key);\n }\n }\n}\n\nfunction enforceCacheLimit(cache: Map<string, CachedRecallResult>): void {\n while (cache.size > ACTIVE_RECALL_CACHE_MAX_ENTRIES) {\n const oldestKey = cache.keys().next().value;\n if (typeof oldestKey !== \"string\") {\n break;\n }\n cache.delete(oldestKey);\n }\n}\n\nfunction cropTurns(\n turns: ActiveRecallTurn[],\n role: \"user\" | \"assistant\",\n maxTurns: number,\n maxChars: number,\n): ActiveRecallTurnWithIndex[] {\n if (maxTurns <= 0) {\n return [];\n }\n\n const selected: ActiveRecallTurnWithIndex[] = [];\n for (let index = turns.length - 1; index >= 0 && selected.length < maxTurns; index -= 1) {\n const turn = turns[index];\n if (turn?.role === role) {\n selected.push({\n index,\n role: turn.role,\n content: collapseWhitespace(truncateCodePointSafe(turn.content, maxChars)),\n });\n }\n }\n\n return selected.reverse();\n}\n\nfunction mergeChronologicalTurns(\n userTurns: ActiveRecallTurnWithIndex[],\n assistantTurns: ActiveRecallTurnWithIndex[],\n): ActiveRecallTurnWithIndex[] {\n return [...userTurns, ...assistantTurns]\n .sort((left, right) => left.index - right.index)\n .filter((value) => value.content.length > 0);\n}\n\nexport function buildActiveRecallQueryBundle(\n input: ActiveRecallInput,\n config: ActiveRecallConfig,\n): string {\n if (config.queryMode === \"message\") {\n return collapseWhitespace(input.currentMessage);\n }\n\n const userTurns = cropTurns(\n input.recentTurns,\n \"user\",\n config.recentUserTurns,\n config.recentUserChars,\n );\n const assistantTurns = cropTurns(\n input.recentTurns,\n \"assistant\",\n config.recentAssistantTurns,\n config.recentAssistantChars,\n );\n const mergedTurns = mergeChronologicalTurns(userTurns, assistantTurns);\n\n const parts = [\n ...mergedTurns.map((turn) => `${turn.role}: ${turn.content}`),\n ];\n\n if (config.queryMode === \"full\") {\n return [...parts, `current: ${collapseWhitespace(input.currentMessage)}`]\n .filter((value) => value.trim().length > 0)\n .join(\"\\n\");\n }\n\n return [`current: ${collapseWhitespace(input.currentMessage)}`, ...parts]\n .filter((value) => value.trim().length > 0)\n .join(\"\\n\");\n}\n\nexport function normalizeActiveRecallSummary(value: string | null, maxChars: number): string | null {\n if (value == null) return null;\n const compact = collapseWhitespace(value);\n if (NONE_SET.has(compact.toLowerCase())) return null;\n return truncateCodePointSafe(compact, maxChars);\n}\n\nfunction sanitizeTranscriptPathSegment(value: string): string {\n const normalized = collapseWhitespace(value);\n return encodeURIComponent(normalized.length > 0 ? normalized : \"unknown\").replaceAll(\n \".\",\n \"%2E\",\n );\n}\n\nexport function buildActiveRecallPrompt(params: {\n config: ActiveRecallConfig;\n queryBundle: string;\n recallContext: string | null;\n graphContext: string[];\n causalContext: string[];\n daySummary: string | null;\n recallExplain: string | null;\n}): string {\n const sections = [\n params.config.customInstruction?.trim() || STYLE_INSTRUCTIONS[params.config.promptStyle],\n `Query bundle:\\n${params.queryBundle}`,\n params.recallContext ? `Retrieved memory:\\n${params.recallContext}` : null,\n params.graphContext.length > 0 ? `Entity graph:\\n${params.graphContext.join(\"\\n\")}` : null,\n params.causalContext.length > 0 ? `Causal trajectories:\\n${params.causalContext.join(\"\\n\")}` : null,\n params.daySummary ? `Day summary:\\n${params.daySummary}` : null,\n params.recallExplain ? `Recall explain:\\n${params.recallExplain}` : null,\n params.config.promptAppend?.trim() || null,\n \"Return either NONE or a compact summary grounded only in the supplied context.\",\n ];\n return sections.filter((value): value is string => !!value && value.trim().length > 0).join(\"\\n\\n\");\n}\n\nasync function appendActiveRecallTranscript(\n transcriptRoot: string,\n input: ActiveRecallInput,\n config: ActiveRecallConfig,\n result: ActiveRecallResult,\n queryBundle: string,\n): Promise<string> {\n const date = new Date().toISOString().slice(0, 10);\n const filePath = path.join(\n transcriptRoot,\n \"agents\",\n sanitizeTranscriptPathSegment(input.agentId),\n date,\n `${sanitizeTranscriptPathSegment(input.sessionKey)}.jsonl`,\n );\n await mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(\n filePath,\n `${JSON.stringify({\n ts: new Date().toISOString(),\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n queryMode: config.queryMode,\n promptStyle: config.promptStyle,\n queryBundle,\n summary: result.summary,\n citations: result.citations,\n latencyMs: result.latencyMs,\n cacheHit: result.cacheHit,\n modelUsed: result.modelUsed,\n })}\\n`,\n \"utf8\",\n );\n return filePath;\n}\n\nexport function createActiveRecallEngine(\n deps: ActiveRecallDependencies,\n config: ActiveRecallConfig,\n) {\n const cache = new Map<string, CachedRecallResult>();\n const now = deps.now ?? (() => Date.now());\n\n return {\n async run(input: ActiveRecallInput): Promise<ActiveRecallResult> {\n if (!config.enabled) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"disabled\",\n transcriptPath: null,\n };\n }\n if (config.agents && !config.agents.includes(input.agentId)) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"filtered\",\n transcriptPath: null,\n };\n }\n if (!config.allowedChatTypes.includes(input.chatType)) {\n return {\n summary: null,\n citations: [],\n latencyMs: 0,\n cacheHit: false,\n modelUsed: config.modelOverride ?? \"filtered\",\n transcriptPath: null,\n };\n }\n\n const queryBundle = buildActiveRecallQueryBundle(input, config);\n const cacheKey = buildCacheKey(input, config, queryBundle);\n const currentTime = now();\n const cacheEnabled = config.cacheTtlMs > 0;\n if (cacheEnabled) {\n pruneExpiredCache(cache, currentTime);\n }\n const cached = cache.get(cacheKey);\n if (cacheEnabled && cached) {\n return {\n ...cloneRecallResult(cached.value),\n latencyMs: Math.max(0, now() - currentTime),\n cacheHit: true,\n };\n }\n\n const start = currentTime;\n const recallContext = await deps.recall(queryBundle, input.sessionKey);\n const graphContext =\n config.entityGraphDepth > 0 && deps.walkEntityGraph\n ? await deps.walkEntityGraph({\n sessionKey: input.sessionKey,\n query: queryBundle,\n depth: config.entityGraphDepth,\n })\n : [];\n const causalContext =\n config.includeCausalTrajectories && deps.loadCausalTrajectories\n ? await deps.loadCausalTrajectories({\n sessionKey: input.sessionKey,\n query: queryBundle,\n })\n : [];\n const daySummary =\n config.includeDaySummary && deps.loadDaySummary\n ? await deps.loadDaySummary(input.sessionKey)\n : null;\n const recallExplain =\n config.attachRecallExplain && deps.explainLastRecall\n ? await deps.explainLastRecall(input.sessionKey)\n : null;\n const prompt = buildActiveRecallPrompt({\n config,\n queryBundle,\n recallContext,\n graphContext,\n causalContext,\n daySummary,\n recallExplain,\n });\n\n const generated = deps.generateSummary\n ? await deps.generateSummary({\n prompt,\n sessionKey: input.sessionKey,\n agentId: input.agentId,\n model: config.modelOverride ?? \"gpt-5.2\",\n timeoutMs: config.timeoutMs,\n thinking: config.thinking,\n fallbackPolicy: config.modelFallbackPolicy,\n })\n : {\n text: recallContext,\n modelUsed: config.modelOverride ?? \"gpt-5.2\",\n cacheHit: false,\n };\n const summary = normalizeActiveRecallSummary(\n generated.text,\n config.maxSummaryChars,\n );\n const snapshot = deps.getLastRecallSnapshot?.(input.sessionKey);\n const citations = (snapshot?.memoryIds ?? []).map((memoryId, index) => ({\n memoryId,\n relevance: Number((1 / (index + 1)).toFixed(3)),\n }));\n const result: ActiveRecallResult = {\n summary,\n citations,\n latencyMs: Math.max(0, now() - start),\n cacheHit: generated.cacheHit === true,\n modelUsed: generated.modelUsed ?? config.modelOverride ?? \"gpt-5.2\",\n transcriptPath: null,\n };\n if (config.persistTranscripts) {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n }\n\n if (cacheEnabled) {\n const completedAt = now();\n cache.set(cacheKey, {\n expiresAt: completedAt + config.cacheTtlMs,\n value: cloneRecallResult(result),\n });\n enforceCacheLimit(cache);\n }\n return result;\n },\n };\n}\n"],"mappings":";;;;;;;AAAA,SAAS,YAAY,aAAa;AAClC,OAAO,UAAU;AA+FjB,IAAM,kCAAkC;AAExC,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAA8D;AAAA,EAClE,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAEA,SAAS,kBAAkB,OAA+C;AACxE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,CAAC,GAAG,MAAM,SAAS;AAAA,EAChC;AACF;AAEA,SAAS,cAAc,OAA0B,QAA4B,aAA6B;AACxG,SAAO,KAAK,UAAU;AAAA,IACpB,YAAY,MAAM;AAAA,IAClB,SAAS,MAAM;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,mBAAmB,OAAO;AAAA,IAC1B,cAAc,OAAO;AAAA,IACrB,iBAAiB,OAAO;AAAA,IACxB,kBAAkB,OAAO;AAAA,IACzB,2BAA2B,OAAO;AAAA,IAClC,mBAAmB,OAAO;AAAA,IAC1B,qBAAqB,OAAO;AAAA,IAC5B,eAAe,OAAO;AAAA,IACtB,qBAAqB,OAAO;AAAA,IAC5B,UAAU,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBACP,OACA,aACM;AACN,aAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC1C,QAAI,MAAM,aAAa,aAAa;AAClC,YAAM,OAAO,GAAG;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAA8C;AACvE,SAAO,MAAM,OAAO,iCAAiC;AACnD,UAAM,YAAY,MAAM,KAAK,EAAE,KAAK,EAAE;AACtC,QAAI,OAAO,cAAc,UAAU;AACjC;AAAA,IACF;AACA,UAAM,OAAO,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,UACP,OACA,MACA,UACA,UAC6B;AAC7B,MAAI,YAAY,GAAG;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAwC,CAAC;AAC/C,WAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,SAAS,UAAU,SAAS,GAAG;AACvF,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,MAAM,SAAS,MAAM;AACvB,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,MAAM,KAAK;AAAA,QACX,SAAS,mBAAmB,sBAAsB,KAAK,SAAS,QAAQ,CAAC;AAAA,MAC3E,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,SAAS,QAAQ;AAC1B;AAEA,SAAS,wBACP,WACA,gBAC6B;AAC7B,SAAO,CAAC,GAAG,WAAW,GAAG,cAAc,EACpC,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,EAC9C,OAAO,CAAC,UAAU,MAAM,QAAQ,SAAS,CAAC;AAC/C;AAEO,SAAS,6BACd,OACA,QACQ;AACR,MAAI,OAAO,cAAc,WAAW;AAClC,WAAO,mBAAmB,MAAM,cAAc;AAAA,EAChD;AAEA,QAAM,YAAY;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,iBAAiB;AAAA,IACrB,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,cAAc,wBAAwB,WAAW,cAAc;AAErE,QAAM,QAAQ;AAAA,IACZ,GAAG,YAAY,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE;AAAA,EAC9D;AAEA,MAAI,OAAO,cAAc,QAAQ;AAC/B,WAAO,CAAC,GAAG,OAAO,YAAY,mBAAmB,MAAM,cAAc,CAAC,EAAE,EACrE,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,EACzC,KAAK,IAAI;AAAA,EACd;AAEA,SAAO,CAAC,YAAY,mBAAmB,MAAM,cAAc,CAAC,IAAI,GAAG,KAAK,EACrE,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,EACzC,KAAK,IAAI;AACd;AAEO,SAAS,6BAA6B,OAAsB,UAAiC;AAClG,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,UAAU,mBAAmB,KAAK;AACxC,MAAI,SAAS,IAAI,QAAQ,YAAY,CAAC,EAAG,QAAO;AAChD,SAAO,sBAAsB,SAAS,QAAQ;AAChD;AAEA,SAAS,8BAA8B,OAAuB;AAC5D,QAAM,aAAa,mBAAmB,KAAK;AAC3C,SAAO,mBAAmB,WAAW,SAAS,IAAI,aAAa,SAAS,EAAE;AAAA,IACxE;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAQ7B;AACT,QAAM,WAAW;AAAA,IACf,OAAO,OAAO,mBAAmB,KAAK,KAAK,mBAAmB,OAAO,OAAO,WAAW;AAAA,IACvF;AAAA,EAAkB,OAAO,WAAW;AAAA,IACpC,OAAO,gBAAgB;AAAA,EAAsB,OAAO,aAAa,KAAK;AAAA,IACtE,OAAO,aAAa,SAAS,IAAI;AAAA,EAAkB,OAAO,aAAa,KAAK,IAAI,CAAC,KAAK;AAAA,IACtF,OAAO,cAAc,SAAS,IAAI;AAAA,EAAyB,OAAO,cAAc,KAAK,IAAI,CAAC,KAAK;AAAA,IAC/F,OAAO,aAAa;AAAA,EAAiB,OAAO,UAAU,KAAK;AAAA,IAC3D,OAAO,gBAAgB;AAAA,EAAoB,OAAO,aAAa,KAAK;AAAA,IACpE,OAAO,OAAO,cAAc,KAAK,KAAK;AAAA,IACtC;AAAA,EACF;AACA,SAAO,SAAS,OAAO,CAAC,UAA2B,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,MAAM;AACpG;AAEA,eAAe,6BACb,gBACA,OACA,QACA,QACA,aACiB;AACjB,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACjD,QAAM,WAAW,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA,8BAA8B,MAAM,OAAO;AAAA,IAC3C;AAAA,IACA,GAAG,8BAA8B,MAAM,UAAU,CAAC;AAAA,EACpD;AACA,QAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM;AAAA,IACJ;AAAA,IACA,GAAG,KAAK,UAAU;AAAA,MAChB,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC3B,YAAY,MAAM;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,aAAa,OAAO;AAAA,MACpB;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,IACpB,CAAC,CAAC;AAAA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBACd,MACA,QACA;AACA,QAAM,QAAQ,oBAAI,IAAgC;AAClD,QAAM,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI;AAExC,SAAO;AAAA,IACL,MAAM,IAAI,OAAuD;AAC/D,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW,OAAO,iBAAiB;AAAA,UACnC,gBAAgB;AAAA,QAClB;AAAA,MACF;AACA,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,MAAM,OAAO,GAAG;AAC3D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW,OAAO,iBAAiB;AAAA,UACnC,gBAAgB;AAAA,QAClB;AAAA,MACF;AACA,UAAI,CAAC,OAAO,iBAAiB,SAAS,MAAM,QAAQ,GAAG;AACrD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,CAAC;AAAA,UACZ,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW,OAAO,iBAAiB;AAAA,UACnC,gBAAgB;AAAA,QAClB;AAAA,MACF;AAEA,YAAM,cAAc,6BAA6B,OAAO,MAAM;AAC9D,YAAM,WAAW,cAAc,OAAO,QAAQ,WAAW;AACzD,YAAM,cAAc,IAAI;AACxB,YAAM,eAAe,OAAO,aAAa;AACzC,UAAI,cAAc;AAChB,0BAAkB,OAAO,WAAW;AAAA,MACtC;AACA,YAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,UAAI,gBAAgB,QAAQ;AAC1B,eAAO;AAAA,UACL,GAAG,kBAAkB,OAAO,KAAK;AAAA,UACjC,WAAW,KAAK,IAAI,GAAG,IAAI,IAAI,WAAW;AAAA,UAC1C,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,QAAQ;AACd,YAAM,gBAAgB,MAAM,KAAK,OAAO,aAAa,MAAM,UAAU;AACrE,YAAM,eACJ,OAAO,mBAAmB,KAAK,KAAK,kBAChC,MAAM,KAAK,gBAAgB;AAAA,QACzB,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,MAChB,CAAC,IACD,CAAC;AACP,YAAM,gBACJ,OAAO,6BAA6B,KAAK,yBACrC,MAAM,KAAK,uBAAuB;AAAA,QAChC,YAAY,MAAM;AAAA,QAClB,OAAO;AAAA,MACT,CAAC,IACD,CAAC;AACP,YAAM,aACJ,OAAO,qBAAqB,KAAK,iBAC7B,MAAM,KAAK,eAAe,MAAM,UAAU,IAC1C;AACN,YAAM,gBACJ,OAAO,uBAAuB,KAAK,oBAC/B,MAAM,KAAK,kBAAkB,MAAM,UAAU,IAC7C;AACN,YAAM,SAAS,wBAAwB;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,YAAY,KAAK,kBACnB,MAAM,KAAK,gBAAgB;AAAA,QACzB;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,SAAS,MAAM;AAAA,QACf,OAAO,OAAO,iBAAiB;AAAA,QAC/B,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,gBAAgB,OAAO;AAAA,MACzB,CAAC,IACD;AAAA,QACE,MAAM;AAAA,QACN,WAAW,OAAO,iBAAiB;AAAA,QACnC,UAAU;AAAA,MACZ;AACJ,YAAM,UAAU;AAAA,QACd,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK,wBAAwB,MAAM,UAAU;AAC9D,YAAM,aAAa,UAAU,aAAa,CAAC,GAAG,IAAI,CAAC,UAAU,WAAW;AAAA,QACtE;AAAA,QACA,WAAW,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAAA,MAChD,EAAE;AACF,YAAM,SAA6B;AAAA,QACjC;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AAAA,QACpC,UAAU,UAAU,aAAa;AAAA,QACjC,WAAW,UAAU,aAAa,OAAO,iBAAiB;AAAA,QAC1D,gBAAgB;AAAA,MAClB;AACA,UAAI,OAAO,oBAAoB;AAC7B,eAAO,iBAAiB,MAAM;AAAA,UAC5B,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM,cAAc,IAAI;AACxB,cAAM,IAAI,UAAU;AAAA,UAClB,WAAW,cAAc,OAAO;AAAA,UAChC,OAAO,kBAAkB,MAAM;AAAA,QACjC,CAAC;AACD,0BAAkB,KAAK;AAAA,MACzB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- import { B as BehaviorSignalEvent, P as PluginConfig, e as BehaviorLoopPolicyState } from './types-H85grL1f.js';
1
+ import { B as BehaviorSignalEvent, P as PluginConfig, e as BehaviorLoopPolicyState } from './types-Bmp9ssU2.js';
2
2
 
3
3
  declare const TUNABLE_BEHAVIOR_PARAMETERS: readonly ["recencyWeight", "lifecyclePromoteHeatThreshold", "lifecycleStaleDecayThreshold", "cronRecallInstructionHeavyTokenCap"];
4
4
  type TunableBehaviorParameter = (typeof TUNABLE_BEHAVIOR_PARAMETERS)[number];
@@ -1,4 +1,4 @@
1
- import { M as MemoryCategory, B as BehaviorSignalEvent } from './types-H85grL1f.js';
1
+ import { M as MemoryCategory, B as BehaviorSignalEvent } from './types-Bmp9ssU2.js';
2
2
 
3
3
  declare function buildBehaviorSignalHash(category: MemoryCategory, content: string): string;
4
4
  declare function buildBehaviorSignalsForMemory(input: {
@@ -1,12 +1,12 @@
1
- import { P as PluginConfig } from './types-H85grL1f.js';
2
- import { O as Orchestrator } from './orchestrator-CvUYwuaL.js';
1
+ import { P as PluginConfig } from './types-Bmp9ssU2.js';
2
+ import { O as Orchestrator } from './orchestrator-CYqmqxco.js';
3
3
  import './buffer.js';
4
4
  import './storage.js';
5
5
  import './page-versioning.js';
6
6
  import './consolidation-operator.js';
7
- import './memory-projection-store-lCzmu4JX.js';
7
+ import './memory-projection-store-BW8u5U0u.js';
8
8
  import 'better-sqlite3';
9
- import './port-BkWL7hqo.js';
9
+ import './port-Br27H8dy.js';
10
10
  import './transcript.js';
11
11
  import './session-integrity.js';
12
12
  import './summarizer.js';
@@ -21,8 +21,8 @@ import './recall-state.js';
21
21
  import './recall-xray.js';
22
22
  import './session-observer-state.js';
23
23
  import './embedding-fallback.js';
24
- import './semantic-consolidation-CGiH52qa.js';
25
- import './codex-materialize-xVqbEmcm.js';
24
+ import './semantic-consolidation-GPcLr9BQ.js';
25
+ import './codex-materialize-YVC2wb6n.js';
26
26
  import './logger.js';
27
27
  import 'zod';
28
28
  import './policy-runtime.js';
@@ -1,8 +1,8 @@
1
1
  import { StorageManager } from './storage.js';
2
- import { a6 as BriefingSections, a7 as BriefingFollowup, a8 as BriefingFocus, a9 as CalendarSource, aa as CalendarEvent, f as MemoryFile, ab as BriefingActiveThread, ac as BriefingResult, E as EntityFile, ad as BriefingRecentEntity } from './types-H85grL1f.js';
2
+ import { a6 as BriefingSections, a7 as BriefingFollowup, a8 as BriefingFocus, a9 as CalendarSource, aa as CalendarEvent, f as MemoryFile, ab as BriefingActiveThread, ac as BriefingResult, E as EntityFile, ad as BriefingRecentEntity } from './types-Bmp9ssU2.js';
3
3
  import './page-versioning.js';
4
4
  import './consolidation-operator.js';
5
- import './memory-projection-store-lCzmu4JX.js';
5
+ import './memory-projection-store-BW8u5U0u.js';
6
6
  import 'better-sqlite3';
7
7
 
8
8
  /**
package/dist/briefing.js CHANGED
@@ -16,18 +16,18 @@ import {
16
16
  renderBriefingMarkdown,
17
17
  resolveBriefingSaveDir,
18
18
  validateBriefingFormat
19
- } from "./chunk-4IT6WL23.js";
20
- import "./chunk-XGX4TUF6.js";
19
+ } from "./chunk-7SFAENUZ.js";
20
+ import "./chunk-MJLUHRSF.js";
21
21
  import "./chunk-YNJHCGDT.js";
22
- import "./chunk-4KAN3GZ3.js";
23
- import "./chunk-T65SHTJP.js";
22
+ import "./chunk-NN2DKE4T.js";
23
+ import "./chunk-ET4BL42V.js";
24
24
  import "./chunk-PFV5C235.js";
25
25
  import "./chunk-RULE4VG5.js";
26
26
  import "./chunk-SCU65EZI.js";
27
- import "./chunk-67YLUWLG.js";
27
+ import "./chunk-XJKFSSDW.js";
28
28
  import "./chunk-DM2T26WE.js";
29
29
  import "./chunk-QSVPYQPG.js";
30
- import "./chunk-M62O4P4T.js";
30
+ import "./chunk-FVQJYWH7.js";
31
31
  import "./chunk-4DJQYKMN.js";
32
32
  import "./chunk-G7D6GZ5J.js";
33
33
  import "./chunk-FAAFWE4G.js";
@@ -1,4 +1,4 @@
1
- import { t as BufferSurpriseEvent } from './types-H85grL1f.js';
1
+ import { t as BufferSurpriseEvent } from './types-Bmp9ssU2.js';
2
2
 
3
3
  /**
4
4
  * Buffer-surprise telemetry report (issue #563 PR 3).
package/dist/buffer.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { StorageManager } from './storage.js';
2
- import { P as PluginConfig, a1 as BufferTurn } from './types-H85grL1f.js';
2
+ import { P as PluginConfig, a1 as BufferTurn } from './types-Bmp9ssU2.js';
3
3
  import './page-versioning.js';
4
4
  import './consolidation-operator.js';
5
- import './memory-projection-store-lCzmu4JX.js';
5
+ import './memory-projection-store-BW8u5U0u.js';
6
6
  import 'better-sqlite3';
7
7
 
8
8
  type TriggerDecision = "extract_now" | "extract_batch" | "keep_buffering";
@@ -1,5 +1,5 @@
1
1
  import { FallbackLlmClient } from './fallback-llm.js';
2
- import { G as GatewayConfig } from './types-H85grL1f.js';
2
+ import { G as GatewayConfig } from './types-Bmp9ssU2.js';
3
3
 
4
4
  /**
5
5
  * calibration.ts — Prediction-Error-Driven Model-User Calibration
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  FallbackLlmClient
3
- } from "./chunk-DWMXVUGO.js";
3
+ } from "./chunk-FLBYSB2V.js";
4
4
  import "./chunk-Q7FJ5ZHM.js";
5
- import "./chunk-ODWDQNRE.js";
5
+ import "./chunk-7SI52C65.js";
6
6
  import "./chunk-L2EXJQJP.js";
7
7
  import "./chunk-UZB5KHKX.js";
8
8
  import "./chunk-MARWOCVP.js";
@@ -1,5 +1,5 @@
1
1
  import { CausalChainIndex } from './causal-chain.js';
2
- import { M as MemoryCategory } from './types-H85grL1f.js';
2
+ import { M as MemoryCategory } from './types-Bmp9ssU2.js';
3
3
  import './causal-trajectory.js';
4
4
  import './objective-state.js';
5
5
 
@@ -1,5 +1,5 @@
1
- import { G as GatewayConfig, P as PluginConfig, f as MemoryFile } from './types-H85grL1f.js';
2
- import { R as RolloutSummaryInput, M as MaterializeResult } from './codex-materialize-xVqbEmcm.js';
1
+ import { G as GatewayConfig, P as PluginConfig, f as MemoryFile } from './types-Bmp9ssU2.js';
2
+ import { R as RolloutSummaryInput, M as MaterializeResult } from './codex-materialize-YVC2wb6n.js';
3
3
 
4
4
  /**
5
5
  * causal-consolidation.ts — CMC Phase 2: LLM-Assisted Causal Consolidation
@@ -5,28 +5,28 @@ import {
5
5
  import {
6
6
  buildExtensionsBlockForConsolidation,
7
7
  runPostConsolidationMaterialize
8
- } from "./chunk-FIXIX6DE.js";
8
+ } from "./chunk-G6NX57V2.js";
9
9
  import "./chunk-EJI5XIBB.js";
10
10
  import {
11
11
  FallbackLlmClient
12
- } from "./chunk-DWMXVUGO.js";
12
+ } from "./chunk-FLBYSB2V.js";
13
13
  import "./chunk-Q7FJ5ZHM.js";
14
- import "./chunk-ODWDQNRE.js";
14
+ import "./chunk-7SI52C65.js";
15
15
  import "./chunk-L2EXJQJP.js";
16
16
  import "./chunk-UZB5KHKX.js";
17
17
  import "./chunk-URB2WSKZ.js";
18
18
  import "./chunk-DT5TVLJE.js";
19
- import "./chunk-XGX4TUF6.js";
19
+ import "./chunk-MJLUHRSF.js";
20
20
  import "./chunk-YNJHCGDT.js";
21
- import "./chunk-4KAN3GZ3.js";
22
- import "./chunk-T65SHTJP.js";
21
+ import "./chunk-NN2DKE4T.js";
22
+ import "./chunk-ET4BL42V.js";
23
23
  import "./chunk-PFV5C235.js";
24
24
  import "./chunk-RULE4VG5.js";
25
25
  import "./chunk-SCU65EZI.js";
26
- import "./chunk-67YLUWLG.js";
26
+ import "./chunk-XJKFSSDW.js";
27
27
  import "./chunk-DM2T26WE.js";
28
28
  import "./chunk-QSVPYQPG.js";
29
- import "./chunk-M62O4P4T.js";
29
+ import "./chunk-FVQJYWH7.js";
30
30
  import "./chunk-4DJQYKMN.js";
31
31
  import "./chunk-G7D6GZ5J.js";
32
32
  import "./chunk-FAAFWE4G.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-DT5TVLJE.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-XGX4TUF6.js";
10
+ } from "./chunk-MJLUHRSF.js";
11
11
  import {
12
12
  getCachedEpisodeMap,
13
13
  setCachedEpisodeMap
@@ -105,4 +105,4 @@ async function searchVerifiedEpisodes(options) {
105
105
  export {
106
106
  searchVerifiedEpisodes
107
107
  };
108
- //# sourceMappingURL=chunk-ETA2JXP5.js.map
108
+ //# sourceMappingURL=chunk-2MVUXO4H.js.map
@@ -8,8 +8,6 @@ import {
8
8
  } from "./chunk-2ODBA7MQ.js";
9
9
 
10
10
  // src/day-summary.ts
11
- import { existsSync } from "fs";
12
- import { readFile } from "fs/promises";
13
11
  import path from "path";
14
12
  import { fileURLToPath } from "url";
15
13
  var PROMPT_RELATIVE_PATH = path.join("prompts", "day_summary.prompt.md");
@@ -64,7 +62,8 @@ function candidateRoots() {
64
62
  return true;
65
63
  });
66
64
  }
67
- function resolvePromptPath() {
65
+ async function resolvePromptPath() {
66
+ const { existsSync } = await import("fs");
68
67
  for (const root of candidateRoots()) {
69
68
  const candidate = path.join(root, PROMPT_RELATIVE_PATH);
70
69
  if (existsSync(candidate)) {
@@ -74,9 +73,10 @@ function resolvePromptPath() {
74
73
  return null;
75
74
  }
76
75
  async function loadDaySummaryPrompt() {
77
- const promptPath = resolvePromptPath();
76
+ const promptPath = await resolvePromptPath();
78
77
  if (promptPath) {
79
78
  try {
79
+ const { readFile } = await import("fs/promises");
80
80
  const raw = await readFile(promptPath, "utf-8");
81
81
  const match = raw.match(/```(?:[a-zA-Z0-9_-]+)?\r?\n([\s\S]*?)\r?\n```/);
82
82
  if (match?.[1]) {
@@ -113,4 +113,4 @@ export {
113
113
  formatDaySummaryMemories,
114
114
  buildExtensionsFooterForSummary
115
115
  };
116
- //# sourceMappingURL=chunk-GZCUW5IC.js.map
116
+ //# sourceMappingURL=chunk-3IQ2TR4N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/day-summary.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { log } from \"./logger.js\";\nimport type { MemoryFile, PluginConfig } from \"./types.js\";\nimport { discoverMemoryExtensions, renderExtensionsFooter, resolveExtensionsRoot } from \"./memory-extension-host/index.js\";\n\nconst PROMPT_RELATIVE_PATH = path.join(\"prompts\", \"day_summary.prompt.md\");\n\n// Embedded fallback prompt for packaged/plugin-install builds where\n// prompts/day_summary.prompt.md may not be present in the runtime bundle.\nconst EMBEDDED_DAY_SUMMARY_PROMPT = `# Baseline day-summary prompt\n\nYou are writing an Engram end-of-day summary.\n\nYour job:\n- compress the day into a short, useful recap\n- prioritize concrete events, decisions, mood/energy signals, and open loops\n- include a few practical next actions for tomorrow\n- avoid hype, fluff, therapy-speak, and invented facts\n\nOutput JSON with these keys:\n- \\`summary\\` — one short paragraph\n- \\`bullets\\` — 2 to 5 bullets with the most important moments\n- \\`next_actions\\` — 1 to 3 concrete actions\n- \\`risks_or_open_loops\\` — 0 to 3 things that still need attention\n\nRules:\n- stay grounded in the input only\n- if the day was mixed, say so plainly\n- do not overstate confidence or importance\n- prefer specific verbs over vague abstractions\n\nBrevity:\n- keep the summary under 90 words\n- keep bullets short and information-dense\n- omit anything that does not change what tomorrow should care about\n\nStructure:\n- \\`summary\\` should be one paragraph only\n- \\`bullets\\` should contain the most important moments, not generic restatements\n- \\`next_actions\\` and \\`risks_or_open_loops\\` should be distinct and non-overlapping\n\nRisk:\n- explicitly surface unresolved blockers, dependencies, or fragile assumptions\n- do not bury open loops inside the summary if they deserve separate attention\n\nTone:\n- sound like a clear internal daily note, not a report template\n- stay natural and direct while remaining compact`;\n\nfunction candidateRoots(): string[] {\n const currentFile = fileURLToPath(import.meta.url);\n const here = path.dirname(currentFile);\n const candidates = [path.resolve(here, \"..\"), path.resolve(here, \"..\", \"..\")];\n\n const seen = new Set<string>();\n return candidates.filter((candidate) => {\n const normalized = path.resolve(candidate);\n if (seen.has(normalized)) return false;\n seen.add(normalized);\n return true;\n });\n}\n\nasync function resolvePromptPath(): Promise<string | null> {\n const { existsSync } = await import(\"node:fs\");\n for (const root of candidateRoots()) {\n const candidate = path.join(root, PROMPT_RELATIVE_PATH);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function loadDaySummaryPrompt(): Promise<string> {\n const promptPath = await resolvePromptPath();\n if (promptPath) {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const raw = await readFile(promptPath, \"utf-8\");\n // CRLF-compatible regex: allow \\r\\n or \\n line endings\n const match = raw.match(/```(?:[a-zA-Z0-9_-]+)?\\r?\\n([\\s\\S]*?)\\r?\\n```/);\n if (match?.[1]) {\n return match[1].trim();\n }\n log.warn(\"day summary prompt file does not contain a fenced prompt block; using embedded fallback\");\n } catch (err) {\n log.warn(`day summary prompt file read failed; using embedded fallback: ${err}`);\n }\n }\n return EMBEDDED_DAY_SUMMARY_PROMPT;\n}\n\nexport function formatDaySummaryMemories(memories: string | MemoryFile[]): string {\n if (typeof memories === \"string\") {\n return memories.trim();\n }\n\n return memories\n .map((memory) => {\n const category = memory.frontmatter.category || \"fact\";\n const created = memory.frontmatter.created || \"unknown\";\n return `[${memory.frontmatter.id}] (${category}, ${created})\\n${memory.content}`;\n })\n .join(\"\\n\\n\")\n .trim();\n}\n\n/**\n * Build a one-line extension footer for day-summary and summary-snapshot contexts.\n * Returns \"\" when extensions are disabled or none are found.\n */\nexport async function buildExtensionsFooterForSummary(\n config: PluginConfig,\n): Promise<string> {\n if (!config.memoryExtensionsEnabled) return \"\";\n const root = resolveExtensionsRoot(config);\n const extensions = await discoverMemoryExtensions(root, log);\n if (extensions.length === 0) return \"\";\n return renderExtensionsFooter(extensions);\n}\n"],"mappings":";;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAK9B,IAAM,uBAAuB,KAAK,KAAK,WAAW,uBAAuB;AAIzE,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCpC,SAAS,iBAA2B;AAClC,QAAM,cAAc,cAAc,YAAY,GAAG;AACjD,QAAM,OAAO,KAAK,QAAQ,WAAW;AACrC,QAAM,aAAa,CAAC,KAAK,QAAQ,MAAM,IAAI,GAAG,KAAK,QAAQ,MAAM,MAAM,IAAI,CAAC;AAE5E,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,WAAW,OAAO,CAAC,cAAc;AACtC,UAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,QAAI,KAAK,IAAI,UAAU,EAAG,QAAO;AACjC,SAAK,IAAI,UAAU;AACnB,WAAO;AAAA,EACT,CAAC;AACH;AAEA,eAAe,oBAA4C;AACzD,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,IAAS;AAC7C,aAAW,QAAQ,eAAe,GAAG;AACnC,UAAM,YAAY,KAAK,KAAK,MAAM,oBAAoB;AACtD,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,uBAAwC;AAC5D,QAAM,aAAa,MAAM,kBAAkB;AAC3C,MAAI,YAAY;AACd,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,YAAM,MAAM,MAAM,SAAS,YAAY,OAAO;AAE9C,YAAM,QAAQ,IAAI,MAAM,+CAA+C;AACvE,UAAI,QAAQ,CAAC,GAAG;AACd,eAAO,MAAM,CAAC,EAAE,KAAK;AAAA,MACvB;AACA,UAAI,KAAK,yFAAyF;AAAA,IACpG,SAAS,KAAK;AACZ,UAAI,KAAK,iEAAiE,GAAG,EAAE;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,UAAyC;AAChF,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,SAAO,SACJ,IAAI,CAAC,WAAW;AACf,UAAM,WAAW,OAAO,YAAY,YAAY;AAChD,UAAM,UAAU,OAAO,YAAY,WAAW;AAC9C,WAAO,IAAI,OAAO,YAAY,EAAE,MAAM,QAAQ,KAAK,OAAO;AAAA,EAAM,OAAO,OAAO;AAAA,EAChF,CAAC,EACA,KAAK,MAAM,EACX,KAAK;AACV;AAMA,eAAsB,gCACpB,QACiB;AACjB,MAAI,CAAC,OAAO,wBAAyB,QAAO;AAC5C,QAAM,OAAO,sBAAsB,MAAM;AACzC,QAAM,aAAa,MAAM,yBAAyB,MAAM,GAAG;AAC3D,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,uBAAuB,UAAU;AAC1C;","names":[]}
@@ -11,6 +11,9 @@ var TURN_REFERENCE_WINDOW_RADIUS = 0;
11
11
  var LEXICAL_CUE_WINDOW_RADIUS = 1;
12
12
  var LEXICAL_CUE_SEARCH_LIMIT = 3;
13
13
  var LEXICAL_CUE_MAX_TOKENS = 400;
14
+ var CONTENT_LABEL_SEARCH_LIMIT = 64;
15
+ var CONTENT_LABEL_MAX_TOKENS = 2e3;
16
+ var CONTENT_LABEL_MAX_PAIRED_WINDOWS_PER_REFERENCE = 1;
14
17
  var LATEST_STATE_CUES = /* @__PURE__ */ new Set([
15
18
  "as of",
16
19
  "currently",
@@ -232,6 +235,13 @@ async function collectTurnReferenceEvidence(options) {
232
235
  if (references.length === 0) {
233
236
  return;
234
237
  }
238
+ await collectContentLabelReferenceEvidence({
239
+ engine: options.engine,
240
+ sessionId: options.sessionId,
241
+ references,
242
+ evidenceItems: options.evidenceItems,
243
+ seenTurns: options.seenTurns
244
+ });
235
245
  const windows = /* @__PURE__ */ new Map();
236
246
  for (const reference of references) {
237
247
  for (const center of candidateTurnIndexesForReference(reference)) {
@@ -260,6 +270,144 @@ async function collectTurnReferenceEvidence(options) {
260
270
  );
261
271
  }
262
272
  }
273
+ async function collectContentLabelReferenceEvidence(options) {
274
+ const resolved = /* @__PURE__ */ new Set();
275
+ for (const reference of options.references) {
276
+ if (reference.includeDirectTurn) {
277
+ continue;
278
+ }
279
+ const hits = await searchReferenceContentLabels(
280
+ options.engine,
281
+ reference.number,
282
+ options.sessionId
283
+ );
284
+ if (hits.length === 0) {
285
+ continue;
286
+ }
287
+ resolved.add(reference.number);
288
+ let appendedWindows = 0;
289
+ for (const hit of hits) {
290
+ if (appendedWindows >= CONTENT_LABEL_MAX_PAIRED_WINDOWS_PER_REFERENCE) {
291
+ break;
292
+ }
293
+ const { fromTurn, toTurn } = contentLabelEvidenceWindow(hit);
294
+ const expanded = await options.engine.expandContext(
295
+ hit.session_id,
296
+ fromTurn,
297
+ toTurn,
298
+ CONTENT_LABEL_MAX_TOKENS
299
+ );
300
+ if (!expandedHasPairedTrajectoryLabels(expanded, reference.number)) {
301
+ continue;
302
+ }
303
+ if (expanded.length === 0) {
304
+ appendEvidenceItem(options.evidenceItems, options.seenTurns, {
305
+ id: `${hit.session_id}:${hit.turn_index}`,
306
+ sessionId: hit.session_id,
307
+ turnIndex: hit.turn_index,
308
+ role: hit.role,
309
+ content: hit.content
310
+ });
311
+ continue;
312
+ }
313
+ appendExpandedEvidence(
314
+ options.evidenceItems,
315
+ options.seenTurns,
316
+ hit.session_id,
317
+ expanded
318
+ );
319
+ appendedWindows += 1;
320
+ }
321
+ }
322
+ return resolved;
323
+ }
324
+ async function searchReferenceContentLabels(engine, referenceNumber, sessionId) {
325
+ const hits = /* @__PURE__ */ new Map();
326
+ for (const labelKind of ["action", "observation"]) {
327
+ const label = labelKind === "action" ? "Action" : "Observation";
328
+ for (const query of [`[${label} ${referenceNumber}]`, `${label} ${referenceNumber}`]) {
329
+ const results = await engine.searchContextFull(
330
+ query,
331
+ CONTENT_LABEL_SEARCH_LIMIT,
332
+ sessionId
333
+ );
334
+ for (const result of results) {
335
+ if (!isReferenceLabelRole(result.role, labelKind) || !contentHasReferenceLabel(result.content, labelKind, referenceNumber)) {
336
+ continue;
337
+ }
338
+ hits.set(`${result.session_id}:${result.turn_index}:${labelKind}`, {
339
+ turn_index: result.turn_index,
340
+ role: result.role,
341
+ content: result.content,
342
+ session_id: result.session_id,
343
+ labelKind
344
+ });
345
+ }
346
+ }
347
+ }
348
+ const numericCandidates = candidateTurnIndexesForReference({
349
+ number: referenceNumber,
350
+ includeDirectTurn: false
351
+ });
352
+ return [...hits.values()].sort((left, right) => {
353
+ const sessionOrder = left.session_id.localeCompare(right.session_id);
354
+ if (sessionOrder !== 0) {
355
+ return sessionOrder;
356
+ }
357
+ const leftDistance = nearestTurnDistance(left.turn_index, numericCandidates);
358
+ const rightDistance = nearestTurnDistance(right.turn_index, numericCandidates);
359
+ if (leftDistance !== rightDistance) {
360
+ return leftDistance - rightDistance;
361
+ }
362
+ return left.turn_index - right.turn_index || left.labelKind.localeCompare(right.labelKind);
363
+ });
364
+ }
365
+ function nearestTurnDistance(turnIndex, candidates) {
366
+ let nearest = Number.POSITIVE_INFINITY;
367
+ for (const candidate of candidates) {
368
+ nearest = Math.min(nearest, Math.abs(turnIndex - candidate));
369
+ }
370
+ return nearest;
371
+ }
372
+ function contentLabelEvidenceWindow(hit) {
373
+ if (hit.labelKind === "action") {
374
+ return {
375
+ fromTurn: Math.max(0, hit.turn_index - 1),
376
+ toTurn: hit.turn_index + 1
377
+ };
378
+ }
379
+ return {
380
+ fromTurn: Math.max(0, hit.turn_index - 1),
381
+ toTurn: hit.turn_index
382
+ };
383
+ }
384
+ function contentHasReferenceLabel(content, labelKind, referenceNumber) {
385
+ const label = labelKind === "action" ? "Action" : "Observation";
386
+ const escapedNumber = String(referenceNumber).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
387
+ return new RegExp(
388
+ `^\\s*\\[\\s*${label}\\s+${escapedNumber}\\s*\\]\\s*(?::\\s*)?`,
389
+ "i"
390
+ ).test(content);
391
+ }
392
+ function isReferenceLabelRole(role, labelKind) {
393
+ if (labelKind === "action") {
394
+ return role === "user";
395
+ }
396
+ return role === "assistant";
397
+ }
398
+ function expandedHasPairedTrajectoryLabels(expanded, referenceNumber) {
399
+ let hasAction = false;
400
+ let hasObservation = false;
401
+ for (const message of expanded) {
402
+ if (isReferenceLabelRole(message.role, "action") && contentHasReferenceLabel(message.content, "action", referenceNumber)) {
403
+ hasAction = true;
404
+ }
405
+ if (isReferenceLabelRole(message.role, "observation") && contentHasReferenceLabel(message.content, "observation", referenceNumber)) {
406
+ hasObservation = true;
407
+ }
408
+ }
409
+ return hasAction && hasObservation;
410
+ }
263
411
  async function collectLexicalCueEvidence(options) {
264
412
  const cues = collectLexicalCues(options.query, {
265
413
  includeBenchmarkAnchorCues: options.includeBenchmarkAnchorCues,
@@ -754,4 +902,4 @@ export {
754
902
  collectStructuredPlanCues,
755
903
  collectTemporalLexicalCues
756
904
  };
757
- //# sourceMappingURL=chunk-KNQ5YJTO.js.map
905
+ //# sourceMappingURL=chunk-3VRIIII5.js.map