@remnic/core 9.6.36 → 9.6.38

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 (270) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +8 -8
  3. package/dist/access-boundary.d.ts +6 -6
  4. package/dist/access-boundary.js +9 -9
  5. package/dist/access-cli.js +32 -32
  6. package/dist/access-http.d.ts +6 -6
  7. package/dist/access-http.js +13 -13
  8. package/dist/access-identity-continuity-surface.d.ts +5 -5
  9. package/dist/access-identity-continuity-surface.js +8 -8
  10. package/dist/access-lcm-surface.d.ts +6 -6
  11. package/dist/access-lcm-surface.js +8 -8
  12. package/dist/access-mcp.d.ts +6 -6
  13. package/dist/access-mcp.js +12 -12
  14. package/dist/access-observe-write-surface.d.ts +6 -6
  15. package/dist/access-observe-write-surface.js +8 -8
  16. package/dist/access-operations-batch.js +10 -10
  17. package/dist/access-operations.d.ts +6 -6
  18. package/dist/access-operations.js +11 -11
  19. package/dist/access-recall-surface.d.ts +6 -6
  20. package/dist/access-recall-surface.js +8 -8
  21. package/dist/{access-service-BofDzaPT.d.ts → access-service-Fw9AYEqG.d.ts} +4 -4
  22. package/dist/access-service.d.ts +6 -6
  23. package/dist/access-service.js +8 -8
  24. package/dist/access-surface-catalog.d.ts +6 -6
  25. package/dist/action-confidence.d.ts +1 -1
  26. package/dist/active-memory-bridge.d.ts +1 -1
  27. package/dist/active-recall.d.ts +1 -1
  28. package/dist/active-recall.js +2 -1
  29. package/dist/active-recall.js.map +1 -1
  30. package/dist/behavior-learner.d.ts +1 -1
  31. package/dist/behavior-signals.d.ts +1 -1
  32. package/dist/bootstrap.d.ts +5 -5
  33. package/dist/briefing.d.ts +2 -2
  34. package/dist/briefing.js +3 -3
  35. package/dist/buffer-surprise-report.d.ts +1 -1
  36. package/dist/buffer.d.ts +2 -2
  37. package/dist/bulk-import/index.d.ts +3 -3
  38. package/dist/calibration.d.ts +1 -1
  39. package/dist/capabilities.d.ts +1 -1
  40. package/dist/{catalog-9WanSGtt.d.ts → catalog-CnS_MP-8.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 +4 -4
  44. package/dist/causal-trajectory-graph.d.ts +1 -1
  45. package/dist/{chunk-B4LPRAWL.js → chunk-2V6L3L56.js} +6 -6
  46. package/dist/{chunk-AXALUFAH.js → chunk-3BZDBG7U.js} +2 -2
  47. package/dist/{chunk-KL4UAXUY.js → chunk-3WULMX34.js} +73 -2
  48. package/dist/{chunk-KL4UAXUY.js.map → chunk-3WULMX34.js.map} +1 -1
  49. package/dist/{chunk-JODHPNLN.js → chunk-5ELELET5.js} +2 -2
  50. package/dist/{chunk-DQ42IQSK.js → chunk-5SORASJK.js} +2 -2
  51. package/dist/{chunk-DAAJUA6Q.js → chunk-6MWGGPJJ.js} +5 -5
  52. package/dist/{chunk-2K3OSLHE.js → chunk-7TEWOG3R.js} +2 -2
  53. package/dist/{chunk-23G3T2Q5.js → chunk-7XY6TJLM.js} +2 -2
  54. package/dist/{chunk-W2AHSCKY.js → chunk-AZK3NEHL.js} +2 -2
  55. package/dist/{chunk-7ZYBDQ7V.js → chunk-CVEEJKRD.js} +2 -2
  56. package/dist/{chunk-YQB32INI.js → chunk-EBVUFGJ4.js} +2 -2
  57. package/dist/{chunk-4Q2XWAHZ.js → chunk-EDD2G35Z.js} +2 -2
  58. package/dist/{chunk-CAZ3Z5M6.js → chunk-F7AE7L6G.js} +2 -2
  59. package/dist/{chunk-B5GBWBCZ.js → chunk-GCTJG5MP.js} +2 -2
  60. package/dist/{chunk-C6TKSI35.js → chunk-HVE3UVAB.js} +3 -3
  61. package/dist/{chunk-SDAXPXER.js → chunk-IGCQHJSQ.js} +2 -2
  62. package/dist/{chunk-3AC5UYKI.js → chunk-METJNEIB.js} +1 -1
  63. package/dist/chunk-METJNEIB.js.map +1 -0
  64. package/dist/{chunk-MXAGJHTA.js → chunk-NREKOGZ2.js} +3 -3
  65. package/dist/{chunk-H4FHR4UM.js → chunk-PQG2AOL4.js} +2 -2
  66. package/dist/{chunk-WSOEYOHN.js → chunk-PWSZNML3.js} +15 -15
  67. package/dist/{chunk-OXVKR5OU.js → chunk-RU73ZROD.js} +342 -16
  68. package/dist/chunk-RU73ZROD.js.map +1 -0
  69. package/dist/{chunk-VJRJTRYF.js → chunk-RVLE2SNP.js} +17 -17
  70. package/dist/{chunk-KVSVVKHA.js → chunk-U5JP7FCM.js} +2 -2
  71. package/dist/{chunk-GQURC4B7.js → chunk-VTRF5QBX.js} +2 -2
  72. package/dist/{chunk-FVTLSFWU.js → chunk-WHZ7MK72.js} +2 -2
  73. package/dist/{chunk-PUQZIS6A.js → chunk-WX4XTAOI.js} +4 -4
  74. package/dist/{chunk-VHJARF5R.js → chunk-XH2Y6UIW.js} +2 -2
  75. package/dist/{chunk-GQGDRLDM.js → chunk-YAN6NTJN.js} +3 -3
  76. package/dist/{chunk-DEKIXXIG.js → chunk-ZIKJD6NL.js} +2 -2
  77. package/dist/{chunk-KJIJNLXT.js → chunk-ZMXXHUEZ.js} +3 -3
  78. package/dist/{chunk-O6YI4CVI.js → chunk-ZSDRGPMV.js} +2 -2
  79. package/dist/{cli-3_x5sJTL.d.ts → cli-PGF41MN6.d.ts} +5 -5
  80. package/dist/cli.d.ts +8 -8
  81. package/dist/cli.js +26 -26
  82. package/dist/compounding/engine.d.ts +2 -2
  83. package/dist/compounding/engine.js +3 -3
  84. package/dist/compounding/preference-consolidator.d.ts +1 -1
  85. package/dist/compression-optimizer.d.ts +1 -1
  86. package/dist/config.d.ts +1 -1
  87. package/dist/config.js +2 -1
  88. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  89. package/dist/connectors/codex-materialize-runner.js +3 -3
  90. package/dist/connectors/codex-materialize.d.ts +1 -1
  91. package/dist/connectors/index.d.ts +1 -1
  92. package/dist/connectors/index.js +3 -3
  93. package/dist/consolidation-provenance-check.d.ts +2 -2
  94. package/dist/consolidation-undo.d.ts +2 -2
  95. package/dist/contradiction/index.d.ts +2 -2
  96. package/dist/conversation-index/backend.d.ts +1 -1
  97. package/dist/conversation-index/chunker.d.ts +1 -1
  98. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  99. package/dist/conversation-index/indexer.d.ts +1 -1
  100. package/dist/conversation-index/search.d.ts +1 -1
  101. package/dist/day-summary.d.ts +1 -1
  102. package/dist/delinearize.d.ts +1 -1
  103. package/dist/direct-answer-wiring.d.ts +1 -1
  104. package/dist/direct-answer.d.ts +1 -1
  105. package/dist/embedding-fallback.d.ts +1 -1
  106. package/dist/enrichment/index.d.ts +1 -1
  107. package/dist/entity-retrieval.d.ts +2 -2
  108. package/dist/entity-retrieval.js +3 -3
  109. package/dist/entity-schema.d.ts +1 -1
  110. package/dist/explicit-capture.d.ts +5 -5
  111. package/dist/extraction-faithfulness.d.ts +1 -1
  112. package/dist/extraction-judge-telemetry.d.ts +1 -1
  113. package/dist/extraction-judge-training.d.ts +1 -1
  114. package/dist/extraction-judge.d.ts +1 -1
  115. package/dist/extraction.d.ts +1 -1
  116. package/dist/fallback-llm.d.ts +1 -1
  117. package/dist/graph-dashboard-diff.d.ts +1 -1
  118. package/dist/graph-dashboard-key.d.ts +1 -1
  119. package/dist/graph-dashboard-parser.d.ts +1 -1
  120. package/dist/graph-edge-reinforcement.d.ts +1 -1
  121. package/dist/graph-snapshot.d.ts +1 -1
  122. package/dist/graph.d.ts +1 -1
  123. package/dist/identity-continuity.d.ts +1 -1
  124. package/dist/importance.d.ts +1 -1
  125. package/dist/importers/index.d.ts +1 -1
  126. package/dist/index.d.ts +13 -13
  127. package/dist/index.js +35 -35
  128. package/dist/intent.d.ts +1 -1
  129. package/dist/lcm/engine.d.ts +1 -1
  130. package/dist/lcm/index.d.ts +1 -1
  131. package/dist/lcm/tools.d.ts +1 -1
  132. package/dist/lifecycle.d.ts +1 -1
  133. package/dist/live-connectors-runner.d.ts +1 -1
  134. package/dist/local-llm.d.ts +1 -1
  135. package/dist/local-model-endpoint.d.ts +1 -1
  136. package/dist/maintenance/memory-governance.d.ts +1 -1
  137. package/dist/maintenance/memory-governance.js +3 -3
  138. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  139. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  140. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  141. package/dist/memory-action-policy.d.ts +1 -1
  142. package/dist/memory-cache.d.ts +1 -1
  143. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  144. package/dist/memory-projection-store.d.ts +1 -1
  145. package/dist/memory-provenance.d.ts +1 -1
  146. package/dist/memory-worth-outcomes.d.ts +2 -2
  147. package/dist/models-json.d.ts +1 -1
  148. package/dist/namespaces/migrate.d.ts +3 -3
  149. package/dist/namespaces/migrate.js +4 -4
  150. package/dist/namespaces/principal.d.ts +1 -1
  151. package/dist/namespaces/search.d.ts +1 -1
  152. package/dist/namespaces/storage.d.ts +3 -3
  153. package/dist/namespaces/storage.js +3 -3
  154. package/dist/native-knowledge.d.ts +1 -1
  155. package/dist/operator-toolkit.d.ts +2 -2
  156. package/dist/operator-toolkit.js +9 -8
  157. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  158. package/dist/orchestration/maintenance.d.ts +2 -2
  159. package/dist/orchestration/maintenance.js +5 -5
  160. package/dist/{orchestrator-CAH5-PKN.d.ts → orchestrator-xePY-WPe.d.ts} +4 -4
  161. package/dist/orchestrator.d.ts +5 -5
  162. package/dist/orchestrator.js +32 -32
  163. package/dist/patterns-cli.d.ts +1 -1
  164. package/dist/{pipeline-CiD86zIk.d.ts → pipeline-Zgwz-Kne.d.ts} +1 -1
  165. package/dist/policy-runtime.d.ts +1 -1
  166. package/dist/provenance.d.ts +1 -1
  167. package/dist/{qmd-Bef7DDuQ.d.ts → qmd-B6Xwfn5_.d.ts} +1 -1
  168. package/dist/qmd-preflight.d.ts +2 -2
  169. package/dist/qmd-recall-cache.d.ts +1 -1
  170. package/dist/qmd.d.ts +2 -2
  171. package/dist/recall-disclosure-escalation.d.ts +1 -1
  172. package/dist/recall-explain-renderer.d.ts +1 -1
  173. package/dist/recall-explain-renderer.js +3 -3
  174. package/dist/recall-planner-llm.d.ts +1 -1
  175. package/dist/recall-state.d.ts +1 -1
  176. package/dist/recall-tag-filter.d.ts +1 -1
  177. package/dist/recall-timings.d.ts +1 -1
  178. package/dist/recall-xray-cli.d.ts +1 -1
  179. package/dist/recall-xray-cli.js +4 -4
  180. package/dist/recall-xray-renderer.d.ts +1 -1
  181. package/dist/recall-xray-renderer.js +3 -3
  182. package/dist/recall-xray.d.ts +1 -1
  183. package/dist/recall-xray.js +2 -2
  184. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  185. package/dist/replay/normalizers/claude.d.ts +1 -1
  186. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  187. package/dist/replay/normalizers/shared.d.ts +1 -1
  188. package/dist/replay/runner.d.ts +1 -1
  189. package/dist/replay/types.d.ts +1 -1
  190. package/dist/resolve-auth-token.d.ts +1 -1
  191. package/dist/resume-bundles.js +3 -2
  192. package/dist/retrieval-agents.d.ts +2 -2
  193. package/dist/retrieval-tiers.d.ts +1 -1
  194. package/dist/routing/engine.d.ts +1 -1
  195. package/dist/routing/store.d.ts +1 -1
  196. package/dist/search/embed-helper.d.ts +1 -1
  197. package/dist/search/factory.d.ts +1 -1
  198. package/dist/search/index.d.ts +1 -1
  199. package/dist/search/lancedb-backend.d.ts +1 -1
  200. package/dist/search/meilisearch-backend.d.ts +1 -1
  201. package/dist/search/noop-backend.d.ts +1 -1
  202. package/dist/search/orama-backend.d.ts +1 -1
  203. package/dist/search/port.d.ts +1 -1
  204. package/dist/search/remote-backend.d.ts +1 -1
  205. package/dist/{semantic-consolidation-BTShF2Fo.d.ts → semantic-consolidation-ClfD_CWg.d.ts} +1 -1
  206. package/dist/semantic-consolidation.d.ts +2 -2
  207. package/dist/semantic-consolidation.js +4 -4
  208. package/dist/semantic-rule-promotion.js +3 -3
  209. package/dist/semantic-rule-verifier.d.ts +1 -1
  210. package/dist/semantic-rule-verifier.js +3 -3
  211. package/dist/session-observer-bands.d.ts +1 -1
  212. package/dist/session-observer-state.d.ts +1 -1
  213. package/dist/shared-context/manager.d.ts +1 -1
  214. package/dist/signal.d.ts +1 -1
  215. package/dist/{storage-DxPDAiU9.d.ts → storage-ZrHZ0dSM.d.ts} +1 -1
  216. package/dist/storage.d.ts +2 -2
  217. package/dist/storage.js +2 -2
  218. package/dist/summarizer.d.ts +1 -1
  219. package/dist/summary-snapshot.d.ts +1 -1
  220. package/dist/temporal-supersession.d.ts +2 -2
  221. package/dist/temporal-timeline-recall.d.ts +1 -1
  222. package/dist/temporal-validity.d.ts +1 -1
  223. package/dist/threading.d.ts +1 -1
  224. package/dist/tier-migration.d.ts +2 -2
  225. package/dist/tier-routing.d.ts +1 -1
  226. package/dist/topics.d.ts +1 -1
  227. package/dist/transcript.d.ts +1 -1
  228. package/dist/trust-score-stage.d.ts +1 -1
  229. package/dist/trust-score.d.ts +1 -1
  230. package/dist/{types-DDUDgd7T.d.ts → types-BbtQZBq9.d.ts} +33 -1
  231. package/dist/types.d.ts +1 -1
  232. package/dist/types.js +1 -1
  233. package/dist/utility-runtime.d.ts +1 -1
  234. package/dist/verified-recall.js +3 -3
  235. package/package.json +2 -2
  236. package/src/coding/codegraph-runtime.ts +539 -1
  237. package/src/coding/codegraph-surfaces.test.ts +75 -0
  238. package/src/coding/codegraph-surfaces.ts +34 -0
  239. package/src/coding/coding-knowledge-config.ts +100 -2
  240. package/src/types.ts +30 -0
  241. package/dist/chunk-3AC5UYKI.js.map +0 -1
  242. package/dist/chunk-OXVKR5OU.js.map +0 -1
  243. /package/dist/{chunk-B4LPRAWL.js.map → chunk-2V6L3L56.js.map} +0 -0
  244. /package/dist/{chunk-AXALUFAH.js.map → chunk-3BZDBG7U.js.map} +0 -0
  245. /package/dist/{chunk-JODHPNLN.js.map → chunk-5ELELET5.js.map} +0 -0
  246. /package/dist/{chunk-DQ42IQSK.js.map → chunk-5SORASJK.js.map} +0 -0
  247. /package/dist/{chunk-DAAJUA6Q.js.map → chunk-6MWGGPJJ.js.map} +0 -0
  248. /package/dist/{chunk-2K3OSLHE.js.map → chunk-7TEWOG3R.js.map} +0 -0
  249. /package/dist/{chunk-23G3T2Q5.js.map → chunk-7XY6TJLM.js.map} +0 -0
  250. /package/dist/{chunk-W2AHSCKY.js.map → chunk-AZK3NEHL.js.map} +0 -0
  251. /package/dist/{chunk-7ZYBDQ7V.js.map → chunk-CVEEJKRD.js.map} +0 -0
  252. /package/dist/{chunk-YQB32INI.js.map → chunk-EBVUFGJ4.js.map} +0 -0
  253. /package/dist/{chunk-4Q2XWAHZ.js.map → chunk-EDD2G35Z.js.map} +0 -0
  254. /package/dist/{chunk-CAZ3Z5M6.js.map → chunk-F7AE7L6G.js.map} +0 -0
  255. /package/dist/{chunk-B5GBWBCZ.js.map → chunk-GCTJG5MP.js.map} +0 -0
  256. /package/dist/{chunk-C6TKSI35.js.map → chunk-HVE3UVAB.js.map} +0 -0
  257. /package/dist/{chunk-SDAXPXER.js.map → chunk-IGCQHJSQ.js.map} +0 -0
  258. /package/dist/{chunk-MXAGJHTA.js.map → chunk-NREKOGZ2.js.map} +0 -0
  259. /package/dist/{chunk-H4FHR4UM.js.map → chunk-PQG2AOL4.js.map} +0 -0
  260. /package/dist/{chunk-WSOEYOHN.js.map → chunk-PWSZNML3.js.map} +0 -0
  261. /package/dist/{chunk-VJRJTRYF.js.map → chunk-RVLE2SNP.js.map} +0 -0
  262. /package/dist/{chunk-KVSVVKHA.js.map → chunk-U5JP7FCM.js.map} +0 -0
  263. /package/dist/{chunk-GQURC4B7.js.map → chunk-VTRF5QBX.js.map} +0 -0
  264. /package/dist/{chunk-FVTLSFWU.js.map → chunk-WHZ7MK72.js.map} +0 -0
  265. /package/dist/{chunk-PUQZIS6A.js.map → chunk-WX4XTAOI.js.map} +0 -0
  266. /package/dist/{chunk-VHJARF5R.js.map → chunk-XH2Y6UIW.js.map} +0 -0
  267. /package/dist/{chunk-GQGDRLDM.js.map → chunk-YAN6NTJN.js.map} +0 -0
  268. /package/dist/{chunk-DEKIXXIG.js.map → chunk-ZIKJD6NL.js.map} +0 -0
  269. /package/dist/{chunk-KJIJNLXT.js.map → chunk-ZMXXHUEZ.js.map} +0 -0
  270. /package/dist/{chunk-O6YI4CVI.js.map → chunk-ZSDRGPMV.js.map} +0 -0
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  DEFAULT_REASONING_MODEL
3
- } from "./chunk-KL4UAXUY.js";
3
+ } from "./chunk-3WULMX34.js";
4
4
  import "./chunk-NDAH7BJ5.js";
