@onkernel/cli 0.10.1 → 0.10.2
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/README.md +37 -0
- package/lib.js +9 -61
- package/package.json +19 -20
package/README.md
CHANGED
|
@@ -285,6 +285,12 @@ Create an API key from the [Kernel dashboard](https://dashboard.onkernel.com).
|
|
|
285
285
|
- `--button <button>` - Mouse button: left, middle, right (default: left)
|
|
286
286
|
- `--hold-key <key>` - Modifier keys to hold (repeatable)
|
|
287
287
|
|
|
288
|
+
### Browser Playwright
|
|
289
|
+
|
|
290
|
+
- `kernel browsers playwright execute <id or persistent id> [code]` - Execute Playwright/TypeScript code against the browser
|
|
291
|
+
- `--timeout <seconds>` - Maximum execution time in seconds (defaults server-side)
|
|
292
|
+
- If `[code]` is omitted, code is read from stdin
|
|
293
|
+
|
|
288
294
|
### Extension Management
|
|
289
295
|
|
|
290
296
|
- `kernel extensions list` - List all uploaded extensions
|
|
@@ -395,6 +401,37 @@ kernel browsers computer type my-browser --text "Hello, World!"
|
|
|
395
401
|
|
|
396
402
|
# Type text with a 100ms delay between keystrokes
|
|
397
403
|
kernel browsers computer type my-browser --text "Slow typing..." --delay 100
|
|
404
|
+
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Playwright execution
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
# Execute inline Playwright (TypeScript) code
|
|
411
|
+
kernel browsers playwright execute my-browser 'await page.goto("https://example.com"); const title = await page.title(); return title;'
|
|
412
|
+
|
|
413
|
+
# Or pipe code from stdin
|
|
414
|
+
cat <<'TS' | kernel browsers playwright execute my-browser
|
|
415
|
+
await page.goto("https://example.com");
|
|
416
|
+
const title = await page.title();
|
|
417
|
+
return { title };
|
|
418
|
+
TS
|
|
419
|
+
|
|
420
|
+
# With a timeout in seconds
|
|
421
|
+
kernel browsers playwright execute my-browser --timeout 30 'await (await context.newPage()).goto("https://example.com")'
|
|
422
|
+
|
|
423
|
+
# Mini CDP connection load test (10s)
|
|
424
|
+
cat <<'TS' | kernel browsers playwright execute my-browser
|
|
425
|
+
const start = Date.now();
|
|
426
|
+
let ops = 0;
|
|
427
|
+
while (Date.now() - start < 10_000) {
|
|
428
|
+
await page.evaluate("new Date();");
|
|
429
|
+
ops++;
|
|
430
|
+
}
|
|
431
|
+
const durationMs = Date.now() - start;
|
|
432
|
+
const opsPerSec = ops / (durationMs / 1000);
|
|
433
|
+
return { opsPerSec, ops, durationMs };
|
|
434
|
+
TS
|
|
398
435
|
```
|
|
399
436
|
|
|
400
437
|
### Extension management
|
package/lib.js
CHANGED
|
@@ -6,18 +6,8 @@ const path = require("path");
|
|
|
6
6
|
const JSZip = require("jszip");
|
|
7
7
|
const tar = require("tar");
|
|
8
8
|
const axios = require("axios");
|
|
9
|
-
const ProxyAgent = require("proxy-agent");
|
|
10
9
|
const { spawnSync } = require("child_process");
|
|
11
10
|
|
|
12
|
-
const proxyUrl =
|
|
13
|
-
process.env.HTTPS_PROXY ||
|
|
14
|
-
process.env.https_proxy ||
|
|
15
|
-
process.env.HTTP_PROXY ||
|
|
16
|
-
process.env.http_proxy ||
|
|
17
|
-
null;
|
|
18
|
-
|
|
19
|
-
const agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;
|
|
20
|
-
|
|
21
11
|
const getArchive = () => {
|
|
22
12
|
let target = `${process.platform}-${process.arch}`;
|
|
23
13
|
const archive = archives[target];
|
|
@@ -29,61 +19,31 @@ const getArchive = () => {
|
|
|
29
19
|
|
|
30
20
|
const binDir = path.join(__dirname, "bin");
|
|
31
21
|
|
|
32
|
-
async function extractTar(tarPath, binaries, dir
|
|
22
|
+
async function extractTar(tarPath, binaries, dir) {
|
|
33
23
|
try {
|
|
34
|
-
const filesToExtract = wrappedIn
|
|
35
|
-
? binaries.map((bin) =>
|
|
36
|
-
path.join(wrappedIn, bin).replace(/\\/g, "/"),
|
|
37
|
-
)
|
|
38
|
-
: binaries;
|
|
39
|
-
|
|
40
24
|
await tar.x({
|
|
41
25
|
file: tarPath,
|
|
42
26
|
cwd: dir,
|
|
43
|
-
filter: (path) =>
|
|
27
|
+
filter: (path) => binaries.includes(path),
|
|
44
28
|
});
|
|
45
|
-
|
|
46
|
-
// If wrapped, move files from wrapped directory to bin directory
|
|
47
|
-
if (wrappedIn) {
|
|
48
|
-
const wrappedDir = path.join(dir, wrappedIn);
|
|
49
|
-
for (const binary of binaries) {
|
|
50
|
-
const srcPath = path.join(wrappedDir, binary);
|
|
51
|
-
const destPath = path.join(dir, binary);
|
|
52
|
-
if (fs.existsSync(srcPath)) {
|
|
53
|
-
fs.renameSync(srcPath, destPath);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Clean up empty wrapped directory
|
|
57
|
-
try {
|
|
58
|
-
fs.rmSync(wrappedDir, { recursive: true, force: true });
|
|
59
|
-
} catch (err) {
|
|
60
|
-
// Ignore cleanup errors
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
console.log(`Successfully extracted ${binaries} to "${dir}"`);
|
|
29
|
+
console.log(`Successfully extracted binaries to "${dir}"`);
|
|
65
30
|
} catch (err) {
|
|
66
31
|
throw new Error(`Extraction failed: ${err.message}`);
|
|
67
32
|
}
|
|
68
33
|
}
|
|
69
34
|
|
|
70
|
-
async function extractZip(zipPath, binaries, dir
|
|
35
|
+
async function extractZip(zipPath, binaries, dir) {
|
|
71
36
|
try {
|
|
72
37
|
const zipData = fs.readFileSync(zipPath);
|
|
73
38
|
const zip = await JSZip.loadAsync(zipData);
|
|
74
|
-
|
|
75
39
|
for (const binary of binaries) {
|
|
76
|
-
|
|
77
|
-
? path.join(wrappedIn, binary).replace(/\\/g, "/")
|
|
78
|
-
: binary;
|
|
79
|
-
|
|
80
|
-
if (!zip.files[binaryPath]) {
|
|
40
|
+
if (!zip.files[binary]) {
|
|
81
41
|
throw new Error(
|
|
82
|
-
`Error: ${
|
|
42
|
+
`Error: ${binary} does not exist in ${zipPath}`,
|
|
83
43
|
);
|
|
84
44
|
}
|
|
85
45
|
|
|
86
|
-
const content = await zip.files[
|
|
46
|
+
const content = await zip.files[binary].async("nodebuffer");
|
|
87
47
|
if (!fs.existsSync(dir)) {
|
|
88
48
|
fs.mkdirSync(dir, { recursive: true });
|
|
89
49
|
}
|
|
@@ -134,21 +94,11 @@ const install = async () => {
|
|
|
134
94
|
fs.chmodSync(bin, 0o755);
|
|
135
95
|
return;
|
|
136
96
|
case "zip":
|
|
137
|
-
return extractZip(
|
|
138
|
-
archivePath,
|
|
139
|
-
archive.bins,
|
|
140
|
-
binDir,
|
|
141
|
-
archive.wrappedIn,
|
|
142
|
-
);
|
|
97
|
+
return extractZip(archivePath, archive.bins, binDir);
|
|
143
98
|
case "tar":
|
|
144
99
|
case "tar.gz":
|
|
145
100
|
case "tgz":
|
|
146
|
-
return extractTar(
|
|
147
|
-
archivePath,
|
|
148
|
-
archive.bins,
|
|
149
|
-
binDir,
|
|
150
|
-
archive.wrappedIn,
|
|
151
|
-
);
|
|
101
|
+
return extractTar(archivePath, archive.bins, binDir);
|
|
152
102
|
case "tar.zst":
|
|
153
103
|
case "tzst":
|
|
154
104
|
case "tar.xz":
|
|
@@ -190,8 +140,6 @@ const download = async (url, filename) => {
|
|
|
190
140
|
url: url,
|
|
191
141
|
responseType: "stream",
|
|
192
142
|
timeout: 300000, // 5min
|
|
193
|
-
httpAgent: agent,
|
|
194
|
-
httpsAgent: agent,
|
|
195
143
|
});
|
|
196
144
|
|
|
197
145
|
const writer = fs.createWriteStream(filename);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onkernel/cli",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Kernel CLI",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"postinstall": "node install.js",
|
|
@@ -29,80 +29,79 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"axios": "^1.8.2",
|
|
31
31
|
"jszip": "^3.10.1",
|
|
32
|
-
"proxy-agent": "^6.5.0",
|
|
33
32
|
"tar": "^7.4.3"
|
|
34
33
|
},
|
|
35
34
|
"archives": {
|
|
36
35
|
"darwin-arm64": {
|
|
37
|
-
"name": "kernel_0.10.
|
|
38
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
36
|
+
"name": "kernel_0.10.2_darwin_arm64.tar.gz",
|
|
37
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_darwin_arm64.tar.gz",
|
|
39
38
|
"bins": [
|
|
40
39
|
"kernel"
|
|
41
40
|
],
|
|
42
41
|
"format": "tar.gz",
|
|
43
42
|
"checksum": {
|
|
44
43
|
"algorithm": "sha256",
|
|
45
|
-
"digest": "
|
|
44
|
+
"digest": "117c02a06ee73fdbb91b9c2fa3ea427def7de2ef2d8c60a5c2390f61a646e7db"
|
|
46
45
|
}
|
|
47
46
|
},
|
|
48
47
|
"darwin-x64": {
|
|
49
|
-
"name": "kernel_0.10.
|
|
50
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
48
|
+
"name": "kernel_0.10.2_darwin_amd64.tar.gz",
|
|
49
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_darwin_amd64.tar.gz",
|
|
51
50
|
"bins": [
|
|
52
51
|
"kernel"
|
|
53
52
|
],
|
|
54
53
|
"format": "tar.gz",
|
|
55
54
|
"checksum": {
|
|
56
55
|
"algorithm": "sha256",
|
|
57
|
-
"digest": "
|
|
56
|
+
"digest": "5456760000a041064dafda8c9cc184c89d3552154006a6f370b5dbd2841e4ab8"
|
|
58
57
|
}
|
|
59
58
|
},
|
|
60
59
|
"linux-arm64": {
|
|
61
|
-
"name": "kernel_0.10.
|
|
62
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
60
|
+
"name": "kernel_0.10.2_linux_arm64.tar.gz",
|
|
61
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_linux_arm64.tar.gz",
|
|
63
62
|
"bins": [
|
|
64
63
|
"kernel"
|
|
65
64
|
],
|
|
66
65
|
"format": "tar.gz",
|
|
67
66
|
"checksum": {
|
|
68
67
|
"algorithm": "sha256",
|
|
69
|
-
"digest": "
|
|
68
|
+
"digest": "5426208fa8116a12048a7ec8afbc2c2e9a79a5cdef3104d2f1d9380b5d76b557"
|
|
70
69
|
}
|
|
71
70
|
},
|
|
72
71
|
"linux-x64": {
|
|
73
|
-
"name": "kernel_0.10.
|
|
74
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
72
|
+
"name": "kernel_0.10.2_linux_amd64.tar.gz",
|
|
73
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_linux_amd64.tar.gz",
|
|
75
74
|
"bins": [
|
|
76
75
|
"kernel"
|
|
77
76
|
],
|
|
78
77
|
"format": "tar.gz",
|
|
79
78
|
"checksum": {
|
|
80
79
|
"algorithm": "sha256",
|
|
81
|
-
"digest": "
|
|
80
|
+
"digest": "afc3dce0374a4738dc3971c9cf3ba8f75bda54272ce6f493680f2439b36ca4d6"
|
|
82
81
|
}
|
|
83
82
|
},
|
|
84
83
|
"win32-arm64": {
|
|
85
|
-
"name": "kernel_0.10.
|
|
86
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
84
|
+
"name": "kernel_0.10.2_windows_arm64.tar.gz",
|
|
85
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_windows_arm64.tar.gz",
|
|
87
86
|
"bins": [
|
|
88
87
|
"kernel.exe"
|
|
89
88
|
],
|
|
90
89
|
"format": "tar.gz",
|
|
91
90
|
"checksum": {
|
|
92
91
|
"algorithm": "sha256",
|
|
93
|
-
"digest": "
|
|
92
|
+
"digest": "1ff7130ed53e428412647d7bc9907bba8150898fca61802ce5bccfa74f196a72"
|
|
94
93
|
}
|
|
95
94
|
},
|
|
96
95
|
"win32-x64": {
|
|
97
|
-
"name": "kernel_0.10.
|
|
98
|
-
"url": "https://github.com/onkernel/cli/releases/download/v0.10.
|
|
96
|
+
"name": "kernel_0.10.2_windows_amd64.tar.gz",
|
|
97
|
+
"url": "https://github.com/onkernel/cli/releases/download/v0.10.2/kernel_0.10.2_windows_amd64.tar.gz",
|
|
99
98
|
"bins": [
|
|
100
99
|
"kernel.exe"
|
|
101
100
|
],
|
|
102
101
|
"format": "tar.gz",
|
|
103
102
|
"checksum": {
|
|
104
103
|
"algorithm": "sha256",
|
|
105
|
-
"digest": "
|
|
104
|
+
"digest": "dd3300a9ede1ea056d2516e5cca841702e57a669625ddf4f149dda4b4c5940f7"
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
107
|
}
|