indusagi 0.12.13 → 0.12.15

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 (142) hide show
  1. package/dist/agent/tools/registry.d.ts +1 -1
  2. package/dist/agent/tools/registry.d.ts.map +1 -1
  3. package/dist/agent/types.d.ts +1 -0
  4. package/dist/agent/types.d.ts.map +1 -1
  5. package/dist/agent/types.js.map +1 -1
  6. package/dist/ai/models.generated.d.ts +621 -53
  7. package/dist/ai/models.generated.d.ts.map +1 -1
  8. package/dist/ai/models.generated.js +548 -0
  9. package/dist/ai/models.generated.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp/client-pool.d.ts +106 -0
  15. package/dist/mcp/client-pool.d.ts.map +1 -0
  16. package/dist/mcp/client-pool.js +233 -0
  17. package/dist/mcp/client-pool.js.map +1 -0
  18. package/dist/mcp/client.d.ts +158 -0
  19. package/dist/mcp/client.d.ts.map +1 -0
  20. package/dist/mcp/client.js +586 -0
  21. package/dist/mcp/client.js.map +1 -0
  22. package/dist/mcp/config.d.ts +61 -0
  23. package/dist/mcp/config.d.ts.map +1 -0
  24. package/dist/mcp/config.js +250 -0
  25. package/dist/mcp/config.js.map +1 -0
  26. package/dist/mcp/errors.d.ts +104 -0
  27. package/dist/mcp/errors.d.ts.map +1 -0
  28. package/dist/mcp/errors.js +138 -0
  29. package/dist/mcp/errors.js.map +1 -0
  30. package/dist/mcp/index.d.ts +56 -0
  31. package/dist/mcp/index.d.ts.map +1 -0
  32. package/dist/mcp/index.js +83 -0
  33. package/dist/mcp/index.js.map +1 -0
  34. package/dist/mcp/schema-converter.d.ts +68 -0
  35. package/dist/mcp/schema-converter.d.ts.map +1 -0
  36. package/dist/mcp/schema-converter.js +230 -0
  37. package/dist/mcp/schema-converter.js.map +1 -0
  38. package/dist/mcp/server.d.ts +111 -0
  39. package/dist/mcp/server.d.ts.map +1 -0
  40. package/dist/mcp/server.js +300 -0
  41. package/dist/mcp/server.js.map +1 -0
  42. package/dist/mcp/tool-factory.d.ts +63 -0
  43. package/dist/mcp/tool-factory.d.ts.map +1 -0
  44. package/dist/mcp/tool-factory.js +228 -0
  45. package/dist/mcp/tool-factory.js.map +1 -0
  46. package/dist/mcp/types.d.ts +289 -0
  47. package/dist/mcp/types.d.ts.map +1 -0
  48. package/dist/mcp/types.js +8 -0
  49. package/dist/mcp/types.js.map +1 -0
  50. package/dist/mcp.d.ts +6 -0
  51. package/dist/mcp.d.ts.map +1 -0
  52. package/dist/mcp.js +6 -0
  53. package/dist/mcp.js.map +1 -0
  54. package/dist/memory/embedder/base.d.ts +41 -0
  55. package/dist/memory/embedder/base.d.ts.map +1 -0
  56. package/dist/memory/embedder/base.js +10 -0
  57. package/dist/memory/embedder/base.js.map +1 -0
  58. package/dist/memory/embedder/index.d.ts +8 -0
  59. package/dist/memory/embedder/index.d.ts.map +1 -0
  60. package/dist/memory/embedder/index.js +6 -0
  61. package/dist/memory/embedder/index.js.map +1 -0
  62. package/dist/memory/embedder/openai.d.ts +35 -0
  63. package/dist/memory/embedder/openai.d.ts.map +1 -0
  64. package/dist/memory/embedder/openai.js +103 -0
  65. package/dist/memory/embedder/openai.js.map +1 -0
  66. package/dist/memory/index.d.ts +33 -0
  67. package/dist/memory/index.d.ts.map +1 -0
  68. package/dist/memory/index.js +31 -0
  69. package/dist/memory/index.js.map +1 -0
  70. package/dist/memory/memory.d.ts +126 -0
  71. package/dist/memory/memory.d.ts.map +1 -0
  72. package/dist/memory/memory.js +280 -0
  73. package/dist/memory/memory.js.map +1 -0
  74. package/dist/memory/processors/base.d.ts +42 -0
  75. package/dist/memory/processors/base.d.ts.map +1 -0
  76. package/dist/memory/processors/base.js +6 -0
  77. package/dist/memory/processors/base.js.map +1 -0
  78. package/dist/memory/processors/index.d.ts +16 -0
  79. package/dist/memory/processors/index.d.ts.map +1 -0
  80. package/dist/memory/processors/index.js +18 -0
  81. package/dist/memory/processors/index.js.map +1 -0
  82. package/dist/memory/processors/message-history.d.ts +35 -0
  83. package/dist/memory/processors/message-history.d.ts.map +1 -0
  84. package/dist/memory/processors/message-history.js +51 -0
  85. package/dist/memory/processors/message-history.js.map +1 -0
  86. package/dist/memory/processors/observational-memory/index.d.ts +82 -0
  87. package/dist/memory/processors/observational-memory/index.d.ts.map +1 -0
  88. package/dist/memory/processors/observational-memory/index.js +234 -0
  89. package/dist/memory/processors/observational-memory/index.js.map +1 -0
  90. package/dist/memory/processors/observational-memory/observer-agent.d.ts +64 -0
  91. package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +1 -0
  92. package/dist/memory/processors/observational-memory/observer-agent.js +362 -0
  93. package/dist/memory/processors/observational-memory/observer-agent.js.map +1 -0
  94. package/dist/memory/processors/observational-memory/reflector-agent.d.ts +38 -0
  95. package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +1 -0
  96. package/dist/memory/processors/observational-memory/reflector-agent.js +213 -0
  97. package/dist/memory/processors/observational-memory/reflector-agent.js.map +1 -0
  98. package/dist/memory/processors/observational-memory/token-counter.d.ts +35 -0
  99. package/dist/memory/processors/observational-memory/token-counter.d.ts.map +1 -0
  100. package/dist/memory/processors/observational-memory/token-counter.js +90 -0
  101. package/dist/memory/processors/observational-memory/token-counter.js.map +1 -0
  102. package/dist/memory/processors/semantic-recall.d.ts +55 -0
  103. package/dist/memory/processors/semantic-recall.d.ts.map +1 -0
  104. package/dist/memory/processors/semantic-recall.js +143 -0
  105. package/dist/memory/processors/semantic-recall.js.map +1 -0
  106. package/dist/memory/processors/working-memory.d.ts +41 -0
  107. package/dist/memory/processors/working-memory.d.ts.map +1 -0
  108. package/dist/memory/processors/working-memory.js +82 -0
  109. package/dist/memory/processors/working-memory.js.map +1 -0
  110. package/dist/memory/storage/base.d.ts +288 -0
  111. package/dist/memory/storage/base.d.ts.map +1 -0
  112. package/dist/memory/storage/base.js +211 -0
  113. package/dist/memory/storage/base.js.map +1 -0
  114. package/dist/memory/storage/index.d.ts +9 -0
  115. package/dist/memory/storage/index.d.ts.map +1 -0
  116. package/dist/memory/storage/index.js +7 -0
  117. package/dist/memory/storage/index.js.map +1 -0
  118. package/dist/memory/storage/inmemory.d.ts +93 -0
  119. package/dist/memory/storage/inmemory.d.ts.map +1 -0
  120. package/dist/memory/storage/inmemory.js +646 -0
  121. package/dist/memory/storage/inmemory.js.map +1 -0
  122. package/dist/memory/tools/working-memory.d.ts +100 -0
  123. package/dist/memory/tools/working-memory.d.ts.map +1 -0
  124. package/dist/memory/tools/working-memory.js +237 -0
  125. package/dist/memory/tools/working-memory.js.map +1 -0
  126. package/dist/memory/types.d.ts +386 -0
  127. package/dist/memory/types.d.ts.map +1 -0
  128. package/dist/memory/types.js +58 -0
  129. package/dist/memory/types.js.map +1 -0
  130. package/dist/memory/vector/base.d.ts +145 -0
  131. package/dist/memory/vector/base.d.ts.map +1 -0
  132. package/dist/memory/vector/base.js +83 -0
  133. package/dist/memory/vector/base.js.map +1 -0
  134. package/dist/memory/vector/index.d.ts +8 -0
  135. package/dist/memory/vector/index.d.ts.map +1 -0
  136. package/dist/memory/vector/index.js +7 -0
  137. package/dist/memory/vector/index.js.map +1 -0
  138. package/dist/memory/vector/inmemory.d.ts +47 -0
  139. package/dist/memory/vector/inmemory.d.ts.map +1 -0
  140. package/dist/memory/vector/inmemory.js +234 -0
  141. package/dist/memory/vector/inmemory.js.map +1 -0
  142. package/package.json +32 -2
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Token Counter Utility
3
+ * Based on Mastra TokenCounter
4
+ */
5
+ /**
6
+ * Simple token counter using character-based estimation.
7
+ * For production, integrate with js-tiktoken for accurate counting.
8
+ */
9
+ export class TokenCounter {
10
+ // Average characters per token (OpenAI's estimation)
11
+ static { this.CHARS_PER_TOKEN = 4; }
12
+ // Per-message overhead for role tokens, framing, separators
13
+ static { this.TOKENS_PER_MESSAGE = 3.8; }
14
+ // Conversation-level overhead
15
+ static { this.TOKENS_PER_CONVERSATION = 24; }
16
+ /**
17
+ * Count tokens in a plain string
18
+ */
19
+ countString(text) {
20
+ if (!text)
21
+ return 0;
22
+ // Simple estimation: characters / 4
23
+ // For production, use tiktoken for accurate counting
24
+ return Math.ceil(text.length / TokenCounter.CHARS_PER_TOKEN);
25
+ }
26
+ /**
27
+ * Count tokens in a single message
28
+ */
29
+ countMessage(message) {
30
+ let tokenString = message.role;
31
+ let overhead = TokenCounter.TOKENS_PER_MESSAGE;
32
+ if (typeof message.content === "string") {
33
+ tokenString += message.content;
34
+ }
35
+ else if (message.content && typeof message.content === "object") {
36
+ const content = message.content;
37
+ if (content.content && !Array.isArray(content.parts)) {
38
+ tokenString += content.content;
39
+ }
40
+ else if (Array.isArray(content.parts)) {
41
+ for (const part of content.parts) {
42
+ if (part.type === "text") {
43
+ tokenString += part.text;
44
+ }
45
+ else if (part.type === "tool-call") {
46
+ tokenString += part.toolName;
47
+ if (part.args) {
48
+ tokenString += JSON.stringify(part.args);
49
+ overhead -= 12; // Compensate for JSON overhead
50
+ }
51
+ }
52
+ else if (part.type === "tool-result") {
53
+ if (part.result !== undefined) {
54
+ tokenString += typeof part.result === "string"
55
+ ? part.result
56
+ : JSON.stringify(part.result);
57
+ overhead -= 12;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ return Math.round(this.countString(tokenString) + overhead);
64
+ }
65
+ /**
66
+ * Count tokens in an array of messages
67
+ */
68
+ countMessages(messages) {
69
+ if (!messages || messages.length === 0)
70
+ return 0;
71
+ let total = TokenCounter.TOKENS_PER_CONVERSATION;
72
+ for (const message of messages) {
73
+ total += this.countMessage(message);
74
+ }
75
+ return total;
76
+ }
77
+ /**
78
+ * Count tokens in observations string
79
+ */
80
+ countObservations(observations) {
81
+ return this.countString(observations);
82
+ }
83
+ }
84
+ /**
85
+ * Create a default token counter instance
86
+ */
87
+ export function createTokenCounter() {
88
+ return new TokenCounter();
89
+ }
90
+ //# sourceMappingURL=token-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../../../src/memory/processors/observational-memory/token-counter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Semantic Recall Processor
3
+ * Based on Mastra SemanticRecall processor
4
+ */
5
+ import type { MemoryProcessor, ProcessorContext } from "./base.js";
6
+ import type { CoreMessage, EmbedderOptions } from "../types.js";
7
+ import type { MemoryStorage } from "../storage/base.js";
8
+ import type { VectorStore } from "../vector/base.js";
9
+ import type { Embedder } from "../embedder/base.js";
10
+ /**
11
+ * Semantic recall processor configuration
12
+ */
13
+ export interface SemanticRecallProcessorConfig {
14
+ storage: MemoryStorage;
15
+ vector: VectorStore;
16
+ embedder: Embedder;
17
+ embedderOptions?: EmbedderOptions;
18
+ indexName: string;
19
+ topK?: number;
20
+ messageRange?: number | {
21
+ before: number;
22
+ after: number;
23
+ };
24
+ scope?: "thread" | "resource";
25
+ threshold?: number;
26
+ }
27
+ /**
28
+ * Semantic Recall Processor
29
+ *
30
+ * Retrieves relevant past messages using vector similarity search.
31
+ */
32
+ export declare class SemanticRecall implements MemoryProcessor {
33
+ readonly id = "semantic-recall";
34
+ readonly name = "Semantic Recall Processor";
35
+ private storage;
36
+ private vector;
37
+ private embedder;
38
+ private embedderOptions?;
39
+ private indexName;
40
+ private topK;
41
+ private messageRange;
42
+ private scope;
43
+ private threshold;
44
+ constructor(config: SemanticRecallProcessorConfig);
45
+ processInputStep(args: {
46
+ messages: CoreMessage[];
47
+ context: ProcessorContext;
48
+ }): Promise<CoreMessage[]>;
49
+ processOutputResult(args: {
50
+ messages: CoreMessage[];
51
+ context: ProcessorContext;
52
+ }): Promise<CoreMessage[]>;
53
+ private messageToText;
54
+ }
55
+ //# sourceMappingURL=semantic-recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-recall.d.ts","sourceRoot":"","sources":["../../../src/memory/processors/semantic-recall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAA0C,eAAe,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;GAIG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,EAAE,qBAAqB;IAChC,QAAQ,CAAC,IAAI,+BAA+B;IAE5C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,6BAA6B;IAY3C,gBAAgB,CAAC,IAAI,EAAE;QAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,gBAAgB,CAAC;KAC3B,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkFpB,mBAAmB,CAAC,IAAI,EAAE;QAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,gBAAgB,CAAC;KAC3B,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAsC1B,OAAO,CAAC,aAAa;CAatB"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Semantic Recall Processor
3
+ * Based on Mastra SemanticRecall processor
4
+ */
5
+ /**
6
+ * Default message range configuration
7
+ */
8
+ const DEFAULT_MESSAGE_RANGE = { before: 1, after: 1 };
9
+ const DEFAULT_TOP_K = 4;
10
+ /**
11
+ * Semantic Recall Processor
12
+ *
13
+ * Retrieves relevant past messages using vector similarity search.
14
+ */
15
+ export class SemanticRecall {
16
+ constructor(config) {
17
+ this.id = "semantic-recall";
18
+ this.name = "Semantic Recall Processor";
19
+ this.storage = config.storage;
20
+ this.vector = config.vector;
21
+ this.embedder = config.embedder;
22
+ this.embedderOptions = config.embedderOptions;
23
+ this.indexName = config.indexName;
24
+ this.topK = config.topK ?? DEFAULT_TOP_K;
25
+ this.messageRange = config.messageRange ?? DEFAULT_MESSAGE_RANGE;
26
+ this.scope = config.scope ?? "resource";
27
+ this.threshold = config.threshold ?? 0.7;
28
+ }
29
+ async processInputStep(args) {
30
+ const { messages, context } = args;
31
+ // Get the last user message as query
32
+ const lastUserMessage = [...messages].reverse().find(m => m.role === "user");
33
+ if (!lastUserMessage)
34
+ return messages;
35
+ const queryText = this.messageToText(lastUserMessage);
36
+ // Embed the query
37
+ const { vector: queryVector } = await this.embedder.embed(queryText, this.embedderOptions);
38
+ // Search for similar messages
39
+ const results = await this.vector.query({
40
+ indexName: this.indexName,
41
+ queryVector,
42
+ topK: this.topK,
43
+ minScore: this.threshold,
44
+ filter: {
45
+ resourceId: context.resourceId,
46
+ ...(this.scope === "thread" && { threadId: context.threadId }),
47
+ },
48
+ });
49
+ if (results.length === 0)
50
+ return messages;
51
+ // Get message context (before/after each match)
52
+ const messageRange = typeof this.messageRange === "number"
53
+ ? { before: this.messageRange, after: this.messageRange }
54
+ : this.messageRange;
55
+ const retrievedMessages = [];
56
+ const retrievedIds = new Set();
57
+ for (const result of results) {
58
+ const msgId = result.metadata?.messageId;
59
+ const msgThreadId = result.metadata?.threadId;
60
+ if (!msgId || !msgThreadId)
61
+ continue;
62
+ // Get surrounding messages
63
+ const { messages: threadMessages } = await this.storage.listMessages({
64
+ threadId: msgThreadId,
65
+ perPage: 1000, // Get all messages to find context
66
+ });
67
+ const msgIndex = threadMessages.findIndex(m => m.id === msgId);
68
+ if (msgIndex === -1)
69
+ continue;
70
+ const start = Math.max(0, msgIndex - messageRange.before);
71
+ const end = Math.min(threadMessages.length, msgIndex + messageRange.after + 1);
72
+ for (let i = start; i < end; i++) {
73
+ const msg = threadMessages[i];
74
+ if (msg && !retrievedIds.has(msg.id)) {
75
+ retrievedMessages.push(msg);
76
+ retrievedIds.add(msg.id);
77
+ }
78
+ }
79
+ }
80
+ if (retrievedMessages.length === 0)
81
+ return messages;
82
+ // Sort retrieved messages by date
83
+ retrievedMessages.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
84
+ // Remove duplicates from original messages
85
+ const filteredMessages = messages.filter(m => !retrievedIds.has(m.id));
86
+ // Insert semantic recall marker
87
+ const recallMarker = {
88
+ id: `semantic-recall-${Date.now()}`,
89
+ role: "system",
90
+ content: `<semantic_recall>\nRelevant past conversation retrieved based on semantic similarity:\n</semantic_recall>`,
91
+ createdAt: new Date(),
92
+ };
93
+ return [recallMarker, ...retrievedMessages, ...filteredMessages];
94
+ }
95
+ async processOutputResult(args) {
96
+ const { messages, context } = args;
97
+ // Embed and store new messages
98
+ for (const message of messages) {
99
+ if (message.role !== "user" && message.role !== "assistant")
100
+ continue;
101
+ if (message.id.startsWith("working-memory-") || message.id.startsWith("semantic-recall-"))
102
+ continue;
103
+ const text = this.messageToText(message);
104
+ if (!text.trim())
105
+ continue;
106
+ try {
107
+ const { vector } = await this.embedder.embed(text, this.embedderOptions);
108
+ await this.vector.upsert({
109
+ indexName: this.indexName,
110
+ vectors: [vector],
111
+ metadata: [{
112
+ messageId: message.id,
113
+ threadId: context.threadId,
114
+ resourceId: context.resourceId,
115
+ role: message.role,
116
+ timestamp: new Date(message.createdAt).getTime(),
117
+ }],
118
+ ids: [`${context.threadId}-${message.id}`],
119
+ });
120
+ }
121
+ catch (error) {
122
+ console.error(`Failed to embed message ${message.id}:`, error);
123
+ }
124
+ }
125
+ return messages;
126
+ }
127
+ // ========================================================================
128
+ // Private Helpers
129
+ // ========================================================================
130
+ messageToText(message) {
131
+ if (typeof message.content === "string")
132
+ return message.content;
133
+ const content = message.content;
134
+ if (content.parts) {
135
+ return content.parts
136
+ .filter((p) => p.type === "text")
137
+ .map(p => p.text)
138
+ .join("\n");
139
+ }
140
+ return content.content ?? "";
141
+ }
142
+ }
143
+ //# sourceMappingURL=semantic-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-recall.js","sourceRoot":"","sources":["../../../src/memory/processors/semantic-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Working Memory Processor
3
+ * Based on Mastra WorkingMemory processor
4
+ */
5
+ import type { MemoryProcessor, ProcessorContext } from "./base.js";
6
+ import type { CoreMessage, WorkingMemoryTemplate } from "../types.js";
7
+ import type { MemoryStorage } from "../storage/base.js";
8
+ /**
9
+ * Working memory processor configuration
10
+ */
11
+ export interface WorkingMemoryProcessorConfig {
12
+ storage: MemoryStorage;
13
+ template?: WorkingMemoryTemplate;
14
+ scope?: "thread" | "resource";
15
+ useVNext?: boolean;
16
+ templateProvider?: {
17
+ getWorkingMemoryTemplate(args: {
18
+ memoryConfig?: import("../types.js").MemoryConfig;
19
+ }): Promise<WorkingMemoryTemplate | null>;
20
+ };
21
+ }
22
+ /**
23
+ * Working Memory Processor
24
+ *
25
+ * Injects structured context (user profile, preferences) into the conversation.
26
+ */
27
+ export declare class WorkingMemory implements MemoryProcessor {
28
+ readonly id = "working-memory";
29
+ readonly name = "Working Memory Processor";
30
+ private storage;
31
+ private template?;
32
+ private scope;
33
+ private useVNext;
34
+ private templateProvider?;
35
+ constructor(config: WorkingMemoryProcessorConfig);
36
+ processInputStep(args: {
37
+ messages: CoreMessage[];
38
+ context: ProcessorContext;
39
+ }): Promise<CoreMessage[]>;
40
+ }
41
+ //# sourceMappingURL=working-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/processors/working-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE;QACjB,wBAAwB,CAAC,IAAI,EAAE;YAAE,YAAY,CAAC,EAAE,OAAO,aAAa,EAAE,YAAY,CAAA;SAAE,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;KAC9H,CAAC;CACH;AAqBD;;;;GAIG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,oBAAoB;IAC/B,QAAQ,CAAC,IAAI,8BAA8B;IAE3C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAwB;IACzC,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAmD;gBAEhE,MAAM,EAAE,4BAA4B;IAQ1C,gBAAgB,CAAC,IAAI,EAAE;QAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,gBAAgB,CAAC;KAC3B,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAmD3B"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Working Memory Processor
3
+ * Based on Mastra WorkingMemory processor
4
+ */
5
+ /**
6
+ * Default working memory template
7
+ */
8
+ const DEFAULT_TEMPLATE = {
9
+ format: "markdown",
10
+ content: `
11
+ # User Information
12
+ - **First Name**:
13
+ - **Last Name**:
14
+ - **Location**:
15
+ - **Occupation**:
16
+ - **Interests**:
17
+ - **Goals**:
18
+ - **Events**:
19
+ - **Facts**:
20
+ - **Projects**:
21
+ `,
22
+ };
23
+ /**
24
+ * Working Memory Processor
25
+ *
26
+ * Injects structured context (user profile, preferences) into the conversation.
27
+ */
28
+ export class WorkingMemory {
29
+ constructor(config) {
30
+ this.id = "working-memory";
31
+ this.name = "Working Memory Processor";
32
+ this.storage = config.storage;
33
+ this.template = config.template;
34
+ this.scope = config.scope ?? "resource";
35
+ this.useVNext = config.useVNext ?? false;
36
+ this.templateProvider = config.templateProvider;
37
+ }
38
+ async processInputStep(args) {
39
+ const { messages, context } = args;
40
+ const { threadId, resourceId, memoryConfig } = context;
41
+ // Determine scope from config
42
+ const scope = memoryConfig?.workingMemory &&
43
+ typeof memoryConfig.workingMemory === "object" &&
44
+ "scope" in memoryConfig.workingMemory
45
+ ? memoryConfig.workingMemory.scope
46
+ : this.scope;
47
+ let workingMemory;
48
+ // Get working memory from storage
49
+ if (scope === "thread") {
50
+ const thread = await this.storage.getThreadById({ threadId });
51
+ workingMemory = thread?.metadata?.workingMemory;
52
+ }
53
+ else {
54
+ const resource = await this.storage.getResourceById({ resourceId });
55
+ workingMemory = resource?.workingMemory;
56
+ }
57
+ // If no working memory exists, use template
58
+ if (!workingMemory) {
59
+ // Try to get template from provider or use local template
60
+ let template = this.template;
61
+ if (this.templateProvider && memoryConfig) {
62
+ const providerTemplate = await this.templateProvider.getWorkingMemoryTemplate({ memoryConfig });
63
+ if (providerTemplate) {
64
+ template = providerTemplate;
65
+ }
66
+ }
67
+ if (!template) {
68
+ template = DEFAULT_TEMPLATE;
69
+ }
70
+ workingMemory = template.content;
71
+ }
72
+ // Inject as system message at the start
73
+ const workingMemoryMessage = {
74
+ id: `working-memory-${Date.now()}`,
75
+ role: "system",
76
+ content: `<working_memory>\n${workingMemory}\n</working_memory>`,
77
+ createdAt: new Date(),
78
+ };
79
+ return [workingMemoryMessage, ...messages];
80
+ }
81
+ }
82
+ //# sourceMappingURL=working-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.js","sourceRoot":"","sources":["../../../src/memory/processors/working-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,MAAM,gBAAgB,GAA0B;IAC9C,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE;;;;;;;;;;;CAWV;CACA,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAUxB,YAAY,MAAoC;QATvC,OAAE,GAAG,gBAAgB,CAAC;QACtB,SAAI,GAAG,0BAA0B,CAAC;QASzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAGtB;QACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAEvD,8BAA8B;QAC9B,MAAM,KAAK,GAAG,YAAY,EAAE,aAAa;YACvC,OAAO,YAAY,CAAC,aAAa,KAAK,QAAQ;YAC9C,OAAO,IAAI,YAAY,CAAC,aAAa;YACnC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK;YAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAEjB,IAAI,aAAwC,CAAC;QAE7C,kCAAkC;QAClC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,aAAa,GAAG,MAAM,EAAE,QAAQ,EAAE,aAAmC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YACpE,aAAa,GAAG,QAAQ,EAAE,aAAa,CAAC;QAC1C,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,0DAA0D;YAC1D,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE7B,IAAI,IAAI,CAAC,gBAAgB,IAAI,YAAY,EAAE,CAAC;gBAC1C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;gBAChG,IAAI,gBAAgB,EAAE,CAAC;oBACrB,QAAQ,GAAG,gBAAgB,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,gBAAgB,CAAC;YAC9B,CAAC;YAED,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;QACnC,CAAC;QAED,wCAAwC;QACxC,MAAM,oBAAoB,GAAgB;YACxC,EAAE,EAAE,kBAAkB,IAAI,CAAC,GAAG,EAAE,EAAE;YAClC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,qBAAqB,aAAa,qBAAqB;YAChE,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QAEF,OAAO,CAAC,oBAAoB,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF"}