@minded-ai/mindedjs 2.0.13-beta.9 → 2.0.14-beta-1

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 (167) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +16 -6
  3. package/dist/agent.js.map +1 -1
  4. package/dist/browserTask/README.md +419 -0
  5. package/dist/browserTask/browserAgent.py +632 -0
  6. package/dist/browserTask/captcha_isolated.png +0 -0
  7. package/dist/browserTask/executeBrowserTask.d.ts +2 -2
  8. package/dist/browserTask/executeBrowserTask.d.ts.map +1 -1
  9. package/dist/browserTask/executeBrowserTask.js +7 -28
  10. package/dist/browserTask/executeBrowserTask.js.map +1 -1
  11. package/dist/browserTask/executeBrowserTask.ts +79 -0
  12. package/dist/browserTask/requirements.txt +8 -0
  13. package/dist/browserTask/setup.sh +144 -0
  14. package/dist/cli/index.js +7 -35
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/lambdaHandlerTemplate.d.ts.map +1 -1
  17. package/dist/cli/lambdaHandlerTemplate.js +2 -1
  18. package/dist/cli/lambdaHandlerTemplate.js.map +1 -1
  19. package/dist/cli/lambdaHandlerTemplate.ts +3 -2
  20. package/dist/internalTools/retell.js +17 -7
  21. package/dist/internalTools/retell.js.map +1 -1
  22. package/dist/internalTools/sendPlaceholderMessage.js +17 -7
  23. package/dist/internalTools/sendPlaceholderMessage.js.map +1 -1
  24. package/dist/nodes/addBrowserTaskNode.js +2 -2
  25. package/dist/nodes/addBrowserTaskNode.js.map +1 -1
  26. package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -1
  27. package/dist/nodes/addBrowserTaskRunNode.js +4 -1
  28. package/dist/nodes/addBrowserTaskRunNode.js.map +1 -1
  29. package/dist/toolsLibrary/classifier.d.ts.map +1 -1
  30. package/dist/toolsLibrary/classifier.js +103 -33
  31. package/dist/toolsLibrary/classifier.js.map +1 -1
  32. package/dist/types/LLM.types.js.map +1 -1
  33. package/dist/utils/extractStateMemoryResponse.d.ts +4 -0
  34. package/dist/utils/extractStateMemoryResponse.d.ts.map +1 -1
  35. package/dist/utils/extractStateMemoryResponse.js +89 -87
  36. package/dist/utils/extractStateMemoryResponse.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/agent.ts +15 -6
  39. package/src/browserTask/executeBrowserTask.ts +22 -47
  40. package/src/cli/index.ts +7 -34
  41. package/src/cli/lambdaHandlerTemplate.ts +3 -2
  42. package/src/nodes/addBrowserTaskNode.ts +2 -2
  43. package/src/nodes/addBrowserTaskRunNode.ts +5 -1
  44. package/src/toolsLibrary/classifier.ts +115 -37
  45. package/src/types/LLM.types.ts +2 -2
  46. package/dist/cli/localOperatorSetup.d.ts +0 -6
  47. package/dist/cli/localOperatorSetup.d.ts.map +0 -1
  48. package/dist/cli/localOperatorSetup.js +0 -300
  49. package/dist/cli/localOperatorSetup.js.map +0 -1
  50. package/dist/guidelines/guidelinesManager.d.ts +0 -37
  51. package/dist/guidelines/guidelinesManager.d.ts.map +0 -1
  52. package/dist/guidelines/guidelinesManager.js +0 -172
  53. package/dist/guidelines/guidelinesManager.js.map +0 -1
  54. package/dist/internalTools/documentExtraction.d.ts +0 -69
  55. package/dist/internalTools/documentExtraction.d.ts.map +0 -1
  56. package/dist/internalTools/documentExtraction.js +0 -65
  57. package/dist/internalTools/documentExtraction.js.map +0 -1
  58. package/dist/internalTools/managedDocumentParser/managedDocumentParser.d.ts +0 -10
  59. package/dist/internalTools/managedDocumentParser/managedDocumentParser.d.ts.map +0 -1
  60. package/dist/internalTools/managedDocumentParser/managedDocumentParser.js +0 -80
  61. package/dist/internalTools/managedDocumentParser/managedDocumentParser.js.map +0 -1
  62. package/dist/pii-gateway/gateway.d.ts +0 -17
  63. package/dist/pii-gateway/gateway.d.ts.map +0 -1
  64. package/dist/pii-gateway/gateway.js +0 -77
  65. package/dist/pii-gateway/gateway.js.map +0 -1
  66. package/dist/pii-gateway/index.d.ts +0 -4
  67. package/dist/pii-gateway/index.d.ts.map +0 -1
  68. package/dist/pii-gateway/index.js +0 -14
  69. package/dist/pii-gateway/index.js.map +0 -1
  70. package/dist/pii-gateway/proxy.d.ts +0 -80
  71. package/dist/pii-gateway/proxy.d.ts.map +0 -1
  72. package/dist/pii-gateway/proxy.js +0 -106
  73. package/dist/pii-gateway/proxy.js.map +0 -1
  74. package/dist/pii-gateway/types.d.ts +0 -27
  75. package/dist/pii-gateway/types.d.ts.map +0 -1
  76. package/dist/pii-gateway/types.js +0 -3
  77. package/dist/pii-gateway/types.js.map +0 -1
  78. package/dist/platform/mindedChatOpenAI.d.ts +0 -5
  79. package/dist/platform/mindedChatOpenAI.d.ts.map +0 -1
  80. package/dist/platform/mindedChatOpenAI.js +0 -23
  81. package/dist/platform/mindedChatOpenAI.js.map +0 -1
  82. package/dist/platform/mindedUtils.d.ts +0 -1
  83. package/dist/platform/mindedUtils.d.ts.map +0 -1
  84. package/dist/platform/mindedUtils.js +0 -2
  85. package/dist/platform/mindedUtils.js.map +0 -1
  86. package/dist/platform/parallelAzureChatOpenAI.d.ts +0 -39
  87. package/dist/platform/parallelAzureChatOpenAI.d.ts.map +0 -1
  88. package/dist/platform/parallelAzureChatOpenAI.js +0 -114
  89. package/dist/platform/parallelAzureChatOpenAI.js.map +0 -1
  90. package/dist/platform/parallelChatOpenAI.d.ts +0 -38
  91. package/dist/platform/parallelChatOpenAI.d.ts.map +0 -1
  92. package/dist/platform/parallelChatOpenAI.js +0 -111
  93. package/dist/platform/parallelChatOpenAI.js.map +0 -1
  94. package/dist/platform/parallelMindedChatOpenAI.d.ts +0 -39
  95. package/dist/platform/parallelMindedChatOpenAI.d.ts.map +0 -1
  96. package/dist/platform/parallelMindedChatOpenAI.js +0 -111
  97. package/dist/platform/parallelMindedChatOpenAI.js.map +0 -1
  98. package/dist/platform/piiGateway/proxy.d.ts +0 -20
  99. package/dist/platform/piiGateway/proxy.d.ts.map +0 -1
  100. package/dist/platform/piiGateway/proxy.js +0 -24
  101. package/dist/platform/piiGateway/proxy.js.map +0 -1
  102. package/dist/toolsLibrary/browser/extraction.d.ts +0 -83
  103. package/dist/toolsLibrary/browser/extraction.d.ts.map +0 -1
  104. package/dist/toolsLibrary/browser/extraction.js +0 -328
  105. package/dist/toolsLibrary/browser/extraction.js.map +0 -1
  106. package/dist/types/Agent.d.ts +0 -2
  107. package/dist/types/Agent.d.ts.map +0 -1
  108. package/dist/types/Agent.js +0 -18
  109. package/dist/types/Agent.js.map +0 -1
  110. package/dist/types/Flows.d.ts +0 -2
  111. package/dist/types/Flows.d.ts.map +0 -1
  112. package/dist/types/Flows.js +0 -18
  113. package/dist/types/Flows.js.map +0 -1
  114. package/dist/types/LLM.d.ts +0 -2
  115. package/dist/types/LLM.d.ts.map +0 -1
  116. package/dist/types/LLM.js +0 -18
  117. package/dist/types/LLM.js.map +0 -1
  118. package/dist/types/LangGraph.d.ts +0 -2
  119. package/dist/types/LangGraph.d.ts.map +0 -1
  120. package/dist/types/LangGraph.js +0 -18
  121. package/dist/types/LangGraph.js.map +0 -1
  122. package/dist/types/Platform.d.ts +0 -2
  123. package/dist/types/Platform.d.ts.map +0 -1
  124. package/dist/types/Platform.js +0 -18
  125. package/dist/types/Platform.js.map +0 -1
  126. package/dist/types/Tools.d.ts +0 -2
  127. package/dist/types/Tools.d.ts.map +0 -1
  128. package/dist/types/Tools.js +0 -18
  129. package/dist/types/Tools.js.map +0 -1
  130. package/dist/types/Triggers.d.ts +0 -2
  131. package/dist/types/Triggers.d.ts.map +0 -1
  132. package/dist/types/Triggers.js +0 -18
  133. package/dist/types/Triggers.js.map +0 -1
  134. package/dist/types/Triggers.types.d.ts +0 -25
  135. package/dist/types/Triggers.types.d.ts.map +0 -1
  136. package/dist/types/Triggers.types.js +0 -3
  137. package/dist/types/Triggers.types.js.map +0 -1
  138. package/dist/types/Voice.d.ts +0 -2
  139. package/dist/types/Voice.d.ts.map +0 -1
  140. package/dist/types/Voice.js +0 -18
  141. package/dist/types/Voice.js.map +0 -1
  142. package/dist/types/index.d.ts +0 -9
  143. package/dist/types/index.d.ts.map +0 -1
  144. package/dist/types/index.js +0 -25
  145. package/dist/types/index.js.map +0 -1
  146. package/dist/utils/LogicalConditionDebugger.d.ts +0 -57
  147. package/dist/utils/LogicalConditionDebugger.d.ts.map +0 -1
  148. package/dist/utils/LogicalConditionDebugger.js +0 -143
  149. package/dist/utils/LogicalConditionDebugger.js.map +0 -1
  150. package/dist/utils/documentProcessor.d.ts +0 -87
  151. package/dist/utils/documentProcessor.d.ts.map +0 -1
  152. package/dist/utils/documentProcessor.js +0 -726
  153. package/dist/utils/documentProcessor.js.map +0 -1
  154. package/dist/utils/extractToolGuidelineParams.d.ts +0 -4
  155. package/dist/utils/extractToolGuidelineParams.d.ts.map +0 -1
  156. package/dist/utils/extractToolGuidelineParams.js +0 -20
  157. package/dist/utils/extractToolGuidelineParams.js.map +0 -1
  158. package/dist/utils/extractToolMemoryResponse.d.ts +0 -4
  159. package/dist/utils/extractToolMemoryResponse.d.ts.map +0 -1
  160. package/dist/utils/extractToolMemoryResponse.js +0 -16
  161. package/dist/utils/extractToolMemoryResponse.js.map +0 -1
  162. package/dist/utils/parseAttachments.d.ts +0 -14
  163. package/dist/utils/parseAttachments.d.ts.map +0 -1
  164. package/dist/utils/parseAttachments.js +0 -54
  165. package/dist/utils/parseAttachments.js.map +0 -1
  166. package/src/cli/localOperatorSetup.ts +0 -308
  167. package/src/toolsLibrary/browser/extraction.ts +0 -393