5
5
  import "./chunk-Z5LAYHGJ.js";
6
6
  import "./chunk-G6NKALRN.js";
7
7
  import "./chunk-OO42R444.js";
8
8
  import "./chunk-K6MV3TRQ.js";
9
+ import "./chunk-P32IDSHD.js";
9
10
  import "./chunk-OEHCMALU.js";
10
11
  import "./chunk-PHK3HARR.js";
11
12
  import "./chunk-4DJQYKMN.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/active-recall.ts"],"sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DEFAULT_REASONING_MODEL } from \"./config.js\";\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 const result: ActiveRecallResult = {\n ...cloneRecallResult(cached.value),\n latencyMs: Math.max(0, now() - currentTime),\n cacheHit: true,\n };\n result.transcriptPath = null;\n if (config.persistTranscripts) {\n try {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n } catch {\n result.transcriptPath = null;\n }\n }\n return result;\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 ?? DEFAULT_REASONING_MODEL,\n timeoutMs: config.timeoutMs,\n thinking: config.thinking,\n fallbackPolicy: config.modelFallbackPolicy,\n })\n : {\n text: recallContext,\n modelUsed: config.modelOverride ?? DEFAULT_REASONING_MODEL,\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 ?? DEFAULT_REASONING_MODEL,\n transcriptPath: null,\n };\n if (config.persistTranscripts) {\n try {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n } catch {\n result.transcriptPath = null;\n }\n }\n\n if (cacheEnabled) {\n const completedAt = now();\n const cachedValue = cloneRecallResult(result);\n cachedValue.transcriptPath = null;\n cache.set(cacheKey, {\n expiresAt: completedAt + config.cacheTtlMs,\n value: cachedValue,\n });\n enforceCacheLimit(cache);\n }\n return result;\n },\n };\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/active-recall.ts"],"sourcesContent":["import { appendFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DEFAULT_REASONING_MODEL } from \"./config.js\";\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 const result: ActiveRecallResult = {\n ...cloneRecallResult(cached.value),\n latencyMs: Math.max(0, now() - currentTime),\n cacheHit: true,\n };\n result.transcriptPath = null;\n if (config.persistTranscripts) {\n try {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n } catch {\n result.transcriptPath = null;\n }\n }\n return result;\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 ?? DEFAULT_REASONING_MODEL,\n timeoutMs: config.timeoutMs,\n thinking: config.thinking,\n fallbackPolicy: config.modelFallbackPolicy,\n })\n : {\n text: recallContext,\n modelUsed: config.modelOverride ?? DEFAULT_REASONING_MODEL,\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 ?? DEFAULT_REASONING_MODEL,\n transcriptPath: null,\n };\n if (config.persistTranscripts) {\n try {\n result.transcriptPath = await appendActiveRecallTranscript(\n config.transcriptDir,\n input,\n config,\n result,\n queryBundle,\n );\n } catch {\n result.transcriptPath = null;\n }\n }\n\n if (cacheEnabled) {\n const completedAt = now();\n const cachedValue = cloneRecallResult(result);\n cachedValue.transcriptPath = null;\n cache.set(cacheKey, {\n expiresAt: completedAt + config.cacheTtlMs,\n value: cachedValue,\n });\n enforceCacheLimit(cache);\n }\n return result;\n },\n };\n}\n"],"mappings":"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","names":["result"]}
