@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
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.chat = chat;
|
|
37
|
+
const recall_1 = require("../memory/recall");
|
|
38
|
+
const appraisal_1 = require("../shared/appraisal");
|
|
39
|
+
const memory_pipeline_1 = require("./memory-pipeline");
|
|
40
|
+
/** Clamp appraisal values to engine-valid ranges after LLM generation. */
|
|
41
|
+
function clampAppraisal(a) {
|
|
42
|
+
const c = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
|
|
43
|
+
return {
|
|
44
|
+
goal_relevance: c(a.goal_relevance, -1, 1),
|
|
45
|
+
goal_congruence: c(a.goal_congruence, -1, 1),
|
|
46
|
+
expectedness: c(a.expectedness, 0, 1),
|
|
47
|
+
controllability: c(a.controllability, 0, 1),
|
|
48
|
+
agency: c(a.agency, -1, 1),
|
|
49
|
+
norm_compatibility: c(a.norm_compatibility, -1, 1),
|
|
50
|
+
internal_standards: c(a.internal_standards ?? 0, -1, 1),
|
|
51
|
+
adjustment_potential: c(a.adjustment_potential ?? 0.5, 0, 1),
|
|
52
|
+
urgency: c(a.urgency ?? 0.5, 0, 1),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Build a system prompt section describing the interlocutor. */
|
|
56
|
+
function buildInterlocutorBlock(ctx) {
|
|
57
|
+
const parts = [`## About ${ctx.name}`];
|
|
58
|
+
if (ctx.description)
|
|
59
|
+
parts.push(ctx.description);
|
|
60
|
+
if (ctx.extensions) {
|
|
61
|
+
for (const [title, content] of Object.entries(ctx.extensions)) {
|
|
62
|
+
parts.push(`### ${title}`);
|
|
63
|
+
parts.push(content);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return parts.join('\n');
|
|
67
|
+
}
|
|
68
|
+
async function chat(deps, message, options) {
|
|
69
|
+
const fromOption = options?.from ?? 'user';
|
|
70
|
+
const from = typeof fromOption === 'string' ? fromOption : fromOption.name;
|
|
71
|
+
const interlocutor = typeof fromOption === 'object' ? fromOption : null;
|
|
72
|
+
// 1. Fetch server-assembled system prompt
|
|
73
|
+
const ctx = await deps.getPromptContext(options?.consumerSuffix, from);
|
|
74
|
+
let systemPrompt = ctx.systemPrompt;
|
|
75
|
+
const hasTools = (ctx.tools?.length ?? 0) > 0;
|
|
76
|
+
// 2. Build messages (external history + user message)
|
|
77
|
+
const messages = [];
|
|
78
|
+
if (options?.history) {
|
|
79
|
+
messages.push(...options.history.map(h => ({ role: h.role, content: h.content })));
|
|
80
|
+
}
|
|
81
|
+
messages.push({ role: 'user', content: message });
|
|
82
|
+
// 3. Advanced memory recall (only if MemoryAdapter provided)
|
|
83
|
+
let memoryBlock = '';
|
|
84
|
+
let recalledEpisodes = [];
|
|
85
|
+
if (deps.memoryAdapter) {
|
|
86
|
+
const recalled = await (0, recall_1.recallMemories)(message, deps.memoryAdapter, deps.memoryRecallConfig, from, deps.personaId);
|
|
87
|
+
recalledEpisodes = recalled.episodic;
|
|
88
|
+
if (interlocutor) {
|
|
89
|
+
systemPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
90
|
+
}
|
|
91
|
+
memoryBlock = (0, recall_1.buildMemoryBlock)(recalled.episodic, recalled.semantic, recalled.reflections);
|
|
92
|
+
if (memoryBlock) {
|
|
93
|
+
systemPrompt += '\n\n' + memoryBlock;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (interlocutor) {
|
|
97
|
+
systemPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
98
|
+
}
|
|
99
|
+
let responseText;
|
|
100
|
+
let appraisal;
|
|
101
|
+
let earlyPerceiveResponse;
|
|
102
|
+
// Split mode: engineLlm handles appraisal, primary llm handles response text
|
|
103
|
+
if (deps.engineLlm && deps.engineLlm !== deps.llm) {
|
|
104
|
+
const { AppraisalVectorSchema } = await Promise.resolve().then(() => __importStar(require('../llm/schema')));
|
|
105
|
+
const appraisalInstruction = [
|
|
106
|
+
'',
|
|
107
|
+
'## Appraisal Task',
|
|
108
|
+
"Evaluate how RECEIVING the user's message affects this persona emotionally.",
|
|
109
|
+
'The event you are appraising is the message itself arriving — not the described situation.',
|
|
110
|
+
"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.",
|
|
111
|
+
"Rate each dimension from the persona's subjective perspective.",
|
|
112
|
+
'An insult should produce negative goal_congruence and norm_compatibility.',
|
|
113
|
+
'A compliment should produce positive values. Neutral small talk should be near zero.',
|
|
114
|
+
].join('\n');
|
|
115
|
+
const appraisalMessages = messages.length <= 5 ? messages : messages.slice(-5);
|
|
116
|
+
const { object: appraisalResult } = await deps.engineLlm.generateObject({
|
|
117
|
+
system: systemPrompt + appraisalInstruction,
|
|
118
|
+
messages: appraisalMessages,
|
|
119
|
+
schema: AppraisalVectorSchema,
|
|
120
|
+
});
|
|
121
|
+
appraisal = clampAppraisal(appraisalResult);
|
|
122
|
+
earlyPerceiveResponse = await deps.perceive(message, {
|
|
123
|
+
from,
|
|
124
|
+
appraisal,
|
|
125
|
+
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
126
|
+
skipMemory: true,
|
|
127
|
+
});
|
|
128
|
+
let updatedPrompt = systemPrompt;
|
|
129
|
+
try {
|
|
130
|
+
const updatedCtx = await deps.getPromptContext(options?.consumerSuffix, from);
|
|
131
|
+
updatedPrompt = updatedCtx.systemPrompt;
|
|
132
|
+
if (interlocutor) {
|
|
133
|
+
updatedPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
134
|
+
}
|
|
135
|
+
if (memoryBlock) {
|
|
136
|
+
updatedPrompt += '\n\n' + memoryBlock;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Use original prompt if updated fetch fails
|
|
141
|
+
}
|
|
142
|
+
const { text } = await deps.llm.generateText({
|
|
143
|
+
system: updatedPrompt,
|
|
144
|
+
messages,
|
|
145
|
+
});
|
|
146
|
+
responseText = text;
|
|
147
|
+
}
|
|
148
|
+
else if (hasTools) {
|
|
149
|
+
const result = await generateWithToolLoop(deps, systemPrompt, messages, options?.onToolCall);
|
|
150
|
+
responseText = result.text;
|
|
151
|
+
appraisal = clampAppraisal(result.appraisal);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const { LLMResponseSchema } = await Promise.resolve().then(() => __importStar(require('../llm/schema')));
|
|
155
|
+
const { object: llmResult } = await deps.llm.generateObject({
|
|
156
|
+
system: systemPrompt,
|
|
157
|
+
messages,
|
|
158
|
+
schema: LLMResponseSchema,
|
|
159
|
+
});
|
|
160
|
+
responseText = llmResult.response;
|
|
161
|
+
appraisal = clampAppraisal(llmResult.appraisal ?? { ...appraisal_1.NEUTRAL_APPRAISAL });
|
|
162
|
+
}
|
|
163
|
+
// 4. Send to API for emotion processing (skip if already done in split mode)
|
|
164
|
+
let response;
|
|
165
|
+
if (earlyPerceiveResponse) {
|
|
166
|
+
response = earlyPerceiveResponse;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
response = await deps.perceive(responseText, {
|
|
170
|
+
from,
|
|
171
|
+
appraisal: appraisal,
|
|
172
|
+
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
173
|
+
skipMemory: true,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
response.text = responseText;
|
|
177
|
+
// 5. Advanced memory pipeline (fire-and-forget, only if adapter exists)
|
|
178
|
+
if (deps.memoryAdapter) {
|
|
179
|
+
const pipelineDeps = {
|
|
180
|
+
personaId: deps.personaId,
|
|
181
|
+
memoryAdapter: deps.memoryAdapter,
|
|
182
|
+
events: deps.events,
|
|
183
|
+
llm: deps.llm,
|
|
184
|
+
engineLlm: deps.engineLlm,
|
|
185
|
+
};
|
|
186
|
+
(0, memory_pipeline_1.postChat)(pipelineDeps, response);
|
|
187
|
+
}
|
|
188
|
+
// 6. Return updated history for external management
|
|
189
|
+
const updatedHistory = [
|
|
190
|
+
...messages,
|
|
191
|
+
{ role: 'assistant', content: responseText }
|
|
192
|
+
];
|
|
193
|
+
return { text: responseText, response, updatedHistory };
|
|
194
|
+
}
|
|
195
|
+
async function generateWithToolLoop(deps, system, messages, onToolCall) {
|
|
196
|
+
const MAX_TOOL_ITERATIONS = 3;
|
|
197
|
+
const { LLMResponseWithToolsSchema, LLMResponseSchema } = await Promise.resolve().then(() => __importStar(require('../llm/schema')));
|
|
198
|
+
let currentSystem = system;
|
|
199
|
+
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
200
|
+
const { object: llmResult } = await deps.llm.generateObject({
|
|
201
|
+
system: currentSystem,
|
|
202
|
+
messages,
|
|
203
|
+
schema: LLMResponseWithToolsSchema,
|
|
204
|
+
});
|
|
205
|
+
if (!llmResult.search_memory) {
|
|
206
|
+
const text = llmResult.response;
|
|
207
|
+
const appraisal = llmResult.appraisal ?? { ...appraisal_1.NEUTRAL_APPRAISAL };
|
|
208
|
+
return { text, appraisal };
|
|
209
|
+
}
|
|
210
|
+
const query = llmResult.search_memory;
|
|
211
|
+
let episodes = [];
|
|
212
|
+
try {
|
|
213
|
+
episodes = await deps.searchMemory(query);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Memory search failed — continue without results
|
|
217
|
+
}
|
|
218
|
+
if (onToolCall) {
|
|
219
|
+
onToolCall({ name: 'search_memory', args: { query }, result: episodes });
|
|
220
|
+
}
|
|
221
|
+
const resultBlock = episodes.length > 0
|
|
222
|
+
? `\n\n## Memory Search Results (query: "${query}")\n${episodes.map(ep => {
|
|
223
|
+
const ts = ep.timestamp ? new Date(ep.timestamp).toISOString() : 'unknown';
|
|
224
|
+
const source = ep.sourceEntity ?? 'unknown';
|
|
225
|
+
const context = ep.context ?? 'no context';
|
|
226
|
+
return `- [${ts}] ${source}: ${context}`;
|
|
227
|
+
}).join('\n')}`
|
|
228
|
+
: `\n\n## Memory Search Results (query: "${query}")\nNo matching memories found.`;
|
|
229
|
+
currentSystem = currentSystem + resultBlock;
|
|
230
|
+
}
|
|
231
|
+
const { object: finalResult } = await deps.llm.generateObject({
|
|
232
|
+
system: currentSystem,
|
|
233
|
+
messages,
|
|
234
|
+
schema: LLMResponseSchema,
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
text: finalResult.response,
|
|
238
|
+
appraisal: finalResult.appraisal ?? { ...appraisal_1.NEUTRAL_APPRAISAL },
|
|
239
|
+
};
|
|
240
|
+
}
|
|
@@ -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,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitResponseEvents = emitResponseEvents;
|
|
4
|
+
async function emitResponseEvents(events, personaId, response, now) {
|
|
5
|
+
const batch = [];
|
|
6
|
+
if (response.emotion) {
|
|
7
|
+
batch.push({
|
|
8
|
+
type: 'emotion_changed',
|
|
9
|
+
personaId,
|
|
10
|
+
timestamp: now,
|
|
11
|
+
payload: {
|
|
12
|
+
vad: response.emotion.vad,
|
|
13
|
+
primary: response.emotion.discrete.primary,
|
|
14
|
+
intensity: response.emotion.discrete.intensity,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (response.socialUpdates?.length) {
|
|
19
|
+
batch.push({
|
|
20
|
+
type: 'relationship_changed',
|
|
21
|
+
personaId,
|
|
22
|
+
timestamp: now,
|
|
23
|
+
payload: { updates: response.socialUpdates },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (response.memoryEpisode) {
|
|
27
|
+
batch.push({
|
|
28
|
+
type: 'memory_consolidated',
|
|
29
|
+
personaId,
|
|
30
|
+
timestamp: now,
|
|
31
|
+
payload: { episodeId: response.memoryEpisode.id },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (response.stageTransition) {
|
|
35
|
+
batch.push({ type: 'stage_transition', personaId, timestamp: now, payload: {} });
|
|
36
|
+
}
|
|
37
|
+
if (response.maskExposure) {
|
|
38
|
+
batch.push({ type: 'mask_exposure', personaId, timestamp: now, payload: response.maskExposure });
|
|
39
|
+
}
|
|
40
|
+
if (response.goalChanges) {
|
|
41
|
+
batch.push({ type: 'goal_changed', personaId, timestamp: now, payload: response.goalChanges });
|
|
42
|
+
}
|
|
43
|
+
if (batch.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
if (events.emitBatch) {
|
|
46
|
+
await events.emitBatch(batch);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
for (const event of batch) {
|
|
50
|
+
await events.emit(event);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postPerceive = postPerceive;
|
|
4
|
+
exports.postChat = postChat;
|
|
5
|
+
const event_emitter_1 = require("./event-emitter");
|
|
6
|
+
/** Save episode (shared between perceive and chat pipelines). */
|
|
7
|
+
function saveEpisode(deps, response) {
|
|
8
|
+
if (!response.memoryEpisode)
|
|
9
|
+
return;
|
|
10
|
+
if (deps.memoryAdapter) {
|
|
11
|
+
deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch(() => { });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Handle reflection generation (LLM call + save). */
|
|
15
|
+
async function handleReflection(deps, prompt, emotionVad) {
|
|
16
|
+
const reflectionLlm = deps.engineLlm ?? deps.llm;
|
|
17
|
+
if (!reflectionLlm)
|
|
18
|
+
return;
|
|
19
|
+
if (!deps.memoryAdapter)
|
|
20
|
+
return;
|
|
21
|
+
const { text } = await reflectionLlm.generateText({
|
|
22
|
+
system: prompt.system,
|
|
23
|
+
messages: [{ role: 'user', content: prompt.user }],
|
|
24
|
+
});
|
|
25
|
+
const reflection = {
|
|
26
|
+
id: `ref-${Date.now()}`,
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
sourceEntity: deps.personaId,
|
|
29
|
+
content: text,
|
|
30
|
+
trigger: 'interaction',
|
|
31
|
+
emotionSnapshot: emotionVad ?? { V: 0, A: 0, D: 0 },
|
|
32
|
+
};
|
|
33
|
+
if (deps.memoryAdapter.saveReflection) {
|
|
34
|
+
await deps.memoryAdapter.saveReflection(reflection);
|
|
35
|
+
}
|
|
36
|
+
await deps.events?.emit({
|
|
37
|
+
type: 'reflection_generated',
|
|
38
|
+
personaId: deps.personaId,
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
payload: { trigger: 'interaction' },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Post-perceive pipeline: save episode + emit events (no reflection).
|
|
45
|
+
*/
|
|
46
|
+
function postPerceive(deps, response) {
|
|
47
|
+
if (!response.memoryEpisode)
|
|
48
|
+
return;
|
|
49
|
+
saveEpisode(deps, response);
|
|
50
|
+
if (deps.events) {
|
|
51
|
+
(0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, Date.now()).catch(() => { });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Post-chat pipeline: save episode + reflection + emit events.
|
|
56
|
+
*/
|
|
57
|
+
function postChat(deps, response) {
|
|
58
|
+
const now = Date.now();
|
|
59
|
+
saveEpisode(deps, response);
|
|
60
|
+
// Reflection generation (requires LLM)
|
|
61
|
+
const hasLlm = deps.engineLlm || deps.llm;
|
|
62
|
+
const hasMemory = deps.memoryAdapter;
|
|
63
|
+
if (hasLlm && hasMemory && response.reflectionPrompt) {
|
|
64
|
+
handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch(() => { });
|
|
65
|
+
}
|
|
66
|
+
if (deps.events) {
|
|
67
|
+
(0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, now).catch(() => { });
|
|
68
|
+
}
|
|
69
|
+
}
|