web-task-api 0.2.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/CHANGELOG.md +25 -0
- package/README.md +284 -0
- package/dist/scripts/demo.d.ts +1 -0
- package/dist/scripts/demo.js +32 -0
- package/dist/scripts/demo.js.map +1 -0
- package/dist/scripts/profile-login.d.ts +1 -0
- package/dist/scripts/profile-login.js +38 -0
- package/dist/scripts/profile-login.js.map +1 -0
- package/dist/src/agents/auto-agent.d.ts +22 -0
- package/dist/src/agents/auto-agent.js +54 -0
- package/dist/src/agents/auto-agent.js.map +1 -0
- package/dist/src/agents/cliproxy-agent.d.ts +18 -0
- package/dist/src/agents/cliproxy-agent.js +137 -0
- package/dist/src/agents/cliproxy-agent.js.map +1 -0
- package/dist/src/agents/index.d.ts +2 -0
- package/dist/src/agents/index.js +17 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/mock-agent.d.ts +15 -0
- package/dist/src/agents/mock-agent.js +132 -0
- package/dist/src/agents/mock-agent.js.map +1 -0
- package/dist/src/agents/opencode-agent.d.ts +20 -0
- package/dist/src/agents/opencode-agent.js +122 -0
- package/dist/src/agents/opencode-agent.js.map +1 -0
- package/dist/src/agents/planner-prompt.d.ts +6 -0
- package/dist/src/agents/planner-prompt.js +116 -0
- package/dist/src/agents/planner-prompt.js.map +1 -0
- package/dist/src/browser/session.d.ts +41 -0
- package/dist/src/browser/session.js +267 -0
- package/dist/src/browser/session.js.map +1 -0
- package/dist/src/client.d.ts +44 -0
- package/dist/src/client.js +59 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.d.ts +16 -0
- package/dist/src/config.js +18 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib.d.ts +6 -0
- package/dist/src/lib.js +5 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/mcp-server.d.ts +3 -0
- package/dist/src/mcp-server.js +191 -0
- package/dist/src/mcp-server.js.map +1 -0
- package/dist/src/mcp.d.ts +2 -0
- package/dist/src/mcp.js +14 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/recipes/registry.d.ts +21 -0
- package/dist/src/recipes/registry.js +38 -0
- package/dist/src/recipes/registry.js.map +1 -0
- package/dist/src/server/app.d.ts +5 -0
- package/dist/src/server/app.js +89 -0
- package/dist/src/server/app.js.map +1 -0
- package/dist/src/sessions/store.d.ts +48 -0
- package/dist/src/sessions/store.js +84 -0
- package/dist/src/sessions/store.js.map +1 -0
- package/dist/src/storage/run-store.d.ts +12 -0
- package/dist/src/storage/run-store.js +30 -0
- package/dist/src/storage/run-store.js.map +1 -0
- package/dist/src/tasks/errors.d.ts +5 -0
- package/dist/src/tasks/errors.js +11 -0
- package/dist/src/tasks/errors.js.map +1 -0
- package/dist/src/tasks/output-validator.d.ts +1 -0
- package/dist/src/tasks/output-validator.js +21 -0
- package/dist/src/tasks/output-validator.js.map +1 -0
- package/dist/src/tasks/runner.d.ts +38 -0
- package/dist/src/tasks/runner.js +236 -0
- package/dist/src/tasks/runner.js.map +1 -0
- package/dist/src/tasks/schemas.d.ts +266 -0
- package/dist/src/tasks/schemas.js +67 -0
- package/dist/src/tasks/schemas.js.map +1 -0
- package/dist/tests/agent-adapters.test.d.ts +1 -0
- package/dist/tests/agent-adapters.test.js +87 -0
- package/dist/tests/agent-adapters.test.js.map +1 -0
- package/dist/tests/agent-selection.test.d.ts +1 -0
- package/dist/tests/agent-selection.test.js +26 -0
- package/dist/tests/agent-selection.test.js.map +1 -0
- package/dist/tests/auto-agent.test.d.ts +1 -0
- package/dist/tests/auto-agent.test.js +86 -0
- package/dist/tests/auto-agent.test.js.map +1 -0
- package/dist/tests/browser-session.test.d.ts +1 -0
- package/dist/tests/browser-session.test.js +41 -0
- package/dist/tests/browser-session.test.js.map +1 -0
- package/dist/tests/client.test.d.ts +1 -0
- package/dist/tests/client.test.js +35 -0
- package/dist/tests/client.test.js.map +1 -0
- package/dist/tests/fixture-site.d.ts +6 -0
- package/dist/tests/fixture-site.js +93 -0
- package/dist/tests/fixture-site.js.map +1 -0
- package/dist/tests/mcp.test.d.ts +1 -0
- package/dist/tests/mcp.test.js +186 -0
- package/dist/tests/mcp.test.js.map +1 -0
- package/dist/tests/output-validator.test.d.ts +1 -0
- package/dist/tests/output-validator.test.js +27 -0
- package/dist/tests/output-validator.test.js.map +1 -0
- package/dist/tests/request-validation.test.d.ts +1 -0
- package/dist/tests/request-validation.test.js +25 -0
- package/dist/tests/request-validation.test.js.map +1 -0
- package/dist/tests/runner-options.test.d.ts +1 -0
- package/dist/tests/runner-options.test.js +44 -0
- package/dist/tests/runner-options.test.js.map +1 -0
- package/dist/tests/session-api.test.d.ts +1 -0
- package/dist/tests/session-api.test.js +244 -0
- package/dist/tests/session-api.test.js.map +1 -0
- package/dist/tests/session-client.test.d.ts +1 -0
- package/dist/tests/session-client.test.js +28 -0
- package/dist/tests/session-client.test.js.map +1 -0
- package/dist/tests/task-api-failure.test.d.ts +1 -0
- package/dist/tests/task-api-failure.test.js +39 -0
- package/dist/tests/task-api-failure.test.js.map +1 -0
- package/dist/tests/task-api.test.d.ts +1 -0
- package/dist/tests/task-api.test.js +50 -0
- package/dist/tests/task-api.test.js.map +1 -0
- package/docs/design.md +513 -0
- package/docs/releasing.md +62 -0
- package/package.json +78 -0
- package/recipes/dexscreener-token-read.json +19 -0
- package/recipes/fixture-catalog.json +14 -0
- package/recipes/generic-search.json +14 -0
- package/recipes/gmgn-token-read.json +19 -0
- package/server.json +79 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { chromium } from "playwright";
|
|
4
|
+
import { DEFAULT_BROWSER_CHANNEL, DEFAULT_BROWSER_USER_DATA_DIR, PROFILES_DIR } from "../config.js";
|
|
5
|
+
export class BrowserSession {
|
|
6
|
+
browser;
|
|
7
|
+
context;
|
|
8
|
+
page;
|
|
9
|
+
screenshotsDir;
|
|
10
|
+
profile;
|
|
11
|
+
tempUserDataDir;
|
|
12
|
+
storageStatePath;
|
|
13
|
+
constructor(browser, context, page, screenshotsDir, profile, tempUserDataDir, storageStatePath) {
|
|
14
|
+
this.browser = browser;
|
|
15
|
+
this.context = context;
|
|
16
|
+
this.page = page;
|
|
17
|
+
this.screenshotsDir = screenshotsDir;
|
|
18
|
+
this.profile = profile;
|
|
19
|
+
this.tempUserDataDir = tempUserDataDir;
|
|
20
|
+
this.storageStatePath = storageStatePath;
|
|
21
|
+
}
|
|
22
|
+
currentElements = new Map();
|
|
23
|
+
static async launch(options) {
|
|
24
|
+
const launchOptions = {
|
|
25
|
+
headless: options.headless,
|
|
26
|
+
...(options.preferChrome || DEFAULT_BROWSER_USER_DATA_DIR ? { channel: DEFAULT_BROWSER_CHANNEL } : {}),
|
|
27
|
+
args: options.protectedSiteMode
|
|
28
|
+
? [
|
|
29
|
+
"--disable-blink-features=AutomationControlled",
|
|
30
|
+
"--disable-features=IsolateOrigins,site-per-process",
|
|
31
|
+
]
|
|
32
|
+
: [],
|
|
33
|
+
};
|
|
34
|
+
const resolved = await resolveUserDataDir(options.profile, DEFAULT_BROWSER_USER_DATA_DIR, options.userDataDir);
|
|
35
|
+
let browser;
|
|
36
|
+
let context;
|
|
37
|
+
let tempUserDataDir = resolved.tempUserDataDir;
|
|
38
|
+
if (resolved.userDataDir) {
|
|
39
|
+
await fs.mkdir(resolved.userDataDir, { recursive: true });
|
|
40
|
+
context = await launchPersistent(resolved.userDataDir, launchOptions);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
browser = await launchBrowser(launchOptions);
|
|
44
|
+
const storageState = options.storageStatePath && (await exists(options.storageStatePath))
|
|
45
|
+
? options.storageStatePath
|
|
46
|
+
: undefined;
|
|
47
|
+
context = await browser.newContext(storageState ? { storageState } : {});
|
|
48
|
+
}
|
|
49
|
+
await hardenContext(context, options.protectedSiteMode ?? false);
|
|
50
|
+
const page = context.pages()[0] ?? (await context.newPage());
|
|
51
|
+
return new BrowserSession(browser, context, page, options.screenshotsDir, options.profile, tempUserDataDir, options.storageStatePath);
|
|
52
|
+
}
|
|
53
|
+
getProfile() {
|
|
54
|
+
return this.profile;
|
|
55
|
+
}
|
|
56
|
+
getUserDataDirDebug() {
|
|
57
|
+
return this.tempUserDataDir;
|
|
58
|
+
}
|
|
59
|
+
async navigate(url) {
|
|
60
|
+
await this.page.goto(url, { waitUntil: "domcontentloaded" });
|
|
61
|
+
await this.waitForSettled();
|
|
62
|
+
return { ok: true, url: this.page.url(), antibotDetected: await this.isAntiBotPage() };
|
|
63
|
+
}
|
|
64
|
+
async snapshot() {
|
|
65
|
+
const textPreview = (await this.page.locator("body").innerText().catch(() => ""))
|
|
66
|
+
.replace(/\s+/g, " ")
|
|
67
|
+
.trim()
|
|
68
|
+
.slice(0, 1500);
|
|
69
|
+
if (await this.isAntiBotPage()) {
|
|
70
|
+
return {
|
|
71
|
+
url: this.page.url(),
|
|
72
|
+
title: await this.page.title(),
|
|
73
|
+
textPreview,
|
|
74
|
+
interactive: [],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const locator = this.page.locator("a, button, input, textarea, select, [role='button'], [role='link']");
|
|
78
|
+
const count = Math.min(await locator.count(), 40);
|
|
79
|
+
this.currentElements.clear();
|
|
80
|
+
const interactive = [];
|
|
81
|
+
for (let index = 0; index < count; index += 1) {
|
|
82
|
+
const item = locator.nth(index);
|
|
83
|
+
if (!(await item.isVisible())) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const details = await item.evaluate((element) => {
|
|
87
|
+
const html = element;
|
|
88
|
+
const labels = html.labels ? Array.from(html.labels).map((label) => label.innerText.trim()) : [];
|
|
89
|
+
const firstLabel = labels.find(Boolean);
|
|
90
|
+
const text = html.innerText?.replace(/\s+/g, " ").trim() || undefined;
|
|
91
|
+
const options = html.tagName.toLowerCase() === "select" && html.options
|
|
92
|
+
? Array.from(html.options)
|
|
93
|
+
.map((option) => option.text.trim())
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
: undefined;
|
|
96
|
+
return {
|
|
97
|
+
tag: html.tagName.toLowerCase(),
|
|
98
|
+
role: html.getAttribute("role") ?? undefined,
|
|
99
|
+
type: html.type || undefined,
|
|
100
|
+
text,
|
|
101
|
+
label: firstLabel ?? html.getAttribute("aria-label") ?? undefined,
|
|
102
|
+
placeholder: html.getAttribute("placeholder") ?? undefined,
|
|
103
|
+
name: html.getAttribute("name") ?? undefined,
|
|
104
|
+
options,
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
const id = `e${interactive.length + 1}`;
|
|
108
|
+
this.currentElements.set(id, { index, tag: details.tag });
|
|
109
|
+
interactive.push({ id, ...details });
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
url: this.page.url(),
|
|
113
|
+
title: await this.page.title(),
|
|
114
|
+
textPreview,
|
|
115
|
+
interactive,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async execute(action) {
|
|
119
|
+
switch (action.type) {
|
|
120
|
+
case "navigate":
|
|
121
|
+
return this.navigate(action.url);
|
|
122
|
+
case "click": {
|
|
123
|
+
const locator = this.resolve(action.elementId);
|
|
124
|
+
await locator.click();
|
|
125
|
+
await this.waitForSettled();
|
|
126
|
+
return { ok: true, elementId: action.elementId, url: this.page.url() };
|
|
127
|
+
}
|
|
128
|
+
case "fill": {
|
|
129
|
+
const locator = this.resolve(action.elementId);
|
|
130
|
+
await locator.fill(action.text);
|
|
131
|
+
return { ok: true, elementId: action.elementId, value: action.text };
|
|
132
|
+
}
|
|
133
|
+
case "press": {
|
|
134
|
+
const locator = this.resolve(action.elementId);
|
|
135
|
+
await locator.focus();
|
|
136
|
+
await locator.press(action.key);
|
|
137
|
+
await this.waitForSettled();
|
|
138
|
+
return { ok: true, elementId: action.elementId, key: action.key, url: this.page.url() };
|
|
139
|
+
}
|
|
140
|
+
case "select": {
|
|
141
|
+
const locator = this.resolve(action.elementId);
|
|
142
|
+
await locator.selectOption({ label: action.value }).catch(async () => {
|
|
143
|
+
await locator.selectOption(action.value);
|
|
144
|
+
});
|
|
145
|
+
await this.waitForSettled();
|
|
146
|
+
return { ok: true, elementId: action.elementId, value: action.value };
|
|
147
|
+
}
|
|
148
|
+
case "wait_for_text": {
|
|
149
|
+
await this.page.getByText(action.text, { exact: false }).waitFor({
|
|
150
|
+
timeout: action.timeoutMs ?? 5_000,
|
|
151
|
+
});
|
|
152
|
+
return { ok: true, text: action.text };
|
|
153
|
+
}
|
|
154
|
+
case "read_page": {
|
|
155
|
+
const text = await this.page.evaluate((maxChars) => (document.body.innerText || "").trim().slice(0, maxChars), action.maxChars ?? 8_000);
|
|
156
|
+
return {
|
|
157
|
+
ok: true,
|
|
158
|
+
text,
|
|
159
|
+
url: this.page.url(),
|
|
160
|
+
title: await this.page.title(),
|
|
161
|
+
antibotDetected: await this.isAntiBotPage(),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async captureScreenshot(name) {
|
|
167
|
+
const filePath = path.join(this.screenshotsDir, `${name}.png`);
|
|
168
|
+
await this.page.screenshot({ path: filePath, fullPage: true });
|
|
169
|
+
return filePath;
|
|
170
|
+
}
|
|
171
|
+
async close() {
|
|
172
|
+
if (this.storageStatePath) {
|
|
173
|
+
await fs.mkdir(path.dirname(this.storageStatePath), { recursive: true }).catch(() => undefined);
|
|
174
|
+
await this.context.storageState({ path: this.storageStatePath }).catch(() => undefined);
|
|
175
|
+
}
|
|
176
|
+
await this.context.close();
|
|
177
|
+
await this.browser?.close();
|
|
178
|
+
if (this.tempUserDataDir) {
|
|
179
|
+
await fs.rm(this.tempUserDataDir, { recursive: true, force: true }).catch(() => undefined);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
resolve(elementId) {
|
|
183
|
+
const meta = this.currentElements.get(elementId);
|
|
184
|
+
if (!meta) {
|
|
185
|
+
throw new Error(`Unknown elementId: ${elementId}. Request a fresh snapshot before acting.`);
|
|
186
|
+
}
|
|
187
|
+
return this.page
|
|
188
|
+
.locator("a, button, input, textarea, select, [role='button'], [role='link']")
|
|
189
|
+
.nth(meta.index);
|
|
190
|
+
}
|
|
191
|
+
async waitForSettled() {
|
|
192
|
+
await this.page.waitForTimeout(250);
|
|
193
|
+
await this.page.waitForLoadState("domcontentloaded").catch(() => undefined);
|
|
194
|
+
await this.page.waitForLoadState("networkidle", { timeout: 1_500 }).catch(() => undefined);
|
|
195
|
+
}
|
|
196
|
+
async isAntiBotPage() {
|
|
197
|
+
const title = (await this.page.title()).toLowerCase();
|
|
198
|
+
const text = ((await this.page.locator("body").innerText().catch(() => "")) || "").toLowerCase();
|
|
199
|
+
return (title.includes("just a moment") ||
|
|
200
|
+
title.includes("attention required") ||
|
|
201
|
+
text.includes("performing security verification") ||
|
|
202
|
+
text.includes("sorry, you have been blocked") ||
|
|
203
|
+
text.includes("verify you are not a bot"));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export async function resolveUserDataDir(profile, sharedUserDataDir = DEFAULT_BROWSER_USER_DATA_DIR, explicitUserDataDir) {
|
|
207
|
+
if (profile) {
|
|
208
|
+
return {
|
|
209
|
+
userDataDir: path.join(PROFILES_DIR, profile, "user-data-dir"),
|
|
210
|
+
tempUserDataDir: undefined,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (explicitUserDataDir) {
|
|
214
|
+
return {
|
|
215
|
+
userDataDir: explicitUserDataDir,
|
|
216
|
+
tempUserDataDir: undefined,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
if (sharedUserDataDir) {
|
|
220
|
+
return {
|
|
221
|
+
userDataDir: sharedUserDataDir,
|
|
222
|
+
tempUserDataDir: undefined,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
userDataDir: undefined,
|
|
227
|
+
tempUserDataDir: undefined,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
async function launchBrowser(launchOptions) {
|
|
231
|
+
try {
|
|
232
|
+
return await chromium.launch(launchOptions);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
const { channel: _channel, ...fallback } = launchOptions;
|
|
236
|
+
return chromium.launch(fallback);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function launchPersistent(userDataDir, launchOptions) {
|
|
240
|
+
try {
|
|
241
|
+
return await chromium.launchPersistentContext(userDataDir, launchOptions);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
const { channel: _channel, ...fallback } = launchOptions;
|
|
245
|
+
return chromium.launchPersistentContext(userDataDir, fallback);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async function exists(filePath) {
|
|
249
|
+
try {
|
|
250
|
+
await fs.access(filePath);
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async function hardenContext(context, protectedSiteMode) {
|
|
258
|
+
if (!protectedSiteMode) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
await context.addInitScript(() => {
|
|
262
|
+
Object.defineProperty(navigator, "webdriver", { get: () => false });
|
|
263
|
+
Object.defineProperty(navigator, "languages", { get: () => ["en-US", "en"] });
|
|
264
|
+
Object.defineProperty(navigator, "plugins", { get: () => [1, 2, 3, 4, 5] });
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { TaskRequest, TaskResult } from "./tasks/schemas.js";
|
|
2
|
+
import type { SessionRecord } from "./sessions/store.js";
|
|
3
|
+
type ClientOptions = {
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
fetch?: typeof globalThis.fetch;
|
|
7
|
+
};
|
|
8
|
+
export declare class WebTaskApiClient {
|
|
9
|
+
private readonly baseUrl;
|
|
10
|
+
private readonly apiKey?;
|
|
11
|
+
private readonly fetchImpl;
|
|
12
|
+
constructor(options?: ClientOptions);
|
|
13
|
+
health(): Promise<{
|
|
14
|
+
healthy: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
listRecipes(): Promise<{
|
|
17
|
+
recipes: Array<Record<string, unknown>>;
|
|
18
|
+
}>;
|
|
19
|
+
createSession(input: {
|
|
20
|
+
name: string;
|
|
21
|
+
mode?: "guest" | "profile";
|
|
22
|
+
profile?: string;
|
|
23
|
+
startUrl?: string;
|
|
24
|
+
agent?: {
|
|
25
|
+
kind: "auto" | "cliproxy" | "opencode" | "mock";
|
|
26
|
+
model?: string;
|
|
27
|
+
};
|
|
28
|
+
notes?: string;
|
|
29
|
+
}): Promise<SessionRecord>;
|
|
30
|
+
listSessions(): Promise<{
|
|
31
|
+
sessions: SessionRecord[];
|
|
32
|
+
}>;
|
|
33
|
+
getSession(sessionId: string): Promise<SessionRecord>;
|
|
34
|
+
updateSession(sessionId: string, patch: {
|
|
35
|
+
name?: string;
|
|
36
|
+
profile?: string;
|
|
37
|
+
startUrl?: string;
|
|
38
|
+
notes?: string;
|
|
39
|
+
}): Promise<SessionRecord>;
|
|
40
|
+
runTask(task: TaskRequest): Promise<TaskResult>;
|
|
41
|
+
getTask(taskId: string): Promise<TaskResult>;
|
|
42
|
+
private request;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class WebTaskApiClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
apiKey;
|
|
4
|
+
fetchImpl;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.baseUrl = (options.baseUrl ?? "http://127.0.0.1:4317").replace(/\/$/, "");
|
|
7
|
+
this.apiKey = options.apiKey;
|
|
8
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch;
|
|
9
|
+
}
|
|
10
|
+
async health() {
|
|
11
|
+
return this.request("/health");
|
|
12
|
+
}
|
|
13
|
+
async listRecipes() {
|
|
14
|
+
return this.request("/v1/recipes");
|
|
15
|
+
}
|
|
16
|
+
async createSession(input) {
|
|
17
|
+
return this.request("/v1/sessions", {
|
|
18
|
+
method: "POST",
|
|
19
|
+
body: JSON.stringify(input),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async listSessions() {
|
|
23
|
+
return this.request("/v1/sessions");
|
|
24
|
+
}
|
|
25
|
+
async getSession(sessionId) {
|
|
26
|
+
return this.request(`/v1/sessions/${sessionId}`);
|
|
27
|
+
}
|
|
28
|
+
async updateSession(sessionId, patch) {
|
|
29
|
+
return this.request(`/v1/sessions/${sessionId}`, {
|
|
30
|
+
method: "PATCH",
|
|
31
|
+
body: JSON.stringify(patch),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async runTask(task) {
|
|
35
|
+
return this.request("/v1/tasks/run", {
|
|
36
|
+
method: "POST",
|
|
37
|
+
body: JSON.stringify(task),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async getTask(taskId) {
|
|
41
|
+
return this.request(`/v1/tasks/${taskId}`);
|
|
42
|
+
}
|
|
43
|
+
async request(path, init = {}) {
|
|
44
|
+
const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
45
|
+
...init,
|
|
46
|
+
headers: {
|
|
47
|
+
"content-type": "application/json",
|
|
48
|
+
...(this.apiKey ? { authorization: `Bearer ${this.apiKey}` } : {}),
|
|
49
|
+
...(init.headers ?? {}),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const payload = (await response.json());
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new Error(`WebTask API request failed (${response.status}): ${JSON.stringify(payload)}`);
|
|
55
|
+
}
|
|
56
|
+
return payload;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,gBAAgB;IACV,OAAO,CAAS;IAChB,MAAM,CAAsB;IAC5B,SAAS,CAA0B;IAEpD,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,OAAO,CAAuB,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAA8C,aAAa,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAOnB;QACC,OAAO,IAAI,CAAC,OAAO,CAAgB,cAAc,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAgC,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAgB,gBAAgB,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,KAA6E;QAE7E,OAAO,IAAI,CAAC,OAAO,CAAgB,gBAAgB,SAAS,EAAE,EAAE;YAC9D,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAiB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAa,eAAe,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAa,aAAa,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,OAAoB,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAC9D,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;aACxB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,OAAY,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const PROJECT_ROOT: string;
|
|
2
|
+
export declare const RUNS_DIR: string;
|
|
3
|
+
export declare const PROFILES_DIR: string;
|
|
4
|
+
export declare const RECIPES_DIR: string;
|
|
5
|
+
export declare const DEFAULT_PORT: number;
|
|
6
|
+
export declare const DEFAULT_HOST: string;
|
|
7
|
+
export declare const DEFAULT_MAX_STEPS = 12;
|
|
8
|
+
export declare const DEFAULT_TIMEOUT_MS = 90000;
|
|
9
|
+
export declare const DEFAULT_HEADLESS: boolean;
|
|
10
|
+
export declare const DEFAULT_OPENCODE_MODEL: string | undefined;
|
|
11
|
+
export declare const DEFAULT_OPENCODE_BASE_URL: string | undefined;
|
|
12
|
+
export declare const DEFAULT_CLIPROXY_BASE_URL: string;
|
|
13
|
+
export declare const DEFAULT_CLIPROXY_MODEL: string | undefined;
|
|
14
|
+
export declare const DEFAULT_CLIPROXY_AUTH_TOKEN: string | undefined;
|
|
15
|
+
export declare const DEFAULT_BROWSER_CHANNEL: string;
|
|
16
|
+
export declare const DEFAULT_BROWSER_USER_DATA_DIR: string | undefined;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export const PROJECT_ROOT = process.cwd();
|
|
3
|
+
export const RUNS_DIR = path.join(PROJECT_ROOT, "runs");
|
|
4
|
+
export const PROFILES_DIR = path.join(PROJECT_ROOT, "profiles");
|
|
5
|
+
export const RECIPES_DIR = path.join(PROJECT_ROOT, "recipes");
|
|
6
|
+
export const DEFAULT_PORT = Number.parseInt(process.env.PORT ?? "4317", 10);
|
|
7
|
+
export const DEFAULT_HOST = process.env.HOST ?? "127.0.0.1";
|
|
8
|
+
export const DEFAULT_MAX_STEPS = 12;
|
|
9
|
+
export const DEFAULT_TIMEOUT_MS = 90_000;
|
|
10
|
+
export const DEFAULT_HEADLESS = process.env.HEADLESS !== "false";
|
|
11
|
+
export const DEFAULT_OPENCODE_MODEL = process.env.OPENCODE_MODEL;
|
|
12
|
+
export const DEFAULT_OPENCODE_BASE_URL = process.env.OPENCODE_BASE_URL;
|
|
13
|
+
export const DEFAULT_CLIPROXY_BASE_URL = process.env.CLIPROXY_BASE_URL ?? "http://127.0.0.1:8317/v1";
|
|
14
|
+
export const DEFAULT_CLIPROXY_MODEL = process.env.CLIPROXY_MODEL;
|
|
15
|
+
export const DEFAULT_CLIPROXY_AUTH_TOKEN = process.env.CLIPROXY_AUTH_TOKEN ?? process.env.CLIPROXY_API_KEY;
|
|
16
|
+
export const DEFAULT_BROWSER_CHANNEL = process.env.BROWSER_CHANNEL ?? "chrome";
|
|
17
|
+
export const DEFAULT_BROWSER_USER_DATA_DIR = process.env.BROWSER_USER_DATA_DIR;
|
|
18
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACvE,MAAM,CAAC,MAAM,yBAAyB,GACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACjE,MAAM,CAAC,MAAM,2BAA2B,GACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,QAAQ,CAAC;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { DEFAULT_HOST, DEFAULT_PORT } from "./config.js";
|
|
4
|
+
import { createApp } from "./server/app.js";
|
|
5
|
+
const app = createApp();
|
|
6
|
+
const main = async () => {
|
|
7
|
+
await app.listen({ port: DEFAULT_PORT, host: DEFAULT_HOST });
|
|
8
|
+
console.log(`web-task-api listening on http://${DEFAULT_HOST}:${DEFAULT_PORT}`);
|
|
9
|
+
};
|
|
10
|
+
main().catch(async (error) => {
|
|
11
|
+
console.error(error);
|
|
12
|
+
await app.close().catch(() => undefined);
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACtB,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,oCAAoC,YAAY,IAAI,YAAY,EAAE,CAAC,CAAC;AAClF,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createMcpServer } from "./mcp-server.js";
|
|
2
|
+
export { createApp } from "./server/app.js";
|
|
3
|
+
export { TaskRunner } from "./tasks/runner.js";
|
|
4
|
+
export { WebTaskApiClient } from "./client.js";
|
|
5
|
+
export type { AgentAdapter, AgentTurnInput, BrowserElement, PageSnapshot, PlannedAction, StepRecord, TaskRequest, TaskResult, } from "./tasks/schemas.js";
|
|
6
|
+
export type { SessionHistoryEntry, SessionRecord } from "./sessions/store.js";
|
package/dist/src/lib.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|