@@ -1,4 +1,4 @@
1
- import { B as BehaviorSignalEvent, P as PluginConfig, g as BehaviorLoopPolicyState } from './types-DDUDgd7T.js';
1
+ import { B as BehaviorSignalEvent, P as PluginConfig, g as BehaviorLoopPolicyState } from './types-BbtQZBq9.js';
2
2
  import './message-parts/index.js';
3
3
 
4
4
  declare const TUNABLE_BEHAVIOR_PARAMETERS: readonly ["recencyWeight", "lifecyclePromoteHeatThreshold", "lifecycleStaleDecayThreshold", "cronRecallInstructionHeavyTokenCap"];
@@ -1,4 +1,4 @@
1
- import { u as MemoryCategory, B as BehaviorSignalEvent } from './types-DDUDgd7T.js';
1
+ import { u as MemoryCategory, B as BehaviorSignalEvent } from './types-BbtQZBq9.js';
2
2
  import './message-parts/index.js';
3
3
 
4
4
  declare function buildBehaviorSignalHash(category: MemoryCategory, content: string): string;
@@ -1,8 +1,8 @@
1
- import { P as PluginConfig } from './types-DDUDgd7T.js';
2
- import { O as Orchestrator } from './orchestrator-CAH5-PKN.js';
1
+ import { P as PluginConfig } from './types-BbtQZBq9.js';
2
+ import { O as Orchestrator } from './orchestrator-xePY-WPe.js';
3
3
  import './message-parts/index.js';
