@bowenqt/qiniu-ai-sdk 0.15.0 → 0.17.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/ai/agent-graph.d.ts +5 -0
- package/dist/ai/agent-graph.d.ts.map +1 -1
- package/dist/ai/agent-graph.js +21 -2
- package/dist/ai/agent-graph.js.map +1 -1
- package/dist/ai/agent-graph.mjs +21 -2
- package/dist/ai/create-agent.d.ts +3 -0
- package/dist/ai/create-agent.d.ts.map +1 -1
- package/dist/ai/create-agent.js +6 -5
- package/dist/ai/create-agent.js.map +1 -1
- package/dist/ai/create-agent.mjs +6 -5
- package/dist/ai/generate-object.d.ts.map +1 -1
- package/dist/ai/generate-object.js +7 -1
- package/dist/ai/generate-object.js.map +1 -1
- package/dist/ai/generate-object.mjs +7 -1
- package/dist/ai/generate-text.d.ts +9 -1
- package/dist/ai/generate-text.d.ts.map +1 -1
- package/dist/ai/generate-text.js +25 -4
- package/dist/ai/generate-text.js.map +1 -1
- package/dist/ai/generate-text.mjs +25 -4
- package/dist/ai/internal-types.d.ts +11 -0
- package/dist/ai/internal-types.d.ts.map +1 -1
- package/dist/ai/internal-types.js +15 -0
- package/dist/ai/internal-types.js.map +1 -1
- package/dist/ai/internal-types.mjs +13 -0
- package/dist/ai/memory/index.d.ts +147 -0
- package/dist/ai/memory/index.d.ts.map +1 -0
- package/dist/ai/memory/index.js +240 -0
- package/dist/ai/memory/index.js.map +1 -0
- package/dist/ai/memory/index.mjs +234 -0
- package/dist/ai/nodes/memory-node.d.ts.map +1 -1
- package/dist/ai/nodes/memory-node.js +14 -16
- package/dist/ai/nodes/memory-node.js.map +1 -1
- package/dist/ai/nodes/memory-node.mjs +15 -17
- package/dist/ai/stream-object.d.ts +109 -0
- package/dist/ai/stream-object.d.ts.map +1 -0
- package/dist/ai/stream-object.js +383 -0
- package/dist/ai/stream-object.js.map +1 -0
- package/dist/ai/stream-object.mjs +347 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -1
- package/dist/lib/capability-cache.d.ts +72 -0
- package/dist/lib/capability-cache.d.ts.map +1 -0
- package/dist/lib/capability-cache.js +117 -0
- package/dist/lib/capability-cache.js.map +1 -0
- package/dist/lib/capability-cache.mjs +113 -0
- package/dist/lib/content-converter.d.ts +33 -0
- package/dist/lib/content-converter.d.ts.map +1 -0
- package/dist/lib/content-converter.js +166 -0
- package/dist/lib/content-converter.js.map +1 -0
- package/dist/lib/content-converter.mjs +161 -0
- package/dist/lib/messages.js +4 -3
- package/dist/lib/messages.js.map +1 -1
- package/dist/lib/messages.mjs +4 -3
- package/dist/lib/partial-json-parser.d.ts +63 -0
- package/dist/lib/partial-json-parser.d.ts.map +1 -0
- package/dist/lib/partial-json-parser.js +142 -0
- package/dist/lib/partial-json-parser.js.map +1 -0
- package/dist/lib/partial-json-parser.mjs +137 -0
- package/dist/lib/token-estimator.d.ts.map +1 -1
- package/dist/lib/token-estimator.js +3 -2
- package/dist/lib/token-estimator.js.map +1 -1
- package/dist/lib/token-estimator.mjs +3 -2
- package/dist/lib/types.d.ts +20 -4
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MaxStepsExceededError, ToolExecutionError } from '../lib/errors.mjs';
|
|
2
2
|
import { checkApproval } from './tool-approval.mjs';
|
|
3
|
+
import { normalizeContent } from '../lib/content-converter.mjs';
|
|
3
4
|
export async function generateText(options) {
|
|
4
5
|
const { client, model, tools, maxSteps = 1, onStepFinish, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, approvalConfig, } = options;
|
|
5
6
|
const messages = normalizeMessages(options);
|
|
@@ -107,9 +108,14 @@ function normalizeMessages(options) {
|
|
|
107
108
|
}
|
|
108
109
|
function buildChatRequest(params) {
|
|
109
110
|
const { model, messages, tools, temperature, topP, maxTokens, responseFormat, toolChoice } = params;
|
|
111
|
+
// Normalize multimodal content (image -> image_url) for API compatibility
|
|
112
|
+
const normalizedMessages = messages.map(msg => ({
|
|
113
|
+
...msg,
|
|
114
|
+
content: normalizeContent(msg.content),
|
|
115
|
+
}));
|
|
110
116
|
return {
|
|
111
117
|
model,
|
|
112
|
-
messages,
|
|
118
|
+
messages: normalizedMessages,
|
|
113
119
|
temperature,
|
|
114
120
|
top_p: topP,
|
|
115
121
|
max_tokens: maxTokens,
|
|
@@ -284,12 +290,17 @@ async function executeTools(toolCalls, tools, messages, abortSignal, approvalCon
|
|
|
284
290
|
const args = parseToolArguments(toolCall.function.arguments);
|
|
285
291
|
// Check approval if tool requires it
|
|
286
292
|
if (tool.requiresApproval) {
|
|
293
|
+
// Validate source if provided (fail fast for JS callers with incomplete source)
|
|
294
|
+
if (tool.source && !tool.source.namespace) {
|
|
295
|
+
throw new Error(`Tool '${toolCall.function.name}' has source.type but missing source.namespace`);
|
|
296
|
+
}
|
|
297
|
+
const toolSource = tool.source ?? { type: 'user', namespace: 'generateText' };
|
|
287
298
|
// Create a minimal RegisteredTool-compatible object for checkApproval
|
|
288
299
|
const toolForApproval = {
|
|
289
300
|
name: toolCall.function.name,
|
|
290
301
|
description: tool.description ?? '',
|
|
291
302
|
parameters: (tool.parameters ?? {}),
|
|
292
|
-
source:
|
|
303
|
+
source: toolSource,
|
|
293
304
|
requiresApproval: tool.requiresApproval,
|
|
294
305
|
approvalHandler: tool.approvalHandler,
|
|
295
306
|
};
|
|
@@ -350,7 +361,7 @@ import { AgentGraph } from './agent-graph.mjs';
|
|
|
350
361
|
* ```
|
|
351
362
|
*/
|
|
352
363
|
export async function generateTextWithGraph(options) {
|
|
353
|
-
const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, checkpointer, threadId, resumeFromCheckpoint = true, } = options;
|
|
364
|
+
const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, checkpointer, threadId, resumeFromCheckpoint = true, memory, } = options;
|
|
354
365
|
// Validate checkpointer + threadId combination
|
|
355
366
|
if (checkpointer && !threadId) {
|
|
356
367
|
throw new Error('threadId is required when checkpointer is provided');
|
|
@@ -383,6 +394,11 @@ export async function generateTextWithGraph(options) {
|
|
|
383
394
|
for (const [name, tool] of Object.entries(tools)) {
|
|
384
395
|
// Convert parameters using same logic as generateText
|
|
385
396
|
const convertedParams = convertToolParameters(tool.parameters);
|
|
397
|
+
// Validate source if provided (fail fast for JS callers with incomplete source)
|
|
398
|
+
if (tool.source && !tool.source.namespace) {
|
|
399
|
+
throw new Error(`Tool '${name}' has source.type but missing source.namespace`);
|
|
400
|
+
}
|
|
401
|
+
const toolSource = tool.source ?? { type: 'user', namespace: 'generateText' };
|
|
386
402
|
registeredTools[name] = {
|
|
387
403
|
name,
|
|
388
404
|
description: tool.description || '',
|
|
@@ -391,7 +407,10 @@ export async function generateTextWithGraph(options) {
|
|
|
391
407
|
properties: convertedParams.properties || convertedParams,
|
|
392
408
|
required: convertedParams.required,
|
|
393
409
|
},
|
|
394
|
-
source:
|
|
410
|
+
source: toolSource,
|
|
411
|
+
// Propagate approval fields for unified behavior
|
|
412
|
+
requiresApproval: tool.requiresApproval,
|
|
413
|
+
approvalHandler: tool.approvalHandler,
|
|
395
414
|
execute: tool.execute
|
|
396
415
|
? async (args, execContext) => {
|
|
397
416
|
// Use context from execute-node (has real toolCallId), fallback to currentMessages
|
|
@@ -452,6 +471,8 @@ export async function generateTextWithGraph(options) {
|
|
|
452
471
|
onNodeExit: onNodeExit,
|
|
453
472
|
},
|
|
454
473
|
approvalConfig: options.approvalConfig,
|
|
474
|
+
memory,
|
|
475
|
+
threadId,
|
|
455
476
|
});
|
|
456
477
|
// Execute graph
|
|
457
478
|
const graphResult = await graph.invoke(messages);
|
|
@@ -12,6 +12,8 @@ import type { ApprovalConfig } from './tool-approval';
|
|
|
12
12
|
export interface MessageMeta {
|
|
13
13
|
/** Skill ID for skill-injected messages */
|
|
14
14
|
skillId?: string;
|
|
15
|
+
/** Summary ID for memory-injected summary messages */
|
|
16
|
+
summaryId?: string;
|
|
15
17
|
/** Whether this message can be dropped during compaction */
|
|
16
18
|
droppable?: boolean;
|
|
17
19
|
/** Original message index before injection */
|
|
@@ -109,4 +111,13 @@ export declare function isDroppable(message: InternalMessage): boolean;
|
|
|
109
111
|
* Get skill ID from message.
|
|
110
112
|
*/
|
|
111
113
|
export declare function getSkillId(message: InternalMessage): string | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Get summary ID from message.
|
|
116
|
+
*/
|
|
117
|
+
export declare function getSummaryId(message: InternalMessage): string | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Check if a message can be compacted (has skill or summary ID).
|
|
120
|
+
* Used by memory-node to determine which droppable messages to remove.
|
|
121
|
+
*/
|
|
122
|
+
export declare function getDroppableId(message: InternalMessage): string | undefined;
|
|
112
123
|
//# sourceMappingURL=internal-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-types.d.ts","sourceRoot":"","sources":["../../src/ai/internal-types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"internal-types.d.ts","sourceRoot":"","sources":["../../src/ai/internal-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.stripMeta = stripMeta;
|
|
8
8
|
exports.isDroppable = isDroppable;
|
|
9
9
|
exports.getSkillId = getSkillId;
|
|
10
|
+
exports.getSummaryId = getSummaryId;
|
|
11
|
+
exports.getDroppableId = getDroppableId;
|
|
10
12
|
/**
|
|
11
13
|
* Strip internal metadata from messages before API call.
|
|
12
14
|
*/
|
|
@@ -25,4 +27,17 @@ function isDroppable(message) {
|
|
|
25
27
|
function getSkillId(message) {
|
|
26
28
|
return message._meta?.skillId;
|
|
27
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Get summary ID from message.
|
|
32
|
+
*/
|
|
33
|
+
function getSummaryId(message) {
|
|
34
|
+
return message._meta?.summaryId;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a message can be compacted (has skill or summary ID).
|
|
38
|
+
* Used by memory-node to determine which droppable messages to remove.
|
|
39
|
+
*/
|
|
40
|
+
function getDroppableId(message) {
|
|
41
|
+
return message._meta?.skillId ?? message._meta?.summaryId;
|
|
42
|
+
}
|
|
28
43
|
//# sourceMappingURL=internal-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-types.js","sourceRoot":"","sources":["../../src/ai/internal-types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;
|
|
1
|
+
{"version":3,"file":"internal-types.js","sourceRoot":"","sources":["../../src/ai/internal-types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AA2GH,8BAEC;AAKD,kCAEC;AAKD,gCAEC;AAKD,oCAEC;AAMD,wCAEC;AAlCD;;GAEG;AACH,SAAgB,SAAS,CAAC,QAA2B;IACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAkB,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAwB;IAChD,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAwB;IAC/C,OAAO,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAwB;IACjD,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,OAAwB;IACnD,OAAO,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AAC9D,CAAC"}
|
|
@@ -20,4 +20,17 @@ export function isDroppable(message) {
|
|
|
20
20
|
export function getSkillId(message) {
|
|
21
21
|
return message._meta?.skillId;
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Get summary ID from message.
|
|
25
|
+
*/
|
|
26
|
+
export function getSummaryId(message) {
|
|
27
|
+
return message._meta?.summaryId;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a message can be compacted (has skill or summary ID).
|
|
31
|
+
* Used by memory-node to determine which droppable messages to remove.
|
|
32
|
+
*/
|
|
33
|
+
export function getDroppableId(message) {
|
|
34
|
+
return message._meta?.skillId ?? message._meta?.summaryId;
|
|
35
|
+
}
|
|
23
36
|
//# sourceMappingURL=internal-types.js.map
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Manager for Agent conversations.
|
|
3
|
+
* Provides short-term and long-term memory management with automatic summarization.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { MemoryManager, InMemoryVectorStore } from '@bowenqt/qiniu-ai-sdk';
|
|
8
|
+
*
|
|
9
|
+
* const memory = new MemoryManager({
|
|
10
|
+
* shortTerm: { maxMessages: 20 },
|
|
11
|
+
* summarizer: {
|
|
12
|
+
* enabled: true,
|
|
13
|
+
* threshold: 50,
|
|
14
|
+
* client,
|
|
15
|
+
* model: 'gemini-2.5-flash',
|
|
16
|
+
* },
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Apply memory to messages before sending to LLM
|
|
20
|
+
* const processedMessages = await memory.process(messages, options);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import type { InternalMessage, MessageMeta } from '../internal-types';
|
|
24
|
+
/** Short-term memory configuration */
|
|
25
|
+
export interface ShortTermMemoryConfig {
|
|
26
|
+
/** Maximum number of recent messages to keep */
|
|
27
|
+
maxMessages?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Summarizer configuration */
|
|
30
|
+
export interface SummarizerConfig {
|
|
31
|
+
/** Enable automatic summarization */
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
/** Message count threshold to trigger summarization */
|
|
34
|
+
threshold?: number;
|
|
35
|
+
/** System prompt for summarization */
|
|
36
|
+
systemPrompt?: string;
|
|
37
|
+
}
|
|
38
|
+
/** Vector store interface for long-term memory */
|
|
39
|
+
export interface VectorStore {
|
|
40
|
+
/** Add documents to the store */
|
|
41
|
+
add(documents: VectorDocument[]): Promise<void>;
|
|
42
|
+
/** Search for similar documents */
|
|
43
|
+
search(query: string, limit?: number): Promise<VectorDocument[]>;
|
|
44
|
+
/** Clear all documents */
|
|
45
|
+
clear(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
/** Document for vector storage */
|
|
48
|
+
export interface VectorDocument {
|
|
49
|
+
id: string;
|
|
50
|
+
content: string;
|
|
51
|
+
metadata?: Record<string, unknown>;
|
|
52
|
+
embedding?: number[];
|
|
53
|
+
}
|
|
54
|
+
/** Long-term memory configuration */
|
|
55
|
+
export interface LongTermMemoryConfig {
|
|
56
|
+
/** Vector store implementation */
|
|
57
|
+
store: VectorStore;
|
|
58
|
+
/** Number of documents to retrieve */
|
|
59
|
+
retrieveLimit?: number;
|
|
60
|
+
}
|
|
61
|
+
/** Memory manager configuration */
|
|
62
|
+
export interface MemoryConfig {
|
|
63
|
+
/** Short-term memory (sliding window) */
|
|
64
|
+
shortTerm?: ShortTermMemoryConfig;
|
|
65
|
+
/** Long-term memory (vector store) */
|
|
66
|
+
longTerm?: LongTermMemoryConfig;
|
|
67
|
+
/** Automatic summarization */
|
|
68
|
+
summarizer?: SummarizerConfig;
|
|
69
|
+
}
|
|
70
|
+
/** Memory processing options */
|
|
71
|
+
export interface MemoryProcessOptions {
|
|
72
|
+
/** Thread ID for memory isolation */
|
|
73
|
+
threadId?: string;
|
|
74
|
+
/** Whether to generate summary if threshold exceeded */
|
|
75
|
+
generateSummary?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** Memory processing result */
|
|
78
|
+
export interface MemoryProcessResult {
|
|
79
|
+
/** Processed messages ready for LLM */
|
|
80
|
+
messages: InternalMessage[];
|
|
81
|
+
/** Whether summarization was triggered */
|
|
82
|
+
summarized: boolean;
|
|
83
|
+
/** Generated summary (if any) */
|
|
84
|
+
summary?: string;
|
|
85
|
+
/** Number of messages dropped */
|
|
86
|
+
droppedCount: number;
|
|
87
|
+
}
|
|
88
|
+
/** Summary message metadata */
|
|
89
|
+
export interface SummaryMeta extends MessageMeta {
|
|
90
|
+
summaryId: string;
|
|
91
|
+
droppable: true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Simple in-memory vector store for testing and small-scale use.
|
|
95
|
+
* Uses cosine similarity for search (requires embeddings).
|
|
96
|
+
*/
|
|
97
|
+
export declare class InMemoryVectorStore implements VectorStore {
|
|
98
|
+
private documents;
|
|
99
|
+
add(documents: VectorDocument[]): Promise<void>;
|
|
100
|
+
search(query: string, limit?: number): Promise<VectorDocument[]>;
|
|
101
|
+
clear(): Promise<void>;
|
|
102
|
+
private textSimilarity;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Memory manager for agent conversations.
|
|
106
|
+
* Handles short-term (sliding window) and long-term (vector) memory.
|
|
107
|
+
*/
|
|
108
|
+
export declare class MemoryManager {
|
|
109
|
+
private config;
|
|
110
|
+
private summaries;
|
|
111
|
+
constructor(config?: MemoryConfig);
|
|
112
|
+
/**
|
|
113
|
+
* Process messages with memory management.
|
|
114
|
+
* Applies summarization, trimming, and long-term retrieval.
|
|
115
|
+
*/
|
|
116
|
+
process(messages: InternalMessage[], options?: MemoryProcessOptions): Promise<MemoryProcessResult>;
|
|
117
|
+
/**
|
|
118
|
+
* Generate summary from messages.
|
|
119
|
+
* Override this method for custom summarization logic.
|
|
120
|
+
*/
|
|
121
|
+
protected generateSummary(messages: InternalMessage[], _threadId: string): Promise<string>;
|
|
122
|
+
/**
|
|
123
|
+
* Store messages to long-term memory.
|
|
124
|
+
*/
|
|
125
|
+
persist(messages: InternalMessage[], threadId: string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Clear memory for a thread.
|
|
128
|
+
*/
|
|
129
|
+
clearThread(threadId: string): void;
|
|
130
|
+
/**
|
|
131
|
+
* Clear all memory.
|
|
132
|
+
*/
|
|
133
|
+
clearAll(): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Get current summary for a thread.
|
|
136
|
+
*/
|
|
137
|
+
getSummary(threadId: string): string | undefined;
|
|
138
|
+
/**
|
|
139
|
+
* Set summary for a thread (manual override).
|
|
140
|
+
*/
|
|
141
|
+
setSummary(threadId: string, summary: string): void;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if a message is droppable (skill or summary).
|
|
145
|
+
*/
|
|
146
|
+
export declare function isDroppable(message: InternalMessage): boolean;
|
|
147
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/memory/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Memory Manager for Agent conversations.
|
|
4
|
+
* Provides short-term and long-term memory management with automatic summarization.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { MemoryManager, InMemoryVectorStore } from '@bowenqt/qiniu-ai-sdk';
|
|
9
|
+
*
|
|
10
|
+
* const memory = new MemoryManager({
|
|
11
|
+
* shortTerm: { maxMessages: 20 },
|
|
12
|
+
* summarizer: {
|
|
13
|
+
* enabled: true,
|
|
14
|
+
* threshold: 50,
|
|
15
|
+
* client,
|
|
16
|
+
* model: 'gemini-2.5-flash',
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Apply memory to messages before sending to LLM
|
|
21
|
+
* const processedMessages = await memory.process(messages, options);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.MemoryManager = exports.InMemoryVectorStore = void 0;
|
|
26
|
+
exports.isDroppable = isDroppable;
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// In-Memory Vector Store (Simple Implementation)
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Simple in-memory vector store for testing and small-scale use.
|
|
32
|
+
* Uses cosine similarity for search (requires embeddings).
|
|
33
|
+
*/
|
|
34
|
+
class InMemoryVectorStore {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.documents = [];
|
|
37
|
+
}
|
|
38
|
+
async add(documents) {
|
|
39
|
+
this.documents.push(...documents);
|
|
40
|
+
}
|
|
41
|
+
async search(query, limit = 5) {
|
|
42
|
+
// Simple text search (no embeddings)
|
|
43
|
+
// In production, use proper embeddings and vector similarity
|
|
44
|
+
const queryLower = query.toLowerCase();
|
|
45
|
+
const scored = this.documents.map(doc => ({
|
|
46
|
+
doc,
|
|
47
|
+
score: this.textSimilarity(queryLower, doc.content.toLowerCase()),
|
|
48
|
+
}));
|
|
49
|
+
return scored
|
|
50
|
+
.sort((a, b) => b.score - a.score)
|
|
51
|
+
.slice(0, limit)
|
|
52
|
+
.map(s => s.doc);
|
|
53
|
+
}
|
|
54
|
+
async clear() {
|
|
55
|
+
this.documents = [];
|
|
56
|
+
}
|
|
57
|
+
textSimilarity(a, b) {
|
|
58
|
+
// Simple word overlap score
|
|
59
|
+
const wordsA = new Set(a.split(/\s+/));
|
|
60
|
+
const wordsB = new Set(b.split(/\s+/));
|
|
61
|
+
let overlap = 0;
|
|
62
|
+
for (const word of wordsA) {
|
|
63
|
+
if (wordsB.has(word))
|
|
64
|
+
overlap++;
|
|
65
|
+
}
|
|
66
|
+
return overlap / Math.max(wordsA.size, wordsB.size, 1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.InMemoryVectorStore = InMemoryVectorStore;
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Memory Manager
|
|
72
|
+
// ============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Memory manager for agent conversations.
|
|
75
|
+
* Handles short-term (sliding window) and long-term (vector) memory.
|
|
76
|
+
*/
|
|
77
|
+
class MemoryManager {
|
|
78
|
+
constructor(config = {}) {
|
|
79
|
+
this.summaries = new Map(); // threadId -> summary
|
|
80
|
+
this.config = {
|
|
81
|
+
shortTerm: { maxMessages: 50, ...config.shortTerm },
|
|
82
|
+
...config,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Process messages with memory management.
|
|
87
|
+
* Applies summarization, trimming, and long-term retrieval.
|
|
88
|
+
*/
|
|
89
|
+
async process(messages, options = {}) {
|
|
90
|
+
const { threadId = 'default', generateSummary = true } = options;
|
|
91
|
+
let processedMessages = [...messages];
|
|
92
|
+
let summarized = false;
|
|
93
|
+
let summary;
|
|
94
|
+
let droppedCount = 0;
|
|
95
|
+
// 1. Check if summarization is needed
|
|
96
|
+
const threshold = this.config.summarizer?.threshold ?? 50;
|
|
97
|
+
if (this.config.summarizer?.enabled &&
|
|
98
|
+
generateSummary &&
|
|
99
|
+
messages.length > threshold) {
|
|
100
|
+
// Generate summary from older messages
|
|
101
|
+
const messagesToSummarize = messages.slice(0, messages.length - Math.floor(threshold / 2));
|
|
102
|
+
summary = await this.generateSummary(messagesToSummarize, threadId);
|
|
103
|
+
this.summaries.set(threadId, summary);
|
|
104
|
+
summarized = true;
|
|
105
|
+
}
|
|
106
|
+
// 2. Apply short-term memory (sliding window)
|
|
107
|
+
const maxMessages = this.config.shortTerm?.maxMessages ?? 50;
|
|
108
|
+
if (processedMessages.length > maxMessages) {
|
|
109
|
+
droppedCount = processedMessages.length - maxMessages;
|
|
110
|
+
processedMessages = processedMessages.slice(-maxMessages);
|
|
111
|
+
}
|
|
112
|
+
// 3. Inject summary if available
|
|
113
|
+
const existingSummary = this.summaries.get(threadId);
|
|
114
|
+
if (existingSummary) {
|
|
115
|
+
const summaryMessage = {
|
|
116
|
+
role: 'system',
|
|
117
|
+
content: `[CONVERSATION SUMMARY]\n${existingSummary}`,
|
|
118
|
+
_meta: {
|
|
119
|
+
summaryId: `summary_${threadId}`,
|
|
120
|
+
droppable: true,
|
|
121
|
+
priority: 100, // Low priority (drop first)
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
// Insert after first system message
|
|
125
|
+
const firstSystemIdx = processedMessages.findIndex(m => m.role === 'system');
|
|
126
|
+
if (firstSystemIdx >= 0) {
|
|
127
|
+
processedMessages.splice(firstSystemIdx + 1, 0, summaryMessage);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
processedMessages.unshift(summaryMessage);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 4. Long-term retrieval (if configured)
|
|
134
|
+
if (this.config.longTerm) {
|
|
135
|
+
const lastUserMessage = [...messages].reverse().find(m => m.role === 'user');
|
|
136
|
+
if (lastUserMessage && typeof lastUserMessage.content === 'string') {
|
|
137
|
+
const retrieved = await this.config.longTerm.store.search(lastUserMessage.content, this.config.longTerm.retrieveLimit ?? 3);
|
|
138
|
+
if (retrieved.length > 0) {
|
|
139
|
+
const contextMessage = {
|
|
140
|
+
role: 'system',
|
|
141
|
+
content: `[RELEVANT CONTEXT]\n${retrieved.map(d => d.content).join('\n---\n')}`,
|
|
142
|
+
_meta: {
|
|
143
|
+
summaryId: `context_${threadId}`,
|
|
144
|
+
droppable: true,
|
|
145
|
+
priority: 90,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
// Insert after summary (or first system)
|
|
149
|
+
const insertIdx = processedMessages.findIndex(m => m._meta?.summaryId?.startsWith('summary_'));
|
|
150
|
+
if (insertIdx >= 0) {
|
|
151
|
+
processedMessages.splice(insertIdx + 1, 0, contextMessage);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const firstSystemIdx = processedMessages.findIndex(m => m.role === 'system');
|
|
155
|
+
processedMessages.splice(firstSystemIdx + 1, 0, contextMessage);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
messages: processedMessages,
|
|
162
|
+
summarized,
|
|
163
|
+
summary,
|
|
164
|
+
droppedCount,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Generate summary from messages.
|
|
169
|
+
* Override this method for custom summarization logic.
|
|
170
|
+
*/
|
|
171
|
+
async generateSummary(messages, _threadId) {
|
|
172
|
+
// Default: Simple concatenation (override for LLM-based summarization)
|
|
173
|
+
const userMessages = messages
|
|
174
|
+
.filter(m => m.role === 'user' && typeof m.content === 'string')
|
|
175
|
+
.map(m => m.content);
|
|
176
|
+
const assistantMessages = messages
|
|
177
|
+
.filter(m => m.role === 'assistant' && typeof m.content === 'string')
|
|
178
|
+
.map(m => m.content);
|
|
179
|
+
return [
|
|
180
|
+
`User discussed: ${userMessages.slice(0, 3).join(', ').slice(0, 200)}...`,
|
|
181
|
+
`Assistant covered: ${assistantMessages.slice(0, 3).join(', ').slice(0, 200)}...`,
|
|
182
|
+
].join('\n');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Store messages to long-term memory.
|
|
186
|
+
*/
|
|
187
|
+
async persist(messages, threadId) {
|
|
188
|
+
if (!this.config.longTerm)
|
|
189
|
+
return;
|
|
190
|
+
const documents = messages
|
|
191
|
+
.filter(m => typeof m.content === 'string' && m.content.length > 20)
|
|
192
|
+
.map((m, i) => ({
|
|
193
|
+
id: `${threadId}_${Date.now()}_${i}`,
|
|
194
|
+
content: m.content,
|
|
195
|
+
metadata: { role: m.role, threadId },
|
|
196
|
+
}));
|
|
197
|
+
await this.config.longTerm.store.add(documents);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Clear memory for a thread.
|
|
201
|
+
*/
|
|
202
|
+
clearThread(threadId) {
|
|
203
|
+
this.summaries.delete(threadId);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear all memory.
|
|
207
|
+
*/
|
|
208
|
+
async clearAll() {
|
|
209
|
+
this.summaries.clear();
|
|
210
|
+
if (this.config.longTerm) {
|
|
211
|
+
await this.config.longTerm.store.clear();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get current summary for a thread.
|
|
216
|
+
*/
|
|
217
|
+
getSummary(threadId) {
|
|
218
|
+
return this.summaries.get(threadId);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Set summary for a thread (manual override).
|
|
222
|
+
*/
|
|
223
|
+
setSummary(threadId, summary) {
|
|
224
|
+
this.summaries.set(threadId, summary);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.MemoryManager = MemoryManager;
|
|
228
|
+
// ============================================================================
|
|
229
|
+
// Helper: Check if message is droppable
|
|
230
|
+
// ============================================================================
|
|
231
|
+
/**
|
|
232
|
+
* Check if a message is droppable (skill or summary).
|
|
233
|
+
*/
|
|
234
|
+
function isDroppable(message) {
|
|
235
|
+
const meta = message._meta;
|
|
236
|
+
if (!meta?.droppable)
|
|
237
|
+
return false;
|
|
238
|
+
return meta.skillId != null || meta.summaryId != null;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/memory/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AA0UH,kCAIC;AAvPD,+EAA+E;AAC/E,iDAAiD;AACjD,+EAA+E;AAE/E;;;GAGG;AACH,MAAa,mBAAmB;IAAhC;QACY,cAAS,GAAqB,EAAE,CAAC;IAmC7C,CAAC;IAjCG,KAAK,CAAC,GAAG,CAAC,SAA2B;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,KAAK,GAAG,CAAC;QACjC,qCAAqC;QACrC,6DAA6D;QAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACpE,CAAC,CAAC,CAAC;QAEJ,OAAO,MAAM;aACR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IAEO,cAAc,CAAC,CAAS,EAAE,CAAS;QACvC,4BAA4B;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;CACJ;AApCD,kDAoCC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;GAGG;AACH,MAAa,aAAa;IAItB,YAAY,SAAuB,EAAE;QAF7B,cAAS,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,sBAAsB;QAGtE,IAAI,CAAC,MAAM,GAAG;YACV,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;YACnD,GAAG,MAAM;SACZ,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CACT,QAA2B,EAC3B,UAAgC,EAAE;QAElC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACjE,IAAI,iBAAiB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACtC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAA2B,CAAC;QAChC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,sCAAsC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC;QAC1D,IACI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO;YAC/B,eAAe;YACf,QAAQ,CAAC,MAAM,GAAG,SAAS,EAC7B,CAAC;YACC,uCAAuC;YACvC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3F,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,UAAU,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,8CAA8C;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;QAC7D,IAAI,iBAAiB,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACzC,YAAY,GAAG,iBAAiB,CAAC,MAAM,GAAG,WAAW,CAAC;YACtD,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9D,CAAC;QAED,iCAAiC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,eAAe,EAAE,CAAC;YAClB,MAAM,cAAc,GAAoB;gBACpC,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2BAA2B,eAAe,EAAE;gBACrD,KAAK,EAAE;oBACH,SAAS,EAAE,WAAW,QAAQ,EAAE;oBAChC,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,GAAG,EAAE,4BAA4B;iBAC9C;aACJ,CAAC;YAEF,oCAAoC;YACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC7E,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBACtB,iBAAiB,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACJ,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAC7E,IAAI,eAAe,IAAI,OAAO,eAAe,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CACrD,eAAe,CAAC,OAAO,EACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAC1C,CAAC;gBAEF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,cAAc,GAAoB;wBACpC,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,uBAAuB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;wBAC/E,KAAK,EAAE;4BACH,SAAS,EAAE,WAAW,QAAQ,EAAE;4BAChC,SAAS,EAAE,IAAI;4BACf,QAAQ,EAAE,EAAE;yBACf;qBACJ,CAAC;oBAEF,yCAAyC;oBACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CACzC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,CAClD,CAAC;oBACF,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;wBACjB,iBAAiB,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;oBAC/D,CAAC;yBAAM,CAAC;wBACJ,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;wBAC7E,iBAAiB,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;oBACpE,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO;YACH,QAAQ,EAAE,iBAAiB;YAC3B,UAAU;YACV,OAAO;YACP,YAAY;SACf,CAAC;IACN,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,eAAe,CAC3B,QAA2B,EAC3B,SAAiB;QAEjB,uEAAuE;QACvE,MAAM,YAAY,GAAG,QAAQ;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;aAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAiB,CAAC,CAAC;QAEnC,MAAM,iBAAiB,GAAG,QAAQ;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;aACpE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAiB,CAAC,CAAC;QAEnC,OAAO;YACH,mBAAmB,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;YACzE,sBAAsB,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;SACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,QAA2B,EAAE,QAAgB;QACvD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAElC,MAAM,SAAS,GAAqB,QAAQ;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;aACnE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACZ,EAAE,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YACpC,OAAO,EAAE,CAAC,CAAC,OAAiB;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE;SACvC,CAAC,CAAC,CAAC;QAER,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAgB;QACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB,EAAE,OAAe;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AApLD,sCAoLC;AAED,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAwB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,SAAS;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;AAC1D,CAAC"}
|