@steno-ai/engine 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/dist/adapters/storage.d.ts +29 -2
  2. package/dist/adapters/storage.d.ts.map +1 -1
  3. package/dist/config.d.ts +3 -3
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +9 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/extraction/index.d.ts +2 -0
  8. package/dist/extraction/index.d.ts.map +1 -1
  9. package/dist/extraction/index.js +2 -0
  10. package/dist/extraction/index.js.map +1 -1
  11. package/dist/extraction/pipeline.d.ts.map +1 -1
  12. package/dist/extraction/pipeline.js +48 -1
  13. package/dist/extraction/pipeline.js.map +1 -1
  14. package/dist/extraction/structured-cross-linker.d.ts +55 -0
  15. package/dist/extraction/structured-cross-linker.d.ts.map +1 -0
  16. package/dist/extraction/structured-cross-linker.js +195 -0
  17. package/dist/extraction/structured-cross-linker.js.map +1 -0
  18. package/dist/extraction/structured-extractor.d.ts +59 -0
  19. package/dist/extraction/structured-extractor.d.ts.map +1 -0
  20. package/dist/extraction/structured-extractor.js +389 -0
  21. package/dist/extraction/structured-extractor.js.map +1 -0
  22. package/dist/extraction/types.d.ts +3 -1
  23. package/dist/extraction/types.d.ts.map +1 -1
  24. package/dist/identity/index.d.ts +2 -0
  25. package/dist/identity/index.d.ts.map +1 -0
  26. package/dist/identity/index.js +2 -0
  27. package/dist/identity/index.js.map +1 -0
  28. package/dist/identity/resolver.d.ts +31 -0
  29. package/dist/identity/resolver.d.ts.map +1 -0
  30. package/dist/identity/resolver.js +122 -0
  31. package/dist/identity/resolver.js.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/models/edge.d.ts +6 -6
  37. package/dist/models/entity.d.ts +32 -0
  38. package/dist/models/entity.d.ts.map +1 -1
  39. package/dist/models/entity.js +11 -0
  40. package/dist/models/entity.js.map +1 -1
  41. package/dist/models/extraction.d.ts +6 -6
  42. package/dist/models/fact.d.ts +6 -6
  43. package/dist/retrieval/graph-traversal.d.ts +4 -1
  44. package/dist/retrieval/graph-traversal.d.ts.map +1 -1
  45. package/dist/retrieval/graph-traversal.js +6 -3
  46. package/dist/retrieval/graph-traversal.js.map +1 -1
  47. package/dist/retrieval/search.d.ts.map +1 -1
  48. package/dist/retrieval/search.js +56 -3
  49. package/dist/retrieval/search.js.map +1 -1
  50. package/dist/retrieval/types.d.ts +1 -0
  51. package/dist/retrieval/types.d.ts.map +1 -1
  52. package/dist/retrieval/types.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/adapters/storage.ts +35 -2
  55. package/src/config.ts +9 -0
  56. package/src/extraction/index.ts +2 -0
  57. package/src/extraction/pipeline.ts +63 -1
  58. package/src/extraction/structured-cross-linker.ts +259 -0
  59. package/src/extraction/structured-extractor.ts +463 -0
  60. package/src/extraction/types.ts +3 -1
  61. package/src/identity/index.ts +1 -0
  62. package/src/identity/resolver.ts +149 -0
  63. package/src/index.ts +1 -0
  64. package/src/models/entity.ts +13 -0
  65. package/src/retrieval/graph-traversal.ts +7 -4
  66. package/src/retrieval/search.ts +58 -3
  67. package/src/retrieval/types.ts +1 -0
  68. package/src/adapters/cache.d.ts +0 -9
  69. package/src/adapters/cache.d.ts.map +0 -1
  70. package/src/adapters/cache.js +0 -2
  71. package/src/adapters/cache.js.map +0 -1
  72. package/src/adapters/embedding.d.ts +0 -7
  73. package/src/adapters/embedding.d.ts.map +0 -1
  74. package/src/adapters/embedding.js +0 -2
  75. package/src/adapters/embedding.js.map +0 -1
  76. package/src/adapters/llm.d.ts +0 -19
  77. package/src/adapters/llm.d.ts.map +0 -1
  78. package/src/adapters/llm.js +0 -2
  79. package/src/adapters/llm.js.map +0 -1
  80. package/src/adapters/perplexity-embedding.d.ts +0 -24
  81. package/src/adapters/perplexity-embedding.d.ts.map +0 -1
  82. package/src/adapters/perplexity-embedding.js +0 -78
  83. package/src/adapters/perplexity-embedding.js.map +0 -1
  84. package/src/adapters/storage.d.ts +0 -173
  85. package/src/adapters/storage.d.ts.map +0 -1
  86. package/src/adapters/storage.js +0 -2
  87. package/src/adapters/storage.js.map +0 -1
  88. package/src/config.d.ts +0 -296
  89. package/src/config.d.ts.map +0 -1
  90. package/src/config.js +0 -92
  91. package/src/config.js.map +0 -1
  92. package/src/extraction/contradiction.d.ts +0 -15
  93. package/src/extraction/contradiction.d.ts.map +0 -1
  94. package/src/extraction/contradiction.js +0 -23
  95. package/src/extraction/contradiction.js.map +0 -1
  96. package/src/extraction/cross-linker.d.ts +0 -23
  97. package/src/extraction/cross-linker.d.ts.map +0 -1
  98. package/src/extraction/cross-linker.js +0 -146
  99. package/src/extraction/cross-linker.js.map +0 -1
  100. package/src/extraction/dedup.d.ts +0 -12
  101. package/src/extraction/dedup.d.ts.map +0 -1
  102. package/src/extraction/dedup.js +0 -93
  103. package/src/extraction/dedup.js.map +0 -1
  104. package/src/extraction/entity-extractor.d.ts +0 -30
  105. package/src/extraction/entity-extractor.d.ts.map +0 -1
  106. package/src/extraction/entity-extractor.js +0 -145
  107. package/src/extraction/entity-extractor.js.map +0 -1
  108. package/src/extraction/hasher.d.ts +0 -5
  109. package/src/extraction/hasher.d.ts.map +0 -1
  110. package/src/extraction/hasher.js +0 -8
  111. package/src/extraction/hasher.js.map +0 -1
  112. package/src/extraction/heuristic.d.ts +0 -3
  113. package/src/extraction/heuristic.d.ts.map +0 -1
  114. package/src/extraction/heuristic.js +0 -282
  115. package/src/extraction/heuristic.js.map +0 -1
  116. package/src/extraction/llm-extractor.d.ts +0 -23
  117. package/src/extraction/llm-extractor.d.ts.map +0 -1
  118. package/src/extraction/llm-extractor.js +0 -240
  119. package/src/extraction/llm-extractor.js.map +0 -1
  120. package/src/extraction/pipeline.d.ts +0 -30
  121. package/src/extraction/pipeline.d.ts.map +0 -1
  122. package/src/extraction/pipeline.js +0 -413
  123. package/src/extraction/pipeline.js.map +0 -1
  124. package/src/extraction/prompts.d.ts +0 -28
  125. package/src/extraction/prompts.d.ts.map +0 -1
  126. package/src/extraction/prompts.js +0 -205
  127. package/src/extraction/prompts.js.map +0 -1
  128. package/src/extraction/sliding-window.d.ts +0 -41
  129. package/src/extraction/sliding-window.d.ts.map +0 -1
  130. package/src/extraction/sliding-window.js +0 -84
  131. package/src/extraction/sliding-window.js.map +0 -1
  132. package/src/extraction/types.d.ts +0 -80
  133. package/src/extraction/types.d.ts.map +0 -1
  134. package/src/extraction/types.js +0 -2
  135. package/src/extraction/types.js.map +0 -1
  136. package/src/feedback/tracker.d.ts +0 -25
  137. package/src/feedback/tracker.d.ts.map +0 -1
  138. package/src/feedback/tracker.js +0 -90
  139. package/src/feedback/tracker.js.map +0 -1
  140. package/src/models/api-key.d.ts +0 -54
  141. package/src/models/api-key.d.ts.map +0 -1
  142. package/src/models/api-key.js +0 -21
  143. package/src/models/api-key.js.map +0 -1
  144. package/src/models/edge.d.ts +0 -78
  145. package/src/models/edge.d.ts.map +0 -1
  146. package/src/models/edge.js +0 -29
  147. package/src/models/edge.js.map +0 -1
  148. package/src/models/entity.d.ts +0 -60
  149. package/src/models/entity.d.ts.map +0 -1
  150. package/src/models/entity.js +0 -22
  151. package/src/models/entity.js.map +0 -1
  152. package/src/models/extraction.d.ts +0 -111
  153. package/src/models/extraction.d.ts.map +0 -1
  154. package/src/models/extraction.js +0 -40
  155. package/src/models/extraction.js.map +0 -1
  156. package/src/models/fact-entity.d.ts +0 -33
  157. package/src/models/fact-entity.d.ts.map +0 -1
  158. package/src/models/fact-entity.js +0 -14
  159. package/src/models/fact-entity.js.map +0 -1
  160. package/src/models/fact.d.ts +0 -191
  161. package/src/models/fact.d.ts.map +0 -1
  162. package/src/models/fact.js +0 -72
  163. package/src/models/fact.js.map +0 -1
  164. package/src/models/index.d.ts +0 -13
  165. package/src/models/index.d.ts.map +0 -1
  166. package/src/models/index.js +0 -13
  167. package/src/models/index.js.map +0 -1
  168. package/src/models/memory-access.d.ts +0 -89
  169. package/src/models/memory-access.d.ts.map +0 -1
  170. package/src/models/memory-access.js +0 -33
  171. package/src/models/memory-access.js.map +0 -1
  172. package/src/models/session.d.ts +0 -60
  173. package/src/models/session.d.ts.map +0 -1
  174. package/src/models/session.js +0 -23
  175. package/src/models/session.js.map +0 -1
  176. package/src/models/tenant.d.ts +0 -448
  177. package/src/models/tenant.d.ts.map +0 -1
  178. package/src/models/tenant.js +0 -23
  179. package/src/models/tenant.js.map +0 -1
  180. package/src/models/trigger.d.ts +0 -87
  181. package/src/models/trigger.d.ts.map +0 -1
  182. package/src/models/trigger.js +0 -41
  183. package/src/models/trigger.js.map +0 -1
  184. package/src/models/usage-record.d.ts +0 -37
  185. package/src/models/usage-record.d.ts.map +0 -1
  186. package/src/models/usage-record.js +0 -14
  187. package/src/models/usage-record.js.map +0 -1
  188. package/src/models/webhook.d.ts +0 -50
  189. package/src/models/webhook.d.ts.map +0 -1
  190. package/src/models/webhook.js +0 -25
  191. package/src/models/webhook.js.map +0 -1
  192. package/src/retrieval/compound-search.d.ts +0 -13
  193. package/src/retrieval/compound-search.d.ts.map +0 -1
  194. package/src/retrieval/compound-search.js +0 -87
  195. package/src/retrieval/compound-search.js.map +0 -1
  196. package/src/retrieval/contradiction-surfacer.d.ts +0 -18
  197. package/src/retrieval/contradiction-surfacer.d.ts.map +0 -1
  198. package/src/retrieval/contradiction-surfacer.js +0 -64
  199. package/src/retrieval/contradiction-surfacer.js.map +0 -1
  200. package/src/retrieval/embedding-cache.d.ts +0 -17
  201. package/src/retrieval/embedding-cache.d.ts.map +0 -1
  202. package/src/retrieval/embedding-cache.js +0 -56
  203. package/src/retrieval/embedding-cache.js.map +0 -1
  204. package/src/retrieval/fusion.d.ts +0 -27
  205. package/src/retrieval/fusion.d.ts.map +0 -1
  206. package/src/retrieval/fusion.js +0 -87
  207. package/src/retrieval/fusion.js.map +0 -1
  208. package/src/retrieval/graph-traversal.d.ts +0 -29
  209. package/src/retrieval/graph-traversal.d.ts.map +0 -1
  210. package/src/retrieval/graph-traversal.js +0 -208
  211. package/src/retrieval/graph-traversal.js.map +0 -1
  212. package/src/retrieval/query-expansion.d.ts +0 -20
  213. package/src/retrieval/query-expansion.d.ts.map +0 -1
  214. package/src/retrieval/query-expansion.js +0 -76
  215. package/src/retrieval/query-expansion.js.map +0 -1
  216. package/src/retrieval/reranker.d.ts +0 -15
  217. package/src/retrieval/reranker.d.ts.map +0 -1
  218. package/src/retrieval/reranker.js +0 -47
  219. package/src/retrieval/reranker.js.map +0 -1
  220. package/src/retrieval/salience-scorer.d.ts +0 -15
  221. package/src/retrieval/salience-scorer.d.ts.map +0 -1
  222. package/src/retrieval/salience-scorer.js +0 -41
  223. package/src/retrieval/salience-scorer.js.map +0 -1
  224. package/src/retrieval/search.d.ts +0 -21
  225. package/src/retrieval/search.d.ts.map +0 -1
  226. package/src/retrieval/search.js +0 -228
  227. package/src/retrieval/search.js.map +0 -1
  228. package/src/retrieval/temporal-scorer.d.ts +0 -18
  229. package/src/retrieval/temporal-scorer.d.ts.map +0 -1
  230. package/src/retrieval/temporal-scorer.js +0 -106
  231. package/src/retrieval/temporal-scorer.js.map +0 -1
  232. package/src/retrieval/trigger-matcher.d.ts +0 -18
  233. package/src/retrieval/trigger-matcher.d.ts.map +0 -1
  234. package/src/retrieval/trigger-matcher.js +0 -134
  235. package/src/retrieval/trigger-matcher.js.map +0 -1
  236. package/src/retrieval/types.d.ts +0 -70
  237. package/src/retrieval/types.d.ts.map +0 -1
  238. package/src/retrieval/types.js +0 -9
  239. package/src/retrieval/types.js.map +0 -1
  240. package/src/retrieval/vector-search.d.ts +0 -5
  241. package/src/retrieval/vector-search.d.ts.map +0 -1
  242. package/src/retrieval/vector-search.js +0 -24
  243. package/src/retrieval/vector-search.js.map +0 -1
  244. package/src/salience/decay.d.ts +0 -9
  245. package/src/salience/decay.d.ts.map +0 -1
  246. package/src/salience/decay.js +0 -15
  247. package/src/salience/decay.js.map +0 -1
  248. package/src/scratchpad/scratchpad.d.ts +0 -23
  249. package/src/scratchpad/scratchpad.d.ts.map +0 -1
  250. package/src/scratchpad/scratchpad.js +0 -137
  251. package/src/scratchpad/scratchpad.js.map +0 -1
  252. package/src/sessions/manager.d.ts +0 -11
  253. package/src/sessions/manager.d.ts.map +0 -1
  254. package/src/sessions/manager.js +0 -63
  255. package/src/sessions/manager.js.map +0 -1