4
4
  import './briefing.js';
5
- import './storage-DxPDAiU9.js';
5
+ import './storage-ZrHZ0dSM.js';
6
6
  import './page-versioning.js';
7
7
  import './consolidation-operator.js';
8
8
  import './memory-projection-store.js';
@@ -22,7 +22,7 @@ import './session-integrity.js';
22
22
  import './summarizer.js';
23
23
  import './orchestration/maintenance.js';
24
24
  import './namespaces/search.js';
25
- import './catalog-9WanSGtt.js';
25
+ import './catalog-CnS_MP-8.js';
26
26
  import './recall-state.js';
27
27
  import './compounding/engine.js';
28
28
  import './shared-context/manager.js';
@@ -32,7 +32,7 @@ import './utility-runtime.js';
32
32
  import './tier-routing.js';
33
33
  import './lifecycle.js';
34
34
  import './orchestration/compression-guideline-coordinator.js';
35
- import './semantic-consolidation-BTShF2Fo.js';
35
+ import './semantic-consolidation-ClfD_CWg.js';
36
36
  import './connectors/codex-materialize.js';
37
37
  import './logger.js';
38
38
  import './embedding-fallback.js';
@@ -1,5 +1,5 @@
1
- import { S as StorageManager } from './storage-DxPDAiU9.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-DDUDgd7T.js';
1
+ import { S as StorageManager } from './storage-ZrHZ0dSM.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-BbtQZBq9.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,8 +17,8 @@ import {
17
17
  renderBriefingMarkdown,
