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.
Files changed (121) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +284 -0
  3. package/dist/scripts/demo.d.ts +1 -0
  4. package/dist/scripts/demo.js +32 -0
  5. package/dist/scripts/demo.js.map +1 -0
  6. package/dist/scripts/profile-login.d.ts +1 -0
  7. package/dist/scripts/profile-login.js +38 -0
  8. package/dist/scripts/profile-login.js.map +1 -0
  9. package/dist/src/agents/auto-agent.d.ts +22 -0
  10. package/dist/src/agents/auto-agent.js +54 -0
  11. package/dist/src/agents/auto-agent.js.map +1 -0
  12. package/dist/src/agents/cliproxy-agent.d.ts +18 -0
  13. package/dist/src/agents/cliproxy-agent.js +137 -0
  14. package/dist/src/agents/cliproxy-agent.js.map +1 -0
  15. package/dist/src/agents/index.d.ts +2 -0
  16. package/dist/src/agents/index.js +17 -0
  17. package/dist/src/agents/index.js.map +1 -0
  18. package/dist/src/agents/mock-agent.d.ts +15 -0
  19. package/dist/src/agents/mock-agent.js +132 -0
  20. package/dist/src/agents/mock-agent.js.map +1 -0
  21. package/dist/src/agents/opencode-agent.d.ts +20 -0
  22. package/dist/src/agents/opencode-agent.js +122 -0
  23. package/dist/src/agents/opencode-agent.js.map +1 -0
  24. package/dist/src/agents/planner-prompt.d.ts +6 -0
  25. package/dist/src/agents/planner-prompt.js +116 -0
  26. package/dist/src/agents/planner-prompt.js.map +1 -0
  27. package/dist/src/browser/session.d.ts +41 -0
  28. package/dist/src/browser/session.js +267 -0
  29. package/dist/src/browser/session.js.map +1 -0
  30. package/dist/src/client.d.ts +44 -0
  31. package/dist/src/client.js +59 -0
  32. package/dist/src/client.js.map +1 -0
  33. package/dist/src/config.d.ts +16 -0
  34. package/dist/src/config.js +18 -0
  35. package/dist/src/config.js.map +1 -0
  36. package/dist/src/index.d.ts +2 -0
  37. package/dist/src/index.js +15 -0
  38. package/dist/src/index.js.map +1 -0
  39. package/dist/src/lib.d.ts +6 -0
  40. package/dist/src/lib.js +5 -0
  41. package/dist/src/lib.js.map +1 -0
  42. package/dist/src/mcp-server.d.ts +3 -0
  43. package/dist/src/mcp-server.js +191 -0
  44. package/dist/src/mcp-server.js.map +1 -0
  45. package/dist/src/mcp.d.ts +2 -0
  46. package/dist/src/mcp.js +14 -0
  47. package/dist/src/mcp.js.map +1 -0
  48. package/dist/src/recipes/registry.d.ts +21 -0
  49. package/dist/src/recipes/registry.js +38 -0
  50. package/dist/src/recipes/registry.js.map +1 -0
  51. package/dist/src/server/app.d.ts +5 -0
  52. package/dist/src/server/app.js +89 -0
  53. package/dist/src/server/app.js.map +1 -0
  54. package/dist/src/sessions/store.d.ts +48 -0
  55. package/dist/src/sessions/store.js +84 -0
  56. package/dist/src/sessions/store.js.map +1 -0
  57. package/dist/src/storage/run-store.d.ts +12 -0
  58. package/dist/src/storage/run-store.js +30 -0
  59. package/dist/src/storage/run-store.js.map +1 -0
  60. package/dist/src/tasks/errors.d.ts +5 -0
  61. package/dist/src/tasks/errors.js +11 -0
  62. package/dist/src/tasks/errors.js.map +1 -0
  63. package/dist/src/tasks/output-validator.d.ts +1 -0
  64. package/dist/src/tasks/output-validator.js +21 -0
  65. package/dist/src/tasks/output-validator.js.map +1 -0
  66. package/dist/src/tasks/runner.d.ts +38 -0
  67. package/dist/src/tasks/runner.js +236 -0
  68. package/dist/src/tasks/runner.js.map +1 -0
  69. package/dist/src/tasks/schemas.d.ts +266 -0
  70. package/dist/src/tasks/schemas.js +67 -0
  71. package/dist/src/tasks/schemas.js.map +1 -0
  72. package/dist/tests/agent-adapters.test.d.ts +1 -0
  73. package/dist/tests/agent-adapters.test.js +87 -0
  74. package/dist/tests/agent-adapters.test.js.map +1 -0
  75. package/dist/tests/agent-selection.test.d.ts +1 -0
  76. package/dist/tests/agent-selection.test.js +26 -0
  77. package/dist/tests/agent-selection.test.js.map +1 -0
  78. package/dist/tests/auto-agent.test.d.ts +1 -0
  79. package/dist/tests/auto-agent.test.js +86 -0
  80. package/dist/tests/auto-agent.test.js.map +1 -0
  81. package/dist/tests/browser-session.test.d.ts +1 -0
  82. package/dist/tests/browser-session.test.js +41 -0
  83. package/dist/tests/browser-session.test.js.map +1 -0
  84. package/dist/tests/client.test.d.ts +1 -0
  85. package/dist/tests/client.test.js +35 -0
  86. package/dist/tests/client.test.js.map +1 -0
  87. package/dist/tests/fixture-site.d.ts +6 -0
  88. package/dist/tests/fixture-site.js +93 -0
  89. package/dist/tests/fixture-site.js.map +1 -0
  90. package/dist/tests/mcp.test.d.ts +1 -0
  91. package/dist/tests/mcp.test.js +186 -0
  92. package/dist/tests/mcp.test.js.map +1 -0
  93. package/dist/tests/output-validator.test.d.ts +1 -0
  94. package/dist/tests/output-validator.test.js +27 -0
  95. package/dist/tests/output-validator.test.js.map +1 -0
  96. package/dist/tests/request-validation.test.d.ts +1 -0
  97. package/dist/tests/request-validation.test.js +25 -0
  98. package/dist/tests/request-validation.test.js.map +1 -0
  99. package/dist/tests/runner-options.test.d.ts +1 -0
  100. package/dist/tests/runner-options.test.js +44 -0
  101. package/dist/tests/runner-options.test.js.map +1 -0
  102. package/dist/tests/session-api.test.d.ts +1 -0
  103. package/dist/tests/session-api.test.js +244 -0
  104. package/dist/tests/session-api.test.js.map +1 -0
  105. package/dist/tests/session-client.test.d.ts +1 -0
  106. package/dist/tests/session-client.test.js +28 -0
  107. package/dist/tests/session-client.test.js.map +1 -0
  108. package/dist/tests/task-api-failure.test.d.ts +1 -0
  109. package/dist/tests/task-api-failure.test.js +39 -0
  110. package/dist/tests/task-api-failure.test.js.map +1 -0
  111. package/dist/tests/task-api.test.d.ts +1 -0
  112. package/dist/tests/task-api.test.js +50 -0
  113. package/dist/tests/task-api.test.js.map +1 -0
  114. package/docs/design.md +513 -0
  115. package/docs/releasing.md +62 -0
  116. package/package.json +78 -0
  117. package/recipes/dexscreener-token-read.json +19 -0
  118. package/recipes/fixture-catalog.json +14 -0
  119. package/recipes/generic-search.json +14 -0
  120. package/recipes/gmgn-token-read.json +19 -0
  121. 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,2 @@
1
+ #!/usr/bin/env node
2
+ import "dotenv/config";
@@ -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";
@@ -0,0 +1,5 @@
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
+ //# sourceMappingURL=lib.js.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { TaskRunner } from "./tasks/runner.js";
3
+ export declare function createMcpServer(taskRunner?: TaskRunner): McpServer;