@flowriki/agent 0.1.0-beta.3 → 0.1.0-beta.4

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.
@@ -2,6 +2,8 @@
2
2
 
3
3
  // src/engine.ts
4
4
  import os5 from "os";
5
+ import { createRequire as createRequire4 } from "module";
6
+ import { spawnSync } from "child_process";
5
7
 
6
8
  // ../agent-core/dist/index.js
7
9
  import { z as z4 } from "zod";
@@ -6061,16 +6063,39 @@ var AgentLink = class {
6061
6063
  }
6062
6064
  }
6063
6065
  };
6066
+ var HEARTBEAT_MS = 3e4;
6064
6067
  function adapt(socket) {
6065
6068
  let closed = false;
6066
6069
  const closeHandlers = [];
6067
6070
  const fire = () => {
6068
6071
  if (closed) return;
6069
6072
  closed = true;
6073
+ clearInterval(heartbeat);
6070
6074
  for (const handler of closeHandlers) handler();
6071
6075
  };
6072
6076
  socket.on("close", fire);
6073
6077
  socket.on("error", fire);
6078
+ let answered = true;
6079
+ socket.on("pong", () => {
6080
+ answered = true;
6081
+ });
6082
+ const heartbeat = setInterval(() => {
6083
+ if (!answered) {
6084
+ try {
6085
+ socket.terminate();
6086
+ } catch {
6087
+ }
6088
+ fire();
6089
+ return;
6090
+ }
6091
+ answered = false;
6092
+ try {
6093
+ socket.ping();
6094
+ } catch {
6095
+ fire();
6096
+ }
6097
+ }, HEARTBEAT_MS);
6098
+ heartbeat.unref?.();
6074
6099
  return {
6075
6100
  send: (data) => {
6076
6101
  if (socket.readyState !== WebSocket.OPEN) return;
@@ -6946,7 +6971,7 @@ function openBrowser(url, env = process.env) {
6946
6971
  }
6947
6972
 
6948
6973
  // src/engine.ts
6949
- var AGENT_VERSION = "0.1.0-beta.3";
6974
+ var AGENT_VERSION = "0.1.0-beta.4";
6950
6975
  async function connect(options = {}) {
6951
6976
  let service;
6952
6977
  try {
@@ -7070,6 +7095,13 @@ async function start(options = {}) {
7070
7095
  message: `this installation is not connected to ${service} yet`
7071
7096
  };
7072
7097
  }
7098
+ if (!browsersReady()) {
7099
+ options.onStatus?.("preparing", "downloading the browser Flowriki records with \u2014 this happens once");
7100
+ const prepared = await prepareBrowsers();
7101
+ if (!prepared.ok) {
7102
+ return { ok: false, reason: "refused", message: `this machine cannot record yet \u2014 ${prepared.message}` };
7103
+ }
7104
+ }
7073
7105
  const lock = takeLock();
7074
7106
  if (!lock.ok) {
7075
7107
  return {
@@ -7116,6 +7148,36 @@ async function start(options = {}) {
7116
7148
  }
7117
7149
  };
7118
7150
  }
7151
+ async function prepareBrowsers() {
7152
+ if (browsersReady()) {
7153
+ return { ok: true, already: true, message: "chromium is already installed" };
7154
+ }
7155
+ let cli;
7156
+ try {
7157
+ cli = createRequire4(import.meta.url).resolve("playwright/cli.js");
7158
+ } catch {
7159
+ return {
7160
+ ok: false,
7161
+ already: false,
7162
+ message: "playwright is not installed beside this agent \u2014 reinstall it"
7163
+ };
7164
+ }
7165
+ const run = spawnSync(process.execPath, [cli, "install", "chromium"], { stdio: "inherit" });
7166
+ if (run.status !== 0) {
7167
+ return {
7168
+ ok: false,
7169
+ already: false,
7170
+ message: `could not install chromium (exit ${run.status ?? "unknown"}) \u2014 try \`npx playwright@${playwrightVersion() ?? "latest"} install chromium\` yourself`
7171
+ };
7172
+ }
7173
+ return { ok: browsersReady(), already: false, message: "chromium installed" };
7174
+ }
7175
+ function browsersReady() {
7176
+ return inspectPlaywright().chromiumInstalled === true;
7177
+ }
7178
+ function playwrightVersion() {
7179
+ return inspectPlaywright().version;
7180
+ }
7119
7181
  function status(serviceArg) {
7120
7182
  const service = resolveService(serviceArg);
7121
7183
  const connection = connectionFor(service);
@@ -7195,6 +7257,8 @@ export {
7195
7257
  connect,
7196
7258
  resolveCheckouts,
7197
7259
  start,
7260
+ prepareBrowsers,
7261
+ browsersReady,
7198
7262
  status,
7199
7263
  doctor,
7200
7264
  disconnect
package/dist/cli.js CHANGED
@@ -4,10 +4,11 @@ import {
4
4
  connect,
5
5
  disconnect,
6
6
  doctor,
7
+ prepareBrowsers,
7
8
  resolveCheckouts,
8
9
  start,
9
10
  status
10
- } from "./chunk-XT52RW5S.js";
11
+ } from "./chunk-7JLRYAQ2.js";
11
12
 
12
13
  // src/cli.ts
13
14
  import { parseArgs } from "util";
@@ -27,6 +28,7 @@ ${bold("USAGE")}
27
28
  flowriki-agent start run the agent (stays in the foreground)
28
29
  flowriki-agent status is it connected, and what is prepared
29
30
  flowriki-agent doctor diagnose setup problems
31
+ flowriki-agent prepare download the browser recording needs
30
32
  flowriki-agent disconnect forget this computer's credential
31
33
 
32
34
  ${bold("OPTIONS")}
@@ -129,8 +131,7 @@ Run \`flowriki-agent --help\`.`);
129
131
  console.log(`${bold("Flowriki agent")} ${dim(AGENT_VERSION)}`);
130
132
  console.log(dim(` connected as ${started.connection.machineName}`));
131
133
  if (started.projects.length === 0) {
132
- console.log(yellow(" no projects prepared \u2014 this machine is online and idle"));
133
- console.log(dim(" Add one: flowriki-agent start --project /path/to/a/checkout"));
134
+ console.log(dim(" ready \u2014 this machine records and runs whatever the dashboard asks for"));
134
135
  }
135
136
  for (const project of started.projects) {
136
137
  console.log(dim(` project ${project.name} (${project.root})`));
@@ -150,6 +151,11 @@ Run \`flowriki-agent --help\`.`);
150
151
  return await new Promise(() => {
151
152
  });
152
153
  }
154
+ case "prepare": {
155
+ const result = await prepareBrowsers();
156
+ console.log(result.ok ? green(result.message) : red(result.message));
157
+ return result.ok ? 0 : 1;
158
+ }
153
159
  case "status": {
154
160
  const state = status(service);
155
161
  if (values.json) {
package/dist/engine.js CHANGED
@@ -1,18 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  AGENT_VERSION,
4
+ browsersReady,
4
5
  connect,
5
6
  disconnect,
6
7
  doctor,
8
+ prepareBrowsers,
7
9
  resolveCheckouts,
8
10
  start,
9
11
  status
10
- } from "./chunk-XT52RW5S.js";
12
+ } from "./chunk-7JLRYAQ2.js";
11
13
  export {
12
14
  AGENT_VERSION,
15
+ browsersReady,
13
16
  connect,
14
17
  disconnect,
15
18
  doctor,
19
+ prepareBrowsers,
16
20
  resolveCheckouts,
17
21
  start,
18
22
  status
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowriki/agent",
3
- "version": "0.1.0-beta.3",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "Run Flowriki UI tests on your own computer. Connects this machine to your Flowriki account.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",