18
18
  resolveBriefingSaveDir,
19
19
  validateBriefingFormat
20
- } from "./chunk-7ZYBDQ7V.js";
21
- import "./chunk-H4FHR4UM.js";
20
+ } from "./chunk-CVEEJKRD.js";
21
+ import "./chunk-PQG2AOL4.js";
22
22
  import "./chunk-B3ABVQ36.js";
23
23
  import "./chunk-L2B3EE7B.js";
24
24
  import "./chunk-5UZXUTVO.js";
@@ -29,7 +29,7 @@ import "./chunk-J6A3CX5N.js";
29
29
  import "./chunk-4KJLYTLS.js";
30
30
  import "./chunk-SVOZFLIQ.js";
31
31
  import "./chunk-LTJAMRGI.js";
32
- import "./chunk-3AC5UYKI.js";
32
+ import "./chunk-METJNEIB.js";
33
33
  import "./chunk-RHOZ5LLO.js";
34
34
  import "./chunk-RL6NEVXT.js";
35
35
  import "./chunk-AWJ2FHCF.js";
@@ -1,4 +1,4 @@
1
- import { Y as BufferSurpriseEvent } from './types-DDUDgd7T.js';
1
+ import { Y as BufferSurpriseEvent } from './types-BbtQZBq9.js';
2
2
  import './message-parts/index.js';
