@ai.ntellect/core 0.3.1 ā†’ 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
package/agent/index.ts CHANGED
@@ -3,7 +3,15 @@ import { Interpreter } from "../llm/interpreter";
3
3
  import { Orchestrator } from "../llm/orchestrator";
4
4
  import { CacheMemory } from "../memory/cache";
5
5
  import { PersistentMemory } from "../memory/persistent";
6
- import { ActionSchema, AgentEvent, MemoryScope, QueueResult } from "../types";
6
+ import { ActionQueueManager } from "../services/queue";
7
+ import { ActionScheduler } from "../services/scheduler";
8
+ import {
9
+ ActionSchema,
10
+ AgentEvent,
11
+ MemoryScope,
12
+ QueueResult,
13
+ ScheduledAction,
14
+ } from "../types";
7
15
  import { QueueItemTransformer } from "../utils/queue-item-transformer";
8
16
  import { ResultSanitizer } from "../utils/sanitize-results";
9
17
  import { ActionHandler } from "./handlers/ActionHandler";
@@ -21,6 +29,7 @@ export class Agent {
21
29
  private evaluatorIteration = 0;
22
30
  private accumulatedResults: string = "";
23
31
  private currentInterpreter: Interpreter | undefined;
32
+ private readonly scheduler: ActionScheduler;
24
33
 
25
34
  constructor({
26
35
  orchestrator,
@@ -45,18 +54,27 @@ export class Agent {
45
54
  this.maxEvaluatorIteration = maxEvaluatorIteration;
46
55
  this.actionHandler = new ActionHandler();
47
56
  this.accumulatedResults = "";
57
+ this.scheduler = new ActionScheduler(
58
+ new ActionQueueManager(this.orchestrator.tools),
59
+ this.orchestrator
60
+ );
48
61
  }
49
62
 
50
63
  async process(prompt: string, events: AgentEvent): Promise<any> {
51
64
  this.accumulatedResults = "";
52
65
  this.evaluatorIteration = 0;
53
66
  console.log("Requesting orchestrator for actions..");
54
- const cacheMemories = await this.memory.cache?.findSimilarActions(prompt, {
55
- similarityThreshold: 70,
56
- maxResults: 5,
57
- userId: "1",
58
- scope: MemoryScope.GLOBAL,
59
- });
67
+ const parsedPrompt = JSON.parse(prompt);
68
+ const promptOnly = parsedPrompt.userRequest;
69
+ const cacheMemories = await this.memory.cache?.findSimilarActions(
70
+ promptOnly,
71
+ {
72
+ similarityThreshold: 70,
73
+ maxResults: 5,
74
+ userId: "1",
75
+ scope: MemoryScope.GLOBAL,
76
+ }
77
+ );
60
78
  console.log("āœ… RECENT_ACTIONS: ", cacheMemories);
61
79
 
62
80
  const persistentMemory = await this.memory.persistent.findRelevantDocuments(
@@ -221,4 +239,22 @@ export class Agent {
221
239
  const sanitizedResults = ResultSanitizer.sanitize(formattedResults);
222
240
  return sanitizedResults;
223
241
  }
242
+
243
+ async scheduleAction(
244
+ action: ActionSchema,
245
+ scheduledTime: Date,
246
+ userId: string,
247
+ recurrence?: ScheduledAction["recurrence"]
248
+ ): Promise<string> {
249
+ return this.scheduler.scheduleAction(
250
+ action,
251
+ scheduledTime,
252
+ userId,
253
+ recurrence
254
+ );
255
+ }
256
+
257
+ async cancelScheduledAction(actionId: string): Promise<boolean> {
258
+ return this.scheduler.cancelScheduledAction(actionId);
259
+ }
224
260
  }
@@ -2,7 +2,7 @@ import { Interpreter } from "../llm/interpreter";
2
2
  import { Orchestrator } from "../llm/orchestrator";
3
3
  import { CacheMemory } from "../memory/cache";
4
4
  import { PersistentMemory } from "../memory/persistent";
5
- import { AgentEvent } from "../types";
5
+ import { ActionSchema, AgentEvent, ScheduledAction } from "../types";
6
6
  export declare class Agent {
7
7
  private readonly actionHandler;
8
8
  private readonly orchestrator;
@@ -12,6 +12,8 @@ export declare class Agent {
12
12
  private readonly maxEvaluatorIteration;
13
13
  private evaluatorIteration;
14
14
  private accumulatedResults;
15
+ private currentInterpreter;
16
+ private readonly scheduler;
15
17
  constructor({ orchestrator, interpreters, memory, stream, maxEvaluatorIteration, }: {
16
18
  orchestrator: Orchestrator;
17
19
  interpreters: Interpreter[];
@@ -28,4 +30,6 @@ export declare class Agent {
28
30
  private interpreterResult;
29
31
  private transformActions;
30
32
  private formatResults;
33
+ scheduleAction(action: ActionSchema, scheduledTime: Date, userId: string, recurrence?: ScheduledAction["recurrence"]): Promise<string>;
34
+ cancelScheduledAction(actionId: string): Promise<boolean>;
31
35
  }
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Agent = void 0;
4
4
  const evaluator_1 = require("../llm/evaluator");
5
+ const queue_1 = require("../services/queue");
6
+ const scheduler_1 = require("../services/scheduler");
5
7
  const types_1 = require("../types");
6
8
  const queue_item_transformer_1 = require("../utils/queue-item-transformer");
7
9
  const sanitize_results_1 = require("../utils/sanitize-results");
@@ -17,19 +19,26 @@ class Agent {
17
19
  this.maxEvaluatorIteration = maxEvaluatorIteration;
18
20
  this.actionHandler = new ActionHandler_1.ActionHandler();
19
21
  this.accumulatedResults = "";
22
+ this.scheduler = new scheduler_1.ActionScheduler(new queue_1.ActionQueueManager(this.orchestrator.tools), this.orchestrator);
20
23
  }
21
24
  async process(prompt, events) {
22
25
  this.accumulatedResults = "";
23
26
  this.evaluatorIteration = 0;
24
27
  console.log("Requesting orchestrator for actions..");
25
- const cacheMemories = await this.memory.cache?.findSimilarActions(prompt, {
28
+ const parsedPrompt = JSON.parse(prompt);
29
+ const promptOnly = parsedPrompt.userRequest;
30
+ const cacheMemories = await this.memory.cache?.findSimilarActions(promptOnly, {
26
31
  similarityThreshold: 70,
27
32
  maxResults: 5,
28
33
  userId: "1",
29
34
  scope: types_1.MemoryScope.GLOBAL,
30
35
  });
31
36
  console.log("āœ… RECENT_ACTIONS: ", cacheMemories);
32
- const request = await this.orchestrator.process(prompt, `## RECENT_ACTIONS: ${JSON.stringify(cacheMemories)} ## CURRENT_RESULTS: ${this.accumulatedResults}`);
37
+ const persistentMemory = await this.memory.persistent.findRelevantDocuments(prompt, {
38
+ similarityThreshold: 80,
39
+ });
40
+ console.log("āœ… PERSISTENT_MEMORY: ", persistentMemory);
41
+ const request = await this.orchestrator.process(prompt, `## RECENT_ACTIONS: ${JSON.stringify(cacheMemories)} ## PERSISTENT_MEMORY: ${JSON.stringify(persistentMemory)} ## CURRENT_RESULTS: ${this.accumulatedResults}`);
33
42
  events.onMessage?.(request);
34
43
  return request.actions.length > 0
35
44
  ? this.handleActions({
@@ -59,12 +68,12 @@ class Agent {
59
68
  return this.interpreterResult({
60
69
  data: this.accumulatedResults,
61
70
  initialPrompt,
62
- interpreter: this.interpreters[0],
71
+ interpreter: this.currentInterpreter,
63
72
  });
64
73
  }
65
74
  const evaluator = new evaluator_1.Evaluator(this.orchestrator.tools, this.memory, this.interpreters);
66
- // const sanitizedResults = ResultSanitizer.sanitize(this.accumulatedResults);
67
75
  const evaluation = await evaluator.process(initialPrompt, this.accumulatedResults);
76
+ this.currentInterpreter = this.getInterpreter(this.interpreters, evaluation.interpreter);
68
77
  events.onMessage?.(evaluation);
69
78
  if (evaluation.isNextActionNeeded) {
70
79
  this.evaluatorIteration++;
@@ -73,21 +82,22 @@ class Agent {
73
82
  actions: evaluation.nextActionsNeeded,
74
83
  }, events);
75
84
  }
76
- const interpreter = this.getInterpreter(this.interpreters, evaluation.interpreter);
77
- if (!interpreter) {
78
- throw new Error("Interpreter not found");
79
- }
80
85
  return this.interpreterResult({
81
86
  data: this.accumulatedResults,
82
87
  initialPrompt,
83
- interpreter,
88
+ interpreter: this.currentInterpreter,
84
89
  });
85
90
  }
86
91
  getInterpreter(interpreters, name) {
92
+ console.log({ interpreters, name });
87
93
  return interpreters.find((interpreter) => interpreter.name === name);
88
94
  }
89
95
  async interpreterResult(actionsResult) {
90
96
  const { interpreter, initialPrompt, data } = actionsResult;
97
+ if (!interpreter) {
98
+ throw new Error("Interpreter not found");
99
+ }
100
+ console.log("āœ… INTERPRETER: ", interpreter.name);
91
101
  return this.stream
92
102
  ? (await interpreter.streamProcess(initialPrompt, {
93
103
  userRequest: initialPrompt,
@@ -112,5 +122,11 @@ class Agent {
112
122
  const sanitizedResults = sanitize_results_1.ResultSanitizer.sanitize(formattedResults);
113
123
  return sanitizedResults;
114
124
  }
125
+ async scheduleAction(action, scheduledTime, userId, recurrence) {
126
+ return this.scheduler.scheduleAction(action, scheduledTime, userId, recurrence);
127
+ }
128
+ async cancelScheduledAction(actionId) {
129
+ return this.scheduler.cancelScheduledAction(actionId);
130
+ }
115
131
  }
116
132
  exports.Agent = Agent;
@@ -3,14 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.evaluatorContext = void 0;
4
4
  exports.evaluatorContext = {
5
5
  behavior: {
6
- language: "user_language",
7
- role: "Your role is to verify if the goal has been achieved and make a response or suggest next actions.",
6
+ language: "same_as_user",
7
+ role: "Your role is to ensure the goal will be achieved and make a response or suggest next actions.",
8
8
  guidelines: {
9
9
  important: [
10
- "Verify if all required actions were executed successfully.",
11
- "Check if the results align with the initial goal.",
10
+ "Verify if all actions were executed successfully (actionsAlreadyDone).",
11
+ "Check if the results align with the initial goal (explain in 'why' field).",
12
+ "Suggest next actions in 'nextActionsNeeded' if the goal is not achieved and if actions in 'actionsAlreadyDone' are not enough.",
12
13
  "If you retrieved the informations from your internal knowledge base, no need to store them in 'extraInformationsToStore'.",
13
- "Store ONLY extra new needed informations in 'extraInformationsToStore' (choose the most relevant informations and memory type: episodic, semantic, or procedural).",
14
+ "Store ONLY new needed informations in 'extraInformationsToStore'.",
15
+ "Choose the most relevant informations and memory type: episodic, semantic, or procedural.",
14
16
  ],
15
17
  warnings: [
16
18
  "NEVER store an old data you retrieve from your internal knowledge base.",
@@ -43,8 +43,8 @@ class Evaluator {
43
43
  const response = await (0, ai_1.generateObject)({
44
44
  model: this.model,
45
45
  schema: zod_1.z.object({
46
- actionsCompleted: zod_1.z.array(zod_1.z.string()),
47
- actionsFailed: zod_1.z.array(zod_1.z.string()),
46
+ requestLanguage: zod_1.z.string(),
47
+ actionsAlreadyDone: zod_1.z.array(zod_1.z.string()),
48
48
  extraInformationsToStore: zod_1.z.array(zod_1.z.object({
49
49
  memoryType: zod_1.z.enum(["episodic", "semantic", "procedural"]),
50
50
  queryForData: zod_1.z.string(),
@@ -80,7 +80,7 @@ class Evaluator {
80
80
  console.log("\nšŸ“ Processing memory item:");
81
81
  console.log("Type:", item.memoryType);
82
82
  console.log("Content:", item.queryForData);
83
- const memories = await this.memory.persistent.searchSimilarQueries(item.queryForData, {
83
+ const memories = await this.memory.persistent.findRelevantDocuments(item.queryForData, {
84
84
  similarityThreshold: 70,
85
85
  });
86
86
  if (memories.length > 0) {
@@ -93,7 +93,7 @@ class Evaluator {
93
93
  purpose: item.memoryType,
94
94
  query: item.queryForData,
95
95
  data: item.data,
96
- scope: types_1.MemoryScope.GLOBAL,
96
+ roomId: "global",
97
97
  createdAt: new Date(),
98
98
  });
99
99
  }
@@ -104,10 +104,9 @@ class Evaluator {
104
104
  cacheMemory.createMemory({
105
105
  content: prompt,
106
106
  type: types_1.MemoryType.ACTION,
107
- data: validatedResponse.actionsCompleted,
108
- scope: types_1.MemoryScope.GLOBAL,
107
+ data: validatedResponse.actionsAlreadyDone,
109
108
  });
110
- console.log("āœ… Workflow actions completed stored in cache", prompt, validatedResponse.actionsCompleted);
109
+ console.log("āœ… Workflow actions completed stored in cache", prompt, validatedResponse.actionsAlreadyDone);
111
110
  }
112
111
  console.log("\nāœ… Evaluation completed");
113
112
  console.log("ā”€".repeat(50));
@@ -123,7 +122,7 @@ class Evaluator {
123
122
  if (error.value.extraInformationsToStore.length > 0) {
124
123
  for (const item of error.value.extraInformationsToStore) {
125
124
  // Check if the item is already in the memory
126
- const memories = await this.memory.persistent.searchSimilarQueries(item.content);
125
+ const memories = await this.memory.persistent.findRelevantDocuments(item.content);
127
126
  if (memories.length === 0) {
128
127
  console.log("Adding to memory", {
129
128
  query: item.content,
@@ -134,7 +133,7 @@ class Evaluator {
134
133
  purpose: "importantToRemember",
135
134
  query: item.content,
136
135
  data: item.data,
137
- scope: types_1.MemoryScope.USER,
136
+ roomId: "global",
138
137
  createdAt: new Date(),
139
138
  });
140
139
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.marketInterpreterContext = exports.securityInterpreterContext = exports.generalInterpreterContext = void 0;
4
4
  exports.generalInterpreterContext = {
5
5
  role: "You are the general assistant. Your role is to provide a clear and factual analysis of the results.",
6
- language: "user_language",
6
+ language: "same_as_user",
7
7
  guidelines: {
8
8
  important: [],
9
9
  warnings: [],
@@ -4,7 +4,7 @@ export declare const orchestratorContext: {
4
4
  role: string;
5
5
  guidelines: {
6
6
  important: string[];
7
- warnings: never[];
7
+ warnings: string[];
8
8
  };
9
9
  };
10
10
  };
@@ -3,18 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.orchestratorContext = void 0;
4
4
  exports.orchestratorContext = {
5
5
  behavior: {
6
- language: "user_language",
7
- role: "You are the orchestrator agent. Your role is to determine what actions are needed to achieve the user goal.",
6
+ language: "same_as_user",
7
+ role: "Your role is to determine what actions are needed to achieve the user goal.",
8
8
  guidelines: {
9
9
  important: [
10
10
  "If there is no action to do, you must answer in the 'answer' field.",
11
11
  "If some parameters are not clear or missing, don't add the action, YOU MUST ask the user for them.",
12
- "ALWAYS use the same language as user request. (If it's English, use English, if it's French, use French, etc.)",
12
+ "For QUESTIONS or ANALYSIS, search first in your internal knowledge base before using actions.",
13
13
  "For ON-CHAIN actions, just use the useful actions.",
14
- "For QUESTIONS or ANALYSIS, you MUST search in your cache memory or/and internal knowledge base.",
15
- "NEVER repeat same actions if the user doesn't ask for it.",
16
14
  ],
17
- warnings: [],
15
+ warnings: ["NEVER repeat same actions if the user doesn't ask for it."],
18
16
  },
19
17
  },
20
18
  };
@@ -20,7 +20,7 @@ class Orchestrator {
20
20
  query: zod_1.z.string(),
21
21
  }),
22
22
  execute: async ({ query }) => {
23
- const persistentMemories = await this.memory.persistent.searchSimilarQueries(query, {
23
+ const persistentMemories = await this.memory.persistent.findRelevantDocuments(query, {
24
24
  similarityThreshold: 70,
25
25
  });
26
26
  return `# LONG_TERM_MEMORY: ${JSON.stringify(persistentMemories)}`;
@@ -5,7 +5,6 @@ export declare class CacheMemory {
5
5
  private readonly CACHE_TTL;
6
6
  constructor(options?: CacheMemoryOptions);
7
7
  private initRedis;
8
- private getMemoryKey;
9
8
  private storeMemory;
10
9
  findSimilarActions(query: string, options?: MatchOptions & {
11
10
  userId?: string;
@@ -31,14 +31,8 @@ class CacheMemory {
31
31
  console.error("āŒ Failed to connect to Redis:", error);
32
32
  }
33
33
  }
34
- getMemoryKey(scope, userId) {
35
- if (scope === types_1.MemoryScope.GLOBAL) {
36
- return `${this.CACHE_PREFIX}global:`;
37
- }
38
- return `${this.CACHE_PREFIX}user:${userId}:`;
39
- }
40
34
  async storeMemory(memory) {
41
- const prefix = this.getMemoryKey(memory.scope, memory.userId);
35
+ const prefix = this.CACHE_PREFIX;
42
36
  const key = `${prefix}${memory.id}`;
43
37
  const result = await this.redis.set(key, JSON.stringify(memory), {
44
38
  EX: this.CACHE_TTL,
@@ -87,20 +81,9 @@ class CacheMemory {
87
81
  return results;
88
82
  }
89
83
  async getAllMemories(scope, userId) {
90
- let patterns = [];
91
- if (!scope || scope === types_1.MemoryScope.GLOBAL) {
92
- const globalPrefix = this.getMemoryKey(types_1.MemoryScope.GLOBAL);
93
- const globalKeys = await this.redis.keys(`${globalPrefix}*`);
94
- const globalPatterns = await this.getMemoriesFromKeys(globalKeys);
95
- patterns = patterns.concat(globalPatterns);
96
- }
97
- if (userId && (!scope || scope === types_1.MemoryScope.USER)) {
98
- const userPrefix = this.getMemoryKey(types_1.MemoryScope.USER, userId);
99
- const userKeys = await this.redis.keys(`${userPrefix}*`);
100
- const userPatterns = await this.getMemoriesFromKeys(userKeys);
101
- patterns = patterns.concat(userPatterns);
102
- }
103
- return patterns;
84
+ const keys = await this.redis.keys(`${this.CACHE_PREFIX}*`);
85
+ const memories = await this.getMemoriesFromKeys(keys);
86
+ return memories;
104
87
  }
105
88
  async getMemoriesFromKeys(keys) {
106
89
  const memories = [];
@@ -29,10 +29,6 @@ export declare class PersistentMemory {
29
29
  * Make API request to Meilisearch
30
30
  */
31
31
  private _makeRequest;
32
- /**
33
- * Get index name based on scope and userId
34
- */
35
- private _getIndexName;
36
32
  /**
37
33
  * Get or create an index with proper settings
38
34
  */
@@ -45,17 +41,15 @@ export declare class PersistentMemory {
45
41
  /**
46
42
  * Find best matching memories
47
43
  */
48
- searchSimilarQueries(query: string, options?: SearchOptions): Promise<{
49
- createdAt: string;
50
- data: any;
51
- purpose: string;
44
+ findRelevantDocuments(query: string, options?: SearchOptions): Promise<{
52
45
  query: string;
53
- chunk: string;
46
+ data: any;
54
47
  similarityPercentage: number;
48
+ createdAt: string;
55
49
  }[]>;
56
50
  /**
57
51
  * Delete memories for a given scope and user
58
52
  */
59
- deleteMemories(scope: MemoryScope, userId?: string): Promise<unknown>;
53
+ deleteMemories(): Promise<unknown>;
60
54
  }
61
55
  export {};
@@ -4,7 +4,6 @@ exports.PersistentMemory = void 0;
4
4
  const openai_1 = require("@ai-sdk/openai");
5
5
  const ai_1 = require("ai");
6
6
  const text_splitter_1 = require("langchain/text_splitter");
7
- const types_1 = require("../types");
8
7
  /**
9
8
  * Handles persistent memory storage using Meilisearch API
10
9
  */
@@ -12,16 +11,14 @@ class PersistentMemory {
12
11
  constructor(options) {
13
12
  this.host = options.host;
14
13
  this.apiKey = options.apiKey;
15
- this.INDEX_PREFIX = options.indexPrefix || "memory_";
14
+ this.INDEX_PREFIX = options.indexPrefix || "memory";
16
15
  }
17
16
  /**
18
17
  * Initialize indexes
19
18
  */
20
19
  async init() {
21
20
  // Create global index
22
- await this._getOrCreateIndex(this._getIndexName(types_1.MemoryScope.GLOBAL));
23
- // Create user index
24
- await this._getOrCreateIndex(this._getIndexName(types_1.MemoryScope.USER));
21
+ await this._getOrCreateIndex(this.INDEX_PREFIX);
25
22
  }
26
23
  /**
27
24
  * Make API request to Meilisearch
@@ -42,15 +39,6 @@ class PersistentMemory {
42
39
  }
43
40
  return response.json();
44
41
  }
45
- /**
46
- * Get index name based on scope and userId
47
- */
48
- _getIndexName(scope, userId) {
49
- if (scope === "global") {
50
- return `${this.INDEX_PREFIX}global`;
51
- }
52
- return `${this.INDEX_PREFIX}user_${userId}`;
53
- }
54
42
  /**
55
43
  * Get or create an index with proper settings
56
44
  */
@@ -102,15 +90,14 @@ class PersistentMemory {
102
90
  * Store a memory in the database
103
91
  */
104
92
  async createMemory(memory) {
105
- const indexName = this._getIndexName(memory.scope, memory.userId);
106
- await this._getOrCreateIndex(indexName);
93
+ await this._getOrCreateIndex(memory.roomId);
107
94
  const chunks = await this.processContent(memory.data);
108
95
  const document = {
109
96
  ...memory,
110
97
  chunks,
111
98
  createdAt: memory.createdAt.toISOString(),
112
99
  };
113
- const response = await this._makeRequest(`/indexes/${indexName}/documents`, {
100
+ const response = await this._makeRequest(`/indexes/${this.INDEX_PREFIX}/documents`, {
114
101
  method: "POST",
115
102
  body: JSON.stringify([document]),
116
103
  });
@@ -120,7 +107,7 @@ class PersistentMemory {
120
107
  /**
121
108
  * Find best matching memories
122
109
  */
123
- async searchSimilarQueries(query, options = {}) {
110
+ async findRelevantDocuments(query, options = {}) {
124
111
  console.log("\nšŸ” Searching in persistent memory");
125
112
  console.log("Query:", query);
126
113
  console.log("Options:", JSON.stringify(options, null, 2));
@@ -130,47 +117,29 @@ class PersistentMemory {
130
117
  value: query,
131
118
  });
132
119
  const searchResults = [];
133
- // Search in global memories
134
- if (!options.scope || options.scope === "global") {
135
- const globalIndex = this._getIndexName(types_1.MemoryScope.GLOBAL);
136
- console.log("\nšŸ“š Searching in global index:", globalIndex);
137
- try {
138
- const globalResults = await this._makeRequest(`/indexes/${globalIndex}/search`, {
139
- method: "POST",
140
- body: JSON.stringify({ q: query }),
141
- });
142
- if (globalResults?.hits) {
143
- searchResults.push(...globalResults.hits);
144
- }
145
- }
146
- catch (error) {
147
- console.error("āŒ Error searching global index:", error);
148
- }
149
- }
150
- // Search in user memories
151
- if (options.userId &&
152
- (!options.scope || options.scope === types_1.MemoryScope.USER)) {
153
- const userIndex = this._getIndexName(types_1.MemoryScope.USER, options.userId);
154
- const userResults = await this._makeRequest(`/indexes/${userIndex}/search`, {
120
+ console.log("\nšŸ“š Searching in global index:", this.INDEX_PREFIX);
121
+ try {
122
+ const globalResults = await this._makeRequest(`/indexes/${this.INDEX_PREFIX}/search`, {
155
123
  method: "POST",
156
124
  body: JSON.stringify({ q: query }),
157
125
  });
158
- if (userResults.hits) {
159
- searchResults.push(...userResults.hits);
126
+ if (globalResults?.hits) {
127
+ searchResults.push(...globalResults.hits);
160
128
  }
161
129
  }
130
+ catch (error) {
131
+ console.error("āŒ Error searching global index:", error);
132
+ }
162
133
  const totalResults = searchResults.length;
163
134
  console.log(`\nšŸ“Š Found ${totalResults} total matches`);
164
135
  // Process and filter results using cosine similarity
165
136
  const results = searchResults
166
137
  .flatMap((hit) => {
167
138
  const chunkSimilarities = hit.chunks.map((chunk) => ({
168
- createdAt: hit.createdAt,
169
- data: hit.data,
170
- purpose: hit.purpose,
171
139
  query: hit.query,
172
- chunk: chunk.content,
140
+ data: hit.data,
173
141
  similarityPercentage: ((0, ai_1.cosineSimilarity)(queryEmbedding, chunk.embedding) + 1) * 50,
142
+ createdAt: hit.createdAt,
174
143
  }));
175
144
  return chunkSimilarities.reduce((best, current) => current.similarityPercentage > best.similarityPercentage
176
145
  ? current
@@ -185,10 +154,6 @@ class PersistentMemory {
185
154
  results.forEach((match, index) => {
186
155
  console.log(`\n${index + 1}. Match Details:`);
187
156
  console.log(` Query: ${match.query}`);
188
- console.log(` Purpose: ${match.purpose}`);
189
- console.log(` Similarity: ${match.similarityPercentage.toFixed(2)}%`);
190
- console.log(` Content: "${match.chunk}"`);
191
- console.log("ā”€".repeat(50));
192
157
  });
193
158
  }
194
159
  else {
@@ -199,9 +164,8 @@ class PersistentMemory {
199
164
  /**
200
165
  * Delete memories for a given scope and user
201
166
  */
202
- async deleteMemories(scope, userId) {
203
- const indexName = this._getIndexName(scope, userId);
204
- return this._makeRequest(`/indexes/${indexName}`, {
167
+ async deleteMemories() {
168
+ return this._makeRequest(`/indexes/${this.INDEX_PREFIX}`, {
205
169
  method: "DELETE",
206
170
  });
207
171
  }
@@ -0,0 +1,17 @@
1
+ import { Orchestrator } from "../llm/orchestrator";
2
+ import { ActionSchema, ScheduledAction, ScheduledActionEvents } from "../types";
3
+ import { ActionQueueManager } from "./queue";
4
+ export declare class ActionScheduler {
5
+ private actionQueueManager;
6
+ private orchestrator;
7
+ private scheduledActions;
8
+ private storage;
9
+ private events;
10
+ constructor(actionQueueManager: ActionQueueManager, orchestrator: Orchestrator, events?: ScheduledActionEvents);
11
+ scheduleAction(action: ActionSchema, scheduledTime: Date, userId: string, recurrence?: ScheduledAction["recurrence"]): Promise<string>;
12
+ private initializeScheduledActions;
13
+ private scheduleExecution;
14
+ private executeScheduledAction;
15
+ private calculateNextExecutionTime;
16
+ cancelScheduledAction(actionId: string): Promise<boolean>;
17
+ }