@molroo-io/sdk 0.6.2 → 0.7.1
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/README.md +100 -194
- package/dist/cjs/api-client.d.ts +2 -12
- package/dist/cjs/api-client.d.ts.map +1 -1
- package/dist/cjs/api-client.js +4 -42
- package/dist/cjs/errors.d.ts +1 -16
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +2 -18
- package/dist/cjs/events/types.d.ts +14 -21
- package/dist/cjs/events/types.d.ts.map +1 -1
- package/dist/cjs/events/types.js +0 -11
- package/dist/cjs/index.d.ts +26 -48
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +29 -52
- package/dist/cjs/llm/resolve.d.ts +4 -22
- package/dist/cjs/llm/resolve.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.js +19 -7
- package/dist/cjs/llm/vercel-ai/adapter.d.ts +4 -10
- package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -1
- package/dist/cjs/llm/vercel-ai/adapter.js +6 -152
- package/dist/cjs/llm/vercel-ai/config.d.ts +8 -5
- package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -1
- package/dist/cjs/memory/in-memory.d.ts +14 -37
- package/dist/cjs/memory/in-memory.d.ts.map +1 -1
- package/dist/cjs/memory/in-memory.js +22 -85
- package/dist/cjs/memory/recall.d.ts +10 -21
- package/dist/cjs/memory/recall.d.ts.map +1 -1
- package/dist/cjs/memory/recall.js +12 -91
- package/dist/cjs/memory/types.d.ts +46 -186
- package/dist/cjs/memory/types.d.ts.map +1 -1
- package/dist/cjs/memory/types.js +0 -10
- package/dist/cjs/persona/chat-orchestrator.d.ts +46 -0
- package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -0
- package/dist/cjs/persona/chat-orchestrator.js +240 -0
- package/dist/cjs/persona/event-emitter.d.ts +7 -0
- package/dist/cjs/persona/event-emitter.d.ts.map +1 -0
- package/dist/cjs/persona/event-emitter.js +53 -0
- package/dist/cjs/persona/memory-pipeline.d.ts +26 -0
- package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -0
- package/dist/cjs/persona/memory-pipeline.js +69 -0
- package/dist/cjs/persona.d.ts +56 -187
- package/dist/cjs/persona.d.ts.map +1 -1
- package/dist/cjs/persona.js +62 -638
- package/dist/cjs/shared/appraisal.d.ts +26 -0
- package/dist/cjs/shared/appraisal.d.ts.map +1 -0
- package/dist/cjs/shared/appraisal.js +45 -0
- package/dist/cjs/shared/client-factory.d.ts +23 -0
- package/dist/cjs/shared/client-factory.d.ts.map +1 -0
- package/dist/cjs/shared/client-factory.js +48 -0
- package/dist/cjs/shared/errors.d.ts +21 -0
- package/dist/cjs/shared/errors.d.ts.map +1 -0
- package/dist/cjs/shared/errors.js +29 -0
- package/dist/cjs/world/client.d.ts +2 -9
- package/dist/cjs/world/client.d.ts.map +1 -1
- package/dist/cjs/world/client.js +7 -34
- package/dist/cjs/world/errors.d.ts +1 -8
- package/dist/cjs/world/errors.d.ts.map +1 -1
- package/dist/cjs/world/errors.js +2 -12
- package/dist/cjs/world/index.d.ts +2 -2
- package/dist/cjs/world/index.d.ts.map +1 -1
- package/dist/cjs/world/types.d.ts +32 -5
- package/dist/cjs/world/types.d.ts.map +1 -1
- package/dist/cjs/world/world-domain.d.ts.map +1 -1
- package/dist/cjs/world/world-domain.js +4 -32
- package/dist/cjs/world/world-persona.d.ts +17 -12
- package/dist/cjs/world/world-persona.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.js +6 -18
- package/dist/cjs/world/world.d.ts +28 -5
- package/dist/cjs/world/world.d.ts.map +1 -1
- package/dist/cjs/world/world.js +13 -11
- package/dist/esm/api-client.d.ts +2 -12
- package/dist/esm/api-client.d.ts.map +1 -1
- package/dist/esm/api-client.js +3 -38
- package/dist/esm/errors.d.ts +1 -16
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +1 -17
- package/dist/esm/events/types.d.ts +14 -21
- package/dist/esm/events/types.d.ts.map +1 -1
- package/dist/esm/events/types.js +0 -11
- package/dist/esm/index.d.ts +26 -48
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +25 -38
- package/dist/esm/llm/resolve.d.ts +4 -22
- package/dist/esm/llm/resolve.d.ts.map +1 -1
- package/dist/esm/llm/resolve.js +20 -8
- package/dist/esm/llm/vercel-ai/adapter.d.ts +4 -10
- package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -1
- package/dist/esm/llm/vercel-ai/adapter.js +6 -119
- package/dist/esm/llm/vercel-ai/config.d.ts +8 -5
- package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -1
- package/dist/esm/memory/in-memory.d.ts +14 -37
- package/dist/esm/memory/in-memory.d.ts.map +1 -1
- package/dist/esm/memory/in-memory.js +20 -83
- package/dist/esm/memory/recall.d.ts +10 -21
- package/dist/esm/memory/recall.d.ts.map +1 -1
- package/dist/esm/memory/recall.js +12 -91
- package/dist/esm/memory/types.d.ts +46 -186
- package/dist/esm/memory/types.d.ts.map +1 -1
- package/dist/esm/memory/types.js +1 -9
- package/dist/esm/persona/chat-orchestrator.d.ts +46 -0
- package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -0
- package/dist/esm/persona/chat-orchestrator.js +204 -0
- package/dist/esm/persona/event-emitter.d.ts +7 -0
- package/dist/esm/persona/event-emitter.d.ts.map +1 -0
- package/dist/esm/persona/event-emitter.js +50 -0
- package/dist/esm/persona/memory-pipeline.d.ts +26 -0
- package/dist/esm/persona/memory-pipeline.d.ts.map +1 -0
- package/dist/esm/persona/memory-pipeline.js +65 -0
- package/dist/esm/persona.d.ts +56 -187
- package/dist/esm/persona.d.ts.map +1 -1
- package/dist/esm/persona.js +62 -638
- package/dist/esm/shared/appraisal.d.ts +26 -0
- package/dist/esm/shared/appraisal.d.ts.map +1 -0
- package/dist/esm/shared/appraisal.js +40 -0
- package/dist/esm/shared/client-factory.d.ts +23 -0
- package/dist/esm/shared/client-factory.d.ts.map +1 -0
- package/dist/esm/shared/client-factory.js +41 -0
- package/dist/esm/shared/errors.d.ts +21 -0
- package/dist/esm/shared/errors.d.ts.map +1 -0
- package/dist/esm/shared/errors.js +24 -0
- package/dist/esm/world/client.d.ts +2 -9
- package/dist/esm/world/client.d.ts.map +1 -1
- package/dist/esm/world/client.js +6 -30
- package/dist/esm/world/errors.d.ts +1 -8
- package/dist/esm/world/errors.d.ts.map +1 -1
- package/dist/esm/world/errors.js +1 -11
- package/dist/esm/world/index.d.ts +2 -2
- package/dist/esm/world/index.d.ts.map +1 -1
- package/dist/esm/world/types.d.ts +32 -5
- package/dist/esm/world/types.d.ts.map +1 -1
- package/dist/esm/world/world-domain.d.ts.map +1 -1
- package/dist/esm/world/world-domain.js +4 -32
- package/dist/esm/world/world-persona.d.ts +17 -12
- package/dist/esm/world/world-persona.d.ts.map +1 -1
- package/dist/esm/world/world-persona.js +6 -18
- package/dist/esm/world/world.d.ts +28 -5
- package/dist/esm/world/world.d.ts.map +1 -1
- package/dist/esm/world/world.js +13 -11
- package/package.json +4 -101
- package/dist/cjs/embedding/cloudflare.d.ts +0 -15
- package/dist/cjs/embedding/cloudflare.d.ts.map +0 -1
- package/dist/cjs/embedding/cloudflare.js +0 -16
- package/dist/cjs/embedding/cohere.d.ts +0 -8
- package/dist/cjs/embedding/cohere.d.ts.map +0 -1
- package/dist/cjs/embedding/cohere.js +0 -31
- package/dist/cjs/embedding/index.d.ts +0 -9
- package/dist/cjs/embedding/index.d.ts.map +0 -1
- package/dist/cjs/embedding/index.js +0 -11
- package/dist/cjs/embedding/local.d.ts +0 -6
- package/dist/cjs/embedding/local.d.ts.map +0 -1
- package/dist/cjs/embedding/local.js +0 -28
- package/dist/cjs/embedding/openai.d.ts +0 -9
- package/dist/cjs/embedding/openai.d.ts.map +0 -1
- package/dist/cjs/embedding/openai.js +0 -26
- package/dist/cjs/events/console.d.ts +0 -25
- package/dist/cjs/events/console.d.ts.map +0 -1
- package/dist/cjs/events/console.js +0 -41
- package/dist/cjs/events/webhook.d.ts +0 -30
- package/dist/cjs/events/webhook.d.ts.map +0 -1
- package/dist/cjs/events/webhook.js +0 -79
- package/dist/cjs/memory/cloudflare/index.d.ts +0 -3
- package/dist/cjs/memory/cloudflare/index.d.ts.map +0 -1
- package/dist/cjs/memory/cloudflare/index.js +0 -5
- package/dist/cjs/memory/cloudflare/vectorize.d.ts +0 -62
- package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +0 -1
- package/dist/cjs/memory/cloudflare/vectorize.js +0 -55
- package/dist/cjs/memory/in-memory-semantic.d.ts +0 -16
- package/dist/cjs/memory/in-memory-semantic.d.ts.map +0 -1
- package/dist/cjs/memory/in-memory-semantic.js +0 -57
- package/dist/cjs/memory/pinecone/index.d.ts +0 -7
- package/dist/cjs/memory/pinecone/index.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/index.js +0 -8
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts +0 -62
- package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/memory-adapter.js +0 -220
- package/dist/cjs/memory/pinecone/semantic.d.ts +0 -44
- package/dist/cjs/memory/pinecone/semantic.d.ts.map +0 -1
- package/dist/cjs/memory/pinecone/semantic.js +0 -90
- package/dist/cjs/memory/sqlite/index.d.ts +0 -3
- package/dist/cjs/memory/sqlite/index.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/index.js +0 -5
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts +0 -58
- package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/memory-adapter.js +0 -336
- package/dist/cjs/memory/sqlite/schema.d.ts +0 -4
- package/dist/cjs/memory/sqlite/schema.d.ts.map +0 -1
- package/dist/cjs/memory/sqlite/schema.js +0 -91
- package/dist/cjs/memory/supabase/index.d.ts +0 -7
- package/dist/cjs/memory/supabase/index.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/index.js +0 -8
- package/dist/cjs/memory/supabase/memory-adapter.d.ts +0 -67
- package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/memory-adapter.js +0 -335
- package/dist/cjs/memory/supabase/semantic.d.ts +0 -44
- package/dist/cjs/memory/supabase/semantic.d.ts.map +0 -1
- package/dist/cjs/memory/supabase/semantic.js +0 -72
- package/dist/esm/embedding/cloudflare.d.ts +0 -15
- package/dist/esm/embedding/cloudflare.d.ts.map +0 -1
- package/dist/esm/embedding/cloudflare.js +0 -13
- package/dist/esm/embedding/cohere.d.ts +0 -8
- package/dist/esm/embedding/cohere.d.ts.map +0 -1
- package/dist/esm/embedding/cohere.js +0 -28
- package/dist/esm/embedding/index.d.ts +0 -9
- package/dist/esm/embedding/index.d.ts.map +0 -1
- package/dist/esm/embedding/index.js +0 -4
- package/dist/esm/embedding/local.d.ts +0 -6
- package/dist/esm/embedding/local.d.ts.map +0 -1
- package/dist/esm/embedding/local.js +0 -25
- package/dist/esm/embedding/openai.d.ts +0 -9
- package/dist/esm/embedding/openai.d.ts.map +0 -1
- package/dist/esm/embedding/openai.js +0 -23
- package/dist/esm/events/console.d.ts +0 -25
- package/dist/esm/events/console.d.ts.map +0 -1
- package/dist/esm/events/console.js +0 -37
- package/dist/esm/events/webhook.d.ts +0 -30
- package/dist/esm/events/webhook.d.ts.map +0 -1
- package/dist/esm/events/webhook.js +0 -75
- package/dist/esm/memory/cloudflare/index.d.ts +0 -3
- package/dist/esm/memory/cloudflare/index.d.ts.map +0 -1
- package/dist/esm/memory/cloudflare/index.js +0 -1
- package/dist/esm/memory/cloudflare/vectorize.d.ts +0 -62
- package/dist/esm/memory/cloudflare/vectorize.d.ts.map +0 -1
- package/dist/esm/memory/cloudflare/vectorize.js +0 -51
- package/dist/esm/memory/in-memory-semantic.d.ts +0 -16
- package/dist/esm/memory/in-memory-semantic.d.ts.map +0 -1
- package/dist/esm/memory/in-memory-semantic.js +0 -53
- package/dist/esm/memory/pinecone/index.d.ts +0 -7
- package/dist/esm/memory/pinecone/index.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/index.js +0 -3
- package/dist/esm/memory/pinecone/memory-adapter.d.ts +0 -62
- package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/memory-adapter.js +0 -216
- package/dist/esm/memory/pinecone/semantic.d.ts +0 -44
- package/dist/esm/memory/pinecone/semantic.d.ts.map +0 -1
- package/dist/esm/memory/pinecone/semantic.js +0 -86
- package/dist/esm/memory/sqlite/index.d.ts +0 -3
- package/dist/esm/memory/sqlite/index.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/index.js +0 -1
- package/dist/esm/memory/sqlite/memory-adapter.d.ts +0 -58
- package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/memory-adapter.js +0 -296
- package/dist/esm/memory/sqlite/schema.d.ts +0 -4
- package/dist/esm/memory/sqlite/schema.d.ts.map +0 -1
- package/dist/esm/memory/sqlite/schema.js +0 -86
- package/dist/esm/memory/supabase/index.d.ts +0 -7
- package/dist/esm/memory/supabase/index.d.ts.map +0 -1
- package/dist/esm/memory/supabase/index.js +0 -3
- package/dist/esm/memory/supabase/memory-adapter.d.ts +0 -67
- package/dist/esm/memory/supabase/memory-adapter.d.ts.map +0 -1
- package/dist/esm/memory/supabase/memory-adapter.js +0 -331
- package/dist/esm/memory/supabase/semantic.d.ts +0 -44
- package/dist/esm/memory/supabase/semantic.d.ts.map +0 -1
- package/dist/esm/memory/supabase/semantic.js +0 -68
|
@@ -1,209 +1,74 @@
|
|
|
1
1
|
import type { Episode, VAD } from '../types';
|
|
2
2
|
export type { Episode, VAD };
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Memory adapter for advanced memory features.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* semantic
|
|
6
|
+
* For simple use cases, manage conversation history externally using
|
|
7
|
+
* the `updatedHistory` returned from `chat()`.
|
|
8
|
+
*
|
|
9
|
+
* For advanced features (semantic search, reflections, emotion-aware storage),
|
|
10
|
+
* implement this interface.
|
|
10
11
|
*
|
|
11
12
|
* @example
|
|
12
13
|
* ```typescript
|
|
13
|
-
*
|
|
14
|
+
* class MyPostgresAdapter implements MemoryAdapter {
|
|
15
|
+
* async saveEpisode(episode: Episode): Promise<void> {
|
|
16
|
+
* await db.query('INSERT INTO episodes ...', [episode]);
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* async recall(query: RecallQuery): Promise<Episode[]> {
|
|
20
|
+
* return db.query('SELECT * FROM episodes WHERE ...', [query.sourceEntity]);
|
|
21
|
+
* }
|
|
14
22
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* }
|
|
23
|
+
* // Optional: semantic search with vector DB
|
|
24
|
+
* async semanticRecall(query: string, options?: SemanticRecallOptions): Promise<Episode[]> {
|
|
25
|
+
* const embedding = await openai.embed(query);
|
|
26
|
+
* return vectorDB.search(embedding, options?.topK ?? 5);
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
21
29
|
* ```
|
|
22
30
|
*/
|
|
23
31
|
export interface MemoryAdapter {
|
|
24
|
-
/** Save an episode
|
|
32
|
+
/** Save an episode with emotion metadata. */
|
|
25
33
|
saveEpisode(episode: Episode): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Recall relevant episodes by structured query.
|
|
28
|
-
* Accepts both SDK `RecallQuery` and `EpisodeQuery` shapes.
|
|
29
|
-
*/
|
|
34
|
+
/** Recall episodes by structured query (filters). */
|
|
30
35
|
recall(query: RecallQuery): Promise<Episode[]>;
|
|
31
|
-
/**
|
|
36
|
+
/** Semantic similarity search (optional). Requires vector DB. */
|
|
37
|
+
semanticRecall?(query: string, options?: SemanticRecallOptions): Promise<Episode[]>;
|
|
38
|
+
/** Save a reflection (optional). */
|
|
32
39
|
saveReflection?(reflection: Reflection): Promise<void>;
|
|
33
|
-
/**
|
|
40
|
+
/** Get reflections for a source (optional). */
|
|
34
41
|
getReflections?(sourceEntity?: string): Promise<Reflection[]>;
|
|
35
|
-
/**
|
|
36
|
-
* Vector/semantic similarity search. Optional.
|
|
37
|
-
* When provided, the adapter handles embedding internally — no separate
|
|
38
|
-
* EmbeddingAdapter needed.
|
|
39
|
-
*/
|
|
40
|
-
semanticRecall?(query: string, options?: SemanticRecallOptions): Promise<Episode[]>;
|
|
41
|
-
/** Retrieve episodes by IDs. Optional — used for hydrating search results. */
|
|
42
|
+
/** Retrieve episodes by IDs (optional). */
|
|
42
43
|
getByIds?(ids: string[]): Promise<Episode[]>;
|
|
43
44
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Query for recalling episodes from a MemoryAdapter.
|
|
46
|
-
*
|
|
47
|
-
* Compatible with both persona engine's `RecallQuery` (`context` field)
|
|
48
|
-
* and the SDK's `EpisodeQuery` (`contextContains` field).
|
|
49
|
-
*/
|
|
45
|
+
/** Query for recalling episodes. */
|
|
50
46
|
export interface RecallQuery {
|
|
51
47
|
/** Filter by source entity name. */
|
|
52
48
|
sourceEntity?: string;
|
|
53
|
-
/** Search keyword or
|
|
49
|
+
/** Search keyword or context text. */
|
|
54
50
|
context?: string;
|
|
55
|
-
/** Max episodes to return.
|
|
51
|
+
/** Max episodes to return. */
|
|
56
52
|
limit?: number;
|
|
57
|
-
/** Minimum importance score
|
|
53
|
+
/** Minimum importance score (0-1). */
|
|
58
54
|
minImportance?: number;
|
|
59
55
|
/** Epoch ms range [from, to]. */
|
|
60
56
|
timeRange?: [number, number];
|
|
61
|
-
/** Filter by episode type.
|
|
57
|
+
/** Filter by episode type. */
|
|
62
58
|
type?: string | string[];
|
|
63
59
|
/** Valence range [min, max]. */
|
|
64
60
|
valenceRange?: [number, number];
|
|
65
61
|
}
|
|
66
62
|
/** Options for semantic/vector recall. */
|
|
67
63
|
export interface SemanticRecallOptions {
|
|
68
|
-
/** Number of results
|
|
64
|
+
/** Number of results. Default: 5. */
|
|
69
65
|
topK?: number;
|
|
70
|
-
/** Minimum similarity score
|
|
66
|
+
/** Minimum similarity score (0-1). */
|
|
71
67
|
minScore?: number;
|
|
72
|
-
/**
|
|
73
|
-
filter?: Partial<RecallQuery>;
|
|
74
|
-
}
|
|
75
|
-
/** Recall limit configuration, extracted for reuse. */
|
|
76
|
-
export interface RecallLimits {
|
|
77
|
-
/** Max episodic memories per recall. Default: 5. */
|
|
78
|
-
episodicLimit?: number;
|
|
79
|
-
/** Max semantic results per recall. Default: 3. */
|
|
80
|
-
semanticLimit?: number;
|
|
81
|
-
/** Max reflections per recall. Default: 3. */
|
|
82
|
-
reflectionLimit?: number;
|
|
83
|
-
/** Minimum importance threshold. Default: 0. */
|
|
68
|
+
/** Minimum importance threshold. */
|
|
84
69
|
minImportance?: number;
|
|
85
70
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Type guard: returns true if the memory config is a `MemoryConfig` (split adapters),
|
|
88
|
-
* false if it's a `MemoryAdapter` (single adapter).
|
|
89
|
-
*
|
|
90
|
-
* Discriminates by checking for `saveEpisode` — present on MemoryAdapter, absent on MemoryConfig.
|
|
91
|
-
*/
|
|
92
|
-
export declare function isMemoryConfig(m: MemoryAdapter | MemoryConfig): m is MemoryConfig;
|
|
93
|
-
/**
|
|
94
|
-
* EpisodeAdapter — RDB-backed structured episode storage.
|
|
95
|
-
*
|
|
96
|
-
* Required adapter for the split `MemoryConfig` approach. Handles saving and
|
|
97
|
-
* recalling episodic memories (conversation episodes + reflections).
|
|
98
|
-
*
|
|
99
|
-
* Implementations: InMemoryEpisodeAdapter (built-in), or consumer-provided
|
|
100
|
-
* (SQLite, PostgreSQL, Supabase, etc.).
|
|
101
|
-
*/
|
|
102
|
-
export interface EpisodeAdapter {
|
|
103
|
-
/** Save an episode returned by the API's AgentResponse. */
|
|
104
|
-
saveEpisode(episode: Episode): Promise<void>;
|
|
105
|
-
/** Recall relevant episodes by structured query (time-ordered). */
|
|
106
|
-
recall(query: EpisodeQuery): Promise<Episode[]>;
|
|
107
|
-
/** Retrieve episodes by IDs — used for hydrating SemanticStore results. */
|
|
108
|
-
getByIds?(ids: string[]): Promise<Episode[]>;
|
|
109
|
-
/** Save a reflection generated by LLM. */
|
|
110
|
-
saveReflection(reflection: Reflection): Promise<void>;
|
|
111
|
-
/** Retrieve reflections for a source entity. */
|
|
112
|
-
getReflections(sourceEntity?: string, limit?: number): Promise<Reflection[]>;
|
|
113
|
-
}
|
|
114
|
-
/** Structured query for episodic recall (RDB-style filtering). */
|
|
115
|
-
export interface EpisodeQuery {
|
|
116
|
-
/** Filter by source entity name. */
|
|
117
|
-
sourceEntity?: string;
|
|
118
|
-
/** LIKE search on episode context (not semantic). */
|
|
119
|
-
contextContains?: string;
|
|
120
|
-
/** Filter by episode type. Single string or array (OR match). */
|
|
121
|
-
type?: string | string[];
|
|
122
|
-
/** Max episodes to return. Default: 10. */
|
|
123
|
-
limit?: number;
|
|
124
|
-
/** Minimum importance score to include. */
|
|
125
|
-
minImportance?: number;
|
|
126
|
-
/** Epoch ms range [from, to]. */
|
|
127
|
-
timeRange?: [number, number];
|
|
128
|
-
/** Valence range [min, max]. */
|
|
129
|
-
valenceRange?: [number, number];
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* SemanticAdapter — Vector DB-backed semantic search.
|
|
133
|
-
*
|
|
134
|
-
* Optional adapter for similarity-based memory recall.
|
|
135
|
-
* Requires an EmbeddingAdapter to be configured alongside.
|
|
136
|
-
*
|
|
137
|
-
* Implementations: consumer-provided (Pinecone, pgvector, ChromaDB, etc.).
|
|
138
|
-
*/
|
|
139
|
-
export interface SemanticAdapter {
|
|
140
|
-
/** Index a semantic entry (episode or reflection embedding). */
|
|
141
|
-
index(entry: SemanticEntry): Promise<void>;
|
|
142
|
-
/** Search for semantically similar entries. */
|
|
143
|
-
search(query: SemanticQuery): Promise<SemanticResult[]>;
|
|
144
|
-
}
|
|
145
|
-
/** Entry to index in the vector store. */
|
|
146
|
-
export interface SemanticEntry {
|
|
147
|
-
id: string;
|
|
148
|
-
embedding: number[];
|
|
149
|
-
metadata: {
|
|
150
|
-
type: 'episode' | 'reflection';
|
|
151
|
-
sourceEntity?: string;
|
|
152
|
-
timestamp: number;
|
|
153
|
-
importance?: number;
|
|
154
|
-
/** Episode type tag (e.g. 'chat_message', 'attack', 'gift'). */
|
|
155
|
-
episodeType?: string;
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
/** Query for semantic similarity search. */
|
|
159
|
-
export interface SemanticQuery {
|
|
160
|
-
embedding: number[];
|
|
161
|
-
/** Number of results to return. Default: 5. */
|
|
162
|
-
topK?: number;
|
|
163
|
-
filter?: {
|
|
164
|
-
type?: 'episode' | 'reflection';
|
|
165
|
-
sourceEntity?: string;
|
|
166
|
-
minImportance?: number;
|
|
167
|
-
/** Filter by episode type tag. */
|
|
168
|
-
episodeType?: string;
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
/** Result from semantic similarity search. */
|
|
172
|
-
export interface SemanticResult {
|
|
173
|
-
id: string;
|
|
174
|
-
score: number;
|
|
175
|
-
metadata: SemanticEntry['metadata'];
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* EmbeddingAdapter — generates vector embeddings from text.
|
|
179
|
-
*
|
|
180
|
-
* Required when using SemanticAdapter. Consumer provides their own
|
|
181
|
-
* embedding model (OpenAI, Cohere, local, etc.).
|
|
182
|
-
*/
|
|
183
|
-
export interface EmbeddingAdapter {
|
|
184
|
-
/** Generate an embedding vector from text. */
|
|
185
|
-
embed(text: string): Promise<number[]>;
|
|
186
|
-
/** Dimensionality of the embedding vectors. */
|
|
187
|
-
readonly dimension: number;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* MemoryConfig — split-adapter configuration for the SDK memory system.
|
|
191
|
-
*
|
|
192
|
-
* At minimum, provide an `episodes` adapter. Optionally add `semantic`
|
|
193
|
-
* + `embedding` for similarity-based recall.
|
|
194
|
-
*
|
|
195
|
-
* For simpler setup, pass a single `MemoryAdapter` instead of `MemoryConfig`.
|
|
196
|
-
*/
|
|
197
|
-
export interface MemoryConfig {
|
|
198
|
-
/** Required: structured episode storage (RDB-backed). */
|
|
199
|
-
episodes: EpisodeAdapter;
|
|
200
|
-
/** Optional: vector similarity search. Requires `embedding` to be set. */
|
|
201
|
-
semantic?: SemanticAdapter;
|
|
202
|
-
/** Optional: embedding adapter. Required when `semantic` is set. */
|
|
203
|
-
embedding?: EmbeddingAdapter;
|
|
204
|
-
/** Optional: recall tuning parameters. */
|
|
205
|
-
recall?: RecallLimits;
|
|
206
|
-
}
|
|
71
|
+
/** Reflection data structure. */
|
|
207
72
|
export interface Reflection {
|
|
208
73
|
id: string;
|
|
209
74
|
timestamp: number;
|
|
@@ -212,20 +77,15 @@ export interface Reflection {
|
|
|
212
77
|
trigger: string;
|
|
213
78
|
emotionSnapshot: VAD;
|
|
214
79
|
}
|
|
215
|
-
/**
|
|
216
|
-
export
|
|
217
|
-
/**
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
export interface CountQuery {
|
|
227
|
-
sourceEntity?: string;
|
|
228
|
-
context?: string;
|
|
229
|
-
timeRange?: [number, number];
|
|
80
|
+
/** Recall limit configuration. */
|
|
81
|
+
export interface RecallLimits {
|
|
82
|
+
/** Max episodic memories. Default: 5. */
|
|
83
|
+
episodicLimit?: number;
|
|
84
|
+
/** Max semantic results. Default: 3. */
|
|
85
|
+
semanticLimit?: number;
|
|
86
|
+
/** Max reflections. Default: 3. */
|
|
87
|
+
reflectionLimit?: number;
|
|
88
|
+
/** Minimum importance threshold. Default: 0. */
|
|
89
|
+
minImportance?: number;
|
|
230
90
|
}
|
|
231
91
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/memory/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE7C,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/memory/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE7C,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE/C,iEAAiE;IACjE,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpF,oCAAoC;IACpC,cAAc,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,+CAA+C;IAC/C,cAAc,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAE9D,2CAA2C;IAC3C,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC9C;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,gCAAgC;IAChC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,GAAG,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
package/dist/esm/memory/types.js
CHANGED
|
@@ -1,9 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Type guard: returns true if the memory config is a `MemoryConfig` (split adapters),
|
|
3
|
-
* false if it's a `MemoryAdapter` (single adapter).
|
|
4
|
-
*
|
|
5
|
-
* Discriminates by checking for `saveEpisode` — present on MemoryAdapter, absent on MemoryConfig.
|
|
6
|
-
*/
|
|
7
|
-
export function isMemoryConfig(m) {
|
|
8
|
-
return !('saveEpisode' in m);
|
|
9
|
-
}
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat orchestration: 3 modes (combined / split / tool-use).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from MolrooPersona to reduce god-object complexity.
|
|
5
|
+
* All external dependencies are injected via ChatOrchestratorDeps.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMAdapter, Message } from '../llm/adapter';
|
|
8
|
+
import type { AgentResponse, InterlocutorContext, PerceiveOptions } from '../types';
|
|
9
|
+
import type { RecallLimits } from '../memory/types';
|
|
10
|
+
import type { MemoryAdapter } from '../memory/types';
|
|
11
|
+
import type { EventAdapter } from '../events/types';
|
|
12
|
+
type PromptContextResult = {
|
|
13
|
+
systemPrompt: string;
|
|
14
|
+
personaPrompt: Record<string, unknown>;
|
|
15
|
+
tools?: Array<Record<string, unknown>>;
|
|
16
|
+
};
|
|
17
|
+
export interface ChatOrchestratorDeps {
|
|
18
|
+
personaId: string;
|
|
19
|
+
llm: LLMAdapter;
|
|
20
|
+
engineLlm: LLMAdapter | null;
|
|
21
|
+
memoryAdapter: MemoryAdapter | null;
|
|
22
|
+
memoryRecallConfig: RecallLimits | undefined;
|
|
23
|
+
events: EventAdapter | null;
|
|
24
|
+
getPromptContext: (consumerSuffix?: string, sourceEntity?: string) => Promise<PromptContextResult>;
|
|
25
|
+
perceive: (message: string, options?: PerceiveOptions) => Promise<AgentResponse>;
|
|
26
|
+
searchMemory: (query: string) => Promise<Array<Record<string, unknown>>>;
|
|
27
|
+
}
|
|
28
|
+
export interface ChatOptions {
|
|
29
|
+
from?: string | InterlocutorContext;
|
|
30
|
+
history?: Message[];
|
|
31
|
+
consumerSuffix?: string;
|
|
32
|
+
onToolCall?: (call: {
|
|
33
|
+
name: string;
|
|
34
|
+
args: Record<string, unknown>;
|
|
35
|
+
result: unknown;
|
|
36
|
+
}) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface ChatResult {
|
|
39
|
+
text: string;
|
|
40
|
+
response: AgentResponse;
|
|
41
|
+
/** Updated conversation history including this turn. Manage externally for simple mode. */
|
|
42
|
+
updatedHistory: Message[];
|
|
43
|
+
}
|
|
44
|
+
export declare function chat(deps: ChatOrchestratorDeps, message: string, options?: ChatOptions): Promise<ChatResult>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=chat-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-orchestrator.d.ts","sourceRoot":"","sources":["../../../src/persona/chat-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACV,aAAa,EAGb,mBAAmB,EACnB,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA+BpD,KAAK,mBAAmB,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,YAAY,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnG,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACjF,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/F;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,2FAA2F;IAC3F,cAAc,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmJlH"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { recallMemories, buildMemoryBlock } from '../memory/recall';
|
|
2
|
+
import { NEUTRAL_APPRAISAL } from '../shared/appraisal';
|
|
3
|
+
import { postChat } from './memory-pipeline';
|
|
4
|
+
/** Clamp appraisal values to engine-valid ranges after LLM generation. */
|
|
5
|
+
function clampAppraisal(a) {
|
|
6
|
+
const c = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
|
|
7
|
+
return {
|
|
8
|
+
goal_relevance: c(a.goal_relevance, -1, 1),
|
|
9
|
+
goal_congruence: c(a.goal_congruence, -1, 1),
|
|
10
|
+
expectedness: c(a.expectedness, 0, 1),
|
|
11
|
+
controllability: c(a.controllability, 0, 1),
|
|
12
|
+
agency: c(a.agency, -1, 1),
|
|
13
|
+
norm_compatibility: c(a.norm_compatibility, -1, 1),
|
|
14
|
+
internal_standards: c(a.internal_standards ?? 0, -1, 1),
|
|
15
|
+
adjustment_potential: c(a.adjustment_potential ?? 0.5, 0, 1),
|
|
16
|
+
urgency: c(a.urgency ?? 0.5, 0, 1),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Build a system prompt section describing the interlocutor. */
|
|
20
|
+
function buildInterlocutorBlock(ctx) {
|
|
21
|
+
const parts = [`## About ${ctx.name}`];
|
|
22
|
+
if (ctx.description)
|
|
23
|
+
parts.push(ctx.description);
|
|
24
|
+
if (ctx.extensions) {
|
|
25
|
+
for (const [title, content] of Object.entries(ctx.extensions)) {
|
|
26
|
+
parts.push(`### ${title}`);
|
|
27
|
+
parts.push(content);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return parts.join('\n');
|
|
31
|
+
}
|
|
32
|
+
export async function chat(deps, message, options) {
|
|
33
|
+
const fromOption = options?.from ?? 'user';
|
|
34
|
+
const from = typeof fromOption === 'string' ? fromOption : fromOption.name;
|
|
35
|
+
const interlocutor = typeof fromOption === 'object' ? fromOption : null;
|
|
36
|
+
// 1. Fetch server-assembled system prompt
|
|
37
|
+
const ctx = await deps.getPromptContext(options?.consumerSuffix, from);
|
|
38
|
+
let systemPrompt = ctx.systemPrompt;
|
|
39
|
+
const hasTools = (ctx.tools?.length ?? 0) > 0;
|
|
40
|
+
// 2. Build messages (external history + user message)
|
|
41
|
+
const messages = [];
|
|
42
|
+
if (options?.history) {
|
|
43
|
+
messages.push(...options.history.map(h => ({ role: h.role, content: h.content })));
|
|
44
|
+
}
|
|
45
|
+
messages.push({ role: 'user', content: message });
|
|
46
|
+
// 3. Advanced memory recall (only if MemoryAdapter provided)
|
|
47
|
+
let memoryBlock = '';
|
|
48
|
+
let recalledEpisodes = [];
|
|
49
|
+
if (deps.memoryAdapter) {
|
|
50
|
+
const recalled = await recallMemories(message, deps.memoryAdapter, deps.memoryRecallConfig, from, deps.personaId);
|
|
51
|
+
recalledEpisodes = recalled.episodic;
|
|
52
|
+
if (interlocutor) {
|
|
53
|
+
systemPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
54
|
+
}
|
|
55
|
+
memoryBlock = buildMemoryBlock(recalled.episodic, recalled.semantic, recalled.reflections);
|
|
56
|
+
if (memoryBlock) {
|
|
57
|
+
systemPrompt += '\n\n' + memoryBlock;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (interlocutor) {
|
|
61
|
+
systemPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
62
|
+
}
|
|
63
|
+
let responseText;
|
|
64
|
+
let appraisal;
|
|
65
|
+
let earlyPerceiveResponse;
|
|
66
|
+
// Split mode: engineLlm handles appraisal, primary llm handles response text
|
|
67
|
+
if (deps.engineLlm && deps.engineLlm !== deps.llm) {
|
|
68
|
+
const { AppraisalVectorSchema } = await import('../llm/schema');
|
|
69
|
+
const appraisalInstruction = [
|
|
70
|
+
'',
|
|
71
|
+
'## Appraisal Task',
|
|
72
|
+
"Evaluate how RECEIVING the user's message affects this persona emotionally.",
|
|
73
|
+
'The event you are appraising is the message itself arriving — not the described situation.',
|
|
74
|
+
"When the user shares their own experience (e.g. loss, success), appraise through the persona's relational goals: caring about the speaker makes their suffering relevant and incongruent.",
|
|
75
|
+
"Rate each dimension from the persona's subjective perspective.",
|
|
76
|
+
'An insult should produce negative goal_congruence and norm_compatibility.',
|
|
77
|
+
'A compliment should produce positive values. Neutral small talk should be near zero.',
|
|
78
|
+
].join('\n');
|
|
79
|
+
const appraisalMessages = messages.length <= 5 ? messages : messages.slice(-5);
|
|
80
|
+
const { object: appraisalResult } = await deps.engineLlm.generateObject({
|
|
81
|
+
system: systemPrompt + appraisalInstruction,
|
|
82
|
+
messages: appraisalMessages,
|
|
83
|
+
schema: AppraisalVectorSchema,
|
|
84
|
+
});
|
|
85
|
+
appraisal = clampAppraisal(appraisalResult);
|
|
86
|
+
earlyPerceiveResponse = await deps.perceive(message, {
|
|
87
|
+
from,
|
|
88
|
+
appraisal,
|
|
89
|
+
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
90
|
+
skipMemory: true,
|
|
91
|
+
});
|
|
92
|
+
let updatedPrompt = systemPrompt;
|
|
93
|
+
try {
|
|
94
|
+
const updatedCtx = await deps.getPromptContext(options?.consumerSuffix, from);
|
|
95
|
+
updatedPrompt = updatedCtx.systemPrompt;
|
|
96
|
+
if (interlocutor) {
|
|
97
|
+
updatedPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
98
|
+
}
|
|
99
|
+
if (memoryBlock) {
|
|
100
|
+
updatedPrompt += '\n\n' + memoryBlock;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Use original prompt if updated fetch fails
|
|
105
|
+
}
|
|
106
|
+
const { text } = await deps.llm.generateText({
|
|
107
|
+
system: updatedPrompt,
|
|
108
|
+
messages,
|
|
109
|
+
});
|
|
110
|
+
responseText = text;
|
|
111
|
+
}
|
|
112
|
+
else if (hasTools) {
|
|
113
|
+
const result = await generateWithToolLoop(deps, systemPrompt, messages, options?.onToolCall);
|
|
114
|
+
responseText = result.text;
|
|
115
|
+
appraisal = clampAppraisal(result.appraisal);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const { LLMResponseSchema } = await import('../llm/schema');
|
|
119
|
+
const { object: llmResult } = await deps.llm.generateObject({
|
|
120
|
+
system: systemPrompt,
|
|
121
|
+
messages,
|
|
122
|
+
schema: LLMResponseSchema,
|
|
123
|
+
});
|
|
124
|
+
responseText = llmResult.response;
|
|
125
|
+
appraisal = clampAppraisal(llmResult.appraisal ?? { ...NEUTRAL_APPRAISAL });
|
|
126
|
+
}
|
|
127
|
+
// 4. Send to API for emotion processing (skip if already done in split mode)
|
|
128
|
+
let response;
|
|
129
|
+
if (earlyPerceiveResponse) {
|
|
130
|
+
response = earlyPerceiveResponse;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
response = await deps.perceive(responseText, {
|
|
134
|
+
from,
|
|
135
|
+
appraisal: appraisal,
|
|
136
|
+
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
137
|
+
skipMemory: true,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
response.text = responseText;
|
|
141
|
+
// 5. Advanced memory pipeline (fire-and-forget, only if adapter exists)
|
|
142
|
+
if (deps.memoryAdapter) {
|
|
143
|
+
const pipelineDeps = {
|
|
144
|
+
personaId: deps.personaId,
|
|
145
|
+
memoryAdapter: deps.memoryAdapter,
|
|
146
|
+
events: deps.events,
|
|
147
|
+
llm: deps.llm,
|
|
148
|
+
engineLlm: deps.engineLlm,
|
|
149
|
+
};
|
|
150
|
+
postChat(pipelineDeps, response);
|
|
151
|
+
}
|
|
152
|
+
// 6. Return updated history for external management
|
|
153
|
+
const updatedHistory = [
|
|
154
|
+
...messages,
|
|
155
|
+
{ role: 'assistant', content: responseText }
|
|
156
|
+
];
|
|
157
|
+
return { text: responseText, response, updatedHistory };
|
|
158
|
+
}
|
|
159
|
+
async function generateWithToolLoop(deps, system, messages, onToolCall) {
|
|
160
|
+
const MAX_TOOL_ITERATIONS = 3;
|
|
161
|
+
const { LLMResponseWithToolsSchema, LLMResponseSchema } = await import('../llm/schema');
|
|
162
|
+
let currentSystem = system;
|
|
163
|
+
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
164
|
+
const { object: llmResult } = await deps.llm.generateObject({
|
|
165
|
+
system: currentSystem,
|
|
166
|
+
messages,
|
|
167
|
+
schema: LLMResponseWithToolsSchema,
|
|
168
|
+
});
|
|
169
|
+
if (!llmResult.search_memory) {
|
|
170
|
+
const text = llmResult.response;
|
|
171
|
+
const appraisal = llmResult.appraisal ?? { ...NEUTRAL_APPRAISAL };
|
|
172
|
+
return { text, appraisal };
|
|
173
|
+
}
|
|
174
|
+
const query = llmResult.search_memory;
|
|
175
|
+
let episodes = [];
|
|
176
|
+
try {
|
|
177
|
+
episodes = await deps.searchMemory(query);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Memory search failed — continue without results
|
|
181
|
+
}
|
|
182
|
+
if (onToolCall) {
|
|
183
|
+
onToolCall({ name: 'search_memory', args: { query }, result: episodes });
|
|
184
|
+
}
|
|
185
|
+
const resultBlock = episodes.length > 0
|
|
186
|
+
? `\n\n## Memory Search Results (query: "${query}")\n${episodes.map(ep => {
|
|
187
|
+
const ts = ep.timestamp ? new Date(ep.timestamp).toISOString() : 'unknown';
|
|
188
|
+
const source = ep.sourceEntity ?? 'unknown';
|
|
189
|
+
const context = ep.context ?? 'no context';
|
|
190
|
+
return `- [${ts}] ${source}: ${context}`;
|
|
191
|
+
}).join('\n')}`
|
|
192
|
+
: `\n\n## Memory Search Results (query: "${query}")\nNo matching memories found.`;
|
|
193
|
+
currentSystem = currentSystem + resultBlock;
|
|
194
|
+
}
|
|
195
|
+
const { object: finalResult } = await deps.llm.generateObject({
|
|
196
|
+
system: currentSystem,
|
|
197
|
+
messages,
|
|
198
|
+
schema: LLMResponseSchema,
|
|
199
|
+
});
|
|
200
|
+
return {
|
|
201
|
+
text: finalResult.response,
|
|
202
|
+
appraisal: finalResult.appraisal ?? { ...NEUTRAL_APPRAISAL },
|
|
203
|
+
};
|
|
204
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless event mapper: AgentResponse → SDK events.
|
|
3
|
+
*/
|
|
4
|
+
import type { EventAdapter } from '../events/types';
|
|
5
|
+
import type { AgentResponse } from '../types';
|
|
6
|
+
export declare function emitResponseEvents(events: EventAdapter, personaId: string, response: AgentResponse, now: number): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../../src/persona/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export async function emitResponseEvents(events, personaId, response, now) {
|
|
2
|
+
const batch = [];
|
|
3
|
+
if (response.emotion) {
|
|
4
|
+
batch.push({
|
|
5
|
+
type: 'emotion_changed',
|
|
6
|
+
personaId,
|
|
7
|
+
timestamp: now,
|
|
8
|
+
payload: {
|
|
9
|
+
vad: response.emotion.vad,
|
|
10
|
+
primary: response.emotion.discrete.primary,
|
|
11
|
+
intensity: response.emotion.discrete.intensity,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (response.socialUpdates?.length) {
|
|
16
|
+
batch.push({
|
|
17
|
+
type: 'relationship_changed',
|
|
18
|
+
personaId,
|
|
19
|
+
timestamp: now,
|
|
20
|
+
payload: { updates: response.socialUpdates },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (response.memoryEpisode) {
|
|
24
|
+
batch.push({
|
|
25
|
+
type: 'memory_consolidated',
|
|
26
|
+
personaId,
|
|
27
|
+
timestamp: now,
|
|
28
|
+
payload: { episodeId: response.memoryEpisode.id },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (response.stageTransition) {
|
|
32
|
+
batch.push({ type: 'stage_transition', personaId, timestamp: now, payload: {} });
|
|
33
|
+
}
|
|
34
|
+
if (response.maskExposure) {
|
|
35
|
+
batch.push({ type: 'mask_exposure', personaId, timestamp: now, payload: response.maskExposure });
|
|
36
|
+
}
|
|
37
|
+
if (response.goalChanges) {
|
|
38
|
+
batch.push({ type: 'goal_changed', personaId, timestamp: now, payload: response.goalChanges });
|
|
39
|
+
}
|
|
40
|
+
if (batch.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
if (events.emitBatch) {
|
|
43
|
+
await events.emitBatch(batch);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
for (const event of batch) {
|
|
47
|
+
await events.emit(event);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory pipeline: episode saving and reflection generation.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from MolrooPersona to eliminate duplicated save logic
|
|
5
|
+
* between postPerceivePipeline and postChat pipelines.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMAdapter } from '../llm/adapter';
|
|
8
|
+
import type { MemoryAdapter } from '../memory/types';
|
|
9
|
+
import type { EventAdapter } from '../events/types';
|
|
10
|
+
import type { AgentResponse } from '../types';
|
|
11
|
+
export interface MemoryPipelineDeps {
|
|
12
|
+
personaId: string;
|
|
13
|
+
memoryAdapter: MemoryAdapter | null;
|
|
14
|
+
events: EventAdapter | null;
|
|
15
|
+
llm: LLMAdapter | null;
|
|
16
|
+
engineLlm: LLMAdapter | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Post-perceive pipeline: save episode + emit events (no reflection).
|
|
20
|
+
*/
|
|
21
|
+
export declare function postPerceive(deps: MemoryPipelineDeps, response: AgentResponse): void;
|
|
22
|
+
/**
|
|
23
|
+
* Post-chat pipeline: save episode + reflection + emit events.
|
|
24
|
+
*/
|
|
25
|
+
export declare function postChat(deps: MemoryPipelineDeps, response: AgentResponse): void;
|
|
26
|
+
//# sourceMappingURL=memory-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-pipeline.d.ts","sourceRoot":"","sources":["../../../src/persona/memory-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAC;AAGrE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;CAC9B;AA+CD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAehF"}
|