3
3
 
4
4
  /**
package/dist/buffer.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as StorageManager } from './storage-DxPDAiU9.js';
2
- import { P as PluginConfig, o as BufferTurn } from './types-DDUDgd7T.js';
1
+ import { S as StorageManager } from './storage-ZrHZ0dSM.js';
2
+ import { P as PluginConfig, o as BufferTurn } from './types-BbtQZBq9.js';
3
3
  import './page-versioning.js';
4
4
  import './consolidation-operator.js';
5
5
  import './memory-projection-store.js';
@@ -1,6 +1,6 @@
1
- import { b5 as BulkImportSourceAdapter } from '../types-DDUDgd7T.js';
2
- export { b4 as BulkImportError, _ as BulkImportOptions, a0 as BulkImportResult, $ as BulkImportSource, b9 as ImportSourceRole, Z as ImportTurn, ba as ImportTurnValidationIssue, bk as isImportRole, bm as parseIsoTimestamp, bn as validateImportTurn } from '../types-DDUDgd7T.js';
3
- export { a as ProcessBatchContext, P as ProcessBatchFn, b as ProcessBatchResult, f as formatBatchTranscript, r as resolveBulkImportContext, c as runBulkImportPipeline, v as validateBatchSize } from '../pipeline-CiD86zIk.js';
1
+ import { b5 as BulkImportSourceAdapter } from '../types-BbtQZBq9.js';
2
+ export { b4 as BulkImportError, _ as BulkImportOptions, a0 as BulkImportResult, $ as BulkImportSource, b9 as ImportSourceRole, Z as ImportTurn, ba as ImportTurnValidationIssue, bk as isImportRole, bm as parseIsoTimestamp, bn as validateImportTurn } from '../types-BbtQZBq9.js';
3
+ export { a as ProcessBatchContext, P as ProcessBatchFn, b as ProcessBatchResult, f as formatBatchTranscript, r as resolveBulkImportContext, c as runBulkImportPipeline, v as validateBatchSize } from '../pipeline-Zgwz-Kne.js';
4
4
  import '../message-parts/index.js';
5
5
 
6
6
  /**
@@ -1,5 +1,5 @@
1
1
  import { FallbackLlmClient } from './fallback-llm.js';
2
- import { G as GatewayConfig, r as AgentPersonaModelConfig } from './types-DDUDgd7T.js';
2
+ import { G as GatewayConfig, r as AgentPersonaModelConfig } from './types-BbtQZBq9.js';
3
3
  import './resolve-provider-secret.js';
4
4
  import './message-parts/index.js';
5
5
 
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig } from './types-DDUDgd7T.js';
1
+ import { P as PluginConfig } from './types-BbtQZBq9.js';
2
2
  import './message-parts/index.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig } from './types-DDUDgd7T.js';
1
+ import { P as PluginConfig } from './types-BbtQZBq9.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-DDUDgd7T.js';
5
+ import './types-BbtQZBq9.js';
6
6
  import './message-parts/index.js';
7
7
  import './lcm/engine.js';
8
8
  import './lcm/archive.js';
@@ -1,4 +1,4 @@
1
- import { G as GatewayConfig, r as AgentPersonaModelConfig, P as PluginConfig, M as MemoryFile } from './types-DDUDgd7T.js';
1
+ import { G as GatewayConfig, r as AgentPersonaModelConfig, P as PluginConfig, M as MemoryFile } from './types-BbtQZBq9.js';
2
2
  import { RolloutSummaryInput, MaterializeResult } from './connectors/codex-materialize.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-NKCPUHCI.js";
5
5
  import {
6
6
  buildExtensionsBlockForConsolidation
7
- } from "./chunk-AXALUFAH.js";
7
+ } from "./chunk-3BZDBG7U.js";
8
8
  import {
9
9
  runPostConsolidationMaterialize
10
- } from "./chunk-KVSVVKHA.js";
10
+ } from "./chunk-U5JP7FCM.js";
11
11
  import "./chunk-QLULYKWZ.js";
12
12
  import "./chunk-JLNBQWZ2.js";
13
13
  import "./chunk-3UXOZBHV.js";
@@ -16,7 +16,7 @@ import {
16
16
  resolveCausalTrajectoryStoreDir
17
17
  } from "./chunk-7XGSIUP5.js";
18
18
  import "./chunk-ZBJMUXZH.js";
19
- import "./chunk-H4FHR4UM.js";
19
+ import "./chunk-PQG2AOL4.js";
20
20
  import "./chunk-B3ABVQ36.js";
21
21
  import "./chunk-L2B3EE7B.js";
22
22
  import "./chunk-5UZXUTVO.js";
@@ -27,7 +27,7 @@ import "./chunk-J6A3CX5N.js";
27
27
  import "./chunk-4KJLYTLS.js";
28
28
  import "./chunk-SVOZFLIQ.js";
29
29
  import "./chunk-LTJAMRGI.js";
30
- import "./chunk-3AC5UYKI.js";
30
+ import "./chunk-METJNEIB.js";
31
31
  import "./chunk-RHOZ5LLO.js";
32
32
  import "./chunk-RL6NEVXT.js";
33
33
  import "./chunk-AWJ2FHCF.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-DDUDgd7T.js';
4
+ import './types-BbtQZBq9.js';
5
5
  import './message-parts/index.js';
6
6
  import './objective-state.js';
7
7
 
@@ -3,10 +3,10 @@ import {
3
3
  readNamespaceMaintenanceLastRanStatuses,
4
4
  readNamespaceMaintenanceStatuses,
5
5
  runNamespaceMaintenancePlan
6
- } from "./chunk-VHJARF5R.js";
6
+ } from "./chunk-XH2Y6UIW.js";
7
7
  import {
8
8
  listNamespaces
9
- } from "./chunk-4Q2XWAHZ.js";
9
+ } from "./chunk-EDD2G35Z.js";
10
10
  import {
11
11
  analyzeSessionIntegrity,
12
12
  applySessionRepair,
@@ -38,17 +38,17 @@ import {
38
38
  } from "./chunk-YBPYIAA5.js";
39
39
  import {
40
40
  parseConfig
41
- } from "./chunk-KL4UAXUY.js";
41
+ } from "./chunk-3WULMX34.js";
42
42
  import {
43
43
  listMemoryGovernanceRuns,
44
44
  readMemoryGovernanceRunArtifact
45
- } from "./chunk-O6YI4CVI.js";
45
+ } from "./chunk-ZSDRGPMV.js";
46
46
  import {
47
47
  analyzeGraphHealth
48
48
  } from "./chunk-OBMR4VIX.js";
49
49
  import {
50
50
  StorageManager
51
- } from "./chunk-H4FHR4UM.js";
51
+ } from "./chunk-PQG2AOL4.js";
52
52
  import {
53
53
  probeProjectionHealth
54
54
  } from "./chunk-RHOZ5LLO.js";
@@ -1646,4 +1646,4 @@ export {
1646
1646
  runBenchmarkRecall,
1647
1647
  runOperatorRepair
1648
1648
  };
1649
- //# sourceMappingURL=chunk-B4LPRAWL.js.map
1649
+ //# sourceMappingURL=chunk-2V6L3L56.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPostConsolidationMaterialize
3
- } from "./chunk-KVSVVKHA.js";
3
+ } from "./chunk-U5JP7FCM.js";
4
4
  import {
5
5
  discoverMemoryExtensions,
6
6
  renderExtensionsBlock,
@@ -220,4 +220,4 @@ export {
220
220
  buildExtensionsBlockForConsolidation,
221
221
  materializeAfterSemanticConsolidation
222
222
  };
223
- //# sourceMappingURL=chunk-AXALUFAH.js.map
223
+ //# sourceMappingURL=chunk-3BZDBG7U.js.map
@@ -13,6 +13,9 @@ import {
13
13
  resolveEmitLegacyTools,
14
14
  resolveNamespaceCatalogEnabled
15
15
  } from "./chunk-OO42R444.js";
16
+ import {
17
+ TIER_1_LANGUAGES
18
+ } from "./chunk-P32IDSHD.js";
16
19
  import {
17
20
  parseProvenanceConfig
18
21
  } from "./chunk-OEHCMALU.js";
@@ -426,6 +429,9 @@ var CODING_KNOWLEDGE_DEFAULTS = Object.freeze({
426
429
  structuralProviderCommand: "",
427
430
  codegraphTools: false,
428
431
  codegraphDbDir: ""
432
+ // `lsp` is excluded: it is an optional structured sub-config (issue #1917)
433
+ // with no flat boolean/string default; the parser returns `undefined` when
434
+ // absent (LSP off — rule 48 explicit opt-in).
429
435
  });
430
436
  var VALID_STRUCTURAL_PROVIDERS = ["none", "subprocess", "native"];
431
437
  function parseCodingKnowledgeConfig(raw) {
@@ -470,9 +476,22 @@ function parseCodingKnowledgeConfig(raw) {
470
476
  /* default */
