@minded-ai/mindedjs 2.0.11 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browserTask/executeBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/executeBrowserTask.js +13 -3
- package/dist/browserTask/executeBrowserTask.js.map +1 -1
- package/dist/browserTask/executeBrowserTask.py +54 -11
- package/package.json +1 -1
- package/src/browserTask/executeBrowserTask.py +54 -11
- package/src/browserTask/executeBrowserTask.ts +15 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAGpE,eAAO,MAAM,oBAAoB,0CAAiD;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,KAAG,OAAO,CAAC,4BAA4B,CAiC/L,CAAC;AAEF,eAAO,MAAM,qBAAqB,oCAA2C;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,OAAO,CAAC,6BAA6B,CA2B/K,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACnB,wBAAwB,KAChC,OAAO,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAGpE,eAAO,MAAM,oBAAoB,0CAAiD;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,KAAG,OAAO,CAAC,4BAA4B,CAiC/L,CAAC;AAEF,eAAO,MAAM,qBAAqB,oCAA2C;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,OAAO,CAAC,6BAA6B,CA2B/K,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACnB,wBAAwB,KAChC,OAAO,CAAC,yBAAyB,CA2HnC,CAAC"}
|
|
@@ -65,10 +65,20 @@ const invokeBrowserTask = async (options) => {
|
|
|
65
65
|
const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema, } = options;
|
|
66
66
|
if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
|
|
67
67
|
const pythonScriptPath = path_1.default.resolve(__dirname, 'executeBrowserTask.py');
|
|
68
|
-
const
|
|
69
|
-
const args = ['run', pythonScriptPath, sessionId, cdpUrl, task, outputSchemaArg];
|
|
68
|
+
const args = ['run', pythonScriptPath];
|
|
70
69
|
logger_1.logger.info({ message: 'Spawning Python process', args });
|
|
71
|
-
const child = (0, node_child_process_1.spawn)('uv', args, { stdio: ['
|
|
70
|
+
const child = (0, node_child_process_1.spawn)('uv', args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
71
|
+
// Build payload to send over stdin
|
|
72
|
+
const payload = {
|
|
73
|
+
sessionId,
|
|
74
|
+
cdpUrl,
|
|
75
|
+
task,
|
|
76
|
+
outputSchema,
|
|
77
|
+
otpSecret: process.env.OTP_SECRET,
|
|
78
|
+
};
|
|
79
|
+
// Write JSON payload to stdin
|
|
80
|
+
child.stdin.write(JSON.stringify(payload));
|
|
81
|
+
child.stdin.end();
|
|
72
82
|
let stdoutBuffer = '';
|
|
73
83
|
let stderrBuffer = '';
|
|
74
84
|
child.stdout.on('data', (data) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,10 @@ import asyncio
|
|
|
2
2
|
import json
|
|
3
3
|
from typing import List, Optional, Dict, Any, TypedDict
|
|
4
4
|
from pydantic import BaseModel, create_model, Field
|
|
5
|
-
from browser_use import Agent, Controller
|
|
5
|
+
from browser_use import Agent, Controller, ActionResult
|
|
6
6
|
from browser_use.browser import BrowserProfile, BrowserSession
|
|
7
7
|
from browser_use.llm import ChatOpenAI
|
|
8
|
+
from playwright.async_api import Page
|
|
8
9
|
import os
|
|
9
10
|
import sys
|
|
10
11
|
from dotenv import load_dotenv
|
|
@@ -43,12 +44,12 @@ def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any
|
|
|
43
44
|
return None
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None):
|
|
47
|
+
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None, otp_secret: Optional[str] = None):
|
|
47
48
|
llm = ChatOpenAI(
|
|
48
49
|
model="gpt-4.1",
|
|
49
50
|
api_key=os.getenv("OPENAI_API_KEY"),
|
|
50
51
|
)
|
|
51
|
-
folder_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '
|
|
52
|
+
folder_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'downloads_{session_id}')
|
|
52
53
|
|
|
53
54
|
# Create folder if it doesn't exist
|
|
54
55
|
os.makedirs(folder_path, exist_ok=True)
|
|
@@ -69,11 +70,33 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
69
70
|
output_schema = None
|
|
70
71
|
|
|
71
72
|
output_model = create_pydantic_model_from_schema(output_schema)
|
|
73
|
+
|
|
74
|
+
# Build controller and register dynamic tools
|
|
75
|
+
controller = Controller(output_model=output_model) if output_model is not None else Controller()
|
|
76
|
+
|
|
77
|
+
# Dynamically add generate_otp action when OTP secret is provided
|
|
78
|
+
|
|
79
|
+
if otp_secret:
|
|
80
|
+
# Ensure pyotp is available when OTP is requested
|
|
81
|
+
try:
|
|
82
|
+
import pyotp # type: ignore
|
|
83
|
+
except Exception as e:
|
|
84
|
+
raise RuntimeError("pyotp is required when otpSecret is provided. Install it with 'uv add pyotp'.") from e
|
|
85
|
+
|
|
86
|
+
@controller.registry.action("Generate a 6-digit TOTP code. Do not call any other tool at the same time.")
|
|
87
|
+
async def generate_otp() -> ActionResult:
|
|
88
|
+
try:
|
|
89
|
+
code = pyotp.TOTP(otp_secret).now()
|
|
90
|
+
print(f"Generated OTP: {code}")
|
|
91
|
+
return ActionResult(extracted_content=code)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
print(f"Failed to generate OTP: {e}")
|
|
94
|
+
return ActionResult(extracted_content=f"Failed to generate OTP: {e}")
|
|
72
95
|
|
|
73
96
|
agent = Agent(
|
|
74
97
|
task=task,
|
|
75
98
|
llm=llm,
|
|
76
|
-
controller=
|
|
99
|
+
controller=controller,
|
|
77
100
|
available_file_paths=available_files,
|
|
78
101
|
browser_session=browser_session,
|
|
79
102
|
)
|
|
@@ -102,10 +125,30 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
102
125
|
print(final_result)
|
|
103
126
|
|
|
104
127
|
if __name__ == '__main__':
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
128
|
+
# Prefer JSON payload via stdin; fallback to argv for backwards compatibility
|
|
129
|
+
payload_str = ''
|
|
130
|
+
try:
|
|
131
|
+
if not sys.stdin.isatty():
|
|
132
|
+
payload_str = sys.stdin.read().strip()
|
|
133
|
+
except Exception:
|
|
134
|
+
payload_str = ''
|
|
135
|
+
|
|
136
|
+
if payload_str:
|
|
137
|
+
try:
|
|
138
|
+
payload = json.loads(payload_str)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
raise SystemExit(f"Failed to parse JSON payload from stdin: {e}")
|
|
141
|
+
|
|
142
|
+
session_id = payload.get('sessionId')
|
|
143
|
+
cdp_url = payload.get('cdpUrl')
|
|
144
|
+
task = payload.get('task')
|
|
145
|
+
output_schema = payload.get('outputSchema')
|
|
146
|
+
otp_secret = payload.get('otpSecret')
|
|
147
|
+
|
|
148
|
+
if not session_id or not cdp_url or not task:
|
|
149
|
+
raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task")
|
|
150
|
+
|
|
151
|
+
output_schema_json = json.dumps(output_schema) if output_schema is not None else None
|
|
152
|
+
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret))
|
|
153
|
+
else:
|
|
154
|
+
raise SystemExit("Usage: uv run executeBrowserTask.py; send a JSON payload via stdin")
|
package/package.json
CHANGED
|
@@ -2,9 +2,10 @@ import asyncio
|
|
|
2
2
|
import json
|
|
3
3
|
from typing import List, Optional, Dict, Any, TypedDict
|
|
4
4
|
from pydantic import BaseModel, create_model, Field
|
|
5
|
-
from browser_use import Agent, Controller
|
|
5
|
+
from browser_use import Agent, Controller, ActionResult
|
|
6
6
|
from browser_use.browser import BrowserProfile, BrowserSession
|
|
7
7
|
from browser_use.llm import ChatOpenAI
|
|
8
|
+
from playwright.async_api import Page
|
|
8
9
|
import os
|
|
9
10
|
import sys
|
|
10
11
|
from dotenv import load_dotenv
|
|
@@ -43,12 +44,12 @@ def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any
|
|
|
43
44
|
return None
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None):
|
|
47
|
+
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None, otp_secret: Optional[str] = None):
|
|
47
48
|
llm = ChatOpenAI(
|
|
48
49
|
model="gpt-4.1",
|
|
49
50
|
api_key=os.getenv("OPENAI_API_KEY"),
|
|
50
51
|
)
|
|
51
|
-
folder_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '
|
|
52
|
+
folder_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), f'downloads_{session_id}')
|
|
52
53
|
|
|
53
54
|
# Create folder if it doesn't exist
|
|
54
55
|
os.makedirs(folder_path, exist_ok=True)
|
|
@@ -69,11 +70,33 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
69
70
|
output_schema = None
|
|
70
71
|
|
|
71
72
|
output_model = create_pydantic_model_from_schema(output_schema)
|
|
73
|
+
|
|
74
|
+
# Build controller and register dynamic tools
|
|
75
|
+
controller = Controller(output_model=output_model) if output_model is not None else Controller()
|
|
76
|
+
|
|
77
|
+
# Dynamically add generate_otp action when OTP secret is provided
|
|
78
|
+
|
|
79
|
+
if otp_secret:
|
|
80
|
+
# Ensure pyotp is available when OTP is requested
|
|
81
|
+
try:
|
|
82
|
+
import pyotp # type: ignore
|
|
83
|
+
except Exception as e:
|
|
84
|
+
raise RuntimeError("pyotp is required when otpSecret is provided. Install it with 'uv add pyotp'.") from e
|
|
85
|
+
|
|
86
|
+
@controller.registry.action("Generate a 6-digit TOTP code. Do not call any other tool at the same time.")
|
|
87
|
+
async def generate_otp() -> ActionResult:
|
|
88
|
+
try:
|
|
89
|
+
code = pyotp.TOTP(otp_secret).now()
|
|
90
|
+
print(f"Generated OTP: {code}")
|
|
91
|
+
return ActionResult(extracted_content=code)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
print(f"Failed to generate OTP: {e}")
|
|
94
|
+
return ActionResult(extracted_content=f"Failed to generate OTP: {e}")
|
|
72
95
|
|
|
73
96
|
agent = Agent(
|
|
74
97
|
task=task,
|
|
75
98
|
llm=llm,
|
|
76
|
-
controller=
|
|
99
|
+
controller=controller,
|
|
77
100
|
available_file_paths=available_files,
|
|
78
101
|
browser_session=browser_session,
|
|
79
102
|
)
|
|
@@ -102,10 +125,30 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
102
125
|
print(final_result)
|
|
103
126
|
|
|
104
127
|
if __name__ == '__main__':
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
128
|
+
# Prefer JSON payload via stdin; fallback to argv for backwards compatibility
|
|
129
|
+
payload_str = ''
|
|
130
|
+
try:
|
|
131
|
+
if not sys.stdin.isatty():
|
|
132
|
+
payload_str = sys.stdin.read().strip()
|
|
133
|
+
except Exception:
|
|
134
|
+
payload_str = ''
|
|
135
|
+
|
|
136
|
+
if payload_str:
|
|
137
|
+
try:
|
|
138
|
+
payload = json.loads(payload_str)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
raise SystemExit(f"Failed to parse JSON payload from stdin: {e}")
|
|
141
|
+
|
|
142
|
+
session_id = payload.get('sessionId')
|
|
143
|
+
cdp_url = payload.get('cdpUrl')
|
|
144
|
+
task = payload.get('task')
|
|
145
|
+
output_schema = payload.get('outputSchema')
|
|
146
|
+
otp_secret = payload.get('otpSecret')
|
|
147
|
+
|
|
148
|
+
if not session_id or not cdp_url or not task:
|
|
149
|
+
raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task")
|
|
150
|
+
|
|
151
|
+
output_schema_json = json.dumps(output_schema) if output_schema is not None else None
|
|
152
|
+
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret))
|
|
153
|
+
else:
|
|
154
|
+
raise SystemExit("Usage: uv run executeBrowserTask.py; send a JSON payload via stdin")
|
|
@@ -97,13 +97,25 @@ export const invokeBrowserTask = async (
|
|
|
97
97
|
|
|
98
98
|
if (browserTaskMode === BrowserTaskMode.LOCAL) {
|
|
99
99
|
const pythonScriptPath = path.resolve(__dirname, 'executeBrowserTask.py');
|
|
100
|
-
const outputSchemaArg = JSON.stringify(outputSchema || []);
|
|
101
100
|
|
|
102
|
-
const args = ['run', pythonScriptPath
|
|
101
|
+
const args = ['run', pythonScriptPath];
|
|
103
102
|
|
|
104
103
|
logger.info({ message: 'Spawning Python process', args });
|
|
105
104
|
|
|
106
|
-
const child = spawn('uv', args, { stdio: ['
|
|
105
|
+
const child = spawn('uv', args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
106
|
+
|
|
107
|
+
// Build payload to send over stdin
|
|
108
|
+
const payload = {
|
|
109
|
+
sessionId,
|
|
110
|
+
cdpUrl,
|
|
111
|
+
task,
|
|
112
|
+
outputSchema,
|
|
113
|
+
otpSecret: process.env.OTP_SECRET,
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Write JSON payload to stdin
|
|
117
|
+
child.stdin.write(JSON.stringify(payload));
|
|
118
|
+
child.stdin.end();
|
|
107
119
|
|
|
108
120
|
let stdoutBuffer = '';
|
|
109
121
|
let stderrBuffer = '';
|