web-task-api 0.2.3 → 0.2.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.
- package/CHANGELOG.md +11 -0
- package/README.md +23 -1
- package/dist/src/config.d.ts +5 -2
- package/dist/src/config.js +60 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/sessions/store.js +1 -2
- package/dist/src/sessions/store.js.map +1 -1
- package/dist/tests/config-paths.test.d.ts +1 -0
- package/dist/tests/config-paths.test.js +89 -0
- package/dist/tests/config-paths.test.js.map +1 -0
- package/docs/design.md +13 -2
- package/package.json +1 -1
- package/server.json +23 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.4] - 2026-03-29
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- mutable runtime state now defaults to a platform user-data root instead of the ambient working directory, while bundled starter recipes continue to load from the installed package tree
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- launching the MCP or HTTP runtime from `~/` or another unrelated cwd no longer leaks `runs/`, `profiles/`, or `sessions/` folders into that directory
|
|
12
|
+
- when incoming temp env variables point at the operator's home or current working directory, the runtime now redirects them into an app-owned temp root before browser tooling starts creating scratch state
|
|
13
|
+
|
|
3
14
|
## [0.2.3] - 2026-03-27
|
|
4
15
|
|
|
5
16
|
### Changed
|
package/README.md
CHANGED
|
@@ -207,7 +207,7 @@ To create a reusable login profile:
|
|
|
207
207
|
npm run profile:login -- --id my-profile --url https://example.com/login
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
-
This opens a real persistent browser profile. Log in manually or solve bot challenges, then press Enter in the terminal. The runtime saves a reusable Chromium user-data directory at
|
|
210
|
+
This opens a real persistent browser profile. Log in manually or solve bot challenges, then press Enter in the terminal. The runtime saves a reusable Chromium user-data directory at `<data-root>/profiles/<id>/user-data-dir` and later tasks can use `"profile": "my-profile"`.
|
|
211
211
|
|
|
212
212
|
This matters for sites like Dexscreener or GMGN that may block fresh headless sessions behind Cloudflare or similar anti-bot checks.
|
|
213
213
|
|
|
@@ -217,6 +217,28 @@ If you want the runtime to behave as closely as possible to your normal local Ch
|
|
|
217
217
|
|
|
218
218
|
That is the closest match to “it works in my Chrome already”.
|
|
219
219
|
|
|
220
|
+
## Runtime storage roots
|
|
221
|
+
|
|
222
|
+
By default the runtime keeps mutable data out of the ambient working directory:
|
|
223
|
+
|
|
224
|
+
- Linux: `~/.local/share/web-task-api`
|
|
225
|
+
- macOS: `~/Library/Application Support/web-task-api`
|
|
226
|
+
- Windows: `%LOCALAPPDATA%\web-task-api`
|
|
227
|
+
|
|
228
|
+
Under that data root the runtime writes:
|
|
229
|
+
|
|
230
|
+
- `profiles/<id>/user-data-dir`
|
|
231
|
+
- `runs/<taskId>/...`
|
|
232
|
+
- `sessions/<sessionId>.json`
|
|
233
|
+
|
|
234
|
+
Bundled starter recipes are read from the installed package's `recipes/` directory, not from the current shell cwd.
|
|
235
|
+
|
|
236
|
+
Useful overrides:
|
|
237
|
+
|
|
238
|
+
- `WEB_TASK_API_DATA_DIR` — custom mutable data root
|
|
239
|
+
- `WEB_TASK_API_RECIPES_DIR` — custom recipes directory
|
|
240
|
+
- `WEB_TASK_API_TEMP_DIR` — custom temp root used when the incoming temp env points at your home/cwd
|
|
241
|
+
|
|
220
242
|
## Planner backends
|
|
221
243
|
|
|
222
244
|
### Recommended: CLIProxyAPI
|
package/dist/src/config.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const PACKAGE_ROOT: string;
|
|
2
|
+
export declare const DATA_ROOT: string;
|
|
3
|
+
export declare const RECIPES_DIR: string;
|
|
4
|
+
export declare const TMP_ROOT: string;
|
|
2
5
|
export declare const RUNS_DIR: string;
|
|
3
6
|
export declare const PROFILES_DIR: string;
|
|
4
|
-
export declare const
|
|
7
|
+
export declare const SESSIONS_DIR: string;
|
|
5
8
|
export declare const DEFAULT_PORT: number;
|
|
6
9
|
export declare const DEFAULT_HOST: string;
|
|
7
10
|
export declare const DEFAULT_MAX_STEPS = 12;
|
package/dist/src/config.js
CHANGED
|
@@ -1,8 +1,64 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
1
3
|
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
function clean(value) {
|
|
6
|
+
const next = value?.trim();
|
|
7
|
+
return next ? next : undefined;
|
|
8
|
+
}
|
|
9
|
+
function findPackageRoot(startDir) {
|
|
10
|
+
let current = startDir;
|
|
11
|
+
for (;;) {
|
|
12
|
+
if (existsSync(path.join(current, "package.json")))
|
|
13
|
+
return current;
|
|
14
|
+
const parent = path.dirname(current);
|
|
15
|
+
if (parent === current)
|
|
16
|
+
return startDir;
|
|
17
|
+
current = parent;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function defaultDataHome() {
|
|
21
|
+
if (process.platform === "win32") {
|
|
22
|
+
const localAppData = clean(process.env.LOCALAPPDATA);
|
|
23
|
+
if (localAppData)
|
|
24
|
+
return localAppData;
|
|
25
|
+
}
|
|
26
|
+
const home = clean(process.env.HOME) || os.homedir();
|
|
27
|
+
if (process.platform === "darwin")
|
|
28
|
+
return path.join(home, "Library", "Application Support");
|
|
29
|
+
return clean(process.env.XDG_DATA_HOME) || path.join(home, ".local", "share");
|
|
30
|
+
}
|
|
31
|
+
function resolveDataRoot() {
|
|
32
|
+
return clean(process.env.WEB_TASK_API_DATA_DIR) || path.join(defaultDataHome(), "web-task-api");
|
|
33
|
+
}
|
|
34
|
+
function resolveRecipesRoot(packageRoot) {
|
|
35
|
+
return clean(process.env.WEB_TASK_API_RECIPES_DIR) || path.join(packageRoot, "recipes");
|
|
36
|
+
}
|
|
37
|
+
function resolveTempRoot(dataRoot) {
|
|
38
|
+
return clean(process.env.WEB_TASK_API_TEMP_DIR) || path.join(dataRoot, "tmp");
|
|
39
|
+
}
|
|
40
|
+
function sanitizeTempEnv(tempRoot, cwd = process.cwd()) {
|
|
41
|
+
const home = clean(process.env.HOME) || os.homedir();
|
|
42
|
+
const normalizedHome = path.resolve(home);
|
|
43
|
+
const normalizedCwd = path.resolve(cwd);
|
|
44
|
+
mkdirSync(tempRoot, { recursive: true });
|
|
45
|
+
for (const name of ["TMPDIR", "TMP", "TEMP", "BUN_TMPDIR"]) {
|
|
46
|
+
const current = clean(process.env[name]);
|
|
47
|
+
if (!current)
|
|
48
|
+
continue;
|
|
49
|
+
const normalizedCurrent = path.resolve(cwd, current);
|
|
50
|
+
if (normalizedCurrent === normalizedHome || normalizedCurrent === normalizedCwd)
|
|
51
|
+
process.env[name] = tempRoot;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export const PACKAGE_ROOT = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
|
|
55
|
+
export const DATA_ROOT = resolveDataRoot();
|
|
56
|
+
export const RECIPES_DIR = resolveRecipesRoot(PACKAGE_ROOT);
|
|
57
|
+
export const TMP_ROOT = resolveTempRoot(DATA_ROOT);
|
|
58
|
+
sanitizeTempEnv(TMP_ROOT);
|
|
59
|
+
export const RUNS_DIR = path.join(DATA_ROOT, "runs");
|
|
60
|
+
export const PROFILES_DIR = path.join(DATA_ROOT, "profiles");
|
|
61
|
+
export const SESSIONS_DIR = path.join(DATA_ROOT, "sessions");
|
|
6
62
|
export const DEFAULT_PORT = Number.parseInt(process.env.PORT ?? "4317", 10);
|
|
7
63
|
export const DEFAULT_HOST = process.env.HOST ?? "127.0.0.1";
|
|
8
64
|
export const DEFAULT_MAX_STEPS = 12;
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import {
|
|
5
|
-
const SESSIONS_DIR = path.join(PROJECT_ROOT, "sessions");
|
|
4
|
+
import { SESSIONS_DIR } from "../config.js";
|
|
6
5
|
export function sessionUserDataDir(sessionId) {
|
|
7
6
|
return path.join(SESSIONS_DIR, sessionId, "user-data-dir");
|
|
8
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/sessions/store.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmC5C,MAAM,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/sessions/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
|
+
const projectRoot = fileURLToPath(new URL("..", import.meta.url));
|
|
9
|
+
const configHref = pathToFileURL(path.join(projectRoot, "src", "config.ts")).href;
|
|
10
|
+
const tsxBin = path.join(projectRoot, "node_modules", ".bin", "tsx");
|
|
11
|
+
test("config defaults use package/data roots instead of ambient cwd", () => {
|
|
12
|
+
const sandbox = mkdtempSync(path.join(tmpdir(), "web-task-api-config-"));
|
|
13
|
+
const home = path.join(sandbox, "home");
|
|
14
|
+
const cwd = path.join(sandbox, "ambient-cwd");
|
|
15
|
+
const xdgDataHome = path.join(home, ".local", "share");
|
|
16
|
+
mkdirSync(home, { recursive: true });
|
|
17
|
+
mkdirSync(cwd, { recursive: true });
|
|
18
|
+
try {
|
|
19
|
+
const result = spawnSync(tsxBin, [
|
|
20
|
+
"-e",
|
|
21
|
+
`import { DATA_ROOT, RECIPES_DIR, RUNS_DIR, PROFILES_DIR, SESSIONS_DIR, TMP_ROOT } from ${JSON.stringify(configHref)}; console.log(JSON.stringify({ DATA_ROOT, RECIPES_DIR, RUNS_DIR, PROFILES_DIR, SESSIONS_DIR, TMP_ROOT, TMPDIR: process.env.TMPDIR, TMP: process.env.TMP, TEMP: process.env.TEMP, BUN_TMPDIR: process.env.BUN_TMPDIR }));`,
|
|
22
|
+
], {
|
|
23
|
+
cwd,
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
env: {
|
|
26
|
+
...process.env,
|
|
27
|
+
HOME: home,
|
|
28
|
+
XDG_DATA_HOME: xdgDataHome,
|
|
29
|
+
TMPDIR: ".",
|
|
30
|
+
TMP: `${home}${path.sep}`,
|
|
31
|
+
TEMP: "./",
|
|
32
|
+
BUN_TMPDIR: `${cwd}${path.sep}`,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
assert.equal(result.status, 0, result.stderr);
|
|
36
|
+
const parsed = JSON.parse(result.stdout.trim());
|
|
37
|
+
const expectedDataRoot = path.join(xdgDataHome, "web-task-api");
|
|
38
|
+
const expectedTempRoot = path.join(expectedDataRoot, "tmp");
|
|
39
|
+
assert.equal(parsed.DATA_ROOT, expectedDataRoot);
|
|
40
|
+
assert.equal(parsed.RUNS_DIR, path.join(expectedDataRoot, "runs"));
|
|
41
|
+
assert.equal(parsed.PROFILES_DIR, path.join(expectedDataRoot, "profiles"));
|
|
42
|
+
assert.equal(parsed.SESSIONS_DIR, path.join(expectedDataRoot, "sessions"));
|
|
43
|
+
assert.equal(parsed.RECIPES_DIR, path.join(projectRoot, "recipes"));
|
|
44
|
+
assert.equal(parsed.TMP_ROOT, expectedTempRoot);
|
|
45
|
+
assert.equal(parsed.TMPDIR, expectedTempRoot);
|
|
46
|
+
assert.equal(parsed.TMP, expectedTempRoot);
|
|
47
|
+
assert.equal(parsed.TEMP, expectedTempRoot);
|
|
48
|
+
assert.equal(parsed.BUN_TMPDIR, expectedTempRoot);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
rmSync(sandbox, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
test("config honors explicit data, recipes, and temp overrides", () => {
|
|
55
|
+
const sandbox = mkdtempSync(path.join(tmpdir(), "web-task-api-config-override-"));
|
|
56
|
+
const cwd = path.join(sandbox, "ambient-cwd");
|
|
57
|
+
const dataRoot = path.join(sandbox, "custom-data");
|
|
58
|
+
const recipesRoot = path.join(sandbox, "custom-recipes");
|
|
59
|
+
const tempRoot = path.join(sandbox, "custom-temp");
|
|
60
|
+
mkdirSync(cwd, { recursive: true });
|
|
61
|
+
mkdirSync(recipesRoot, { recursive: true });
|
|
62
|
+
try {
|
|
63
|
+
const result = spawnSync(tsxBin, [
|
|
64
|
+
"-e",
|
|
65
|
+
`import { DATA_ROOT, RECIPES_DIR, RUNS_DIR, PROFILES_DIR, SESSIONS_DIR, TMP_ROOT } from ${JSON.stringify(configHref)}; console.log(JSON.stringify({ DATA_ROOT, RECIPES_DIR, RUNS_DIR, PROFILES_DIR, SESSIONS_DIR, TMP_ROOT }));`,
|
|
66
|
+
], {
|
|
67
|
+
cwd,
|
|
68
|
+
encoding: "utf8",
|
|
69
|
+
env: {
|
|
70
|
+
...process.env,
|
|
71
|
+
WEB_TASK_API_DATA_DIR: dataRoot,
|
|
72
|
+
WEB_TASK_API_RECIPES_DIR: recipesRoot,
|
|
73
|
+
WEB_TASK_API_TEMP_DIR: tempRoot,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
assert.equal(result.status, 0, result.stderr);
|
|
77
|
+
const parsed = JSON.parse(result.stdout.trim());
|
|
78
|
+
assert.equal(parsed.DATA_ROOT, dataRoot);
|
|
79
|
+
assert.equal(parsed.RECIPES_DIR, recipesRoot);
|
|
80
|
+
assert.equal(parsed.RUNS_DIR, path.join(dataRoot, "runs"));
|
|
81
|
+
assert.equal(parsed.PROFILES_DIR, path.join(dataRoot, "profiles"));
|
|
82
|
+
assert.equal(parsed.SESSIONS_DIR, path.join(dataRoot, "sessions"));
|
|
83
|
+
assert.equal(parsed.TMP_ROOT, tempRoot);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
rmSync(sandbox, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=config-paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-paths.test.js","sourceRoot":"","sources":["../../tests/config-paths.test.ts"],"names":[],"mappings":"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"}
|
package/docs/design.md
CHANGED
|
@@ -419,6 +419,8 @@ The bundled GMGN/Dexscreener recipes should therefore be treated as starter reci
|
|
|
419
419
|
|
|
420
420
|
## Planned directory structure
|
|
421
421
|
|
|
422
|
+
Package tree:
|
|
423
|
+
|
|
422
424
|
```text
|
|
423
425
|
src/
|
|
424
426
|
agents/
|
|
@@ -433,8 +435,17 @@ tests/
|
|
|
433
435
|
scripts/
|
|
434
436
|
docs/
|
|
435
437
|
examples/
|
|
436
|
-
|
|
437
|
-
|
|
438
|
+
recipes/
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
Default runtime data root (outside the package / ambient cwd):
|
|
442
|
+
|
|
443
|
+
```text
|
|
444
|
+
<data-root>/
|
|
445
|
+
profiles/
|
|
446
|
+
runs/
|
|
447
|
+
sessions/
|
|
448
|
+
tmp/
|
|
438
449
|
```
|
|
439
450
|
|
|
440
451
|
## Detailed implementation plan
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "web-task-api",
|
|
3
3
|
"mcpName": "io.github.rich-jojo/web-task-api",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.4",
|
|
5
5
|
"packageManager": "npm@10.8.2",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"description": "Browser-task runtime for MCP and HTTP automation with runs, sessions, and recipes.",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.rich-jojo/web-task-api",
|
|
4
4
|
"title": "Web Task",
|
|
5
5
|
"description": "Browser tasks, sessions, and recipes for MCP and HTTP automation.",
|
|
6
|
-
"version": "0.2.
|
|
6
|
+
"version": "0.2.4",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/rich-jojo/web-task-api",
|
|
9
9
|
"source": "github"
|
|
@@ -12,11 +12,32 @@
|
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "web-task-api",
|
|
15
|
-
"version": "0.2.
|
|
15
|
+
"version": "0.2.4",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
|
19
19
|
"environmentVariables": [
|
|
20
|
+
{
|
|
21
|
+
"name": "WEB_TASK_API_DATA_DIR",
|
|
22
|
+
"description": "Optional mutable data root for web-task-api runs, sessions, profiles, and temp state. When omitted, the runtime uses a platform user-data directory instead of the ambient cwd.",
|
|
23
|
+
"isRequired": false,
|
|
24
|
+
"isSecret": false,
|
|
25
|
+
"format": "string"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "WEB_TASK_API_RECIPES_DIR",
|
|
29
|
+
"description": "Optional recipes directory override. When omitted, web-task-api reads bundled recipes from the installed package.",
|
|
30
|
+
"isRequired": false,
|
|
31
|
+
"isSecret": false,
|
|
32
|
+
"format": "string"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "WEB_TASK_API_TEMP_DIR",
|
|
36
|
+
"description": "Optional temp root override used when incoming temp env variables point at your home directory or working directory.",
|
|
37
|
+
"isRequired": false,
|
|
38
|
+
"isSecret": false,
|
|
39
|
+
"format": "string"
|
|
40
|
+
},
|
|
20
41
|
{
|
|
21
42
|
"name": "CLIPROXY_BASE_URL",
|
|
22
43
|
"description": "Optional CLIProxy base URL for the cliproxy planner backend.",
|