471
477
  false
472
478
  ),
473
- codegraphDbDir: typeof record.codegraphDbDir === "string" ? record.codegraphDbDir.trim() : ""
479
+ codegraphDbDir: typeof record.codegraphDbDir === "string" ? record.codegraphDbDir.trim() : "",
480
+ // `lsp` is spread conditionally so an absent key stays ABSENT — an own
481
+ // `lsp: undefined` property would change the pinned defaults shape
482
+ // (config.test.ts) and leak a new key into serialized configs.
483
+ ...readLspField(record.lsp)
474
484
  };
475
485
  }
486
+ function readLspField(raw) {
487
+ if (raw === void 0 || raw === null) return {};
488
+ if (typeof raw !== "object" || Array.isArray(raw)) {
489
+ throw new Error(
490
+ `codingKnowledge.lsp must be an object ({ enabled, servers?, timeoutMs?, maxRequestsPerRun? }); got ${JSON.stringify(raw)}`
491
+ );
492
+ }
493
+ return { lsp: parseLspConfig(raw) };
494
+ }
476
495
  var STRICT_BOOL_ACCEPTED = "true/false/1/0/yes/no/on/off";
477
496
  function readStrictBool(value, keyName, defaultValue) {
478
497
  if (value === void 0) return defaultValue;
@@ -496,6 +515,58 @@ function readStructuralProvider(raw) {
496
515
  `codingKnowledge.structuralProvider must be one of ${VALID_STRUCTURAL_PROVIDERS.join(", ")}; got ${JSON.stringify(raw)}.`
497
516
  );
498
517
  }
