testdriverai 5.0.9 → 5.1.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.
package/agent.js CHANGED
@@ -691,6 +691,26 @@ const actOnMarkdown = async (content, depth, pushToHistory = false, dry = false)
691
691
  }
692
692
  };
693
693
 
694
+ const ensureMacScreenPerms = async () => {
695
+
696
+ // if os is mac, check for screen capture permissions
697
+ if (
698
+ !config.TD_VM &&
699
+ process.platform === "darwin" &&
700
+ !macScreenPerms.hasScreenCapturePermission()
701
+ ) {
702
+ logger.info(chalk.red("Screen capture permissions not enabled."));
703
+ logger.info(
704
+ "You must enable screen capture permissions for the application calling `testdriverai`.",
705
+ );
706
+ logger.info(
707
+ "Read More: https://docs.testdriver.ai/faq/screen-recording-permissions-mac-only",
708
+ );
709
+ analytics.track("noMacPermissions");
710
+ return exit();
711
+ }
712
+ }
713
+
694
714
  const newSession = async () => {
695
715
  // should be start of new session
696
716
  const sessionRes = await sdk.req("session/start", {
@@ -1122,6 +1142,13 @@ const embed = async (file, depth) => {
1122
1142
  logger.info(`${file} (end)`);
1123
1143
  };
1124
1144
 
1145
+ const buildEnv = async () => {
1146
+ let win = await system.activeWin();
1147
+ setTerminalApp(win);
1148
+ await ensureMacScreenPerms();
1149
+ await makeSandbox();
1150
+ }
1151
+
1125
1152
  const start = async () => {
1126
1153
  // logger.info(await system.getPrimaryDisplay());
1127
1154
 
@@ -1135,28 +1162,12 @@ const start = async () => {
1135
1162
 
1136
1163
  // await sdk.auth();
1137
1164
 
1138
- // if os is mac, check for screen capture permissions
1139
- if (
1140
- process.platform === "darwin" &&
1141
- !macScreenPerms.hasScreenCapturePermission()
1142
- ) {
1143
- logger.info(chalk.red("Screen capture permissions not enabled."));
1144
- logger.info(
1145
- "You must enable screen capture permissions for the application calling `testdriverai`.",
1146
- );
1147
- logger.info(
1148
- "Read More: https://docs.testdriver.ai/faq/screen-recording-permissions-mac-only",
1149
- );
1150
- analytics.track("noMacPermissions");
1151
- return exit();
1152
- }
1153
-
1154
1165
  if (thisCommand !== "run") {
1155
1166
  speak("Howdy! I am TestDriver version " + package.version);
1156
1167
 
1157
1168
  if (!config.TD_VM) {
1158
1169
  logger.info(
1159
- chalk.red("Warning!") +
1170
+ chalk.red("Warning!" ) +
1160
1171
  chalk.dim("Local mode sends screenshots of the desktop to our API."),
1161
1172
  );
1162
1173
  logger.info(
@@ -1170,11 +1181,11 @@ const start = async () => {
1170
1181
  analytics.track("command", { command: thisCommand, file: thisFile });
1171
1182
 
1172
1183
  if (thisCommand == "edit") {
1173
- await makeSandbox();
1184
+ await buildEnv();
1174
1185
  firstPrompt();
1175
1186
  } else if (thisCommand == "run") {
1187
+ await buildEnv();
1176
1188
  errorLimit = 100;
1177
- await makeSandbox();
1178
1189
  run(thisFile);
1179
1190
  } else if (thisCommand == "init") {
1180
1191
  await init();
package/index.js CHANGED
@@ -4,16 +4,17 @@ const system = require("./lib/system.js");
4
4
  const { emitter, events } = require("./lib/events.js");
5
5
  const { logger } = require("./lib/logger.js");
6
6
 
7
- (async () => {
7
+ if (process.argv[2] === "--help" || process.argv[2] === "-h") {
8
+ console.log("Command: testdriverai [init, run, edit] [yaml filepath]");
9
+ process.exit(0);
10
+ }
8
11
 
9
- let win = await system.activeWin();
12
+ (async () => {
10
13
 
11
14
  if (!config.TD_OVERLAY) {
12
15
  let agent = require("./agent.js");
13
- agent.setTerminalApp(win);
14
16
  agent.start();
15
17
  } else {
16
-
17
18
  // Intercept all stdout and stderr calls (works with console as well)
18
19
  const originalStdoutWrite = process.stdout.write.bind(process.stdout);
19
20
  process.stdout.write = (...args) => {
@@ -24,7 +25,7 @@ const { logger } = require("./lib/logger.js");
24
25
  );
25
26
  originalStdoutWrite(...args);
26
27
  };
27
-
28
+
28
29
  const originalStderrWrite = process.stderr.write.bind(process.stderr);
29
30
  process.stderr.write = (...args) => {
30
31
  const [data, encoding] = args;
@@ -34,7 +35,7 @@ const { logger } = require("./lib/logger.js");
34
35
  );
35
36
  originalStderrWrite(...args);
36
37
  };
37
-
38
+
38
39
  require("./lib/overlay.js")
39
40
  .electronProcessPromise.then(async () => {
40
41
  let agent = require("./agent.js");
@@ -45,6 +46,4 @@ const { logger } = require("./lib/logger.js");
45
46
  process.exit(1);
46
47
  });
47
48
  }
48
-
49
-
50
- })()
49
+ })();
package/lib/commander.js CHANGED
@@ -200,10 +200,10 @@ commands:
200
200
  response = await commands.assert(object.expect, object.async);
201
201
  break;
202
202
  case "exec":
203
- speak(`exec ${object.cli}`);
203
+ speak(`exec`);
204
204
  logger.info(generator.jsonToManual(object));
205
205
  notify(generator.jsonToManual(object, false));
206
- response = await commands.exec(object.cli, object.stderr, object.silent);
206
+ response = await commands.exec(object.js);
207
207
  outputs.set(object.output, response);
208
208
  break;
209
209
  default:
package/lib/commands.js CHANGED
@@ -1,5 +1,6 @@
1
1
  // the actual commands to interact with the system
2
2
  const sdk = require("./sdk");
3
+ const vm = require('vm');
3
4
  const chalk = require("chalk");
4
5
  const {
5
6
  captureScreenBase64,
@@ -35,8 +36,6 @@ const {
35
36
  createMarkdownStreamLogger,
36
37
  } = require("./logger");
37
38
  const { emitter, events } = require("./events.js");
38
- const util = require('util');
39
- const exec = util.promisify(require('child_process').exec);
40
39
 
41
40
  const niceSeconds = (ms) => {
42
41
  return Math.round(ms / 1000);
@@ -704,42 +703,26 @@ let commands = {
704
703
  assert: async (assertion, async = false) => {
705
704
  return await assert(assertion, true, async);
706
705
  },
707
- exec: async (cli_command, use_stderr = false, silent = false) => {
706
+ exec: async (nodejs_code) => {
708
707
 
709
- if (config.TD_VM) {
710
- let result = await sandbox.send({type: "commands.run", command: cli_command });
711
- if (!silent) {
712
- if (use_stderr) {
713
- logger.info(chalk.dim(result.out.stderr), true);
714
- } else {
715
- logger.info(chalk.dim(result.out.stdout), true);
716
- }
717
-
718
- }
719
-
720
- let rtnr = use_stderr ? result.out.stderr : result.out.stdout;
721
- return rtnr;
722
-
723
- } else {
708
+ // must be assigned to `result`
709
+ // do not overwrite `result`
710
+ // must install locally via npm install
724
711
 
725
- let args = {};
726
- if (silent) {
727
- args = { stdio: [] };
728
- }
712
+ const context = vm.createContext({ require, console, fs, process });
713
+ const script = new vm.Script(`
714
+ (async () => {
715
+ ${nodejs_code}
716
+ })();
717
+ `);
729
718
 
730
- const { stdout, stderr } = await exec(cli_command, args);
719
+ await script.runInContext(context);
731
720
 
732
- if (!silent) {
733
- logger.info(chalk.dim(stdout), true);
734
- }
721
+ // wait for context.result to resolve
722
+ const stepResult = await context.result;
735
723
 
736
- if (use_stderr) {
737
- return stderr;
738
- } else {
739
- return stdout;
740
- }
741
-
742
- }
724
+ return stepResult;
725
+
743
726
  }
744
727
  };
745
728
 
package/lib/logger.js CHANGED
@@ -19,6 +19,13 @@ const logFormat = printf(({ message }) => {
19
19
 
20
20
  let interpolationVars = JSON.parse(process.env.TD_INTERPOLATION_VARS || '{}');
21
21
 
22
+ // this handles local `TD_*` variables
23
+ for (const [key, value] of Object.entries(process.env)) {
24
+ if (key.startsWith("TD_") && key !== "TD_INTERPOLATION_VARS") {
25
+ interpolationVars[key] = value;
26
+ }
27
+ }
28
+
22
29
  const censorSensitiveData = (message) => {
23
30
  for (let value of Object.values(interpolationVars)) {
24
31
 
package/lib/system.js CHANGED
@@ -171,19 +171,10 @@ const initializeActiveWindow = async () => {
171
171
  const activeWin = async () => {
172
172
 
173
173
  if (config.TD_VM) {
174
-
175
- return "error getting active window, proceed normally";
176
-
174
+ return "error getting active window, proceed normally";
177
175
  } else {
178
-
179
- try {
180
- const activeWindow = await initializeActiveWindow();
181
- return await activeWindow();
182
- } catch (error) {
183
- logger.error('Error getting active window: %s', error);
184
- return null;
185
- }
186
-
176
+ const activeWindow = await initializeActiveWindow();
177
+ return await activeWindow();
187
178
  }
188
179
  };
189
180
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testdriverai",
3
- "version": "5.0.9",
3
+ "version": "5.1.1",
4
4
  "description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -44,6 +44,7 @@
44
44
  "sharp": "^0.33.5",
45
45
  "systeminformation": "^5.23.5",
46
46
  "tmp": "^0.2.3",
47
+ "totp-generator": "^1.0.0",
47
48
  "uuid": "^10.0.0",
48
49
  "winston": "^3.13.0",
49
50
  "ws": "^8.18.1"