package/src/cli/index.ts CHANGED
@@ -4,7 +4,6 @@ import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import { logger } from '../utils/logger';
6
6
  import { execSync } from 'child_process';
7
- import { setupLocalOperator, isLocalOperatorSetup } from './localOperatorSetup';
8
7
 
9
8
  const ENV_FILE = '.env';
10
9
 
@@ -12,7 +11,7 @@ function getEnvFilePath(): string {
12
11
  return path.join(process.cwd(), ENV_FILE);
13
12
  }
14
13
 
15
- async function setToken(token: string, useLocalOperator: boolean = false): Promise<void> {
14
+ function setToken(token: string): void {
16
15
  const envPath = getEnvFilePath();
17
16
  const tokenLine = `MINDED_CONNECTION_TOKEN=${token}`;
18
17
 
@@ -20,7 +19,7 @@ async function setToken(token: string, useLocalOperator: boolean = false): Promi
20
19
  if (!fs.existsSync(envPath)) {
21
20
  // Create .env file with the token
22
21
  fs.writeFileSync(envPath, tokenLine + '\n');
23
- console.info(`Created ${envPath} and added token`);
22
+ logger.info({ msg: `Created ${envPath} and added token` });
24
23
  } else {
25
24
  // Read existing .env file
26
25
  const envContent = fs.readFileSync(envPath, 'utf8');
@@ -30,7 +29,7 @@ async function setToken(token: string, useLocalOperator: boolean = false): Promi
30
29
  // Replace existing token
31
30
  const updatedContent = envContent.replace(/MINDED_CONNECTION_TOKEN=.*/, tokenLine);
32
31
  fs.writeFileSync(envPath, updatedContent);
33
- console.info(`Updated MINDED_CONNECTION_TOKEN in ${envPath}`);
32
+ logger.info({ msg: `Updated MINDED_CONNECTION_TOKEN in ${envPath}` });
34
33
  } else {
35
34
  // Append token to existing file
36
35
  const newContent = envContent.endsWith('\n') ? envContent + tokenLine + '\n' : envContent + '\n' + tokenLine + '\n';
@@ -38,12 +37,6 @@ async function setToken(token: string, useLocalOperator: boolean = false): Promi
38
37
  logger.info({ msg: `Added MINDED_CONNECTION_TOKEN to ${envPath}` });
39
38
  }
40
39
  }
41
-
42
- // Handle local operator setup if requested
43
- if (useLocalOperator) {
44
- console.info('Setting up local browser operator...');
45
- await setupLocalOperator();
46
- }
47
40
  }