@@ -1,5 +0,0 @@
1
- import type { StorageAdapter } from '../adapters/storage.js';
2
- import type { EmbeddingAdapter } from '../adapters/embedding.js';
3
- import type { Candidate } from './types.js';
4
- export declare function vectorSearch(storage: StorageAdapter, embedding: EmbeddingAdapter, query: string, tenantId: string, scope: string, scopeId: string, limit: number, asOf?: Date): Promise<Candidate[]>;
5
- //# sourceMappingURL=vector-search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["vector-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,IAAI,GACV,OAAO,CAAC,SAAS,EAAE,CAAC,CAwBtB"}
@@ -1,24 +0,0 @@
1
- export async function vectorSearch(storage, embedding, query, tenantId, scope, scopeId, limit, asOf) {
2
- const queryEmbedding = await embedding.embed(query);
3
- const results = await storage.vectorSearch({
4
- embedding: queryEmbedding,
5
- tenantId,
6
- scope,
7
- scopeId,
8
- limit,
9
- minSimilarity: 0.0,
10
- validOnly: true,
11
- asOf,
12
- });
13
- return results.map((r) => ({
14
- fact: r.fact,
15
- vectorScore: r.similarity,
16
- keywordScore: 0,
17
- graphScore: 0,
18
- recencyScore: 0,
19
- salienceScore: 0,
20
- temporalScore: 0,
21
- source: 'vector',
22
- }));
23
- }
24
- //# sourceMappingURL=vector-search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["vector-search.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,SAA2B,EAC3B,KAAa,EACb,QAAgB,EAChB,KAAa,EACb,OAAe,EACf,KAAa,EACb,IAAW;IAEX,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;QACzC,SAAS,EAAE,cAAc;QACzB,QAAQ;QACR,KAAK;QACL,OAAO;QACP,KAAK;QACL,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,IAAI;QACf,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,UAAU;QACzB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,QAAiB;KAC1B,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1,9 +0,0 @@
1
- export interface DecayInput {
2
- importance: number;
3
- frequency: number;
4
- lastAccessed: Date | null;
5
- halfLifeDays: number;
6
- normalizationK: number;
7
- }
8
- export declare function calculateDecayScore(input: DecayInput): number;
9
- //# sourceMappingURL=decay.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decay.d.ts","sourceRoot":"","sources":["decay.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgB7D"}
@@ -1,15 +0,0 @@
1
- export function calculateDecayScore(input) {
2
- const { importance, frequency, lastAccessed, halfLifeDays, normalizationK } = input;
3
- if (lastAccessed === null)
4
- return 0;
5
- // Recency factor: exponential decay using Ebbinghaus forgetting curve
6
- const daysSinceAccess = (Date.now() - lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
7
- const lambda = Math.LN2 / halfLifeDays;
8
- const recencyFactor = Math.exp(-lambda * daysSinceAccess);
9
- // Frequency factor: logarithmic scaling with fixed normalization constant K
10
- const frequencyFactor = Math.min(1.0, Math.log(1 + frequency) / Math.log(1 + normalizationK));
11
- // Final score: clamped to [0, 1]
12
- const score = importance * recencyFactor * frequencyFactor;
13
- return Math.max(0, Math.min(1, score));
14
- }
15
- //# sourceMappingURL=decay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decay.js","sourceRoot":"","sources":["decay.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEpF,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpC,sEAAsE;IACtE,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IAE1D,4EAA4E;IAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAE9F,iCAAiC;IACjC,MAAM,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,eAAe,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -1,23 +0,0 @@
1
- import type { StorageAdapter } from '../adapters/storage.js';
2
- import type { LLMAdapter } from '../adapters/llm.js';
3
- import type { Scope } from '../config.js';
4
- /**
5
- * Get or create a scratchpad for a scope.
6
- * The scratchpad is stored as a special fact with tag 'scratchpad'.
7
- */
8
- export declare function getScratchpad(storage: StorageAdapter, tenantId: string, scope: Scope, scopeId: string): Promise<string>;
9
- /**
10
- * Update the scratchpad after an extraction.
11
- * Appends new facts to the existing scratchpad, compresses if too long.
12
- */
13
- export declare function updateScratchpad(storage: StorageAdapter, llm: LLMAdapter, tenantId: string, scope: Scope, scopeId: string, newFacts: string[]): Promise<void>;
14
- /**
15
- * Compress the scratchpad using an LLM.
16
- * Preserves the most important information while reducing size.
17
- */
18
- export declare function compressScratchpad(llm: LLMAdapter, content: string): Promise<string>;
19
- /**
20
- * Get filtered scratchpad content relevant to a query.
21
- */
22
- export declare function getRelevantScratchpad(storage: StorageAdapter, llm: LLMAdapter, tenantId: string, scope: Scope, scopeId: string, query: string): Promise<string>;
23
- //# sourceMappingURL=scratchpad.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scratchpad.d.ts","sourceRoot":"","sources":["scratchpad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAK1C;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,CAiDf;AA0BD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB1F;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
@@ -1,137 +0,0 @@
1
- const SCRATCHPAD_MAX_CHARS = 5000;
2
- const SCRATCHPAD_COMPRESSED_CHARS = 2500;
3
- /**
4
- * Get or create a scratchpad for a scope.
5
- * The scratchpad is stored as a special fact with tag 'scratchpad'.
6
- */
7
- export async function getScratchpad(storage, tenantId, scope, scopeId) {
8
- const facts = await storage.getFactsByScope(tenantId, scope, scopeId, { limit: 100 });
9
- const scratchpadFact = facts.data.find(f => f.tags?.includes('scratchpad'));
10
- return scratchpadFact?.content ?? '';
11
- }
12
- /**
13
- * Update the scratchpad after an extraction.
14
- * Appends new facts to the existing scratchpad, compresses if too long.
15
- */
16
- export async function updateScratchpad(storage, llm, tenantId, scope, scopeId, newFacts) {
17
- if (newFacts.length === 0)
18
- return;
19
- // Get existing scratchpad
20
- const existing = await getScratchpad(storage, tenantId, scope, scopeId);
21
- // Merge new facts into existing profile
22
- const newSection = newFacts.join('\n');
23
- let updated;
24
- if (!existing) {
25
- // First scratchpad — just use the new facts
26
- updated = newSection;
27
- }
28
- else if (existing.length + newSection.length < SCRATCHPAD_MAX_CHARS) {
29
- // Under limit — merge via LLM to keep it clean (not just append)
30
- updated = await mergeScratchpad(llm, existing, newSection);
31
- }
32
- else {
33
- // Over limit — compress everything together
34
- updated = await compressScratchpad(llm, `${existing}\n\nNew facts to integrate:\n${newSection}`);
35
- }
36
- // Find existing scratchpad fact and invalidate it
37
- const facts = await storage.getFactsByScope(tenantId, scope, scopeId, { limit: 200 });
38
- const existingScratchpad = facts.data.find(f => f.tags?.includes('scratchpad'));
39
- if (existingScratchpad) {
40
- await storage.invalidateFact(tenantId, existingScratchpad.id);
41
- }
42
- // Create new scratchpad fact (no embedding needed — it's retrieved by tag, not vector search)
43
- const id = crypto.randomUUID();
44
- await storage.createFact({
45
- id,
46
- lineageId: existingScratchpad?.lineageId ?? crypto.randomUUID(),
47
- tenantId,
48
- scope,
49
- scopeId,
50
- content: updated,
51
- embeddingModel: 'none',
52
- embeddingDim: 1,
53
- importance: 1.0,
54
- confidence: 1.0,
55
- operation: existingScratchpad ? 'update' : 'create',
56
- sourceType: 'api',
57
- modality: 'text',
58
- tags: ['scratchpad'],
59
- metadata: { type: 'scratchpad', updatedAt: new Date().toISOString() },
60
- contradictionStatus: 'none',
61
- });
62
- }
63
- /**
64
- * Merge new facts into an existing scratchpad profile.
65
- * Integrates new information cleanly without duplicating.
66
- */
67
- async function mergeScratchpad(llm, existing, newFacts) {
68
- const response = await llm.complete([
69
- {
70
- role: 'system',
71
- content: `You maintain a structured user profile. Merge the new facts into the existing profile.
72
-
73
- Rules:
74
- - If a new fact UPDATES an existing one, replace the old version (e.g., "favorite color is now green" replaces "favorite color is blue")
75
- - If a new fact is already covered, skip it (no duplicates)
76
- - If a new fact is genuinely new, add it to the appropriate section
77
- - Keep the profile organized by category (identity, preferences, people, goals, events, etc.)
78
- - Keep it concise — under ${SCRATCHPAD_MAX_CHARS} characters
79
- - Output ONLY the merged profile, no explanation`
80
- },
81
- { role: 'user', content: `EXISTING PROFILE:\n${existing}\n\nNEW FACTS TO MERGE:\n${newFacts}` }
82
- ], { temperature: 0 });
83
- return response.content;
84
- }
85
- /**
86
- * Compress the scratchpad using an LLM.
87
- * Preserves the most important information while reducing size.
88
- */
89
- export async function compressScratchpad(llm, content) {
90
- const response = await llm.complete([
91
- {
92
- role: 'system',
93
- content: `Compress the following user profile/scratchpad into a concise summary of ~${SCRATCHPAD_COMPRESSED_CHARS} characters.
94
-
95
- Preserve:
96
- - Names of people and their relationships
97
- - Key facts (job, location, health, allergies)
98
- - Strong preferences and personality traits
99
- - Important events with dates
100
- - Goals and future plans
101
- - Contradictions or changes in opinion
102
-
103
- Remove:
104
- - Duplicate information
105
- - Trivial details
106
- - Repetitive emotional expressions
107
-
108
- Output ONLY the compressed summary, no explanation.`
109
- },
110
- { role: 'user', content }
111
- ], { temperature: 0 });
112
- return response.content;
113
- }
114
- /**
115
- * Get filtered scratchpad content relevant to a query.
116
- */
117
- export async function getRelevantScratchpad(storage, llm, tenantId, scope, scopeId, query) {
118
- const scratchpad = await getScratchpad(storage, tenantId, scope, scopeId);
119
- if (!scratchpad || scratchpad.length < 50)
120
- return '';
121
- // If scratchpad is short, return all of it
122
- if (scratchpad.length < 1000)
123
- return scratchpad;
124
- // Filter scratchpad for relevant content
125
- const response = await llm.complete([
126
- {
127
- role: 'system',
128
- content: 'Extract ONLY the parts of this user profile that are relevant to answering the given question. Return the relevant excerpts. If nothing is relevant, return empty string.'
129
- },
130
- {
131
- role: 'user',
132
- content: `Profile:\n${scratchpad}\n\nQuestion: ${query}`
133
- }
134
- ], { temperature: 0 });
135
- return response.content;
136
- }
137
- //# sourceMappingURL=scratchpad.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scratchpad.js","sourceRoot":"","sources":["scratchpad.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { StorageAdapter } from '../adapters/storage.js';
2
- import type { LLMAdapter } from '../adapters/llm.js';
3
- import type { Session } from '../models/session.js';
4
- import type { SessionScope } from '../config.js';
5
- /**
6
- * Find an active (not ended) session for the given scope, or create a new one.
7
- */
8
- export declare function getOrCreateActiveSession(storage: StorageAdapter, tenantId: string, scope: SessionScope, scopeId: string): Promise<Session>;
9
- export declare function startSession(storage: StorageAdapter, tenantId: string, scope: SessionScope, scopeId: string, metadata?: Record<string, unknown>): Promise<Session>;
10
- export declare function endSession(storage: StorageAdapter, llm: LLMAdapter, tenantId: string, sessionId: string): Promise<Session>;
11
- //# sourceMappingURL=manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
@@ -1,63 +0,0 @@
1
- /**
2
- * Find an active (not ended) session for the given scope, or create a new one.
3
- */
4
- export async function getOrCreateActiveSession(storage, tenantId, scope, scopeId) {
5
- // Fetch a few recent sessions — the active one (if any) is likely the most recent,
6
- // but we check a small batch in case the latest was already ended.
7
- const sessions = await storage.getSessionsByScope(tenantId, scope, scopeId, { limit: 5 });
8
- const active = sessions.data.find(s => !s.endedAt);
9
- if (active)
10
- return active;
11
- return startSession(storage, tenantId, scope, scopeId);
12
- }
13
- export async function startSession(storage, tenantId, scope, scopeId, metadata) {
14
- const id = crypto.randomUUID();
15
- return storage.createSession({
16
- id,
17
- tenantId,
18
- scope,
19
- scopeId,
20
- metadata: metadata ?? {},
21
- });
22
- }
23
- export async function endSession(storage, llm, tenantId, sessionId) {
24
- // 1. Get session
25
- const session = await storage.getSession(tenantId, sessionId);
26
- if (!session)
27
- throw new Error(`Session ${sessionId} not found`);
28
- if (session.endedAt)
29
- throw new Error(`Session ${sessionId} already ended`);
30
- // 2. Get facts created during this session
31
- const facts = await storage.getFactsByScope(tenantId, session.scope, session.scopeId, { limit: 100 });
32
- const sessionFacts = facts.data.filter(f => f.sessionId === sessionId);
33
- // 3. Generate summary if there are facts
34
- let summary;
35
- let topics;
36
- if (sessionFacts.length > 0) {
37
- const factContents = sessionFacts.map(f => f.content).join('\n');
38
- const response = await llm.complete([
39
- {
40
- role: 'system',
41
- content: 'Summarize the following facts from a conversation session in 2-3 sentences. Also extract the main topics (as a JSON array of strings). Return JSON: {"summary": "...", "topics": ["..."]}',
42
- },
43
- {
44
- role: 'user',
45
- content: factContents,
46
- },
47
- ], { temperature: 0, responseFormat: 'json' });
48
- try {
49
- const parsed = JSON.parse(response.content);
50
- summary = typeof parsed.summary === 'string' ? parsed.summary : undefined;
51
- topics = Array.isArray(parsed.topics)
52
- ? parsed.topics.filter((t) => typeof t === 'string')
53
- : undefined;
54
- }
55
- catch {
56
- // If JSON parse fails, use raw content as summary
57
- summary = response.content;
58
- }
59
- }
60
- // 4. End the session
61
- return storage.endSession(tenantId, sessionId, summary, topics);
62
- }
63
- //# sourceMappingURL=manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["manager.ts"],"names":[],"mappings":"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"}