@steno-ai/engine 0.1.15 → 0.1.16
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.
- package/dist/adapters/storage.d.ts +29 -2
- package/dist/adapters/storage.d.ts.map +1 -1
- package/dist/extraction/pipeline.d.ts.map +1 -1
- package/dist/extraction/pipeline.js +23 -0
- package/dist/extraction/pipeline.js.map +1 -1
- package/dist/extraction/types.d.ts +2 -0
- package/dist/extraction/types.d.ts.map +1 -1
- package/dist/identity/index.d.ts +2 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +2 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/resolver.d.ts +31 -0
- package/dist/identity/resolver.d.ts.map +1 -0
- package/dist/identity/resolver.js +122 -0
- package/dist/identity/resolver.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/entity.d.ts +32 -0
- package/dist/models/entity.d.ts.map +1 -1
- package/dist/models/entity.js +11 -0
- package/dist/models/entity.js.map +1 -1
- package/dist/retrieval/graph-traversal.d.ts +4 -1
- package/dist/retrieval/graph-traversal.d.ts.map +1 -1
- package/dist/retrieval/graph-traversal.js +6 -3
- package/dist/retrieval/graph-traversal.js.map +1 -1
- package/dist/retrieval/search.d.ts.map +1 -1
- package/dist/retrieval/search.js +56 -3
- package/dist/retrieval/search.js.map +1 -1
- package/dist/retrieval/types.d.ts +1 -0
- package/dist/retrieval/types.d.ts.map +1 -1
- package/dist/retrieval/types.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/storage.ts +35 -2
- package/src/extraction/pipeline.ts +34 -0
- package/src/extraction/types.ts +2 -0
- package/src/identity/index.ts +1 -0
- package/src/identity/resolver.ts +149 -0
- package/src/index.ts +1 -0
- package/src/models/entity.ts +13 -0
- package/src/retrieval/graph-traversal.ts +7 -4
- package/src/retrieval/search.ts +58 -3
- package/src/retrieval/types.ts +1 -0
- package/src/adapters/cache.d.ts +0 -9
- package/src/adapters/cache.d.ts.map +0 -1
- package/src/adapters/cache.js +0 -2
- package/src/adapters/cache.js.map +0 -1
- package/src/adapters/embedding.d.ts +0 -7
- package/src/adapters/embedding.d.ts.map +0 -1
- package/src/adapters/embedding.js +0 -2
- package/src/adapters/embedding.js.map +0 -1
- package/src/adapters/llm.d.ts +0 -19
- package/src/adapters/llm.d.ts.map +0 -1
- package/src/adapters/llm.js +0 -2
- package/src/adapters/llm.js.map +0 -1
- package/src/adapters/perplexity-embedding.d.ts +0 -24
- package/src/adapters/perplexity-embedding.d.ts.map +0 -1
- package/src/adapters/perplexity-embedding.js +0 -78
- package/src/adapters/perplexity-embedding.js.map +0 -1
- package/src/adapters/storage.d.ts +0 -173
- package/src/adapters/storage.d.ts.map +0 -1
- package/src/adapters/storage.js +0 -2
- package/src/adapters/storage.js.map +0 -1
- package/src/config.d.ts +0 -296
- package/src/config.d.ts.map +0 -1
- package/src/config.js +0 -92
- package/src/config.js.map +0 -1
- package/src/extraction/contradiction.d.ts +0 -15
- package/src/extraction/contradiction.d.ts.map +0 -1
- package/src/extraction/contradiction.js +0 -23
- package/src/extraction/contradiction.js.map +0 -1
- package/src/extraction/cross-linker.d.ts +0 -23
- package/src/extraction/cross-linker.d.ts.map +0 -1
- package/src/extraction/cross-linker.js +0 -146
- package/src/extraction/cross-linker.js.map +0 -1
- package/src/extraction/dedup.d.ts +0 -12
- package/src/extraction/dedup.d.ts.map +0 -1
- package/src/extraction/dedup.js +0 -93
- package/src/extraction/dedup.js.map +0 -1
- package/src/extraction/entity-extractor.d.ts +0 -30
- package/src/extraction/entity-extractor.d.ts.map +0 -1
- package/src/extraction/entity-extractor.js +0 -145
- package/src/extraction/entity-extractor.js.map +0 -1
- package/src/extraction/hasher.d.ts +0 -5
- package/src/extraction/hasher.d.ts.map +0 -1
- package/src/extraction/hasher.js +0 -8
- package/src/extraction/hasher.js.map +0 -1
- package/src/extraction/heuristic.d.ts +0 -3
- package/src/extraction/heuristic.d.ts.map +0 -1
- package/src/extraction/heuristic.js +0 -282
- package/src/extraction/heuristic.js.map +0 -1
- package/src/extraction/llm-extractor.d.ts +0 -23
- package/src/extraction/llm-extractor.d.ts.map +0 -1
- package/src/extraction/llm-extractor.js +0 -240
- package/src/extraction/llm-extractor.js.map +0 -1
- package/src/extraction/pipeline.d.ts +0 -30
- package/src/extraction/pipeline.d.ts.map +0 -1
- package/src/extraction/pipeline.js +0 -413
- package/src/extraction/pipeline.js.map +0 -1
- package/src/extraction/prompts.d.ts +0 -28
- package/src/extraction/prompts.d.ts.map +0 -1
- package/src/extraction/prompts.js +0 -205
- package/src/extraction/prompts.js.map +0 -1
- package/src/extraction/sliding-window.d.ts +0 -41
- package/src/extraction/sliding-window.d.ts.map +0 -1
- package/src/extraction/sliding-window.js +0 -84
- package/src/extraction/sliding-window.js.map +0 -1
- package/src/extraction/types.d.ts +0 -80
- package/src/extraction/types.d.ts.map +0 -1
- package/src/extraction/types.js +0 -2
- package/src/extraction/types.js.map +0 -1
- package/src/feedback/tracker.d.ts +0 -25
- package/src/feedback/tracker.d.ts.map +0 -1
- package/src/feedback/tracker.js +0 -90
- package/src/feedback/tracker.js.map +0 -1
- package/src/models/api-key.d.ts +0 -54
- package/src/models/api-key.d.ts.map +0 -1
- package/src/models/api-key.js +0 -21
- package/src/models/api-key.js.map +0 -1
- package/src/models/edge.d.ts +0 -78
- package/src/models/edge.d.ts.map +0 -1
- package/src/models/edge.js +0 -29
- package/src/models/edge.js.map +0 -1
- package/src/models/entity.d.ts +0 -60
- package/src/models/entity.d.ts.map +0 -1
- package/src/models/entity.js +0 -22
- package/src/models/entity.js.map +0 -1
- package/src/models/extraction.d.ts +0 -111
- package/src/models/extraction.d.ts.map +0 -1
- package/src/models/extraction.js +0 -40
- package/src/models/extraction.js.map +0 -1
- package/src/models/fact-entity.d.ts +0 -33
- package/src/models/fact-entity.d.ts.map +0 -1
- package/src/models/fact-entity.js +0 -14
- package/src/models/fact-entity.js.map +0 -1
- package/src/models/fact.d.ts +0 -191
- package/src/models/fact.d.ts.map +0 -1
- package/src/models/fact.js +0 -72
- package/src/models/fact.js.map +0 -1
- package/src/models/index.d.ts +0 -13
- package/src/models/index.d.ts.map +0 -1
- package/src/models/index.js +0 -13
- package/src/models/index.js.map +0 -1
- package/src/models/memory-access.d.ts +0 -89
- package/src/models/memory-access.d.ts.map +0 -1
- package/src/models/memory-access.js +0 -33
- package/src/models/memory-access.js.map +0 -1
- package/src/models/session.d.ts +0 -60
- package/src/models/session.d.ts.map +0 -1
- package/src/models/session.js +0 -23
- package/src/models/session.js.map +0 -1
- package/src/models/tenant.d.ts +0 -448
- package/src/models/tenant.d.ts.map +0 -1
- package/src/models/tenant.js +0 -23
- package/src/models/tenant.js.map +0 -1
- package/src/models/trigger.d.ts +0 -87
- package/src/models/trigger.d.ts.map +0 -1
- package/src/models/trigger.js +0 -41
- package/src/models/trigger.js.map +0 -1
- package/src/models/usage-record.d.ts +0 -37
- package/src/models/usage-record.d.ts.map +0 -1
- package/src/models/usage-record.js +0 -14
- package/src/models/usage-record.js.map +0 -1
- package/src/models/webhook.d.ts +0 -50
- package/src/models/webhook.d.ts.map +0 -1
- package/src/models/webhook.js +0 -25
- package/src/models/webhook.js.map +0 -1
- package/src/retrieval/compound-search.d.ts +0 -13
- package/src/retrieval/compound-search.d.ts.map +0 -1
- package/src/retrieval/compound-search.js +0 -87
- package/src/retrieval/compound-search.js.map +0 -1
- package/src/retrieval/contradiction-surfacer.d.ts +0 -18
- package/src/retrieval/contradiction-surfacer.d.ts.map +0 -1
- package/src/retrieval/contradiction-surfacer.js +0 -64
- package/src/retrieval/contradiction-surfacer.js.map +0 -1
- package/src/retrieval/embedding-cache.d.ts +0 -17
- package/src/retrieval/embedding-cache.d.ts.map +0 -1
- package/src/retrieval/embedding-cache.js +0 -56
- package/src/retrieval/embedding-cache.js.map +0 -1
- package/src/retrieval/fusion.d.ts +0 -27
- package/src/retrieval/fusion.d.ts.map +0 -1
- package/src/retrieval/fusion.js +0 -87
- package/src/retrieval/fusion.js.map +0 -1
- package/src/retrieval/graph-traversal.d.ts +0 -29
- package/src/retrieval/graph-traversal.d.ts.map +0 -1
- package/src/retrieval/graph-traversal.js +0 -208
- package/src/retrieval/graph-traversal.js.map +0 -1
- package/src/retrieval/query-expansion.d.ts +0 -20
- package/src/retrieval/query-expansion.d.ts.map +0 -1
- package/src/retrieval/query-expansion.js +0 -76
- package/src/retrieval/query-expansion.js.map +0 -1
- package/src/retrieval/reranker.d.ts +0 -15
- package/src/retrieval/reranker.d.ts.map +0 -1
- package/src/retrieval/reranker.js +0 -47
- package/src/retrieval/reranker.js.map +0 -1
- package/src/retrieval/salience-scorer.d.ts +0 -15
- package/src/retrieval/salience-scorer.d.ts.map +0 -1
- package/src/retrieval/salience-scorer.js +0 -41
- package/src/retrieval/salience-scorer.js.map +0 -1
- package/src/retrieval/search.d.ts +0 -21
- package/src/retrieval/search.d.ts.map +0 -1
- package/src/retrieval/search.js +0 -228
- package/src/retrieval/search.js.map +0 -1
- package/src/retrieval/temporal-scorer.d.ts +0 -18
- package/src/retrieval/temporal-scorer.d.ts.map +0 -1
- package/src/retrieval/temporal-scorer.js +0 -106
- package/src/retrieval/temporal-scorer.js.map +0 -1
- package/src/retrieval/trigger-matcher.d.ts +0 -18
- package/src/retrieval/trigger-matcher.d.ts.map +0 -1
- package/src/retrieval/trigger-matcher.js +0 -134
- package/src/retrieval/trigger-matcher.js.map +0 -1
- package/src/retrieval/types.d.ts +0 -70
- package/src/retrieval/types.d.ts.map +0 -1
- package/src/retrieval/types.js +0 -9
- package/src/retrieval/types.js.map +0 -1
- package/src/retrieval/vector-search.d.ts +0 -5
- package/src/retrieval/vector-search.d.ts.map +0 -1
- package/src/retrieval/vector-search.js +0 -24
- package/src/retrieval/vector-search.js.map +0 -1
- package/src/salience/decay.d.ts +0 -9
- package/src/salience/decay.d.ts.map +0 -1
- package/src/salience/decay.js +0 -15
- package/src/salience/decay.js.map +0 -1
- package/src/scratchpad/scratchpad.d.ts +0 -23
- package/src/scratchpad/scratchpad.d.ts.map +0 -1
- package/src/scratchpad/scratchpad.js +0 -137
- package/src/scratchpad/scratchpad.js.map +0 -1
- package/src/sessions/manager.d.ts +0 -11
- package/src/sessions/manager.d.ts.map +0 -1
- package/src/sessions/manager.js +0 -63
- 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"}
|
package/src/salience/decay.d.ts
DELETED
|
@@ -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"}
|
package/src/salience/decay.js
DELETED
|
@@ -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"}
|
package/src/sessions/manager.js
DELETED
|
@@ -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":"AAKA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAuB,EACvB,QAAgB,EAChB,KAAmB,EACnB,OAAe;IAEf,mFAAmF;IACnF,mEAAmE;IACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,QAAgB,EAChB,KAAmB,EACnB,OAAe,EACf,QAAkC;IAElC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,OAAO,OAAO,CAAC,aAAa,CAAC;QAC3B,EAAE;QACF,QAAQ;QACR,KAAK;QACL,OAAO;QACP,QAAQ,EAAE,QAAQ,IAAI,EAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAuB,EACvB,GAAe,EACf,QAAgB,EAChB,SAAiB;IAEjB,iBAAiB;IACjB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,gBAAgB,CAAC,CAAC;IAE3E,2CAA2C;IAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACtG,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAEvE,yCAAyC;IACzC,IAAI,OAA2B,CAAC;IAChC,IAAI,MAA4B,CAAC;IAEjC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YAClC;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2LAA2L;aACrM;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,YAAY;aACtB;SACF,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBAC1E,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;YAClD,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAClE,CAAC"}
|