@framers/agentos 0.1.49 → 0.1.50
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/api/AgentOS.d.ts +1 -53
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +5 -256
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/api/AgentOSOrchestrator.d.ts +5 -276
- package/dist/api/AgentOSOrchestrator.d.ts.map +1 -1
- package/dist/api/AgentOSOrchestrator.js +107 -772
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/api/StreamChunkEmitter.d.ts +32 -0
- package/dist/api/StreamChunkEmitter.d.ts.map +1 -0
- package/dist/api/StreamChunkEmitter.js +141 -0
- package/dist/api/StreamChunkEmitter.js.map +1 -0
- package/dist/api/TaskOutcomeTelemetryManager.d.ts +107 -0
- package/dist/api/TaskOutcomeTelemetryManager.d.ts.map +1 -0
- package/dist/api/TaskOutcomeTelemetryManager.js +331 -0
- package/dist/api/TaskOutcomeTelemetryManager.js.map +1 -0
- package/dist/api/errors.d.ts +17 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +25 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/turn-phases/conversation-history.d.ts +22 -0
- package/dist/api/turn-phases/conversation-history.d.ts.map +1 -0
- package/dist/api/turn-phases/conversation-history.js +55 -0
- package/dist/api/turn-phases/conversation-history.js.map +1 -0
- package/dist/api/turn-phases/index.d.ts +5 -0
- package/dist/api/turn-phases/index.d.ts.map +1 -0
- package/dist/api/turn-phases/index.js +5 -0
- package/dist/api/turn-phases/index.js.map +1 -0
- package/dist/api/turn-phases/long-term-memory.d.ts +35 -0
- package/dist/api/turn-phases/long-term-memory.d.ts.map +1 -0
- package/dist/api/turn-phases/long-term-memory.js +82 -0
- package/dist/api/turn-phases/long-term-memory.js.map +1 -0
- package/dist/api/turn-phases/prompt-profile.d.ts +22 -0
- package/dist/api/turn-phases/prompt-profile.d.ts.map +1 -0
- package/dist/api/turn-phases/prompt-profile.js +34 -0
- package/dist/api/turn-phases/prompt-profile.js.map +1 -0
- package/dist/api/turn-phases/rolling-summary.d.ts +28 -0
- package/dist/api/turn-phases/rolling-summary.d.ts.map +1 -0
- package/dist/api/turn-phases/rolling-summary.js +87 -0
- package/dist/api/turn-phases/rolling-summary.js.map +1 -0
- package/dist/api/types/OrchestratorConfig.d.ts +89 -0
- package/dist/api/types/OrchestratorConfig.d.ts.map +1 -0
- package/dist/api/types/OrchestratorConfig.js +6 -0
- package/dist/api/types/OrchestratorConfig.js.map +1 -0
- package/dist/core/agents/index.d.ts +7 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/index.js +7 -0
- package/dist/core/agents/index.js.map +1 -0
- package/dist/core/ai_utilities/HybridUtilityAI.d.ts +54 -0
- package/dist/core/ai_utilities/HybridUtilityAI.d.ts.map +1 -1
- package/dist/core/ai_utilities/HybridUtilityAI.js +119 -1
- package/dist/core/ai_utilities/HybridUtilityAI.js.map +1 -1
- package/dist/core/ai_utilities/index.d.ts +5 -0
- package/dist/core/ai_utilities/index.d.ts.map +1 -0
- package/dist/core/ai_utilities/index.js +5 -0
- package/dist/core/ai_utilities/index.js.map +1 -0
- package/dist/core/audio/index.d.ts +5 -0
- package/dist/core/audio/index.d.ts.map +1 -0
- package/dist/core/audio/index.js +5 -0
- package/dist/core/audio/index.js.map +1 -0
- package/dist/core/conversation/index.d.ts +8 -0
- package/dist/core/conversation/index.d.ts.map +1 -0
- package/dist/core/conversation/index.js +8 -0
- package/dist/core/conversation/index.js.map +1 -0
- package/dist/core/index.d.ts +45 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +66 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/orchestration/index.d.ts +6 -0
- package/dist/core/orchestration/index.d.ts.map +1 -0
- package/dist/core/orchestration/index.js +6 -0
- package/dist/core/orchestration/index.js.map +1 -0
- package/dist/core/streaming/AsyncStreamClientBridge.d.ts +29 -0
- package/dist/core/streaming/AsyncStreamClientBridge.d.ts.map +1 -0
- package/dist/core/streaming/AsyncStreamClientBridge.js +130 -0
- package/dist/core/streaming/AsyncStreamClientBridge.js.map +1 -0
- package/dist/core/streaming/index.d.ts +4 -0
- package/dist/core/streaming/index.d.ts.map +1 -0
- package/dist/core/streaming/index.js +4 -0
- package/dist/core/streaming/index.js.map +1 -0
- package/dist/core/tools/index.d.ts +13 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +8 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Task outcome telemetry — rolling KPI windows, adaptive execution,
|
|
3
|
+
* and alert generation. Extracted from AgentOSOrchestrator for readability.
|
|
4
|
+
*/
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function clampInteger(value, fallback, min, max) {
|
|
9
|
+
const n = Number(value);
|
|
10
|
+
if (!Number.isFinite(n))
|
|
11
|
+
return fallback;
|
|
12
|
+
return Math.max(min, Math.min(max, Math.trunc(n)));
|
|
13
|
+
}
|
|
14
|
+
export function resolveTaskOutcomeTelemetryConfig(config) {
|
|
15
|
+
const scope = config?.scope === 'global' || config?.scope === 'organization'
|
|
16
|
+
? config.scope
|
|
17
|
+
: 'organization_persona';
|
|
18
|
+
return {
|
|
19
|
+
enabled: config?.enabled !== false,
|
|
20
|
+
rollingWindowSize: clampInteger(config?.rollingWindowSize, 100, 5, 5000),
|
|
21
|
+
scope,
|
|
22
|
+
emitAlerts: config?.emitAlerts !== false,
|
|
23
|
+
alertBelowWeightedSuccessRate: Math.max(0, Math.min(1, Number(config?.alertBelowWeightedSuccessRate ?? 0.55))),
|
|
24
|
+
alertMinSamples: clampInteger(config?.alertMinSamples, 8, 1, 10000),
|
|
25
|
+
alertCooldownMs: clampInteger(config?.alertCooldownMs, 60000, 0, 86400000),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function resolveAdaptiveExecutionConfig(config) {
|
|
29
|
+
return {
|
|
30
|
+
enabled: config?.enabled !== false,
|
|
31
|
+
minSamples: clampInteger(config?.minSamples, 5, 1, 1000),
|
|
32
|
+
minWeightedSuccessRate: Math.max(0, Math.min(1, Number(config?.minWeightedSuccessRate ?? 0.7))),
|
|
33
|
+
forceAllToolsWhenDegraded: config?.forceAllToolsWhenDegraded !== false,
|
|
34
|
+
forceFailOpenWhenDegraded: config?.forceFailOpenWhenDegraded !== false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function sanitizeKpiEntry(raw) {
|
|
38
|
+
const status = raw?.status;
|
|
39
|
+
const validStatus = status === 'success' || status === 'partial' || status === 'failed' ? status : null;
|
|
40
|
+
if (!validStatus)
|
|
41
|
+
return null;
|
|
42
|
+
const scoreNum = Number(raw?.score);
|
|
43
|
+
const timestampNum = Number(raw?.timestamp);
|
|
44
|
+
if (!Number.isFinite(scoreNum) || !Number.isFinite(timestampNum))
|
|
45
|
+
return null;
|
|
46
|
+
return {
|
|
47
|
+
status: validStatus,
|
|
48
|
+
score: Math.max(0, Math.min(1, scoreNum)),
|
|
49
|
+
timestamp: Math.max(0, Math.trunc(timestampNum)),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function normalizeTaskOutcomeOverride(customFlags) {
|
|
53
|
+
if (!customFlags)
|
|
54
|
+
return null;
|
|
55
|
+
const raw = customFlags.taskOutcome ?? customFlags.task_outcome;
|
|
56
|
+
if (raw == null)
|
|
57
|
+
return null;
|
|
58
|
+
if (typeof raw === 'boolean') {
|
|
59
|
+
return {
|
|
60
|
+
status: raw ? 'success' : 'failed',
|
|
61
|
+
score: raw ? 1 : 0,
|
|
62
|
+
reason: 'Caller explicitly set task outcome boolean.',
|
|
63
|
+
source: 'request_override',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (typeof raw === 'number') {
|
|
67
|
+
const clamped = Math.max(0, Math.min(1, raw));
|
|
68
|
+
return {
|
|
69
|
+
status: clamped >= 0.7 ? 'success' : clamped >= 0.3 ? 'partial' : 'failed',
|
|
70
|
+
score: clamped,
|
|
71
|
+
reason: 'Caller supplied numeric task outcome score.',
|
|
72
|
+
source: 'request_override',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (typeof raw !== 'string' || !raw.trim())
|
|
76
|
+
return null;
|
|
77
|
+
const normalized = raw.trim().toLowerCase().replace(/\s+/g, '_').replace(/-/g, '_');
|
|
78
|
+
if (['success', 'succeeded', 'done', 'completed', 'true'].includes(normalized)) {
|
|
79
|
+
return { status: 'success', score: 1, reason: 'Caller marked task successful.', source: 'request_override' };
|
|
80
|
+
}
|
|
81
|
+
if (['failed', 'failure', 'error', 'false'].includes(normalized)) {
|
|
82
|
+
return { status: 'failed', score: 0, reason: 'Caller marked task failed.', source: 'request_override' };
|
|
83
|
+
}
|
|
84
|
+
if (['partial', 'partially', 'mixed'].includes(normalized)) {
|
|
85
|
+
return { status: 'partial', score: 0.5, reason: 'Caller marked task as partial.', source: 'request_override' };
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
function normalizeRequestedToolFailureMode(customFlags) {
|
|
90
|
+
if (!customFlags)
|
|
91
|
+
return null;
|
|
92
|
+
const raw = customFlags.toolFailureMode ?? customFlags.tool_failure_mode;
|
|
93
|
+
if (typeof raw !== 'string')
|
|
94
|
+
return null;
|
|
95
|
+
const normalized = raw.trim().toLowerCase().replace(/\s+/g, '_').replace(/-/g, '_');
|
|
96
|
+
if (normalized === 'fail_open')
|
|
97
|
+
return 'fail_open';
|
|
98
|
+
if (normalized === 'fail_closed')
|
|
99
|
+
return 'fail_closed';
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
export function evaluateTaskOutcome(args) {
|
|
103
|
+
const override = normalizeTaskOutcomeOverride(args.customFlags);
|
|
104
|
+
if (override)
|
|
105
|
+
return override;
|
|
106
|
+
if (args.didForceTerminate || args.finalOutput.error) {
|
|
107
|
+
return {
|
|
108
|
+
status: 'failed',
|
|
109
|
+
score: 0,
|
|
110
|
+
reason: args.didForceTerminate
|
|
111
|
+
? 'Turn force-terminated due to iteration cap.'
|
|
112
|
+
: 'Final response contains an error payload.',
|
|
113
|
+
source: 'heuristic',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const text = typeof args.finalOutput.responseText === 'string'
|
|
117
|
+
? args.finalOutput.responseText.trim()
|
|
118
|
+
: '';
|
|
119
|
+
if (text.length >= 48) {
|
|
120
|
+
return {
|
|
121
|
+
status: 'success',
|
|
122
|
+
score: args.degraded ? 0.85 : 0.95,
|
|
123
|
+
reason: 'Final response was produced without terminal errors.',
|
|
124
|
+
source: 'heuristic',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (text.length > 0 || (args.finalOutput.toolCalls?.length ?? 0) > 0) {
|
|
128
|
+
return {
|
|
129
|
+
status: 'partial',
|
|
130
|
+
score: args.degraded ? 0.5 : 0.6,
|
|
131
|
+
reason: 'Turn completed but produced a limited final response.',
|
|
132
|
+
source: 'heuristic',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
status: 'failed',
|
|
137
|
+
score: 0.1,
|
|
138
|
+
reason: 'No usable final response was produced.',
|
|
139
|
+
source: 'heuristic',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Manager
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
function normalizeOrganizationId(value) {
|
|
146
|
+
if (typeof value !== 'string')
|
|
147
|
+
return undefined;
|
|
148
|
+
const trimmed = value.trim();
|
|
149
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Manages rolling task outcome KPI windows, adaptive execution policies,
|
|
153
|
+
* and alert generation. Designed to be used as a delegate within AgentOSOrchestrator.
|
|
154
|
+
*/
|
|
155
|
+
export class TaskOutcomeTelemetryManager {
|
|
156
|
+
constructor(telemetryConfig, adaptiveConfig, store) {
|
|
157
|
+
this.telemetryConfig = telemetryConfig;
|
|
158
|
+
this.adaptiveConfig = adaptiveConfig;
|
|
159
|
+
this.store = store;
|
|
160
|
+
this.kpiWindows = new Map();
|
|
161
|
+
this.alertState = new Map();
|
|
162
|
+
}
|
|
163
|
+
async loadPersistedWindows() {
|
|
164
|
+
if (!this.store || !this.telemetryConfig.enabled)
|
|
165
|
+
return;
|
|
166
|
+
try {
|
|
167
|
+
const persisted = await this.store.loadWindows();
|
|
168
|
+
const cap = this.telemetryConfig.rollingWindowSize;
|
|
169
|
+
for (const [scopeKey, rawEntries] of Object.entries(persisted ?? {})) {
|
|
170
|
+
if (!Array.isArray(rawEntries))
|
|
171
|
+
continue;
|
|
172
|
+
const normalized = rawEntries
|
|
173
|
+
.map((entry) => sanitizeKpiEntry(entry))
|
|
174
|
+
.filter((entry) => Boolean(entry))
|
|
175
|
+
.sort((a, b) => a.timestamp - b.timestamp);
|
|
176
|
+
if (normalized.length === 0)
|
|
177
|
+
continue;
|
|
178
|
+
this.kpiWindows.set(scopeKey, normalized.slice(Math.max(0, normalized.length - cap)));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.warn('TaskOutcomeTelemetryManager: Failed to load persisted windows.', error);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
resolveScopeKey(args) {
|
|
186
|
+
const scope = this.telemetryConfig.scope;
|
|
187
|
+
const org = normalizeOrganizationId(args.organizationId) ?? 'none';
|
|
188
|
+
const persona = normalizeOrganizationId(args.personaId) ?? 'unknown';
|
|
189
|
+
if (scope === 'global')
|
|
190
|
+
return 'global';
|
|
191
|
+
if (scope === 'organization')
|
|
192
|
+
return `org:${org}`;
|
|
193
|
+
return `org:${org}:persona:${persona}`;
|
|
194
|
+
}
|
|
195
|
+
updateKpi(args) {
|
|
196
|
+
if (!this.telemetryConfig.enabled)
|
|
197
|
+
return null;
|
|
198
|
+
const scopeKey = this.resolveScopeKey(args);
|
|
199
|
+
const window = this.kpiWindows.get(scopeKey) ?? [];
|
|
200
|
+
window.push({
|
|
201
|
+
status: args.outcome.status,
|
|
202
|
+
score: Math.max(0, Math.min(1, Number(args.outcome.score) || 0)),
|
|
203
|
+
timestamp: Date.now(),
|
|
204
|
+
});
|
|
205
|
+
const cap = this.telemetryConfig.rollingWindowSize;
|
|
206
|
+
if (window.length > cap)
|
|
207
|
+
window.splice(0, window.length - cap);
|
|
208
|
+
this.kpiWindows.set(scopeKey, window);
|
|
209
|
+
if (this.store) {
|
|
210
|
+
void this.store
|
|
211
|
+
.saveWindow(scopeKey, window.map((e) => ({ ...e })))
|
|
212
|
+
.catch((err) => console.warn(`Failed to persist KPI window for '${scopeKey}'.`, err));
|
|
213
|
+
}
|
|
214
|
+
return this.summarizeWindow(scopeKey);
|
|
215
|
+
}
|
|
216
|
+
getCurrentKpi(args) {
|
|
217
|
+
if (!this.telemetryConfig.enabled)
|
|
218
|
+
return null;
|
|
219
|
+
return this.summarizeWindow(this.resolveScopeKey(args));
|
|
220
|
+
}
|
|
221
|
+
summarizeWindow(scopeKey) {
|
|
222
|
+
const window = this.kpiWindows.get(scopeKey) ?? [];
|
|
223
|
+
if (window.length === 0)
|
|
224
|
+
return null;
|
|
225
|
+
let successCount = 0, partialCount = 0, failedCount = 0, scoreSum = 0;
|
|
226
|
+
for (const entry of window) {
|
|
227
|
+
if (entry.status === 'success')
|
|
228
|
+
successCount++;
|
|
229
|
+
else if (entry.status === 'partial')
|
|
230
|
+
partialCount++;
|
|
231
|
+
else
|
|
232
|
+
failedCount++;
|
|
233
|
+
scoreSum += entry.score;
|
|
234
|
+
}
|
|
235
|
+
const sampleCount = window.length;
|
|
236
|
+
return {
|
|
237
|
+
scopeKey,
|
|
238
|
+
scopeMode: this.telemetryConfig.scope,
|
|
239
|
+
windowSize: this.telemetryConfig.rollingWindowSize,
|
|
240
|
+
sampleCount,
|
|
241
|
+
successCount,
|
|
242
|
+
partialCount,
|
|
243
|
+
failedCount,
|
|
244
|
+
successRate: sampleCount > 0 ? successCount / sampleCount : 0,
|
|
245
|
+
averageScore: sampleCount > 0 ? scoreSum / sampleCount : 0,
|
|
246
|
+
weightedSuccessRate: sampleCount > 0 ? scoreSum / sampleCount : 0,
|
|
247
|
+
timestamp: new Date().toISOString(),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
maybeApplyAdaptivePolicy(args) {
|
|
251
|
+
if (!this.adaptiveConfig.enabled || !args.turnPlan)
|
|
252
|
+
return { applied: false };
|
|
253
|
+
const kpi = this.getCurrentKpi({ organizationId: args.organizationId, personaId: args.personaId });
|
|
254
|
+
if (!kpi)
|
|
255
|
+
return { applied: false, kpi };
|
|
256
|
+
if (kpi.sampleCount < this.adaptiveConfig.minSamples)
|
|
257
|
+
return { applied: false, kpi };
|
|
258
|
+
if (kpi.weightedSuccessRate >= this.adaptiveConfig.minWeightedSuccessRate)
|
|
259
|
+
return { applied: false, kpi };
|
|
260
|
+
const reasons = [
|
|
261
|
+
`weightedSuccessRate=${kpi.weightedSuccessRate.toFixed(3)} below threshold=${this.adaptiveConfig.minWeightedSuccessRate.toFixed(3)}`,
|
|
262
|
+
];
|
|
263
|
+
let forcedToolSelectionMode = false;
|
|
264
|
+
let forcedToolFailureMode = false;
|
|
265
|
+
let preservedRequestedFailClosed = false;
|
|
266
|
+
if (this.adaptiveConfig.forceAllToolsWhenDegraded && args.turnPlan.policy.toolSelectionMode === 'discovered') {
|
|
267
|
+
args.turnPlan.policy.toolSelectionMode = 'all';
|
|
268
|
+
forcedToolSelectionMode = true;
|
|
269
|
+
reasons.push('toolSelectionMode switched discovered -> all');
|
|
270
|
+
}
|
|
271
|
+
if (this.adaptiveConfig.forceFailOpenWhenDegraded && args.turnPlan.policy.toolFailureMode !== 'fail_open') {
|
|
272
|
+
const requested = normalizeRequestedToolFailureMode(args.requestCustomFlags);
|
|
273
|
+
if (requested === 'fail_closed') {
|
|
274
|
+
preservedRequestedFailClosed = true;
|
|
275
|
+
reasons.push('preserved explicit request override toolFailureMode=fail_closed');
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const before = args.turnPlan.policy.toolFailureMode;
|
|
279
|
+
args.turnPlan.policy.toolFailureMode = 'fail_open';
|
|
280
|
+
forcedToolFailureMode = true;
|
|
281
|
+
reasons.push(`toolFailureMode switched ${before} -> fail_open`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (!forcedToolSelectionMode && !forcedToolFailureMode) {
|
|
285
|
+
return {
|
|
286
|
+
applied: false,
|
|
287
|
+
reason: preservedRequestedFailClosed
|
|
288
|
+
? 'Adaptive execution detected degraded KPI but preserved explicit fail-closed request override.'
|
|
289
|
+
: undefined,
|
|
290
|
+
kpi,
|
|
291
|
+
actions: preservedRequestedFailClosed ? { preservedRequestedFailClosed: true } : undefined,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
args.turnPlan.capability.fallbackApplied = true;
|
|
295
|
+
args.turnPlan.capability.fallbackReason = `Adaptive fallback applied: ${reasons.join('; ')}.`;
|
|
296
|
+
args.turnPlan.diagnostics.usedFallback = true;
|
|
297
|
+
return {
|
|
298
|
+
applied: true,
|
|
299
|
+
reason: args.turnPlan.capability.fallbackReason,
|
|
300
|
+
kpi,
|
|
301
|
+
actions: {
|
|
302
|
+
forcedToolSelectionMode,
|
|
303
|
+
forcedToolFailureMode,
|
|
304
|
+
preservedRequestedFailClosed: preservedRequestedFailClosed || undefined,
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
maybeBuildAlert(kpi) {
|
|
309
|
+
if (!this.telemetryConfig.enabled || !this.telemetryConfig.emitAlerts || !kpi)
|
|
310
|
+
return null;
|
|
311
|
+
if (kpi.sampleCount < this.telemetryConfig.alertMinSamples)
|
|
312
|
+
return null;
|
|
313
|
+
if (kpi.weightedSuccessRate >= this.telemetryConfig.alertBelowWeightedSuccessRate)
|
|
314
|
+
return null;
|
|
315
|
+
const now = Date.now();
|
|
316
|
+
const lastAlertAt = this.alertState.get(kpi.scopeKey) ?? 0;
|
|
317
|
+
if (this.telemetryConfig.alertCooldownMs > 0 && now - lastAlertAt < this.telemetryConfig.alertCooldownMs)
|
|
318
|
+
return null;
|
|
319
|
+
this.alertState.set(kpi.scopeKey, now);
|
|
320
|
+
return {
|
|
321
|
+
scopeKey: kpi.scopeKey,
|
|
322
|
+
severity: kpi.weightedSuccessRate < this.telemetryConfig.alertBelowWeightedSuccessRate * 0.6 ? 'critical' : 'warning',
|
|
323
|
+
reason: `Weighted success rate ${kpi.weightedSuccessRate.toFixed(3)} below alert threshold ${this.telemetryConfig.alertBelowWeightedSuccessRate.toFixed(3)}.`,
|
|
324
|
+
threshold: this.telemetryConfig.alertBelowWeightedSuccessRate,
|
|
325
|
+
value: kpi.weightedSuccessRate,
|
|
326
|
+
sampleCount: kpi.sampleCount,
|
|
327
|
+
timestamp: new Date(now).toISOString(),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=TaskOutcomeTelemetryManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskOutcomeTelemetryManager.js","sourceRoot":"","sources":["../../src/api/TaskOutcomeTelemetryManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Custom error class for AgentOS service facade errors.
|
|
3
|
+
*/
|
|
4
|
+
import { GMIError, GMIErrorCode } from '../utils/errors';
|
|
5
|
+
/**
|
|
6
|
+
* Custom error class for errors specifically originating from the AgentOS service facade.
|
|
7
|
+
* Provides a standardized way to represent errors encountered within the `AgentOS` class.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AgentOSServiceError extends GMIError {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
constructor(message: string, code: GMIErrorCode | string, details?: any, componentOrigin?: string);
|
|
12
|
+
/**
|
|
13
|
+
* Wraps an existing error within a new AgentOSServiceError instance.
|
|
14
|
+
*/
|
|
15
|
+
static wrap(error: any, code: GMIErrorCode | string, message: string, componentOrigin?: string): AgentOSServiceError;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;IAC/C,SAAyB,IAAI,EAAE,MAAM,CAAyB;gBAElD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,MAAM;IAKjG;;OAEG;WACoB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,mBAAmB;CAYrI"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Custom error class for AgentOS service facade errors.
|
|
3
|
+
*/
|
|
4
|
+
import { GMIError } from '../utils/errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* Custom error class for errors specifically originating from the AgentOS service facade.
|
|
7
|
+
* Provides a standardized way to represent errors encountered within the `AgentOS` class.
|
|
8
|
+
*/
|
|
9
|
+
export class AgentOSServiceError extends GMIError {
|
|
10
|
+
constructor(message, code, details, componentOrigin) {
|
|
11
|
+
super(message, code, details, componentOrigin);
|
|
12
|
+
this.name = 'AgentOSServiceError';
|
|
13
|
+
Object.setPrototypeOf(this, AgentOSServiceError.prototype);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Wraps an existing error within a new AgentOSServiceError instance.
|
|
17
|
+
*/
|
|
18
|
+
static wrap(error, code, message, componentOrigin) {
|
|
19
|
+
const baseMessage = error instanceof Error ? error.message : String(error);
|
|
20
|
+
const originalComponent = error instanceof GMIError ? error.component : undefined;
|
|
21
|
+
const originalDetails = error instanceof GMIError ? error.details : { underlyingError: error };
|
|
22
|
+
return new AgentOSServiceError(`${message}: ${baseMessage}`, code, originalDetails, componentOrigin || originalComponent);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAgB,MAAM,+BAA+B,CAAC;AAEvE;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAG/C,YAAY,OAAe,EAAE,IAA2B,EAAE,OAAa,EAAE,eAAwB;QAC/F,KAAK,CAAC,OAAO,EAAE,IAAoB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QAHxC,SAAI,GAAW,qBAAqB,CAAC;QAI5D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACI,MAAM,CAAU,IAAI,CAAC,KAAU,EAAE,IAA2B,EAAE,OAAe,EAAE,eAAwB;QAC5G,MAAM,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,iBAAiB,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,MAAM,eAAe,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QAE/F,OAAO,IAAI,mBAAmB,CAC5B,GAAG,OAAO,KAAK,WAAW,EAAE,EAC5B,IAAI,EACJ,eAAe,EACf,eAAe,IAAI,iBAAiB,CACrC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Conversation history assembly phase.
|
|
3
|
+
* Builds a trimmed, deduplicated history snapshot for prompt construction.
|
|
4
|
+
*/
|
|
5
|
+
import type { ConversationContext } from '../../core/conversation/ConversationContext';
|
|
6
|
+
import { type GMITurnInput } from '../../cognitive_substrate/IGMI';
|
|
7
|
+
import type { RollingSummaryCompactionConfig, RollingSummaryCompactionResult } from '../../core/conversation/RollingSummaryCompactor';
|
|
8
|
+
export interface ConversationHistoryPhaseInput {
|
|
9
|
+
conversationContext: ConversationContext | undefined;
|
|
10
|
+
gmiInput: GMITurnInput;
|
|
11
|
+
rollingSummaryEnabled: boolean;
|
|
12
|
+
rollingSummaryResult: RollingSummaryCompactionResult | null;
|
|
13
|
+
rollingSummaryText: string;
|
|
14
|
+
rollingSummaryConfigForTurn: RollingSummaryCompactionConfig | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a conversation history snapshot for prompt construction.
|
|
18
|
+
* When rolling summary is active, trims history to head messages + unsummarized tail.
|
|
19
|
+
* Deduplicates the current user message if already in history.
|
|
20
|
+
*/
|
|
21
|
+
export declare function assembleConversationHistory(input: ConversationHistoryPhaseInput): any[] | null;
|
|
22
|
+
//# sourceMappingURL=conversation-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-history.d.ts","sourceRoot":"","sources":["../../../src/api/turn-phases/conversation-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAEvF,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,KAAK,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AAEtI,MAAM,WAAW,6BAA6B;IAC5C,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACrD,QAAQ,EAAE,YAAY,CAAC;IACvB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oBAAoB,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC5D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAAC;CACpE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,6BAA6B,GAAG,GAAG,EAAE,GAAG,IAAI,CAkD9F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Conversation history assembly phase.
|
|
3
|
+
* Builds a trimmed, deduplicated history snapshot for prompt construction.
|
|
4
|
+
*/
|
|
5
|
+
import { MessageRole } from '../../core/conversation/ConversationMessage.js';
|
|
6
|
+
import { GMIInteractionType } from '../../cognitive_substrate/IGMI.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build a conversation history snapshot for prompt construction.
|
|
9
|
+
* When rolling summary is active, trims history to head messages + unsummarized tail.
|
|
10
|
+
* Deduplicates the current user message if already in history.
|
|
11
|
+
*/
|
|
12
|
+
export function assembleConversationHistory(input) {
|
|
13
|
+
const { conversationContext } = input;
|
|
14
|
+
if (!conversationContext)
|
|
15
|
+
return null;
|
|
16
|
+
const excludeRoles = new Set([MessageRole.ERROR, MessageRole.THOUGHT]);
|
|
17
|
+
const useTrimmedHistory = input.rollingSummaryEnabled &&
|
|
18
|
+
typeof input.rollingSummaryResult?.summaryUptoTimestamp === 'number' &&
|
|
19
|
+
input.rollingSummaryText.length > 0;
|
|
20
|
+
const rawHistory = useTrimmedHistory
|
|
21
|
+
? conversationContext.getAllMessages()
|
|
22
|
+
: conversationContext.getHistory(undefined, [MessageRole.ERROR, MessageRole.THOUGHT]);
|
|
23
|
+
let historyForPrompt = rawHistory.filter((m) => m && !excludeRoles.has(m.role));
|
|
24
|
+
// Deduplicate: remove the last user message if it matches the current inbound
|
|
25
|
+
const last = historyForPrompt[historyForPrompt.length - 1];
|
|
26
|
+
if (last?.role === MessageRole.USER) {
|
|
27
|
+
const content = typeof last.content === 'string' ? last.content.trim() : '';
|
|
28
|
+
const inbound = input.gmiInput.type === GMIInteractionType.TEXT && typeof input.gmiInput.content === 'string'
|
|
29
|
+
? input.gmiInput.content.trim()
|
|
30
|
+
: input.gmiInput.type === GMIInteractionType.MULTIMODAL_CONTENT
|
|
31
|
+
? JSON.stringify(input.gmiInput.content).trim()
|
|
32
|
+
: '';
|
|
33
|
+
if (content && inbound && content === inbound) {
|
|
34
|
+
historyForPrompt = historyForPrompt.slice(0, -1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// When rolling summary is active, keep head messages + unsummarized tail
|
|
38
|
+
if (useTrimmedHistory) {
|
|
39
|
+
const headCount = Math.max(0, input.rollingSummaryConfigForTurn?.headMessagesToKeep ?? 0);
|
|
40
|
+
const head = historyForPrompt.slice(0, Math.min(headCount, historyForPrompt.length));
|
|
41
|
+
const afterSummary = historyForPrompt.filter((m) => m && m.timestamp > input.rollingSummaryResult.summaryUptoTimestamp);
|
|
42
|
+
const merged = [];
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
for (const msg of [...head, ...afterSummary]) {
|
|
45
|
+
const id = typeof msg?.id === 'string' ? msg.id : '';
|
|
46
|
+
if (!id || seen.has(id))
|
|
47
|
+
continue;
|
|
48
|
+
seen.add(id);
|
|
49
|
+
merged.push(msg);
|
|
50
|
+
}
|
|
51
|
+
historyForPrompt = merged;
|
|
52
|
+
}
|
|
53
|
+
return historyForPrompt;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=conversation-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-history.js","sourceRoot":"","sources":["../../../src/api/turn-phases/conversation-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/turn-phases/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/turn-phases/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Long-term memory retrieval phase.
|
|
3
|
+
* Checks cadence, retrieves durable memories, and updates retrieval state.
|
|
4
|
+
*/
|
|
5
|
+
import type { ConversationContext } from '../../core/conversation/ConversationContext';
|
|
6
|
+
import type { ILongTermMemoryRetriever } from '../../core/conversation/ILongTermMemoryRetriever';
|
|
7
|
+
import { type ResolvedLongTermMemoryPolicy } from '../../core/conversation/LongTermMemoryPolicy';
|
|
8
|
+
import { type GMITurnInput } from '../../cognitive_substrate/IGMI';
|
|
9
|
+
export interface LongTermMemoryPhaseInput {
|
|
10
|
+
conversationContext: ConversationContext | undefined;
|
|
11
|
+
longTermMemoryRetriever: ILongTermMemoryRetriever | undefined;
|
|
12
|
+
longTermMemoryPolicy: ResolvedLongTermMemoryPolicy | null;
|
|
13
|
+
gmiInput: GMITurnInput;
|
|
14
|
+
streamId: string;
|
|
15
|
+
userId: string;
|
|
16
|
+
organizationId: string | undefined;
|
|
17
|
+
conversationId: string;
|
|
18
|
+
personaId: string;
|
|
19
|
+
modeForRouting: string;
|
|
20
|
+
recallConfig: {
|
|
21
|
+
cadenceTurns: number;
|
|
22
|
+
forceOnCompaction: boolean;
|
|
23
|
+
maxContextChars: number;
|
|
24
|
+
topKByScope: Record<'user' | 'persona' | 'organization', number>;
|
|
25
|
+
};
|
|
26
|
+
didCompact: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface LongTermMemoryPhaseResult {
|
|
29
|
+
contextText: string | null;
|
|
30
|
+
diagnostics: Record<string, unknown> | undefined;
|
|
31
|
+
shouldReview: boolean;
|
|
32
|
+
reviewReason: string | null;
|
|
33
|
+
}
|
|
34
|
+
export declare function executeLongTermMemoryPhase(input: LongTermMemoryPhaseInput): Promise<LongTermMemoryPhaseResult>;
|
|
35
|
+
//# sourceMappingURL=long-term-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"long-term-memory.d.ts","sourceRoot":"","sources":["../../../src/api/turn-phases/long-term-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAOvF,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACrD,uBAAuB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC9D,oBAAoB,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC1D,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,cAAc,EAAE,MAAM,CAAC,CAAC;KAClE,CAAC;IACF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CA+FpC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Long-term memory retrieval phase.
|
|
3
|
+
* Checks cadence, retrieves durable memories, and updates retrieval state.
|
|
4
|
+
*/
|
|
5
|
+
import { DEFAULT_LONG_TERM_MEMORY_POLICY, } from '../../core/conversation/LongTermMemoryPolicy.js';
|
|
6
|
+
import { MessageRole } from '../../core/conversation/ConversationMessage.js';
|
|
7
|
+
import { GMIInteractionType } from '../../cognitive_substrate/IGMI.js';
|
|
8
|
+
export async function executeLongTermMemoryPhase(input) {
|
|
9
|
+
const { conversationContext, longTermMemoryRetriever, longTermMemoryPolicy, } = input;
|
|
10
|
+
const policyEnabled = Boolean(longTermMemoryPolicy?.enabled);
|
|
11
|
+
const hasScopes = Boolean(longTermMemoryPolicy?.scopes?.user) ||
|
|
12
|
+
Boolean(longTermMemoryPolicy?.scopes?.persona) ||
|
|
13
|
+
Boolean(longTermMemoryPolicy?.scopes?.organization);
|
|
14
|
+
if (!conversationContext || !longTermMemoryRetriever || !policyEnabled || !hasScopes) {
|
|
15
|
+
return {
|
|
16
|
+
contextText: null,
|
|
17
|
+
diagnostics: undefined,
|
|
18
|
+
shouldReview: false,
|
|
19
|
+
reviewReason: 'retriever_not_applicable',
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const queryText = input.gmiInput.type === GMIInteractionType.TEXT && typeof input.gmiInput.content === 'string'
|
|
24
|
+
? input.gmiInput.content.trim()
|
|
25
|
+
: input.gmiInput.type === GMIInteractionType.MULTIMODAL_CONTENT
|
|
26
|
+
? JSON.stringify(input.gmiInput.content).trim()
|
|
27
|
+
: '';
|
|
28
|
+
const userTurnCount = conversationContext.getAllMessages().filter((m) => m?.role === MessageRole.USER).length;
|
|
29
|
+
const { cadenceTurns, forceOnCompaction } = input.recallConfig;
|
|
30
|
+
const rawState = conversationContext.getMetadata('longTermMemoryRetrievalState');
|
|
31
|
+
const prevState = rawState &&
|
|
32
|
+
typeof rawState === 'object' &&
|
|
33
|
+
typeof rawState.lastReviewedUserTurn === 'number'
|
|
34
|
+
? rawState
|
|
35
|
+
: null;
|
|
36
|
+
const turnsSinceReview = prevState
|
|
37
|
+
? Math.max(0, userTurnCount - prevState.lastReviewedUserTurn)
|
|
38
|
+
: Number.POSITIVE_INFINITY;
|
|
39
|
+
const dueToCadence = !prevState || turnsSinceReview >= cadenceTurns;
|
|
40
|
+
const dueToCompaction = forceOnCompaction && input.didCompact;
|
|
41
|
+
const shouldReview = dueToCadence || dueToCompaction;
|
|
42
|
+
let reviewReason;
|
|
43
|
+
if (shouldReview) {
|
|
44
|
+
reviewReason = !prevState ? 'initial_review' : dueToCompaction ? 'forced_on_compaction' : 'cadence_due';
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
reviewReason = 'cadence_not_due';
|
|
48
|
+
}
|
|
49
|
+
let contextText = null;
|
|
50
|
+
let diagnostics;
|
|
51
|
+
if (shouldReview && queryText.length > 0) {
|
|
52
|
+
const retrievalResult = await longTermMemoryRetriever.retrieveLongTermMemory({
|
|
53
|
+
userId: input.userId,
|
|
54
|
+
organizationId: input.organizationId,
|
|
55
|
+
conversationId: input.conversationId,
|
|
56
|
+
personaId: input.personaId,
|
|
57
|
+
mode: input.modeForRouting,
|
|
58
|
+
queryText,
|
|
59
|
+
memoryPolicy: longTermMemoryPolicy ?? DEFAULT_LONG_TERM_MEMORY_POLICY,
|
|
60
|
+
maxContextChars: input.recallConfig.maxContextChars,
|
|
61
|
+
topKByScope: input.recallConfig.topKByScope,
|
|
62
|
+
});
|
|
63
|
+
if (retrievalResult?.contextText?.trim()) {
|
|
64
|
+
contextText = retrievalResult.contextText.trim();
|
|
65
|
+
diagnostics = retrievalResult.diagnostics;
|
|
66
|
+
}
|
|
67
|
+
conversationContext.setMetadata('longTermMemoryRetrievalState', {
|
|
68
|
+
lastReviewedUserTurn: userTurnCount,
|
|
69
|
+
lastReviewedAt: Date.now(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else if (shouldReview && queryText.length === 0) {
|
|
73
|
+
reviewReason = 'empty_query';
|
|
74
|
+
}
|
|
75
|
+
return { contextText, diagnostics, shouldReview, reviewReason };
|
|
76
|
+
}
|
|
77
|
+
catch (retrievalError) {
|
|
78
|
+
console.warn(`Long-term memory retrieval failed for stream ${input.streamId} (continuing without it).`, retrievalError);
|
|
79
|
+
return { contextText: null, diagnostics: undefined, shouldReview: true, reviewReason: 'retrieval_error' };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=long-term-memory.js.map
|