@mnemoai/core 1.1.0 → 1.1.2

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 (220) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +7 -0
  4. package/dist/cli.js.map +7 -0
  5. package/dist/index.d.ts +136 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/{index.ts → dist/index.js} +537 -1333
  8. package/dist/index.js.map +7 -0
  9. package/dist/src/access-tracker.d.ts +97 -0
  10. package/dist/src/access-tracker.d.ts.map +1 -0
  11. package/dist/src/access-tracker.js +184 -0
  12. package/dist/src/access-tracker.js.map +7 -0
  13. package/dist/src/adapters/chroma.d.ts +31 -0
  14. package/dist/src/adapters/chroma.d.ts.map +1 -0
  15. package/{src/adapters/chroma.ts → dist/src/adapters/chroma.js} +45 -107
  16. package/dist/src/adapters/chroma.js.map +7 -0
  17. package/dist/src/adapters/lancedb.d.ts +29 -0
  18. package/dist/src/adapters/lancedb.d.ts.map +1 -0
  19. package/{src/adapters/lancedb.ts → dist/src/adapters/lancedb.js} +41 -109
  20. package/dist/src/adapters/lancedb.js.map +7 -0
  21. package/dist/src/adapters/pgvector.d.ts +33 -0
  22. package/dist/src/adapters/pgvector.d.ts.map +1 -0
  23. package/{src/adapters/pgvector.ts → dist/src/adapters/pgvector.js} +42 -104
  24. package/dist/src/adapters/pgvector.js.map +7 -0
  25. package/dist/src/adapters/qdrant.d.ts +34 -0
  26. package/dist/src/adapters/qdrant.d.ts.map +1 -0
  27. package/dist/src/adapters/qdrant.js +132 -0
  28. package/dist/src/adapters/qdrant.js.map +7 -0
  29. package/dist/src/adaptive-retrieval.d.ts +14 -0
  30. package/dist/src/adaptive-retrieval.d.ts.map +1 -0
  31. package/dist/src/adaptive-retrieval.js +52 -0
  32. package/dist/src/adaptive-retrieval.js.map +7 -0
  33. package/dist/src/audit-log.d.ts +56 -0
  34. package/dist/src/audit-log.d.ts.map +1 -0
  35. package/dist/src/audit-log.js +139 -0
  36. package/dist/src/audit-log.js.map +7 -0
  37. package/dist/src/chunker.d.ts +45 -0
  38. package/dist/src/chunker.d.ts.map +1 -0
  39. package/dist/src/chunker.js +157 -0
  40. package/dist/src/chunker.js.map +7 -0
  41. package/dist/src/config.d.ts +70 -0
  42. package/dist/src/config.d.ts.map +1 -0
  43. package/dist/src/config.js +142 -0
  44. package/dist/src/config.js.map +7 -0
  45. package/dist/src/decay-engine.d.ts +73 -0
  46. package/dist/src/decay-engine.d.ts.map +1 -0
  47. package/dist/src/decay-engine.js +119 -0
  48. package/dist/src/decay-engine.js.map +7 -0
  49. package/dist/src/embedder.d.ts +94 -0
  50. package/dist/src/embedder.d.ts.map +1 -0
  51. package/{src/embedder.ts → dist/src/embedder.js} +119 -317
  52. package/dist/src/embedder.js.map +7 -0
  53. package/dist/src/extraction-prompts.d.ts +12 -0
  54. package/dist/src/extraction-prompts.d.ts.map +1 -0
  55. package/dist/src/extraction-prompts.js +311 -0
  56. package/dist/src/extraction-prompts.js.map +7 -0
  57. package/dist/src/license.d.ts +29 -0
  58. package/dist/src/license.d.ts.map +1 -0
  59. package/{src/license.ts → dist/src/license.js} +42 -113
  60. package/dist/src/license.js.map +7 -0
  61. package/dist/src/llm-client.d.ts +23 -0
  62. package/dist/src/llm-client.d.ts.map +1 -0
  63. package/{src/llm-client.ts → dist/src/llm-client.js} +22 -55
  64. package/dist/src/llm-client.js.map +7 -0
  65. package/dist/src/logger.d.ts +33 -0
  66. package/dist/src/logger.d.ts.map +1 -0
  67. package/dist/src/logger.js +35 -0
  68. package/dist/src/logger.js.map +7 -0
  69. package/dist/src/mcp-server.d.ts +16 -0
  70. package/dist/src/mcp-server.d.ts.map +1 -0
  71. package/{src/mcp-server.ts → dist/src/mcp-server.js} +81 -181
  72. package/dist/src/mcp-server.js.map +7 -0
  73. package/dist/src/memory-categories.d.ts +40 -0
  74. package/dist/src/memory-categories.d.ts.map +1 -0
  75. package/dist/src/memory-categories.js +33 -0
  76. package/dist/src/memory-categories.js.map +7 -0
  77. package/dist/src/memory-upgrader.d.ts +71 -0
  78. package/dist/src/memory-upgrader.d.ts.map +1 -0
  79. package/dist/src/memory-upgrader.js +238 -0
  80. package/dist/src/memory-upgrader.js.map +7 -0
  81. package/dist/src/migrate.d.ts +47 -0
  82. package/dist/src/migrate.d.ts.map +1 -0
  83. package/{src/migrate.ts → dist/src/migrate.js} +57 -165
  84. package/dist/src/migrate.js.map +7 -0
  85. package/dist/src/mnemo.d.ts +67 -0
  86. package/dist/src/mnemo.d.ts.map +1 -0
  87. package/dist/src/mnemo.js +66 -0
  88. package/dist/src/mnemo.js.map +7 -0
  89. package/dist/src/noise-filter.d.ts +23 -0
  90. package/dist/src/noise-filter.d.ts.map +1 -0
  91. package/dist/src/noise-filter.js +62 -0
  92. package/dist/src/noise-filter.js.map +7 -0
  93. package/dist/src/noise-prototypes.d.ts +40 -0
  94. package/dist/src/noise-prototypes.d.ts.map +1 -0
  95. package/dist/src/noise-prototypes.js +116 -0
  96. package/dist/src/noise-prototypes.js.map +7 -0
  97. package/dist/src/observability.d.ts +16 -0
  98. package/dist/src/observability.d.ts.map +1 -0
  99. package/dist/src/observability.js +53 -0
  100. package/dist/src/observability.js.map +7 -0
  101. package/dist/src/query-tracker.d.ts +27 -0
  102. package/dist/src/query-tracker.d.ts.map +1 -0
  103. package/dist/src/query-tracker.js +32 -0
  104. package/dist/src/query-tracker.js.map +7 -0
  105. package/dist/src/reflection-event-store.d.ts +44 -0
  106. package/dist/src/reflection-event-store.d.ts.map +1 -0
  107. package/dist/src/reflection-event-store.js +50 -0
  108. package/dist/src/reflection-event-store.js.map +7 -0
  109. package/dist/src/reflection-item-store.d.ts +58 -0
  110. package/dist/src/reflection-item-store.d.ts.map +1 -0
  111. package/dist/src/reflection-item-store.js +69 -0
  112. package/dist/src/reflection-item-store.js.map +7 -0
  113. package/dist/src/reflection-mapped-metadata.d.ts +47 -0
  114. package/dist/src/reflection-mapped-metadata.d.ts.map +1 -0
  115. package/dist/src/reflection-mapped-metadata.js +40 -0
  116. package/dist/src/reflection-mapped-metadata.js.map +7 -0
  117. package/dist/src/reflection-metadata.d.ts +11 -0
  118. package/dist/src/reflection-metadata.d.ts.map +1 -0
  119. package/dist/src/reflection-metadata.js +24 -0
  120. package/dist/src/reflection-metadata.js.map +7 -0
  121. package/dist/src/reflection-ranking.d.ts +13 -0
  122. package/dist/src/reflection-ranking.d.ts.map +1 -0
  123. package/{src/reflection-ranking.ts → dist/src/reflection-ranking.js} +12 -21
  124. package/dist/src/reflection-ranking.js.map +7 -0
  125. package/dist/src/reflection-retry.d.ts +30 -0
  126. package/dist/src/reflection-retry.d.ts.map +1 -0
  127. package/{src/reflection-retry.ts → dist/src/reflection-retry.js} +24 -64
  128. package/dist/src/reflection-retry.js.map +7 -0
  129. package/dist/src/reflection-slices.d.ts +42 -0
  130. package/dist/src/reflection-slices.d.ts.map +1 -0
  131. package/{src/reflection-slices.ts → dist/src/reflection-slices.js} +60 -136
  132. package/dist/src/reflection-slices.js.map +7 -0
  133. package/dist/src/reflection-store.d.ts +85 -0
  134. package/dist/src/reflection-store.d.ts.map +1 -0
  135. package/dist/src/reflection-store.js +407 -0
  136. package/dist/src/reflection-store.js.map +7 -0
  137. package/dist/src/resonance-state.d.ts +19 -0
  138. package/dist/src/resonance-state.d.ts.map +1 -0
  139. package/{src/resonance-state.ts → dist/src/resonance-state.js} +13 -42
  140. package/dist/src/resonance-state.js.map +7 -0
  141. package/dist/src/retriever.d.ts +228 -0
  142. package/dist/src/retriever.d.ts.map +1 -0
  143. package/dist/src/retriever.js +1006 -0
  144. package/dist/src/retriever.js.map +7 -0
  145. package/dist/src/scopes.d.ts +58 -0
  146. package/dist/src/scopes.d.ts.map +1 -0
  147. package/dist/src/scopes.js +252 -0
  148. package/dist/src/scopes.js.map +7 -0
  149. package/dist/src/self-improvement-files.d.ts +20 -0
  150. package/dist/src/self-improvement-files.d.ts.map +1 -0
  151. package/{src/self-improvement-files.ts → dist/src/self-improvement-files.js} +24 -49
  152. package/dist/src/self-improvement-files.js.map +7 -0
  153. package/dist/src/semantic-gate.d.ts +24 -0
  154. package/dist/src/semantic-gate.d.ts.map +1 -0
  155. package/dist/src/semantic-gate.js +86 -0
  156. package/dist/src/semantic-gate.js.map +7 -0
  157. package/dist/src/session-recovery.d.ts +9 -0
  158. package/dist/src/session-recovery.d.ts.map +1 -0
  159. package/{src/session-recovery.ts → dist/src/session-recovery.js} +40 -57
  160. package/dist/src/session-recovery.js.map +7 -0
  161. package/dist/src/smart-extractor.d.ts +107 -0
  162. package/dist/src/smart-extractor.d.ts.map +1 -0
  163. package/{src/smart-extractor.ts → dist/src/smart-extractor.js} +130 -383
  164. package/dist/src/smart-extractor.js.map +7 -0
  165. package/dist/src/smart-metadata.d.ts +103 -0
  166. package/dist/src/smart-metadata.d.ts.map +1 -0
  167. package/dist/src/smart-metadata.js +361 -0
  168. package/dist/src/smart-metadata.js.map +7 -0
  169. package/dist/src/storage-adapter.d.ts +102 -0
  170. package/dist/src/storage-adapter.d.ts.map +1 -0
  171. package/dist/src/storage-adapter.js +22 -0
  172. package/dist/src/storage-adapter.js.map +7 -0
  173. package/dist/src/store.d.ts +108 -0
  174. package/dist/src/store.d.ts.map +1 -0
  175. package/dist/src/store.js +939 -0
  176. package/dist/src/store.js.map +7 -0
  177. package/dist/src/tier-manager.d.ts +57 -0
  178. package/dist/src/tier-manager.d.ts.map +1 -0
  179. package/dist/src/tier-manager.js +80 -0
  180. package/dist/src/tier-manager.js.map +7 -0
  181. package/dist/src/tools.d.ts +43 -0
  182. package/dist/src/tools.d.ts.map +1 -0
  183. package/dist/src/tools.js +1075 -0
  184. package/dist/src/tools.js.map +7 -0
  185. package/dist/src/wal-recovery.d.ts +30 -0
  186. package/dist/src/wal-recovery.d.ts.map +1 -0
  187. package/{src/wal-recovery.ts → dist/src/wal-recovery.js} +26 -79
  188. package/dist/src/wal-recovery.js.map +7 -0
  189. package/package.json +21 -2
  190. package/openclaw.plugin.json +0 -815
  191. package/src/access-tracker.ts +0 -341
  192. package/src/adapters/README.md +0 -78
  193. package/src/adapters/qdrant.ts +0 -191
  194. package/src/adaptive-retrieval.ts +0 -90
  195. package/src/audit-log.ts +0 -238
  196. package/src/chunker.ts +0 -254
  197. package/src/config.ts +0 -271
  198. package/src/decay-engine.ts +0 -238
  199. package/src/extraction-prompts.ts +0 -339
  200. package/src/memory-categories.ts +0 -71
  201. package/src/memory-upgrader.ts +0 -388
  202. package/src/mnemo.ts +0 -142
  203. package/src/noise-filter.ts +0 -97
  204. package/src/noise-prototypes.ts +0 -164
  205. package/src/observability.ts +0 -81
  206. package/src/query-tracker.ts +0 -57
  207. package/src/reflection-event-store.ts +0 -98
  208. package/src/reflection-item-store.ts +0 -112
  209. package/src/reflection-mapped-metadata.ts +0 -84
  210. package/src/reflection-metadata.ts +0 -23
  211. package/src/reflection-store.ts +0 -602
  212. package/src/retriever.ts +0 -1510
  213. package/src/scopes.ts +0 -375
  214. package/src/semantic-gate.ts +0 -121
  215. package/src/smart-metadata.ts +0 -561
  216. package/src/storage-adapter.ts +0 -153
  217. package/src/store.ts +0 -1330
  218. package/src/tier-manager.ts +0 -189
  219. package/src/tools.ts +0 -1292
  220. package/test/core.test.mjs +0 -301
