@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.
|
|
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-
|
|
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(
|
|
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-
|
|
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