@molroo-io/sdk 0.9.0 → 0.10.0
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/cjs/defaults/index.d.ts.map +1 -1
- package/dist/cjs/defaults/index.js +10 -5
- package/dist/cjs/events/types.d.ts +1 -1
- package/dist/cjs/events/types.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.d.ts.map +1 -1
- package/dist/cjs/llm/resolve.js +2 -1
- package/dist/cjs/llm/schema.d.ts +0 -114
- package/dist/cjs/llm/schema.d.ts.map +1 -1
- package/dist/cjs/llm/schema.js +1 -44
- package/dist/cjs/persona/chat-orchestrator.d.ts +18 -3
- package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -1
- package/dist/cjs/persona/chat-orchestrator.js +29 -109
- package/dist/cjs/persona/conversation.d.ts +22 -1
- package/dist/cjs/persona/conversation.d.ts.map +1 -1
- package/dist/cjs/persona/conversation.js +2 -0
- package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -1
- package/dist/cjs/persona/memory-pipeline.js +30 -4
- package/dist/cjs/persona.d.ts +330 -36
- package/dist/cjs/persona.d.ts.map +1 -1
- package/dist/cjs/persona.js +302 -19
- package/dist/cjs/shared/errors.d.ts +5 -1
- package/dist/cjs/shared/errors.d.ts.map +1 -1
- package/dist/cjs/shared/errors.js +4 -0
- package/dist/cjs/types.d.ts +18 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.d.ts +20 -5
- package/dist/cjs/world/world-persona.d.ts.map +1 -1
- package/dist/cjs/world/world-persona.js +21 -5
- package/dist/cjs/world/world.d.ts +23 -3
- package/dist/cjs/world/world.d.ts.map +1 -1
- package/dist/cjs/world/world.js +24 -1
- package/dist/esm/api-client.js +2 -2
- package/dist/esm/defaults/index.d.ts.map +1 -1
- package/dist/esm/defaults/index.js +10 -2
- package/dist/esm/errors.js +1 -1
- package/dist/esm/events/types.d.ts +1 -1
- package/dist/esm/events/types.d.ts.map +1 -1
- package/dist/esm/generate/persona.js +2 -2
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -6
- package/dist/esm/llm/resolve.d.ts.map +1 -1
- package/dist/esm/llm/resolve.js +3 -2
- package/dist/esm/llm/schema.d.ts +0 -114
- package/dist/esm/llm/schema.d.ts.map +1 -1
- package/dist/esm/llm/schema.js +0 -43
- package/dist/esm/llm/vercel-ai/index.js +2 -2
- package/dist/esm/package.json +1 -0
- package/dist/esm/persona/chat-orchestrator.d.ts +18 -3
- package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -1
- package/dist/esm/persona/chat-orchestrator.js +32 -112
- package/dist/esm/persona/conversation.d.ts +22 -1
- package/dist/esm/persona/conversation.d.ts.map +1 -1
- package/dist/esm/persona/conversation.js +2 -0
- package/dist/esm/persona/memory-pipeline.d.ts.map +1 -1
- package/dist/esm/persona/memory-pipeline.js +31 -5
- package/dist/esm/persona.d.ts +330 -36
- package/dist/esm/persona.d.ts.map +1 -1
- package/dist/esm/persona.js +308 -26
- package/dist/esm/shared/errors.d.ts +5 -1
- package/dist/esm/shared/errors.d.ts.map +1 -1
- package/dist/esm/shared/errors.js +4 -0
- package/dist/esm/types.d.ts +18 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +1 -1
- package/dist/esm/world/client.js +2 -2
- package/dist/esm/world/errors.js +1 -1
- package/dist/esm/world/index.js +5 -5
- package/dist/esm/world/world-domain.js +3 -3
- package/dist/esm/world/world-persona.d.ts +20 -5
- package/dist/esm/world/world-persona.d.ts.map +1 -1
- package/dist/esm/world/world-persona.js +23 -7
- package/dist/esm/world/world.d.ts +23 -3
- package/dist/esm/world/world.d.ts.map +1 -1
- package/dist/esm/world/world.js +27 -4
- package/package.json +3 -3
- package/dist/cjs/defaults/persona.json +0 -17
- package/dist/esm/defaults/persona.json +0 -17
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { recallMemories, buildMemoryBlock } from '../memory/recall';
|
|
2
|
-
import { NEUTRAL_APPRAISAL } from '../shared/appraisal';
|
|
3
|
-
import { postChat } from './memory-pipeline';
|
|
1
|
+
import { recallMemories, buildMemoryBlock } from '../memory/recall.js';
|
|
2
|
+
import { NEUTRAL_APPRAISAL } from '../shared/appraisal.js';
|
|
3
|
+
import { postChat } from './memory-pipeline.js';
|
|
4
4
|
/** Clamp appraisal values to engine-valid ranges after LLM generation. */
|
|
5
5
|
function clampAppraisal(a) {
|
|
6
6
|
const c = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
|
|
@@ -41,43 +41,17 @@ function buildDirectAppraisalInstruction() {
|
|
|
41
41
|
'A compliment should produce positive values. Neutral small talk should be near zero.',
|
|
42
42
|
].join('\n');
|
|
43
43
|
}
|
|
44
|
-
function buildEventAppraisalInstruction() {
|
|
45
|
-
return [
|
|
46
|
-
'',
|
|
47
|
-
'## Event Classification Task',
|
|
48
|
-
"Classify the user's message into the ontology event format before emotion is computed.",
|
|
49
|
-
'',
|
|
50
|
-
'### Step 1: interaction_type (required)',
|
|
51
|
-
'Determine the conversation mode: chat (small talk), inform (sharing info/news), humor (jokes/playfulness), express (emotional/relational event), goodbye (farewell/parting).',
|
|
52
|
-
'',
|
|
53
|
-
'### Step 2: event_type (only when interaction_type is "express")',
|
|
54
|
-
'If the message contains a relationship event, classify it: praise, criticism, support, rejection, apology, request, betrayal, or neglect.',
|
|
55
|
-
'Omit event_type for chat, inform, humor, or goodbye — these do not carry relationship events.',
|
|
56
|
-
'',
|
|
57
|
-
'### Step 3: agent_role, target_role, relationship, intensity',
|
|
58
|
-
'agent_role: who performed the action. target_role: who is affected by or receives the action.',
|
|
59
|
-
'Example: "you did great" → interaction=express, event=praise, agent=user, target=self.',
|
|
60
|
-
'Example: "nice weather" → interaction=chat, no event_type, agent=user, target=self.',
|
|
61
|
-
'Example: "my friend betrayed me" → interaction=express, event=betrayal, agent=other, target=user.',
|
|
62
|
-
].join('\n');
|
|
63
|
-
}
|
|
64
|
-
/** Convert an EventAppraisal to the ontologyEvent shape for API. */
|
|
65
|
-
function toOntologyEvent(event) {
|
|
66
|
-
return {
|
|
67
|
-
interaction_type: event.interaction_type,
|
|
68
|
-
...(event.event_type ? { event_type: event.event_type } : {}),
|
|
69
|
-
agent_role: event.agent_role,
|
|
70
|
-
target_role: event.target_role,
|
|
71
|
-
relationship: event.relationship,
|
|
72
|
-
intensity: event.intensity,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
44
|
export async function chat(deps, message, options) {
|
|
76
45
|
const fromOption = options?.from ?? 'user';
|
|
77
46
|
const from = typeof fromOption === 'string' ? fromOption : fromOption.name;
|
|
78
47
|
const interlocutor = typeof fromOption === 'object' ? fromOption : null;
|
|
79
48
|
// 1. Fetch server-assembled system prompt
|
|
80
|
-
const ctx = await deps.getPromptContext(
|
|
49
|
+
const ctx = await deps.getPromptContext({
|
|
50
|
+
consumerSuffix: options?.consumerSuffix,
|
|
51
|
+
sourceEntity: from,
|
|
52
|
+
consumerRules: options?.consumerRules,
|
|
53
|
+
consumerExamples: options?.consumerExamples,
|
|
54
|
+
});
|
|
81
55
|
let systemPrompt = ctx.systemPrompt;
|
|
82
56
|
const hasTools = (ctx.tools?.length ?? 0) > 0;
|
|
83
57
|
// 2. Build messages (external history + user message)
|
|
@@ -105,39 +79,31 @@ export async function chat(deps, message, options) {
|
|
|
105
79
|
}
|
|
106
80
|
let responseText;
|
|
107
81
|
let appraisal;
|
|
108
|
-
let ontologyEvent;
|
|
109
82
|
let earlyPerceiveResponse;
|
|
110
83
|
// Split mode: engineLlm handles appraisal, primary llm handles response text
|
|
111
84
|
if (deps.engineLlm && deps.engineLlm !== deps.llm) {
|
|
112
85
|
const appraisalMessages = messages.length <= 5 ? messages : messages.slice(-5);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
ontologyEvent = toOntologyEvent(appraisalResult);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
const { AppraisalVectorSchema } = await import('../llm/schema');
|
|
124
|
-
const { object: appraisalResult } = await deps.engineLlm.generateObject({
|
|
125
|
-
system: systemPrompt + buildDirectAppraisalInstruction(),
|
|
126
|
-
messages: appraisalMessages,
|
|
127
|
-
schema: AppraisalVectorSchema,
|
|
128
|
-
});
|
|
129
|
-
appraisal = clampAppraisal(appraisalResult);
|
|
130
|
-
}
|
|
86
|
+
const { AppraisalVectorSchema } = await import('../llm/schema.js');
|
|
87
|
+
const { object: appraisalResult } = await deps.engineLlm.generateObject({
|
|
88
|
+
system: systemPrompt + buildDirectAppraisalInstruction(),
|
|
89
|
+
messages: appraisalMessages,
|
|
90
|
+
schema: AppraisalVectorSchema,
|
|
91
|
+
});
|
|
92
|
+
appraisal = clampAppraisal(appraisalResult);
|
|
131
93
|
earlyPerceiveResponse = await deps.perceive(message, {
|
|
132
94
|
from,
|
|
133
|
-
|
|
134
|
-
...(ontologyEvent ? { ontologyEvent } : {}),
|
|
95
|
+
appraisal,
|
|
135
96
|
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
136
97
|
skipMemory: true,
|
|
137
98
|
});
|
|
138
99
|
let updatedPrompt = systemPrompt;
|
|
139
100
|
try {
|
|
140
|
-
const updatedCtx = await deps.getPromptContext(
|
|
101
|
+
const updatedCtx = await deps.getPromptContext({
|
|
102
|
+
consumerSuffix: options?.consumerSuffix,
|
|
103
|
+
sourceEntity: from,
|
|
104
|
+
consumerRules: options?.consumerRules,
|
|
105
|
+
consumerExamples: options?.consumerExamples,
|
|
106
|
+
});
|
|
141
107
|
updatedPrompt = updatedCtx.systemPrompt;
|
|
142
108
|
if (interlocutor) {
|
|
143
109
|
updatedPrompt += '\n\n' + buildInterlocutorBlock(interlocutor);
|
|
@@ -159,29 +125,16 @@ export async function chat(deps, message, options) {
|
|
|
159
125
|
const result = await generateWithToolLoop(deps, systemPrompt, messages, options?.onToolCall);
|
|
160
126
|
responseText = result.text;
|
|
161
127
|
appraisal = result.appraisal;
|
|
162
|
-
ontologyEvent = result.ontologyEvent;
|
|
163
128
|
}
|
|
164
129
|
else {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
ontologyEvent = toOntologyEvent(llmResult);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
const { LLMResponseSchema } = await import('../llm/schema');
|
|
177
|
-
const { object: llmResult } = await deps.llm.generateObject({
|
|
178
|
-
system: systemPrompt,
|
|
179
|
-
messages,
|
|
180
|
-
schema: LLMResponseSchema,
|
|
181
|
-
});
|
|
182
|
-
responseText = llmResult.response;
|
|
183
|
-
appraisal = clampAppraisal(llmResult.appraisal ?? { ...NEUTRAL_APPRAISAL });
|
|
184
|
-
}
|
|
130
|
+
const { LLMResponseSchema } = await import('../llm/schema.js');
|
|
131
|
+
const { object: llmResult } = await deps.llm.generateObject({
|
|
132
|
+
system: systemPrompt,
|
|
133
|
+
messages,
|
|
134
|
+
schema: LLMResponseSchema,
|
|
135
|
+
});
|
|
136
|
+
responseText = llmResult.response;
|
|
137
|
+
appraisal = clampAppraisal(llmResult.appraisal ?? { ...NEUTRAL_APPRAISAL });
|
|
185
138
|
}
|
|
186
139
|
// 4. Send to API for emotion processing (skip if already done in split mode)
|
|
187
140
|
let response;
|
|
@@ -192,7 +145,6 @@ export async function chat(deps, message, options) {
|
|
|
192
145
|
response = await deps.perceive(responseText, {
|
|
193
146
|
from,
|
|
194
147
|
...(appraisal ? { appraisal } : {}),
|
|
195
|
-
...(ontologyEvent ? { ontologyEvent } : {}),
|
|
196
148
|
priorEpisodes: recalledEpisodes.length > 0 ? recalledEpisodes : undefined,
|
|
197
149
|
skipMemory: true,
|
|
198
150
|
});
|
|
@@ -218,30 +170,9 @@ export async function chat(deps, message, options) {
|
|
|
218
170
|
}
|
|
219
171
|
async function generateWithToolLoop(deps, system, messages, onToolCall) {
|
|
220
172
|
const MAX_TOOL_ITERATIONS = 3;
|
|
221
|
-
const {
|
|
173
|
+
const { LLMResponseSchema, LLMResponseWithToolsSchema, } = await import('../llm/schema.js');
|
|
222
174
|
let currentSystem = system;
|
|
223
175
|
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
224
|
-
if (deps.appraisalMode === 'event') {
|
|
225
|
-
const { object: llmResult } = await deps.llm.generateObject({
|
|
226
|
-
system: currentSystem + buildEventAppraisalInstruction(),
|
|
227
|
-
messages,
|
|
228
|
-
schema: LLMEventResponseWithToolsSchema,
|
|
229
|
-
});
|
|
230
|
-
if (!llmResult.search_memory) {
|
|
231
|
-
return {
|
|
232
|
-
text: llmResult.response,
|
|
233
|
-
ontologyEvent: toOntologyEvent(llmResult),
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
const query = llmResult.search_memory;
|
|
237
|
-
const episodes = [];
|
|
238
|
-
if (onToolCall) {
|
|
239
|
-
onToolCall({ name: 'search_memory', args: { query }, result: episodes });
|
|
240
|
-
}
|
|
241
|
-
const resultBlock = `\n\n## Memory Search Results (query: "${query}")\nNo matching memories found.`;
|
|
242
|
-
currentSystem = currentSystem + resultBlock;
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
176
|
const { object: llmResult } = await deps.llm.generateObject({
|
|
246
177
|
system: currentSystem,
|
|
247
178
|
messages,
|
|
@@ -261,17 +192,6 @@ async function generateWithToolLoop(deps, system, messages, onToolCall) {
|
|
|
261
192
|
const resultBlock = `\n\n## Memory Search Results (query: "${query}")\nNo matching memories found.`;
|
|
262
193
|
currentSystem = currentSystem + resultBlock;
|
|
263
194
|
}
|
|
264
|
-
if (deps.appraisalMode === 'event') {
|
|
265
|
-
const { object: finalResult } = await deps.llm.generateObject({
|
|
266
|
-
system: currentSystem + buildEventAppraisalInstruction(),
|
|
267
|
-
messages,
|
|
268
|
-
schema: LLMEventResponseSchema,
|
|
269
|
-
});
|
|
270
|
-
return {
|
|
271
|
-
text: finalResult.response,
|
|
272
|
-
ontologyEvent: toOntologyEvent(finalResult),
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
195
|
const { object: finalResult } = await deps.llm.generateObject({
|
|
276
196
|
system: currentSystem,
|
|
277
197
|
messages,
|
|
@@ -7,8 +7,18 @@ export interface ConversationOptions {
|
|
|
7
7
|
maxMessages?: number;
|
|
8
8
|
/** Default source entity for all messages in this conversation. */
|
|
9
9
|
from?: string | InterlocutorContext;
|
|
10
|
-
/**
|
|
10
|
+
/** Free-form app-specific context appended to every system prompt in this conversation. */
|
|
11
11
|
consumerSuffix?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Behavioral constraints and absolute rules applied to every message in this conversation.
|
|
14
|
+
* Examples: "Never break character", "Always respond in Korean".
|
|
15
|
+
*/
|
|
16
|
+
consumerRules?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Few-shot example messages for style/behavior reference, applied to every message in this conversation.
|
|
19
|
+
* Helps the LLM match a specific tone or response format.
|
|
20
|
+
*/
|
|
21
|
+
consumerExamples?: string;
|
|
12
22
|
}
|
|
13
23
|
/**
|
|
14
24
|
* Auto-managed conversation session that tracks message history.
|
|
@@ -44,7 +54,18 @@ export declare class Conversation {
|
|
|
44
54
|
*/
|
|
45
55
|
send(message: string, options?: {
|
|
46
56
|
from?: string | InterlocutorContext;
|
|
57
|
+
/** Free-form app-specific context appended to the system prompt for this message only. */
|
|
47
58
|
consumerSuffix?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Behavioral constraints and absolute rules for this message only.
|
|
61
|
+
* Overrides the session-level `consumerRules` when provided.
|
|
62
|
+
*/
|
|
63
|
+
consumerRules?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Few-shot example messages for style/behavior reference for this message only.
|
|
66
|
+
* Overrides the session-level `consumerExamples` when provided.
|
|
67
|
+
*/
|
|
68
|
+
consumerExamples?: string;
|
|
48
69
|
onToolCall?: (call: {
|
|
49
70
|
name: string;
|
|
50
71
|
args: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/persona/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IAClC,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/persona/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IAClC,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAEnC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAKjE;;;;;;OAMG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;QACpC,0FAA0F;QAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB;;;WAGG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/F,GACA,OAAO,CAAC,iBAAiB,CAAC;IAkB7B,kDAAkD;IAClD,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,8CAA8C;IAC9C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,sCAAsC;IACtC,KAAK,IAAI,IAAI;IAIb,iDAAiD;IACjD,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -35,6 +35,8 @@ export class Conversation {
|
|
|
35
35
|
const result = await this._persona.chat(message, {
|
|
36
36
|
from: options?.from ?? this._options.from,
|
|
37
37
|
consumerSuffix: options?.consumerSuffix ?? this._options.consumerSuffix,
|
|
38
|
+
consumerRules: options?.consumerRules ?? this._options.consumerRules,
|
|
39
|
+
consumerExamples: options?.consumerExamples ?? this._options.consumerExamples,
|
|
38
40
|
history: this._history,
|
|
39
41
|
onToolCall: options?.onToolCall,
|
|
40
42
|
});
|
|
@@ -1 +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;
|
|
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;AAyBrE,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;AAiDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAUpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAmBhF"}
|
|
@@ -1,10 +1,30 @@
|
|
|
1
|
-
import { emitResponseEvents } from './event-emitter';
|
|
1
|
+
import { emitResponseEvents } from './event-emitter.js';
|
|
2
|
+
/** Emit pipeline error or log warning if no EventAdapter. */
|
|
3
|
+
function handlePipelineError(deps, stage, error) {
|
|
4
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
5
|
+
if (deps.events) {
|
|
6
|
+
deps.events.emit({
|
|
7
|
+
type: 'pipeline_error',
|
|
8
|
+
personaId: deps.personaId,
|
|
9
|
+
timestamp: Date.now(),
|
|
10
|
+
payload: { stage, error: message },
|
|
11
|
+
}).catch(() => {
|
|
12
|
+
// Last resort: log to console if event emit itself fails
|
|
13
|
+
console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
2
20
|
/** Save episode (shared between perceive and chat pipelines). */
|
|
3
21
|
function saveEpisode(deps, response) {
|
|
4
22
|
if (!response.memoryEpisode)
|
|
5
23
|
return;
|
|
6
24
|
if (deps.memoryAdapter) {
|
|
7
|
-
deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch(() => {
|
|
25
|
+
deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch((err) => {
|
|
26
|
+
handlePipelineError(deps, 'save_episode', err);
|
|
27
|
+
});
|
|
8
28
|
}
|
|
9
29
|
}
|
|
10
30
|
/** Handle reflection generation (LLM call + save). */
|
|
@@ -44,7 +64,9 @@ export function postPerceive(deps, response) {
|
|
|
44
64
|
return;
|
|
45
65
|
saveEpisode(deps, response);
|
|
46
66
|
if (deps.events) {
|
|
47
|
-
emitResponseEvents(deps.events, deps.personaId, response, Date.now()).catch(() => {
|
|
67
|
+
emitResponseEvents(deps.events, deps.personaId, response, Date.now()).catch((err) => {
|
|
68
|
+
handlePipelineError(deps, 'event_emit', err);
|
|
69
|
+
});
|
|
48
70
|
}
|
|
49
71
|
}
|
|
50
72
|
/**
|
|
@@ -57,9 +79,13 @@ export function postChat(deps, response) {
|
|
|
57
79
|
const hasLlm = deps.engineLlm || deps.llm;
|
|
58
80
|
const hasMemory = deps.memoryAdapter;
|
|
59
81
|
if (hasLlm && hasMemory && response.reflectionPrompt) {
|
|
60
|
-
handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch(() => {
|
|
82
|
+
handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch((err) => {
|
|
83
|
+
handlePipelineError(deps, 'reflection', err);
|
|
84
|
+
});
|
|
61
85
|
}
|
|
62
86
|
if (deps.events) {
|
|
63
|
-
emitResponseEvents(deps.events, deps.personaId, response, now).catch(() => {
|
|
87
|
+
emitResponseEvents(deps.events, deps.personaId, response, now).catch((err) => {
|
|
88
|
+
handlePipelineError(deps, 'event_emit', err);
|
|
89
|
+
});
|
|
64
90
|
}
|
|
65
91
|
}
|