518
+ function parseLspConfig(raw) {
519
+ const enabled = readStrictBool(raw.enabled, "lsp.enabled", false);
520
+ if (!enabled) return { enabled: false };
521
+ const servers = {};
522
+ if (raw.servers !== void 0 && raw.servers !== null) {
523
+ if (typeof raw.servers !== "object" || Array.isArray(raw.servers)) {
524
+ throw new Error(
525
+ `codingKnowledge.lsp.servers must be an object mapping language ids to { command, args? }; got ${JSON.stringify(raw.servers)}.`
526
+ );
527
+ }
528
+ for (const [lang, def] of Object.entries(raw.servers)) {
529
+ if (!TIER_1_LANGUAGES.includes(lang)) {
530
+ throw new Error(
531
+ `codingKnowledge.lsp.servers has unknown language key ${JSON.stringify(lang)}; valid keys: ${TIER_1_LANGUAGES.join(", ")}.`
532
+ );
533
+ }
534
+ if (!def || typeof def !== "object" || Array.isArray(def)) {
535
+ throw new Error(
536
+ `codingKnowledge.lsp.servers.${lang} must be an object ({ command, args? }); got ${JSON.stringify(def)}.`
537
+ );
538
+ }
539
+ const d = def;
540
+ if (typeof d.command !== "string" || d.command.trim().length === 0) {
541
+ throw new Error(
542
+ `codingKnowledge.lsp.servers.${lang}.command must be a non-empty string; got ${JSON.stringify(d.command)}.`
543
+ );
544
+ }
545
+ if (d.args !== void 0 && (!Array.isArray(d.args) || !d.args.every((a) => typeof a === "string"))) {
546
+ throw new Error(
547
+ `codingKnowledge.lsp.servers.${lang}.args must be an array of strings; got ${JSON.stringify(d.args)}.`
548
+ );
549
+ }
550
+ servers[lang] = {
551
+ command: d.command.trim(),
552
+ ...Array.isArray(d.args) ? { args: d.args } : {}
553
+ };
554
+ }
555
+ }
556
+ const timeoutMs = readPositiveInt(raw.timeoutMs, "lsp.timeoutMs", 3e3, 3e4);
557
+ const maxRequestsPerRun = readPositiveInt(raw.maxRequestsPerRun, "lsp.maxRequestsPerRun", 500, 5e3);
558
+ return { enabled: true, ...Object.keys(servers).length > 0 ? { servers } : {}, timeoutMs, maxRequestsPerRun };
559
+ }
560
+ function readPositiveInt(value, keyName, defaultValue, max) {
561
+ if (value === void 0) return defaultValue;
562
+ const coerced = typeof value === "string" && value.trim().length > 0 ? Number(value) : value;
563
+ if (typeof coerced !== "number" || !Number.isFinite(coerced) || !Number.isInteger(coerced) || coerced < 1 || coerced > max) {
564
+ throw new Error(
565
+ `codingKnowledge.${keyName} must be an integer in [1, ${max}]; got ${JSON.stringify(value)}. To disable LSP resolution set codingKnowledge.lsp.enabled to false.`
566
+ );
567
+ }
568
+ return coerced;
569
+ }
499
570
 
500
571
  // src/chat/chat-config.ts
501
572
  var DEFAULT_CHAT_CONFIG = {
@@ -3463,4 +3534,4 @@ export {
3463
3534
  VALID_MEMORY_CATEGORIES,
3464
3535
  parseConfig
3465
3536
  };
3466
- //# sourceMappingURL=chunk-KL4UAXUY.js.map
3537
+ //# sourceMappingURL=chunk-3WULMX34.js.map