48
41
 
49
42
  function generateLambdaHandler(): void {
@@ -155,7 +148,7 @@ function generateLambdaHandler(): void {
155
148
  }
156
149
  }
157
150
 
158
- async function main() {
151
+ function main() {
159
152
  const args = process.argv.slice(2);
160
153
  const command = args[0];
161
154
 
@@ -165,33 +158,13 @@ async function main() {
165
158
  logger.error({ msg: 'Please provide a token' });
166
159
  process.exit(1);
167
160
  }
168
-
169
- // Check for --use-local-operator flag
170
- const useLocalOperator = args.includes('--use-local-operator');
171
- await setToken(token, useLocalOperator);
172
- } else if (command === 'setup-local-operator') {
173
- // Standalone command to setup local operator
174
- const skipPrompt = args.includes('--yes') || args.includes('-y');
175
- await setupLocalOperator(skipPrompt);
161
+ setToken(token);
176
162
  } else if (command === 'generate-lambda-ts-handler') {
177
163
  generateLambdaHandler();
178
- } else if (command === 'check-local-operator') {
179
- // Command to check if local operator is set up
180
- if (isLocalOperatorSetup()) {
181
- console.info('✓ Local operator is set up and ready');
182
- } else {
183
- console.info('✗ Local operator is not set up. Run: npx minded setup-local-operator');
184
- process.exit(1);
185
- }
186
164
  } else {
187
- logger.error({
188
- msg: 'Unknown command. Available commands: token, setup-local-operator, check-local-operator, generate-lambda-ts-handler',
189
- });
165
+ logger.error({ msg: 'Unknown command. Available commands: token, generate-lambda-ts-handler' });
190
166
  process.exit(1);
191
167
  }
192
168
  }