@@ -0,0 +1,62 @@
1
+ const DENIAL_PATTERNS = [
2
+ /i don'?t have (any )?(information|data|memory|record)/i,
3
+ /i'?m not sure about/i,
4
+ /i don'?t recall/i,
5
+ /i don'?t remember/i,
6
+ /it looks like i don'?t/i,
7
+ /i wasn'?t able to find/i,
8
+ /no (relevant )?memories found/i,
9
+ /i don'?t have access to/i
10
+ ];
11
+ const META_QUESTION_PATTERNS = [
12
+ /\bdo you (remember|recall|know about)\b/i,
13
+ /\bcan you (remember|recall)\b/i,
14
+ /\bdid i (tell|mention|say|share)\b/i,
15
+ /\bhave i (told|mentioned|said)\b/i,
16
+ /\bwhat did i (tell|say|mention)\b/i,
17
+ /如果你知道.+只回复/i,
18
+ /如果不知道.+只回复\s*none/i,
19
+ /只回复精确代号/i,
20
+ /只回复\s*none/i,
21
+ // Chinese recall / meta-question patterns
22
+ /你还?记得/,
23
+ /记不记得/,
24
+ /还记得.*吗/,
25
+ /你[知晓]道.+吗/,
26
+ /我(?:之前|上次|以前)(?:说|提|讲).*(?:吗|呢|?|\?)/
27
+ ];
28
+ const BOILERPLATE_PATTERNS = [
29
+ /^(hi|hello|hey|good morning|good evening|greetings)/i,
30
+ /^fresh session/i,
31
+ /^new session/i,
32
+ /^HEARTBEAT/i
33
+ ];
34
+ const DIAGNOSTIC_ARTIFACT_PATTERNS = [
35
+ /\bquery\s*->\s*(none|no explicit solution|unknown|not found)\b/i,
36
+ /\buser asked for\b.*\b(none|no explicit solution|unknown|not found)\b/i,
37
+ /\bno explicit solution\b/i
38
+ ];
39
+ const DEFAULT_OPTIONS = {
40
+ filterDenials: true,
41
+ filterMetaQuestions: true,
42
+ filterBoilerplate: true
43
+ };
44
+ function isNoise(text, options = {}) {
45
+ const opts = { ...DEFAULT_OPTIONS, ...options };
46
+ const trimmed = text.trim();
47
+ if (trimmed.length < 5) return true;
48
+ if (opts.filterDenials && DENIAL_PATTERNS.some((p) => p.test(trimmed))) return true;
49
+ if (opts.filterMetaQuestions && META_QUESTION_PATTERNS.some((p) => p.test(trimmed))) return true;
50
+ if (opts.filterBoilerplate && BOILERPLATE_PATTERNS.some((p) => p.test(trimmed))) return true;
51
+ if (DIAGNOSTIC_ARTIFACT_PATTERNS.some((p) => p.test(trimmed))) return true;
52
+ return false;
53
+ }
54
+ function filterNoise(items, getText, options) {
55
+ const opts = { ...DEFAULT_OPTIONS, ...options };
56
+ return items.filter((item) => !isNoise(getText(item), opts));
57
+ }
58
+ export {
59
+ filterNoise,
60
+ isNoise
61
+ };
62
+ //# sourceMappingURL=noise-filter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/noise-filter.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Noise Filter\n * Filters out low-quality memories (meta-questions, agent denials, session boilerplate)\n * Inspired by openclaw-plugin-continuity's noise filtering approach.\n */\n\n// Agent-side denial patterns\nconst DENIAL_PATTERNS = [\n /i don'?t have (any )?(information|data|memory|record)/i,\n /i'?m not sure about/i,\n /i don'?t recall/i,\n /i don'?t remember/i,\n /it looks like i don'?t/i,\n /i wasn'?t able to find/i,\n /no (relevant )?memories found/i,\n /i don'?t have access to/i,\n];\n\n// User-side meta-question patterns (about memory itself, not content)\nconst META_QUESTION_PATTERNS = [\n /\\bdo you (remember|recall|know about)\\b/i,\n /\\bcan you (remember|recall)\\b/i,\n /\\bdid i (tell|mention|say|share)\\b/i,\n /\\bhave i (told|mentioned|said)\\b/i,\n /\\bwhat did i (tell|say|mention)\\b/i,\n /\u5982\u679C\u4F60\u77E5\u9053.+\u53EA\u56DE\u590D/i,\n /\u5982\u679C\u4E0D\u77E5\u9053.+\u53EA\u56DE\u590D\\s*none/i,\n /\u53EA\u56DE\u590D\u7CBE\u786E\u4EE3\u53F7/i,\n /\u53EA\u56DE\u590D\\s*none/i,\n // Chinese recall / meta-question patterns\n /\u4F60\u8FD8?\u8BB0\u5F97/,\n /\u8BB0\u4E0D\u8BB0\u5F97/,\n /\u8FD8\u8BB0\u5F97.*\u5417/,\n /\u4F60[\u77E5\u6653]\u9053.+\u5417/,\n /\u6211(?:\u4E4B\u524D|\u4E0A\u6B21|\u4EE5\u524D)(?:\u8BF4|\u63D0|\u8BB2).*(?:\u5417|\u5462|\uFF1F|\\?)/,\n];\n\n// Session boilerplate\nconst BOILERPLATE_PATTERNS = [\n /^(hi|hello|hey|good morning|good evening|greetings)/i,\n /^fresh session/i,\n /^new session/i,\n /^HEARTBEAT/i,\n];\n\n// Extractor artifacts from validation prompts / synthetic summaries\nconst DIAGNOSTIC_ARTIFACT_PATTERNS = [\n /\\bquery\\s*->\\s*(none|no explicit solution|unknown|not found)\\b/i,\n /\\buser asked for\\b.*\\b(none|no explicit solution|unknown|not found)\\b/i,\n /\\bno explicit solution\\b/i,\n];\n\nexport interface NoiseFilterOptions {\n /** Filter agent denial responses (default: true) */\n filterDenials?: boolean;\n /** Filter meta-questions about memory (default: true) */\n filterMetaQuestions?: boolean;\n /** Filter session boilerplate (default: true) */\n filterBoilerplate?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<NoiseFilterOptions> = {\n filterDenials: true,\n filterMetaQuestions: true,\n filterBoilerplate: true,\n};\n\n/**\n * Check if a memory text is noise that should be filtered out.\n * Returns true if the text is noise.\n */\nexport function isNoise(text: string, options: NoiseFilterOptions = {}): boolean {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const trimmed = text.trim();\n\n if (trimmed.length < 5) return true;\n\n if (opts.filterDenials && DENIAL_PATTERNS.some(p => p.test(trimmed))) return true;\n if (opts.filterMetaQuestions && META_QUESTION_PATTERNS.some(p => p.test(trimmed))) return true;\n if (opts.filterBoilerplate && BOILERPLATE_PATTERNS.some(p => p.test(trimmed))) return true;\n if (DIAGNOSTIC_ARTIFACT_PATTERNS.some(p => p.test(trimmed))) return true;\n\n return false;\n}\n\n/**\n * Filter an array of items, removing noise entries.\n */\nexport function filterNoise<T>(\n items: T[],\n getText: (item: T) => string,\n options?: NoiseFilterOptions\n): T[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n return items.filter(item => !isNoise(getText(item), opts));\n}\n"],
5
+ "mappings": "AAQA,MAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,+BAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF;AAWA,MAAM,kBAAgD;AAAA,EACpD,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,mBAAmB;AACrB;AAMO,SAAS,QAAQ,MAAc,UAA8B,CAAC,GAAY;AAC/E,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,UAAU,KAAK,KAAK;AAE1B,MAAI,QAAQ,SAAS,EAAG,QAAO;AAE/B,MAAI,KAAK,iBAAiB,gBAAgB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAC7E,MAAI,KAAK,uBAAuB,uBAAuB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAC1F,MAAI,KAAK,qBAAqB,qBAAqB,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AACtF,MAAI,6BAA6B,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC,EAAG,QAAO;AAEpE,SAAO;AACT;AAKO,SAAS,YACd,OACA,SACA,SACK;AACL,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,SAAO,MAAM,OAAO,UAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,IAAI,CAAC;AAC3D;",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Embedding-based Noise Prototype Bank
3
+ *
4
+ * Language-agnostic noise detection: maintains a bank of noise prototype
5
+ * embeddings (recall queries, agent denials, greetings). Input texts are
6
+ * compared via cosine similarity — no regex maintenance required.
7
+ *
8
+ * The bank starts with ~15 built-in multilingual prototypes and grows
9
+ * automatically when the LLM extraction returns zero memories (feedback loop).
10
+ */
11
+ import type { Embedder } from "./embedder.js";
12
+ export declare class NoisePrototypeBank {
13
+ private vectors;
14
+ private builtinCount;
15
+ private _initialized;
16
+ private debugLog;
17
+ constructor(debugLog?: (msg: string) => void);
18
+ /** Whether the bank has been initialized with prototype embeddings. */
19
+ get initialized(): boolean;
20
+ /** Total number of prototypes (built-in + learned). */
21
+ get size(): number;
22
+ /**
23
+ * Embed all built-in noise prototypes and cache their vectors.
24
+ * Call once at plugin startup. Safe to call multiple times (no-op after first).
25
+ */
26
+ init(embedder: Embedder): Promise<void>;
27
+ /**
28
+ * Check if a text vector matches any noise prototype.
29
+ * Returns true if cosine similarity >= threshold with any prototype.
30
+ */
31
+ isNoise(textVector: number[], threshold?: number): boolean;
32
+ /**
33
+ * LLM feedback: add a text vector to the learned noise bank.
34
+ * Called when LLM extraction returns zero memories (strong noise signal).
35
+ * Deduplicates against existing prototypes (>= 0.95 similarity = skip).
36
+ * Evicts oldest learned prototype when bank exceeds MAX_LEARNED_PROTOTYPES.
37
+ */
38
+ learn(textVector: number[]): void;
39
+ }
40
+ //# sourceMappingURL=noise-prototypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise-prototypes.d.ts","sourceRoot":"","sources":["../../src/noise-prototypes.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqC9C,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAI5C,uEAAuE;IACvE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,uDAAuD;IACvD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC7C;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,SAAoB,GAAG,OAAO;IAQrE;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;CAmBpC"}
@@ -0,0 +1,116 @@
1
+ const BUILTIN_NOISE_TEXTS = [
2
+ // Recall queries
3
+ "Do you remember what I told you?",
4
+ "Can you recall my preferences?",
5
+ "What did I say about that?",
6
+ "\u4F60\u8FD8\u8BB0\u5F97\u6211\u559C\u6B22\u4EC0\u4E48\u5417",
7
+ "\u4F60\u77E5\u9053\u6211\u4E4B\u524D\u8BF4\u8FC7\u4EC0\u4E48\u5417",
8
+ "\u8A18\u5F97\u6211\u4E0A\u6B21\u63D0\u5230\u7684\u55CE",
9
+ "\u6211\u4E4B\u524D\u8DDF\u4F60\u8BF4\u8FC7\u5417",
10
+ // Agent denials
11
+ "I don't have any information about that",
12
+ "I don't recall any previous conversation",
13
+ "\u6211\u6CA1\u6709\u76F8\u5173\u7684\u8BB0\u5FC6",
14
+ // Greetings / boilerplate
15
+ "Hello, how are you doing today?",
16
+ "Hi there, what's up",
17
+ "\u65B0\u7684\u4E00\u5929\u5F00\u59CB\u4E86"
18
+ ];
19
+ const DEFAULT_THRESHOLD = 0.82;
20
+ const MAX_LEARNED_PROTOTYPES = 200;
21
+ const DEDUP_THRESHOLD = 0.95;
22
+ class NoisePrototypeBank {
23
+ vectors = [];
24
+ builtinCount = 0;
25
+ _initialized = false;
26
+ debugLog;
27
+ constructor(debugLog) {
28
+ this.debugLog = debugLog ?? (() => {
29
+ });
30
+ }
31
+ /** Whether the bank has been initialized with prototype embeddings. */
32
+ get initialized() {
33
+ return this._initialized;
34
+ }
35
+ /** Total number of prototypes (built-in + learned). */
36
+ get size() {
37
+ return this.vectors.length;
38
+ }
39
+ /**
40
+ * Embed all built-in noise prototypes and cache their vectors.
41
+ * Call once at plugin startup. Safe to call multiple times (no-op after first).
42
+ */
43
+ async init(embedder) {
44
+ if (this._initialized) return;
45
+ for (const text of BUILTIN_NOISE_TEXTS) {
46
+ try {
47
+ const v = await embedder.embed(text);
48
+ if (v && v.length > 0) this.vectors.push(v);
49
+ } catch {
50
+ }
51
+ }
52
+ this.builtinCount = this.vectors.length;
53
+ this._initialized = true;
54
+ if (this.vectors.length >= 2) {
55
+ const sim = cosine(this.vectors[0], this.vectors[1]);
56
+ if (sim > 0.98) {
57
+ this.debugLog(
58
+ `noise-prototype-bank: degenerate embeddings detected (pairwise cosine=${sim.toFixed(4)}), disabling noise filter`
59
+ );
60
+ this._initialized = false;
61
+ this.vectors = [];
62
+ return;
63
+ }
64
+ }
65
+ this.debugLog(
66
+ `noise-prototype-bank: initialized with ${this.builtinCount} built-in prototypes`
67
+ );
68
+ }
69
+ /**
70
+ * Check if a text vector matches any noise prototype.
71
+ * Returns true if cosine similarity >= threshold with any prototype.
72
+ */
73
+ isNoise(textVector, threshold = DEFAULT_THRESHOLD) {
74
+ if (!this._initialized || this.vectors.length === 0) return false;
75
+ for (const proto of this.vectors) {
76
+ if (cosine(proto, textVector) >= threshold) return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * LLM feedback: add a text vector to the learned noise bank.
82
+ * Called when LLM extraction returns zero memories (strong noise signal).
83
+ * Deduplicates against existing prototypes (>= 0.95 similarity = skip).
84
+ * Evicts oldest learned prototype when bank exceeds MAX_LEARNED_PROTOTYPES.
85
+ */
86
+ learn(textVector) {
87
+ if (!this._initialized) return;
88
+ for (const proto of this.vectors) {
89
+ if (cosine(proto, textVector) >= DEDUP_THRESHOLD) return;
90
+ }
91
+ this.vectors.push(textVector);
92
+ if (this.vectors.length > this.builtinCount + MAX_LEARNED_PROTOTYPES) {
93
+ this.vectors.splice(this.builtinCount, 1);
94
+ }
95
+ this.debugLog(
96
+ `noise-prototype-bank: learned new noise prototype (total: ${this.vectors.length})`
97
+ );
98
+ }
99
+ }
100
+ function cosine(a, b) {
101
+ if (a.length !== b.length) return 0;
102
+ let dot = 0;
103
+ let na = 0;
104
+ let nb = 0;
105
+ for (let i = 0; i < a.length; i++) {
106
+ dot += a[i] * b[i];
107
+ na += a[i] * a[i];
108
+ nb += b[i] * b[i];
109
+ }
110
+ const denom = Math.sqrt(na) * Math.sqrt(nb);
111
+ return denom === 0 ? 0 : dot / denom;
112
+ }
113
+ export {
114
+ NoisePrototypeBank
115
+ };
116
+ //# sourceMappingURL=noise-prototypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/noise-prototypes.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: MIT\n/**\n * Embedding-based Noise Prototype Bank\n *\n * Language-agnostic noise detection: maintains a bank of noise prototype\n * embeddings (recall queries, agent denials, greetings). Input texts are\n * compared via cosine similarity \u2014 no regex maintenance required.\n *\n * The bank starts with ~15 built-in multilingual prototypes and grows\n * automatically when the LLM extraction returns zero memories (feedback loop).\n */\n\nimport type { Embedder } from \"./embedder.js\";\n\n// ============================================================================\n// Built-in noise prototypes (multilingual)\n// ============================================================================\n\nconst BUILTIN_NOISE_TEXTS: readonly string[] = [\n // Recall queries\n \"Do you remember what I told you?\",\n \"Can you recall my preferences?\",\n \"What did I say about that?\",\n \"\u4F60\u8FD8\u8BB0\u5F97\u6211\u559C\u6B22\u4EC0\u4E48\u5417\",\n \"\u4F60\u77E5\u9053\u6211\u4E4B\u524D\u8BF4\u8FC7\u4EC0\u4E48\u5417\",\n \"\u8A18\u5F97\u6211\u4E0A\u6B21\u63D0\u5230\u7684\u55CE\",\n \"\u6211\u4E4B\u524D\u8DDF\u4F60\u8BF4\u8FC7\u5417\",\n // Agent denials\n \"I don't have any information about that\",\n \"I don't recall any previous conversation\",\n \"\u6211\u6CA1\u6709\u76F8\u5173\u7684\u8BB0\u5FC6\",\n // Greetings / boilerplate\n \"Hello, how are you doing today?\",\n \"Hi there, what's up\",\n \"\u65B0\u7684\u4E00\u5929\u5F00\u59CB\u4E86\",\n];\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_THRESHOLD = 0.82;\nconst MAX_LEARNED_PROTOTYPES = 200;\nconst DEDUP_THRESHOLD = 0.95;\n\n// ============================================================================\n// NoisePrototypeBank\n// ============================================================================\n\nexport class NoisePrototypeBank {\n private vectors: number[][] = [];\n private builtinCount = 0;\n private _initialized = false;\n private debugLog: (msg: string) => void;\n\n constructor(debugLog?: (msg: string) => void) {\n this.debugLog = debugLog ?? (() => { });\n }\n\n /** Whether the bank has been initialized with prototype embeddings. */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /** Total number of prototypes (built-in + learned). */\n get size(): number {\n return this.vectors.length;\n }\n\n /**\n * Embed all built-in noise prototypes and cache their vectors.\n * Call once at plugin startup. Safe to call multiple times (no-op after first).\n */\n async init(embedder: Embedder): Promise<void> {\n if (this._initialized) return;\n\n for (const text of BUILTIN_NOISE_TEXTS) {\n try {\n const v = await embedder.embed(text);\n if (v && v.length > 0) this.vectors.push(v);\n } catch {\n // Skip failed embeddings \u2014 bank will work with whatever succeeds\n }\n }\n this.builtinCount = this.vectors.length;\n this._initialized = true;\n\n // Degeneracy check: if all prototype vectors are nearly identical, the\n // embedding model does not produce discriminative outputs (e.g. a\n // deterministic mock that ignores text). In that case the noise bank\n // would flag every input as noise, so we disable ourselves.\n if (this.vectors.length >= 2) {\n const sim = cosine(this.vectors[0], this.vectors[1]);\n if (sim > 0.98) {\n this.debugLog(\n `noise-prototype-bank: degenerate embeddings detected (pairwise cosine=${sim.toFixed(4)}), disabling noise filter`,\n );\n this._initialized = false;\n this.vectors = [];\n return;\n }\n }\n\n this.debugLog(\n `noise-prototype-bank: initialized with ${this.builtinCount} built-in prototypes`,\n );\n }\n\n /**\n * Check if a text vector matches any noise prototype.\n * Returns true if cosine similarity >= threshold with any prototype.\n */\n isNoise(textVector: number[], threshold = DEFAULT_THRESHOLD): boolean {\n if (!this._initialized || this.vectors.length === 0) return false;\n for (const proto of this.vectors) {\n if (cosine(proto, textVector) >= threshold) return true;\n }\n return false;\n }\n\n /**\n * LLM feedback: add a text vector to the learned noise bank.\n * Called when LLM extraction returns zero memories (strong noise signal).\n * Deduplicates against existing prototypes (>= 0.95 similarity = skip).\n * Evicts oldest learned prototype when bank exceeds MAX_LEARNED_PROTOTYPES.\n */\n learn(textVector: number[]): void {\n if (!this._initialized) return;\n\n // Deduplicate: too similar to an existing prototype \u2192 skip\n for (const proto of this.vectors) {\n if (cosine(proto, textVector) >= DEDUP_THRESHOLD) return;\n }\n\n this.vectors.push(textVector);\n\n // Evict oldest learned prototype if over limit (preserve built-in prototypes)\n if (this.vectors.length > this.builtinCount + MAX_LEARNED_PROTOTYPES) {\n this.vectors.splice(this.builtinCount, 1);\n }\n\n this.debugLog(\n `noise-prototype-bank: learned new noise prototype (total: ${this.vectors.length})`,\n );\n }\n}\n\n// ============================================================================\n// Cosine Similarity\n// ============================================================================\n\nfunction cosine(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n const denom = Math.sqrt(na) * Math.sqrt(nb);\n return denom === 0 ? 0 : dot / denom;\n}\n"],
5
+ "mappings": "AAkBA,MAAM,sBAAyC;AAAA;AAAA,EAE3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AAMA,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,kBAAkB;AAMjB,MAAM,mBAAmB;AAAA,EACpB,UAAsB,CAAC;AAAA,EACvB,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EAER,YAAY,UAAkC;AAC1C,SAAK,WAAW,aAAa,MAAM;AAAA,IAAE;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,OAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,UAAmC;AAC1C,QAAI,KAAK,aAAc;AAEvB,eAAW,QAAQ,qBAAqB;AACpC,UAAI;AACA,cAAM,IAAI,MAAM,SAAS,MAAM,IAAI;AACnC,YAAI,KAAK,EAAE,SAAS,EAAG,MAAK,QAAQ,KAAK,CAAC;AAAA,MAC9C,QAAQ;AAAA,MAER;AAAA,IACJ;AACA,SAAK,eAAe,KAAK,QAAQ;AACjC,SAAK,eAAe;AAMpB,QAAI,KAAK,QAAQ,UAAU,GAAG;AAC1B,YAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;AACnD,UAAI,MAAM,MAAM;AACZ,aAAK;AAAA,UACD,yEAAyE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC3F;AACA,aAAK,eAAe;AACpB,aAAK,UAAU,CAAC;AAChB;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK;AAAA,MACD,0CAA0C,KAAK,YAAY;AAAA,IAC/D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,YAAsB,YAAY,mBAA4B;AAClE,QAAI,CAAC,KAAK,gBAAgB,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,eAAW,SAAS,KAAK,SAAS;AAC9B,UAAI,OAAO,OAAO,UAAU,KAAK,UAAW,QAAO;AAAA,IACvD;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAA4B;AAC9B,QAAI,CAAC,KAAK,aAAc;AAGxB,eAAW,SAAS,KAAK,SAAS;AAC9B,UAAI,OAAO,OAAO,UAAU,KAAK,gBAAiB;AAAA,IACtD;AAEA,SAAK,QAAQ,KAAK,UAAU;AAG5B,QAAI,KAAK,QAAQ,SAAS,KAAK,eAAe,wBAAwB;AAClE,WAAK,QAAQ,OAAO,KAAK,cAAc,CAAC;AAAA,IAC5C;AAEA,SAAK;AAAA,MACD,6DAA6D,KAAK,QAAQ,MAAM;AAAA,IACpF;AAAA,EACJ;AACJ;AAMA,SAAS,OAAO,GAAa,GAAqB;AAC9C,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,MAAI,MAAM;AACV,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,WAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,UAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAChB,UAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACpB;AACA,QAAM,QAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE;AAC1C,SAAO,UAAU,IAAI,IAAI,MAAM;AACnC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Observability — aggregated stats from query-tracking.jsonl
3
+ */
4
+ export interface QueryStats {
5
+ totalQueries: number;
6
+ avgLatencyMs: number;
7
+ resonancePassRate: number;
8
+ avgHitCount: number;
9
+ queryTypeDistribution: Record<string, number>;
10
+ hourlyTrend: {
11
+ hour: string;
12
+ count: number;
13
+ }[];
14
+ }
15
+ export declare function getStats(maxRecords?: number): Promise<QueryStats>;
16
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AACA;;GAEG;AAIH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,wBAAsB,QAAQ,CAAC,UAAU,SAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAgErE"}
@@ -0,0 +1,53 @@
1
+ import { getRecentQueries } from "./query-tracker.js";
2
+ async function getStats(maxRecords = 1e3) {
3
+ const records = await getRecentQueries(maxRecords);
4
+ if (records.length === 0) {
5
+ return {
6
+ totalQueries: 0,
7
+ avgLatencyMs: 0,
8
+ resonancePassRate: 0,
9
+ avgHitCount: 0,
10
+ queryTypeDistribution: {},
11
+ hourlyTrend: []
12
+ };
13
+ }
14
+ const totalQueries = records.length;
15
+ const avgLatencyMs = Math.round(
16
+ records.reduce((sum, r) => sum + r.latency_ms, 0) / totalQueries
17
+ );
18
+ const resonancePassRate = +(records.filter((r) => r.resonancePass).length / totalQueries).toFixed(3);
19
+ const avgHitCount = +(records.reduce((sum, r) => sum + r.hitCount, 0) / totalQueries).toFixed(2);
20
+ const queryTypeDistribution = {};
21
+ for (const r of records) {
22
+ queryTypeDistribution[r.queryType] = (queryTypeDistribution[r.queryType] || 0) + 1;
23
+ }
24
+ const now = Date.now();
25
+ const cutoff = now - 24 * 60 * 60 * 1e3;
26
+ const hourBuckets = /* @__PURE__ */ new Map();
27
+ for (let i = 0; i < 24; i++) {
28
+ const d = new Date(now - i * 60 * 60 * 1e3);
29
+ const key = d.toISOString().slice(0, 13);
30
+ hourBuckets.set(key, 0);
31
+ }
32
+ for (const r of records) {
33
+ const ts = new Date(r.timestamp).getTime();
34
+ if (ts < cutoff) continue;
35
+ const key = r.timestamp.slice(0, 13);
36
+ if (hourBuckets.has(key)) {
37
+ hourBuckets.set(key, hourBuckets.get(key) + 1);
38
+ }
39
+ }
40
+ const hourlyTrend = Array.from(hourBuckets.entries()).map(([hour, count]) => ({ hour, count })).sort((a, b) => a.hour.localeCompare(b.hour));
41
+ return {
42
+ totalQueries,
43
+ avgLatencyMs,
44
+ resonancePassRate,
45
+ avgHitCount,
46
+ queryTypeDistribution,
47
+ hourlyTrend
48
+ };
49
+ }
50
+ export {
51
+ getStats
52
+ };
53
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/observability.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * Observability \u2014 aggregated stats from query-tracking.jsonl\n */\n\nimport { getRecentQueries, type QueryRecord } from \"./query-tracker.js\";\n\nexport interface QueryStats {\n totalQueries: number;\n avgLatencyMs: number;\n resonancePassRate: number;\n avgHitCount: number;\n queryTypeDistribution: Record<string, number>;\n hourlyTrend: { hour: string; count: number }[];\n}\n\nexport async function getStats(maxRecords = 1000): Promise<QueryStats> {\n const records = await getRecentQueries(maxRecords);\n\n if (records.length === 0) {\n return {\n totalQueries: 0,\n avgLatencyMs: 0,\n resonancePassRate: 0,\n avgHitCount: 0,\n queryTypeDistribution: {},\n hourlyTrend: [],\n };\n }\n\n const totalQueries = records.length;\n const avgLatencyMs = Math.round(\n records.reduce((sum, r) => sum + r.latency_ms, 0) / totalQueries\n );\n const resonancePassRate = +(\n records.filter((r) => r.resonancePass).length / totalQueries\n ).toFixed(3);\n const avgHitCount = +(\n records.reduce((sum, r) => sum + r.hitCount, 0) / totalQueries\n ).toFixed(2);\n\n // Query type distribution\n const queryTypeDistribution: Record<string, number> = {};\n for (const r of records) {\n queryTypeDistribution[r.queryType] =\n (queryTypeDistribution[r.queryType] || 0) + 1;\n }\n\n // Hourly trend \u2014 last 24h bucketed by hour\n const now = Date.now();\n const cutoff = now - 24 * 60 * 60 * 1000;\n const hourBuckets = new Map<string, number>();\n\n for (let i = 0; i < 24; i++) {\n const d = new Date(now - i * 60 * 60 * 1000);\n const key = d.toISOString().slice(0, 13); // \"YYYY-MM-DDTHH\"\n hourBuckets.set(key, 0);\n }\n\n for (const r of records) {\n const ts = new Date(r.timestamp).getTime();\n if (ts < cutoff) continue;\n const key = r.timestamp.slice(0, 13);\n if (hourBuckets.has(key)) {\n hourBuckets.set(key, hourBuckets.get(key)! + 1);\n }\n }\n\n const hourlyTrend = Array.from(hourBuckets.entries())\n .map(([hour, count]) => ({ hour, count }))\n .sort((a, b) => a.hour.localeCompare(b.hour));\n\n return {\n totalQueries,\n avgLatencyMs,\n resonancePassRate,\n avgHitCount,\n queryTypeDistribution,\n hourlyTrend,\n };\n}\n"],
5
+ "mappings": "AAKA,SAAS,wBAA0C;AAWnD,eAAsB,SAAS,aAAa,KAA2B;AACrE,QAAM,UAAU,MAAM,iBAAiB,UAAU;AAEjD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,uBAAuB,CAAC;AAAA,MACxB,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ;AAC7B,QAAM,eAAe,KAAK;AAAA,IACxB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC,IAAI;AAAA,EACtD;AACA,QAAM,oBAAoB,EACxB,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,cAChD,QAAQ,CAAC;AACX,QAAM,cAAc,EAClB,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,CAAC,IAAI,cAClD,QAAQ,CAAC;AAGX,QAAM,wBAAgD,CAAC;AACvD,aAAW,KAAK,SAAS;AACvB,0BAAsB,EAAE,SAAS,KAC9B,sBAAsB,EAAE,SAAS,KAAK,KAAK;AAAA,EAChD;AAGA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,SAAS,MAAM,KAAK,KAAK,KAAK;AACpC,QAAM,cAAc,oBAAI,IAAoB;AAE5C,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,GAAI;AAC3C,UAAM,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACvC,gBAAY,IAAI,KAAK,CAAC;AAAA,EACxB;AAEA,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AACzC,QAAI,KAAK,OAAQ;AACjB,UAAM,MAAM,EAAE,UAAU,MAAM,GAAG,EAAE;AACnC,QAAI,YAAY,IAAI,GAAG,GAAG;AACxB,kBAAY,IAAI,KAAK,YAAY,IAAI,GAAG,IAAK,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,KAAK,YAAY,QAAQ,CAAC,EACjD,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Query Tracker
3
+ *
4
+ * Lightweight, append-only JSONL tracker for every recall query.
5
+ * Fire-and-forget writes — never blocks the recall path.
6
+ * Persisted to ~/.openclaw/memory/query-tracking.jsonl.
7
+ */
8
+ export interface QueryRecord {
9
+ timestamp: string;
10
+ query: string;
11
+ source: "auto" | "manual" | "cli";
12
+ hitCount: number;
13
+ topScore: number;
14
+ latency_ms: number;
15
+ queryType: "single" | "multi-hop" | "gated-out";
16
+ resonancePass: boolean;
17
+ }
18
+ /**
19
+ * Record a query to the tracking log (fire-and-forget).
20
+ * Errors are silently swallowed to avoid impacting recall latency.
21
+ */
22
+ export declare function recordQuery(data: QueryRecord): void;
23
+ /**
24
+ * Read the most recent N query records from the tracking log.
25
+ */
26
+ export declare function getRecentQueries(n?: number): Promise<QueryRecord[]>;
27
+ //# sourceMappingURL=query-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-tracker.d.ts","sourceRoot":"","sources":["../../src/query-tracker.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAQH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAUnD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,GAAE,MAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAS9E"}
@@ -0,0 +1,32 @@
1
+ import { appendFile, readFile, mkdir } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join, dirname } from "node:path";
4
+ const TRACKING_PATH = join(homedir(), ".openclaw", "memory", "query-tracking.jsonl");
5
+ let dirEnsured = false;
6
+ function recordQuery(data) {
7
+ const line = JSON.stringify(data) + "\n";
8
+ const doWrite = async () => {
9
+ if (!dirEnsured) {
10
+ await mkdir(dirname(TRACKING_PATH), { recursive: true });
11
+ dirEnsured = true;
12
+ }
13
+ await appendFile(TRACKING_PATH, line, "utf8");
14
+ };
15
+ doWrite().catch(() => {
16
+ });
17
+ }
18
+ async function getRecentQueries(n = 100) {
19
+ try {
20
+ const raw = await readFile(TRACKING_PATH, "utf8");
21
+ const lines = raw.trim().split("\n").filter(Boolean);
22
+ const recent = lines.slice(-n);
23
+ return recent.map((line) => JSON.parse(line));
24
+ } catch {
25
+ return [];
26
+ }
27
+ }
28
+ export {
29
+ getRecentQueries,
30
+ recordQuery
31
+ };
32
+ //# sourceMappingURL=query-tracker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/query-tracker.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\n/**\n * Query Tracker\n *\n * Lightweight, append-only JSONL tracker for every recall query.\n * Fire-and-forget writes \u2014 never blocks the recall path.\n * Persisted to ~/.openclaw/memory/query-tracking.jsonl.\n */\n\nimport { appendFile, readFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\n\nconst TRACKING_PATH = join(homedir(), \".openclaw\", \"memory\", \"query-tracking.jsonl\");\n\nexport interface QueryRecord {\n timestamp: string;\n query: string;\n source: \"auto\" | \"manual\" | \"cli\";\n hitCount: number;\n topScore: number;\n latency_ms: number;\n queryType: \"single\" | \"multi-hop\" | \"gated-out\";\n resonancePass: boolean;\n}\n\nlet dirEnsured = false;\n\n/**\n * Record a query to the tracking log (fire-and-forget).\n * Errors are silently swallowed to avoid impacting recall latency.\n */\nexport function recordQuery(data: QueryRecord): void {\n const line = JSON.stringify(data) + \"\\n\";\n const doWrite = async () => {\n if (!dirEnsured) {\n await mkdir(dirname(TRACKING_PATH), { recursive: true });\n dirEnsured = true;\n }\n await appendFile(TRACKING_PATH, line, \"utf8\");\n };\n doWrite().catch(() => {});\n}\n\n/**\n * Read the most recent N query records from the tracking log.\n */\nexport async function getRecentQueries(n: number = 100): Promise<QueryRecord[]> {\n try {\n const raw = await readFile(TRACKING_PATH, \"utf8\");\n const lines = raw.trim().split(\"\\n\").filter(Boolean);\n const recent = lines.slice(-n);\n return recent.map((line) => JSON.parse(line) as QueryRecord);\n } catch {\n return [];\n }\n}\n"],
5
+ "mappings": "AASA,SAAS,YAAY,UAAU,aAAa;AAC5C,SAAS,eAAe;AACxB,SAAS,MAAM,eAAe;AAE9B,MAAM,gBAAgB,KAAK,QAAQ,GAAG,aAAa,UAAU,sBAAsB;AAanF,IAAI,aAAa;AAMV,SAAS,YAAY,MAAyB;AACnD,QAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AACpC,QAAM,UAAU,YAAY;AAC1B,QAAI,CAAC,YAAY;AACf,YAAM,MAAM,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,mBAAa;AAAA,IACf;AACA,UAAM,WAAW,eAAe,MAAM,MAAM;AAAA,EAC9C;AACA,UAAQ,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC1B;AAKA,eAAsB,iBAAiB,IAAY,KAA6B;AAC9E,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,eAAe,MAAM;AAChD,UAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACnD,UAAM,SAAS,MAAM,MAAM,CAAC,CAAC;AAC7B,WAAO,OAAO,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAgB;AAAA,EAC7D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ export declare const REFLECTION_SCHEMA_VERSION = 4;
2
+ export type ReflectionErrorSignalLike = {
3
+ signatureHash: string;
4
+ };
5
+ export interface ReflectionEventMetadata {
6
+ type: "memory-reflection-event";
7
+ reflectionVersion: 4;
8
+ stage: "reflect-store";
9
+ eventId: string;
10
+ sessionKey: string;
11
+ sessionId: string;
12
+ agentId: string;
13
+ command: string;
14
+ storedAt: number;
15
+ usedFallback: boolean;
16
+ errorSignals: string[];
17
+ sourceReflectionPath?: string;
18
+ }
19
+ export interface ReflectionEventPayload {
20
+ kind: "event";
21
+ text: string;
22
+ metadata: ReflectionEventMetadata;
23
+ }
24
+ export interface BuildReflectionEventPayloadParams {
25
+ eventId?: string;
26
+ scope: string;
27
+ sessionKey: string;
28
+ sessionId: string;
29
+ agentId: string;
30
+ command: string;
31
+ toolErrorSignals: ReflectionErrorSignalLike[];
32
+ runAt: number;
33
+ usedFallback: boolean;
34
+ sourceReflectionPath?: string;
35
+ }
36
+ export declare function createReflectionEventId(params: {
37
+ runAt: number;
38
+ sessionKey: string;
39
+ sessionId: string;
40
+ agentId: string;
41
+ command: string;
42
+ }): string;
43
+ export declare function buildReflectionEventPayload(params: BuildReflectionEventPayloadParams): ReflectionEventPayload;
44
+ //# sourceMappingURL=reflection-event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection-event-store.d.ts","sourceRoot":"","sources":["../../src/reflection-event-store.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,yBAAyB,CAAC;IAChC,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,yBAAyB,EAAE,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAQT;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iCAAiC,GAAG,sBAAsB,CAsC7G"}
@@ -0,0 +1,50 @@
1
+ import { createHash } from "node:crypto";
2
+ const REFLECTION_SCHEMA_VERSION = 4;
3
+ function createReflectionEventId(params) {
4
+ const safeRunAt = Number.isFinite(params.runAt) ? Math.max(0, Math.floor(params.runAt)) : Date.now();
5
+ const datePart = new Date(safeRunAt).toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
6
+ const digest = createHash("sha1").update(`${safeRunAt}|${params.sessionKey}|${params.sessionId}|${params.agentId}|${params.command}`).digest("hex").slice(0, 8);
7
+ return `refl-${datePart}-${digest}`;
8
+ }
9
+ function buildReflectionEventPayload(params) {
10
+ const eventId = params.eventId || createReflectionEventId({
11
+ runAt: params.runAt,
12
+ sessionKey: params.sessionKey,
13
+ sessionId: params.sessionId,
14
+ agentId: params.agentId,
15
+ command: params.command
16
+ });
17
+ const metadata = {
18
+ type: "memory-reflection-event",
19
+ reflectionVersion: REFLECTION_SCHEMA_VERSION,
20
+ stage: "reflect-store",
21
+ eventId,
22
+ sessionKey: params.sessionKey,
23
+ sessionId: params.sessionId,
24
+ agentId: params.agentId,
25
+ command: params.command,
26
+ storedAt: params.runAt,
27
+ usedFallback: params.usedFallback,
28
+ errorSignals: params.toolErrorSignals.map((signal) => signal.signatureHash),
29
+ ...params.sourceReflectionPath ? { sourceReflectionPath: params.sourceReflectionPath } : {}
30
+ };
31
+ const text = [
32
+ `reflection-event \xB7 ${params.scope}`,
33
+ `eventId=${eventId}`,
34
+ `session=${params.sessionId}`,
35
+ `agent=${params.agentId}`,
36
+ `command=${params.command}`,
37
+ `usedFallback=${params.usedFallback ? "true" : "false"}`
38
+ ].join("\n");
39
+ return {
40
+ kind: "event",
41
+ text,
42
+ metadata
43
+ };
44
+ }
45
+ export {
46
+ REFLECTION_SCHEMA_VERSION,
47
+ buildReflectionEventPayload,
48
+ createReflectionEventId
49
+ };
50
+ //# sourceMappingURL=reflection-event-store.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/reflection-event-store.ts"],
4
+ "sourcesContent": ["// SPDX-License-Identifier: LicenseRef-Mnemo-Pro\nimport { createHash } from \"node:crypto\";\n\nexport const REFLECTION_SCHEMA_VERSION = 4;\n\nexport type ReflectionErrorSignalLike = {\n signatureHash: string;\n};\n\nexport interface ReflectionEventMetadata {\n type: \"memory-reflection-event\";\n reflectionVersion: 4;\n stage: \"reflect-store\";\n eventId: string;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n storedAt: number;\n usedFallback: boolean;\n errorSignals: string[];\n sourceReflectionPath?: string;\n}\n\nexport interface ReflectionEventPayload {\n kind: \"event\";\n text: string;\n metadata: ReflectionEventMetadata;\n}\n\nexport interface BuildReflectionEventPayloadParams {\n eventId?: string;\n scope: string;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n toolErrorSignals: ReflectionErrorSignalLike[];\n runAt: number;\n usedFallback: boolean;\n sourceReflectionPath?: string;\n}\n\nexport function createReflectionEventId(params: {\n runAt: number;\n sessionKey: string;\n sessionId: string;\n agentId: string;\n command: string;\n}): string {\n const safeRunAt = Number.isFinite(params.runAt) ? Math.max(0, Math.floor(params.runAt)) : Date.now();\n const datePart = new Date(safeRunAt).toISOString().replace(/[-:.TZ]/g, \"\").slice(0, 14);\n const digest = createHash(\"sha1\")\n .update(`${safeRunAt}|${params.sessionKey}|${params.sessionId}|${params.agentId}|${params.command}`)\n .digest(\"hex\")\n .slice(0, 8);\n return `refl-${datePart}-${digest}`;\n}\n\nexport function buildReflectionEventPayload(params: BuildReflectionEventPayloadParams): ReflectionEventPayload {\n const eventId = params.eventId || createReflectionEventId({\n runAt: params.runAt,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n agentId: params.agentId,\n command: params.command,\n });\n\n const metadata: ReflectionEventMetadata = {\n type: \"memory-reflection-event\",\n reflectionVersion: REFLECTION_SCHEMA_VERSION,\n stage: \"reflect-store\",\n eventId,\n sessionKey: params.sessionKey,\n sessionId: params.sessionId,\n agentId: params.agentId,\n command: params.command,\n storedAt: params.runAt,\n usedFallback: params.usedFallback,\n errorSignals: params.toolErrorSignals.map((signal) => signal.signatureHash),\n ...(params.sourceReflectionPath ? { sourceReflectionPath: params.sourceReflectionPath } : {}),\n };\n\n const text = [\n `reflection-event \u00B7 ${params.scope}`,\n `eventId=${eventId}`,\n `session=${params.sessionId}`,\n `agent=${params.agentId}`,\n `command=${params.command}`,\n `usedFallback=${params.usedFallback ? \"true\" : \"false\"}`,\n ].join(\"\\n\");\n\n return {\n kind: \"event\",\n text,\n metadata,\n };\n}\n"],
5
+ "mappings": "AACA,SAAS,kBAAkB;AAEpB,MAAM,4BAA4B;AAwClC,SAAS,wBAAwB,QAM7B;AACT,QAAM,YAAY,OAAO,SAAS,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI;AACnG,QAAM,WAAW,IAAI,KAAK,SAAS,EAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE;AACtF,QAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,GAAG,SAAS,IAAI,OAAO,UAAU,IAAI,OAAO,SAAS,IAAI,OAAO,OAAO,IAAI,OAAO,OAAO,EAAE,EAClG,OAAO,KAAK,EACZ,MAAM,GAAG,CAAC;AACb,SAAO,QAAQ,QAAQ,IAAI,MAAM;AACnC;AAEO,SAAS,4BAA4B,QAAmE;AAC7G,QAAM,UAAU,OAAO,WAAW,wBAAwB;AAAA,IACxD,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,QAAM,WAAoC;AAAA,IACxC,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO,iBAAiB,IAAI,CAAC,WAAW,OAAO,aAAa;AAAA,IAC1E,GAAI,OAAO,uBAAuB,EAAE,sBAAsB,OAAO,qBAAqB,IAAI,CAAC;AAAA,EAC7F;AAEA,QAAM,OAAO;AAAA,IACX,yBAAsB,OAAO,KAAK;AAAA,IAClC,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO,SAAS;AAAA,IAC3B,SAAS,OAAO,OAAO;AAAA,IACvB,WAAW,OAAO,OAAO;AAAA,IACzB,gBAAgB,OAAO,eAAe,SAAS,OAAO;AAAA,EACxD,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,58 @@
1
+ import type { ReflectionSliceItem } from "./reflection-slices.js";
2
+ export type ReflectionItemKind = "invariant" | "derived";
3
+ export interface ReflectionItemMetadata {
4
+ type: "memory-reflection-item";
5
+ reflectionVersion: 4;
6
+ stage: "reflect-store";
7
+ eventId: string;
8
+ itemKind: ReflectionItemKind;
9
+ section: "Invariants" | "Derived";
10
+ ordinal: number;
11
+ groupSize: number;
12
+ agentId: string;
13
+ sessionKey: string;
14
+ sessionId: string;
15
+ storedAt: number;
16
+ usedFallback: boolean;
17
+ errorSignals: string[];
18
+ decayModel: "logistic";
19
+ decayMidpointDays: number;
20
+ decayK: number;
21
+ baseWeight: number;
22
+ quality: number;
23
+ sourceReflectionPath?: string;
24
+ }
25
+ export interface ReflectionItemPayload {
26
+ kind: "item-invariant" | "item-derived";
27
+ text: string;
28
+ metadata: ReflectionItemMetadata;
29
+ }
30
+ export interface BuildReflectionItemPayloadsParams {
31
+ items: ReflectionSliceItem[];
32
+ eventId: string;
33
+ agentId: string;
34
+ sessionKey: string;
35
+ sessionId: string;
36
+ runAt: number;
37
+ usedFallback: boolean;
38
+ toolErrorSignals: Array<{
39
+ signatureHash: string;
40
+ }>;
41
+ sourceReflectionPath?: string;
42
+ }
43
+ export declare const REFLECTION_INVARIANT_DECAY_MIDPOINT_DAYS = 45;
44
+ export declare const REFLECTION_INVARIANT_DECAY_K = 0.22;
45
+ export declare const REFLECTION_INVARIANT_BASE_WEIGHT = 1.1;
46
+ export declare const REFLECTION_INVARIANT_QUALITY = 1;
47
+ export declare const REFLECTION_DERIVED_DECAY_MIDPOINT_DAYS = 7;
48
+ export declare const REFLECTION_DERIVED_DECAY_K = 0.65;
49
+ export declare const REFLECTION_DERIVED_BASE_WEIGHT = 1;
50
+ export declare const REFLECTION_DERIVED_QUALITY = 0.95;
51
+ export declare function getReflectionItemDecayDefaults(itemKind: ReflectionItemKind): {
52
+ midpointDays: number;
53
+ k: number;
54
+ baseWeight: number;
55
+ quality: number;
56
+ };
57
+ export declare function buildReflectionItemPayloads(params: BuildReflectionItemPayloadsParams): ReflectionItemPayload[];
58
+ //# sourceMappingURL=reflection-item-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection-item-store.d.ts","sourceRoot":"","sources":["../../src/reflection-item-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,iBAAiB,EAAE,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AACxD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,kBAAkB,GAAG;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAgBA;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iCAAiC,GAAG,qBAAqB,EAAE,CAgC9G"}