@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.
Files changed (68) hide show
  1. package/dist/ai/agent-graph.d.ts +5 -0
  2. package/dist/ai/agent-graph.d.ts.map +1 -1
  3. package/dist/ai/agent-graph.js +21 -2
  4. package/dist/ai/agent-graph.js.map +1 -1
  5. package/dist/ai/agent-graph.mjs +21 -2
  6. package/dist/ai/create-agent.d.ts +3 -0
  7. package/dist/ai/create-agent.d.ts.map +1 -1
  8. package/dist/ai/create-agent.js +6 -5
  9. package/dist/ai/create-agent.js.map +1 -1
  10. package/dist/ai/create-agent.mjs +6 -5
  11. package/dist/ai/generate-object.d.ts.map +1 -1
  12. package/dist/ai/generate-object.js +7 -1
  13. package/dist/ai/generate-object.js.map +1 -1
  14. package/dist/ai/generate-object.mjs +7 -1
  15. package/dist/ai/generate-text.d.ts +9 -1
  16. package/dist/ai/generate-text.d.ts.map +1 -1
  17. package/dist/ai/generate-text.js +25 -4
  18. package/dist/ai/generate-text.js.map +1 -1
  19. package/dist/ai/generate-text.mjs +25 -4
  20. package/dist/ai/internal-types.d.ts +11 -0
  21. package/dist/ai/internal-types.d.ts.map +1 -1
  22. package/dist/ai/internal-types.js +15 -0
  23. package/dist/ai/internal-types.js.map +1 -1
  24. package/dist/ai/internal-types.mjs +13 -0
  25. package/dist/ai/memory/index.d.ts +147 -0
  26. package/dist/ai/memory/index.d.ts.map +1 -0
  27. package/dist/ai/memory/index.js +240 -0
  28. package/dist/ai/memory/index.js.map +1 -0
  29. package/dist/ai/memory/index.mjs +234 -0
  30. package/dist/ai/nodes/memory-node.d.ts.map +1 -1
  31. package/dist/ai/nodes/memory-node.js +14 -16
  32. package/dist/ai/nodes/memory-node.js.map +1 -1
  33. package/dist/ai/nodes/memory-node.mjs +15 -17
  34. package/dist/ai/stream-object.d.ts +109 -0
  35. package/dist/ai/stream-object.d.ts.map +1 -0
  36. package/dist/ai/stream-object.js +383 -0
  37. package/dist/ai/stream-object.js.map +1 -0
  38. package/dist/ai/stream-object.mjs +347 -0
  39. package/dist/index.d.ts +8 -2
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +16 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +7 -1
  44. package/dist/lib/capability-cache.d.ts +72 -0
  45. package/dist/lib/capability-cache.d.ts.map +1 -0
  46. package/dist/lib/capability-cache.js +117 -0
  47. package/dist/lib/capability-cache.js.map +1 -0
  48. package/dist/lib/capability-cache.mjs +113 -0
  49. package/dist/lib/content-converter.d.ts +33 -0
  50. package/dist/lib/content-converter.d.ts.map +1 -0
  51. package/dist/lib/content-converter.js +166 -0
  52. package/dist/lib/content-converter.js.map +1 -0
  53. package/dist/lib/content-converter.mjs +161 -0
  54. package/dist/lib/messages.js +4 -3
  55. package/dist/lib/messages.js.map +1 -1
  56. package/dist/lib/messages.mjs +4 -3
  57. package/dist/lib/partial-json-parser.d.ts +63 -0
  58. package/dist/lib/partial-json-parser.d.ts.map +1 -0
  59. package/dist/lib/partial-json-parser.js +142 -0
  60. package/dist/lib/partial-json-parser.js.map +1 -0
  61. package/dist/lib/partial-json-parser.mjs +137 -0
  62. package/dist/lib/token-estimator.d.ts.map +1 -1
  63. package/dist/lib/token-estimator.js +3 -2
  64. package/dist/lib/token-estimator.js.map +1 -1
  65. package/dist/lib/token-estimator.mjs +3 -2
  66. package/dist/lib/types.d.ts +20 -4
  67. package/dist/lib/types.d.ts.map +1 -1
  68. 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: { type: 'builtin', namespace: 'user' },
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: { type: 'user', namespace: 'generateText' },
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;;AAyGH,8BAEC;AAKD,kCAEC;AAKD,gCAEC;AAnBD;;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"}
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"}