193
169
 
194
- main().catch((error) => {
195
- logger.error({ message: 'Command failed', error });
196
- process.exit(1);
197
- });
170
+ main();
@@ -49,7 +49,7 @@ export const handler = async (event: any, context: any) => {
49
49
  },
50
50
  body: JSON.stringify(responseBody),
51
51
  };
52
- } catch (err) {
52
+ } catch (err: any) {
53
53
  logger.error({
54
54
  msg: 'Lambda runtime error',
55
55
  err,
@@ -66,7 +66,8 @@ export const handler = async (event: any, context: any) => {
66
66
  },
67
67
  body: JSON.stringify({
68
68
  error: 'Lambda runtime error',
69
- err,
69
+ errorMessage: err.message,
70
+ errorStack: err.stack,
70
71
  requestId: context.requestId,
71
72
  functionName: context.functionName,
72
73
  }),
@@ -39,7 +39,7 @@ export const addBrowserTaskNode = async ({ graph, node, agent, llm }: AddBrowser
39
39
 
40
40
  const combinedPlaybooks = combinePlaybooks(agent.playbooks);
41
41
  if (combinedPlaybooks) {
42
- const compiledPrompt = compilePrompt(combinedPlaybooks, { state: state, memory: state.memory, env: process.env });
42
+ const compiledPrompt = compilePrompt(combinedPlaybooks, { state: state, memory: state.memory });
43
43
  const systemMessage = new SystemMessage(compiledPrompt);
44
44
  if (state.messages.length === 0 || state.messages[0].getType() === 'system') {
45
45
  state.messages[0] = systemMessage;
@@ -68,7 +68,7 @@ export const addBrowserTaskNode = async ({ graph, node, agent, llm }: AddBrowser
68
68
  };
69
69
 
70
70
  // Compile the prompt with parameters
71
- const compiledPrompt = compilePrompt(node.prompt, { ...promptParams, env: process.env });
71
+ const compiledPrompt = compilePrompt(node.prompt, { ...promptParams });
72
72
 
73
73
  // Build the full prompt with compiled content
74
74
  const fullPrompt = `
@@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid';
10
10
  import { invokeBrowserTask } from '../browserTask/executeBrowserTask';
11
11
  import { zodSchemaToParams } from '../platform/utils/tools';
12
12
  import { getConfig } from '../platform/config';
13
+ import { compilePrompt } from './compilePrompt';
13
14
 
14
15
  type AddBrowserTaskRunNodeParams = {
15
16
  graph: PreCompiledGraph;
@@ -50,12 +51,15 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
50
51
  inputParams: zodSchemaToParams(tool.input),
51
52
  }));
52
53
 
54
+ // We compile the env variables to avoid having to pass them to the platform in the tool input
55
+ const promptCompiledWithEnv = compilePrompt(prompt, { env: process.env });
56
+
53
57
  const { browserTaskMode } = getConfig();
54
58
  // Invoke browser task via socket
55
59
  const result = await invokeBrowserTask({
56
60
  sessionId,
57
61
  cdpUrl,
58
- task: prompt,
62
+ task: promptCompiledWithEnv,
59
63
  keepAlive,
60
64
  hooks,
61
65
  browserTaskMode,
@@ -35,6 +35,34 @@ const DEFAULT_CONFIG: Partial<ClassifierConfig> = {
35
35
  defaultReason: 'Unable to determine classification',
36
36
  };
37
37
 
38
+ /**
39
+ * Validates the classification result
40
+ * @param result The classification result to validate
41
+ * @param config The classifier configuration
42
+ * @returns True if the result is valid, false otherwise
43
+ */
44
+ function validateClassificationResult(result: ClassificationResult, config: ClassifierConfig): boolean {
45
+ // Check if result exists and has a class property
46
+ if (!result || !result.class) {
47
+ return false;
48
+ }
49
+
50
+ // Check if the class is one of the configured classes
51
+ const validClasses = config.classes.map((c) => c.name);
52
+ if (!validClasses.includes(result.class)) {
53
+ return false;
54
+ }
55
+
56
+ // If we expect JSON format with confidence, validate it
57
+ if (config.outputFormat === 'json' && result.confidence !== undefined) {
58
+ if (typeof result.confidence !== 'number' || result.confidence < 0 || result.confidence > 1) {
59
+ return false;
60
+ }
61
+ }
62
+
63
+ return true;
64
+ }
65
+
38
66
  /**
39
67
  * Generic classifier utility that can be used standalone
40
68
  * @param content The content to classify
@@ -44,48 +72,98 @@ const DEFAULT_CONFIG: Partial<ClassifierConfig> = {
44
72
  */
45
73
  export async function classify(content: string, config: ClassifierConfig, llm: BaseLanguageModel): Promise<ClassificationResult> {
46
74
  const mergedConfig = { ...DEFAULT_CONFIG, ...config };
75
+ const MAX_RETRIES = 3;
76
+ let lastError: Error | null = null;
77
+ let lastInvalidResult: ClassificationResult | null = null;
47
78
 
48
- try {
49
- // Build the classification prompt
50
- const classesDescription = mergedConfig.classes.map((c) => `${c.name}: ${c.description}`).join('\n');
79
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
80
+ try {
81
+ // Build the classification prompt
82
+ const classesDescription = mergedConfig.classes.map((c) => `${c.name}: ${c.description}`).join('\n');
83
+ const validClassNames = mergedConfig.classes.map((c) => c.name);
84
+
85
+ const basePrompt =
86
+ mergedConfig.systemPrompt ||
87
+ 'You are a classifier. Your task is to classify the given content into one of the following categories:';
88
+
89
+ let prompt = `${basePrompt}\n\n${classesDescription}\n\n`;
90
+
91
+ // Add retry feedback if this is not the first attempt
92
+ if (attempt > 1 && lastInvalidResult) {
93
+ prompt += `\n⚠️ IMPORTANT: Your previous classification attempt was INVALID. `;
94
+ if (lastInvalidResult.class && !validClassNames.includes(lastInvalidResult.class)) {
95
+ prompt += `You selected "${lastInvalidResult.class}" which is NOT in the list of valid classes. `;
96
+ } else if (!lastInvalidResult.class) {
97
+ prompt += `You did not provide a class value. `;
98
+ }
99
+ prompt += `You MUST select ONLY from these valid classes:\n${validClassNames.join(', ')}\n\n`;
100
+ }
101
+
102
+ if (mergedConfig.outputFormat === 'json') {
103
+ prompt += `You should output the result in the following JSON format: {
104
+ "class": "<selected class name>",
105
+ ${mergedConfig.includeReason ? '"reason": "<explanation for the classification>",' : ''}
106
+ "confidence": <confidence score between 0 and 1>
107
+ }.\nReturn JSON and nothing more.`;
108
+ } else {
109
+ prompt += 'Return only the class name.';
110
+ }
111
+
112
+ prompt += `\n\nContent to classify:\n${content}`;
113
+
114
+ // Make the classification request
115
+ let result: ClassificationResult;
116
+ if (mergedConfig.outputFormat === 'json') {
117
+ const parser = new JsonOutputParser();
118
+ const parsedResult = await llm.pipe(parser).invoke([new SystemMessage(prompt)]);
119
+ result = parsedResult as ClassificationResult;
120
+ } else {
121
+ const llmResult = await llm.invoke([new SystemMessage(prompt)]);
122
+ const classText = typeof llmResult.content === 'string' ? llmResult.content.trim() : '';
123
+ result = { class: classText };
124
+ }
125
+
126
+ // Validate the result
127
+ if (!validateClassificationResult(result, mergedConfig)) {
128
+ lastInvalidResult = result;
129
+ throw new Error(`Invalid classification result: ${JSON.stringify(result)}`);
130
+ }
131
+
132
+ // Success - return the valid result
133
+ return result;
134
+ } catch (err) {
135
+ lastError = err as Error;
136
+ logger.warn({
137
+ message: `Classification attempt ${attempt} failed`,
138
+ attempt,
139
+ maxRetries: MAX_RETRIES,
140
+ error: lastError.message,
141
+ invalidResult: lastInvalidResult,
142
+ });
51
143
 
52
- const basePrompt =
53
- mergedConfig.systemPrompt || 'You are a classifier. Your task is to classify the given content into one of the following categories:';
54
-
55
- let prompt = `${basePrompt}\n\n${classesDescription}\n\n`;
56
-
57
- if (mergedConfig.outputFormat === 'json') {
58
- prompt += `You should output the result in the following JSON format: {
59
- "class": "<selected class name>",
60
- ${mergedConfig.includeReason ? '"reason": "<explanation for the classification>",' : ''}
61
- "confidence": <confidence score between 0 and 1>
62
- }.\nReturn JSON and nothing more.`;
63
- } else {
64
- prompt += 'Return only the class name.';
144
+ // If this is not the last attempt, continue to retry
145
+ if (attempt < MAX_RETRIES) {
146
+ continue;
147
+ }
65
148
  }
149
+ }
66
150
 
67
- prompt += `\n\nContent to classify:\n${content}`;
68
-
69
- // Make the classification request
70
- if (mergedConfig.outputFormat === 'json') {
71
- const parser = new JsonOutputParser();
72
- const result = await llm.pipe(parser).invoke([new SystemMessage(prompt)]);
73
- return result as ClassificationResult;
74
- } else {
75
- const result = await llm.invoke([new SystemMessage(prompt)]);
76
- const classText = typeof result.content === 'string' ? result.content.trim() : '';
77
- return { class: classText };
78
- }
79
- } catch (err) {
80
- logger.error({ message: 'Classification failed, using default', err });
151
+ // All retries exhausted - fallback to default
152
+ logger.warn({
153
+ message: 'Classification failed after max retries, using default class',
154
+ maxRetries: MAX_RETRIES,
155
+ lastError: lastError?.message,
156
+ lastInvalidResult,
157
+ defaultClass: mergedConfig.defaultClass,
158
+ defaultReason: mergedConfig.defaultReason,
159
+ });
81
160
 
82
- // Return default classification on error
83
- return {
84
- class: mergedConfig.defaultClass || 'unknown',
85
- reason: mergedConfig.defaultReason || (err as Error).message,
86
- confidence: 0,
87
- };
88
- }
161
+ // Return default classification
162
+ return {
163
+ class: mergedConfig.defaultClass || 'unknown',
164
+ reason: mergedConfig.defaultReason || `Classification failed after ${MAX_RETRIES} attempts: ${lastError?.message}`,
165
+ confidence: 0,
166
+ };
89
167
  }
90
168
 
91
169
  /**
@@ -9,7 +9,7 @@ export type LLMConfig = {
9
9
  export type LLMProvider = 'ChatOpenAI' | 'AzureChatOpenAI' | 'MindedChatOpenAI';
10
10
 
11
11
  export const LLMProviders: Record<LLMProvider, any> = {
12
- ChatOpenAI,
13
- AzureChatOpenAI,
12
+ ChatOpenAI: ChatOpenAI,
13
+ AzureChatOpenAI: AzureChatOpenAI,
14
14
  MindedChatOpenAI,
15
15
  };
@@ -1,6 +0,0 @@
1
- export declare function isLocalOperatorSetup(): boolean;
2
- export declare function setupLocalOperator(skipPrompt?: boolean): Promise<void>;
3
- export declare function validateLocalOperatorSetup(): void;
4
- export declare function getVenvPath(): string;
5
- export declare function getVenvBinPath(): string;
6
- //# sourceMappingURL=localOperatorSetup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localOperatorSetup.d.ts","sourceRoot":"","sources":["../../src/cli/localOperatorSetup.ts"],"names":[],"mappings":"AAwCA,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AA+FD,wBAAsB,kBAAkB,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJnF;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAMjD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -1,300 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.isLocalOperatorSetup = isLocalOperatorSetup;
27
- exports.setupLocalOperator = setupLocalOperator;
28
- exports.validateLocalOperatorSetup = validateLocalOperatorSetup;
29
- exports.getVenvPath = getVenvPath;
30
- exports.getVenvBinPath = getVenvBinPath;
31
- const fs = __importStar(require("fs"));
32
- const path = __importStar(require("path"));
33
- const child_process_1 = require("child_process");
34
- const readline = __importStar(require("readline"));
35
- const VENV_DIR = '.venv';
36
- const SETUP_MARKER_FILE = '.minded-local-operator-setup';
37
- const REQUIRED_PACKAGES = [
38
- {
39
- name: 'uv',
40
- description: 'Python package manager for fast dependency installation',
41
- command: 'curl -LsSf https://astral.sh/uv/install.sh | sh',
42
- checkCommand: 'uv --version',
43
- },
44
- {
45
- name: 'Python 3.12',
46
- description: 'Python runtime for browser automation',
47
- command: 'python3.12 --version',
48
- checkCommand: 'python3.12 --version',
49
- },
50
- {
51
- name: 'browser-use',
52
- description: 'Browser automation library',
53
- command: 'uv pip install browser-use',
54
- },
55
- {
56
- name: 'Playwright Chromium',
57
- description: 'Chromium browser for automation',
58
- command: 'uvx playwright install chromium --with-deps',
59
- },
60
- ];
61
- function isLocalOperatorSetup() {
62
- const setupMarkerPath = path.join(process.cwd(), SETUP_MARKER_FILE);
63
- const venvPath = path.join(process.cwd(), VENV_DIR);
64
- // Check if both the marker file and venv directory exist
65
- return fs.existsSync(setupMarkerPath) && fs.existsSync(venvPath);
66
- }
67
- function checkCommand(command) {
68
- try {
69
- (0, child_process_1.execSync)(command, { stdio: 'ignore' });
70
- return true;
71
- }
72
- catch (_a) {
73
- return false;
74
- }
75
- }
76
- function promptUser(question) {
77
- // Check if we're in an interactive terminal
78
- if (!process.stdin.isTTY) {
79
- console.warn('Non-interactive terminal detected, skipping prompt and cancelling installation');
80
- return Promise.resolve(false);
81
- }
82
- return new Promise((resolve) => {
83
- const rl = readline.createInterface({
84
- input: process.stdin,
85
- output: process.stdout,
86
- });
87
- // Set a timeout in case the prompt hangs
88
- const timeout = setTimeout(() => {
89
- console.warn('Prompt timeout (30s), cancelling installation');
90
- rl.close();
91
- resolve(false);
92
- }, 30000); // 30 second timeout
93
- console.log('Displaying prompt to user');
94
- rl.question(question, (answer) => {
95
- clearTimeout(timeout);
96
- console.log(`User answered: "${answer}"`);
97
- rl.close();
98
- const confirmed = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
99
- console.log(`Prompt result: ${confirmed}`);
100
- resolve(confirmed);
101
- });
102
- // Handle potential readline errors
103
- rl.on('error', (error) => {
104
- console.error('Readline error, cancelling installation:', error.message);
105
- clearTimeout(timeout);
106
- rl.close();
107
- resolve(false);
108
- });
109
- });
110
- }
111
- async function runCommand(command, description) {
112
- return new Promise((resolve, reject) => {
113
- console.log(`Installing ${description}...`);
114
- const isComplexCommand = command.includes('|') || command.includes('&&');
115
- if (isComplexCommand) {
116
- // For complex commands with pipes or &&, use shell
117
- const child = (0, child_process_1.spawn)('sh', ['-c', command], {
118
- stdio: 'inherit',
119
- shell: true,
120
- });
121
- child.on('error', (error) => {
122
- console.error(`Failed to install ${description}:`, error.message);
123
- reject(error);
124
- });
125
- child.on('close', (code) => {
126
- if (code === 0) {
127
- console.log(`✓ ${description} installed successfully`);
128
- resolve();
129
- }
130
- else {
131
- reject(new Error(`Command exited with code ${code}`));
132
- }
133
- });
134
- }
135
- else {
136
- // For simple commands, use execSync
137
- try {
138
- (0, child_process_1.execSync)(command, { stdio: 'inherit' });
139
- console.log(`✓ ${description} installed successfully`);
140
- resolve();
141
- }
142
- catch (error) {
143
- console.error(`Failed to install ${description}:`, error);
144
- reject(error);
145
- }
146
- }
147
- });
148
- }
149
- async function setupLocalOperator(skipPrompt = false) {
150
- console.log('\n🤖 Minded Local Operator Setup\n');
151
- // Check if already setup
152
- if (isLocalOperatorSetup()) {
153
- console.log('✓ Local operator is already set up');
154
- return;
155
- }
156
- // Display what will be installed
157
- console.log('The following packages will be installed for local browser automation:\n');
158
- REQUIRED_PACKAGES.forEach((pkg, index) => {
159
- console.log(` ${index + 1}. ${pkg.name} - ${pkg.description}`);
160
- });
161
- console.log('');
162
- // Ask for confirmation unless skipped
163
- if (!skipPrompt) {
164
- console.log('Waiting for user confirmation...');
165
- const confirmed = await promptUser('Do you want to proceed with the installation? (y/n): ');
166
- if (!confirmed) {
167
- console.log('Installation cancelled by user');
168
- process.exit(0);
169
- }
170
- console.log('User confirmed, proceeding with installation');
171
- }
172
- else {
173
- console.log('Skipping confirmation prompt, proceeding with installation...');
174
- }
175
- console.log('\n📦 Starting installation...\n');
176
- try {
177
- // Check and install uv if needed
178
- if (!checkCommand('uv --version')) {
179
- console.log('Installing uv package manager...');
180
- await runCommand('curl -LsSf https://astral.sh/uv/install.sh | sh', 'uv');
181
- // Add uv to PATH for current session
182
- const uvPath = path.join(process.env.HOME || '', '.cargo', 'bin');
183
- process.env.PATH = `${uvPath}:${process.env.PATH}`;
184
- }
185
- else {
186
- console.log('✓ uv is already installed');
187
- }
188
- // Check Python 3.12
189
- if (!checkCommand('python3.12 --version')) {
190
- console.error('Python 3.12 is required but not found');
191
- console.log('Please install Python 3.12 manually:');
192
- console.log(' macOS: brew install python@3.12');
193
- console.log(' Ubuntu/Debian: sudo apt install python3.12');
194
- console.log(' Or visit: https://www.python.org/downloads/');
195
- process.exit(1);
196
- }
197
- else {
198
- console.log('✓ Python 3.12 is available');
199
- }
200
- // Create virtual environment
201
- console.log('Creating Python virtual environment...');
202
- (0, child_process_1.execSync)(`uv venv --python 3.12 ${VENV_DIR}`, { stdio: 'inherit' });
203
- console.log('✓ Virtual environment created');
204
- // Install browser-use in the venv
205
- console.log('Installing browser-use package...');
206
- (0, child_process_1.execSync)(`uv pip install --python ${path.join(process.cwd(), VENV_DIR, 'bin', 'python')} browser-use`, {
207
- stdio: 'inherit',
208
- });
209
- console.log('✓ browser-use installed');
210
- // Install Playwright Chromium
211
- console.log('Installing Playwright Chromium browser...');
212
- (0, child_process_1.execSync)(`uvx playwright install chromium --with-deps`, { stdio: 'inherit' });
213
- console.log('✓ Playwright Chromium installed');
214
- // Create setup marker file
215
- const setupMarkerPath = path.join(process.cwd(), SETUP_MARKER_FILE);
216
- const setupInfo = {
217
- version: '1.0.0',
218
- setupDate: new Date().toISOString(),
219
- packages: REQUIRED_PACKAGES.map((p) => p.name),
220
- venvPath: VENV_DIR,
221
- };
222
- fs.writeFileSync(setupMarkerPath, JSON.stringify(setupInfo, null, 2));
223
- // Add to .gitignore if not already there
224
- const gitignorePath = path.join(process.cwd(), '.gitignore');
225
- if (fs.existsSync(gitignorePath)) {
226
- const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
227
- const itemsToIgnore = [VENV_DIR, SETUP_MARKER_FILE, 'downloads/'];
228
- const linesToAdd = [];
229
- itemsToIgnore.forEach((item) => {
230
- if (!gitignoreContent.includes(item)) {
231
- linesToAdd.push(item);
232
- }
233
- });
234
- if (linesToAdd.length > 0) {
235
- const newContent = gitignoreContent.trimEnd() + '\n\n# Minded Local Operator\n' + linesToAdd.join('\n') + '\n';
236
- fs.writeFileSync(gitignorePath, newContent);
237
- console.log('✓ Updated .gitignore');
238
- }
239
- }
240
- // Add BROWSER_TASK_MODE to .env file
241
- const envPath = path.join(process.cwd(), '.env');
242
- const browserTaskModeVar = 'BROWSER_TASK_MODE=localRun';
243
- if (fs.existsSync(envPath)) {
244
- const envContent = fs.readFileSync(envPath, 'utf8');
245
- // Check if BROWSER_TASK_MODE is already set
246
- if (!envContent.includes('BROWSER_TASK_MODE')) {
247
- // Append to existing .env file
248
- const newEnvContent = envContent.trimEnd() + '\n' + browserTaskModeVar + '\n';
249
- fs.writeFileSync(envPath, newEnvContent);
250
- console.log('✓ Added BROWSER_TASK_MODE=localRun to .env');
251
- }
252
- else if (!envContent.includes('BROWSER_TASK_MODE=localRun')) {
253
- // BROWSER_TASK_MODE exists but with different value, update it
254
- const updatedEnvContent = envContent.replace(/BROWSER_TASK_MODE=.*$/m, browserTaskModeVar);
255
- fs.writeFileSync(envPath, updatedEnvContent);
256
- console.log('✓ Updated BROWSER_TASK_MODE to localRun in .env');
257
- }
258
- else {
259
- console.log('✓ BROWSER_TASK_MODE=localRun already configured in .env');
260
- }
261
- }
262
- else {
263
- // Create new .env file
264
- fs.writeFileSync(envPath, browserTaskModeVar + '\n');
265
- console.log('✓ Created .env file with BROWSER_TASK_MODE=localRun');
266
- }
267
- console.log('\n' + '='.repeat(50));
268
- console.log('✅ Local operator setup completed successfully!');
269
- console.log('='.repeat(50) + '\n');
270
- console.log('You can now use browser automation features locally.');
271
- console.log('The virtual environment will be activated automatically when needed.');
272
- }
273
- catch (error) {
274
- console.error('Setup failed:', error);
275
- // Clean up partial installation
276
- try {
277
- if (fs.existsSync(path.join(process.cwd(), VENV_DIR))) {
278
- fs.rmSync(path.join(process.cwd(), VENV_DIR), { recursive: true });
279
- }
280
- }
281
- catch (_a) {
282
- // Ignore cleanup errors
283
- }
284
- process.exit(1);
285
- }
286
- }
287
- function validateLocalOperatorSetup() {
288
- if (!isLocalOperatorSetup()) {
289
- console.error('Local operator is not set up');
290
- console.log('Please run: npx minded setup-local-operator');
291
- throw new Error('Local operator not configured');
292
- }
293
- }
294
- function getVenvPath() {
295
- return path.join(process.cwd(), VENV_DIR);
296
- }
297
- function getVenvBinPath() {
298
- return path.join(getVenvPath(), 'bin');
299
- }
300
- //# sourceMappingURL=localOperatorSetup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localOperatorSetup.js","sourceRoot":"","sources":["../../src/cli/localOperatorSetup.ts"],"names":[],"mappings":"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"}