abelworkflow 1.2.3 → 1.3.0

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 (63) hide show
  1. package/README.md +26 -25
  2. package/extensions/gpt-responses-compat.ts +166 -27
  3. package/lib/cli/main.mjs +18 -86
  4. package/lib/cli/pi.mjs +43 -0
  5. package/lib/cli/prompts.mjs +3 -3
  6. package/lib/installer/assets.mjs +35 -31
  7. package/lib/installer/install.mjs +29 -9
  8. package/lib/installer/links.mjs +97 -84
  9. package/lib/paths.mjs +0 -2
  10. package/lib/providers/claude.mjs +14 -3
  11. package/lib/providers/codex.mjs +14 -9
  12. package/lib/providers/pi.mjs +61 -68
  13. package/lib/providers/skills.mjs +22 -22
  14. package/lib/providers/url.mjs +32 -1
  15. package/lib/templates/codex/agents/default.toml +16 -54
  16. package/lib/templates/codex/agents/explorer.toml +25 -52
  17. package/lib/templates/codex/agents/planner.toml +23 -77
  18. package/lib/templates/codex/agents/reviewer.toml +16 -62
  19. package/lib/templates/codex/agents/worker.toml +30 -64
  20. package/lib/templates/codex/config-base.toml +0 -6
  21. package/lib/templates/{workflow/gitignore.template → gitignore.template} +0 -3
  22. package/lib/tools/cli-installer.mjs +40 -12
  23. package/package.json +13 -18
  24. package/lib/templates/workflow/AGENTS.md +0 -50
  25. package/lib/templates/workflow/commands/abel-design.md +0 -175
  26. package/lib/templates/workflow/commands/abel-diagnose.md +0 -63
  27. package/lib/templates/workflow/commands/abel-implement.md +0 -170
  28. package/lib/templates/workflow/commands/abel-init.md +0 -25
  29. package/skills/dev-browser/SKILL.md +0 -281
  30. package/skills/dev-browser/dist/scripts/start.d.ts +0 -1
  31. package/skills/dev-browser/dist/scripts/start.js +0 -90
  32. package/skills/dev-browser/dist/src/client.d.ts +0 -92
  33. package/skills/dev-browser/dist/src/client.js +0 -310
  34. package/skills/dev-browser/dist/src/entrypoint.d.ts +0 -29
  35. package/skills/dev-browser/dist/src/entrypoint.js +0 -113
  36. package/skills/dev-browser/dist/src/index.d.ts +0 -3
  37. package/skills/dev-browser/dist/src/index.js +0 -1
  38. package/skills/dev-browser/dist/src/page-api.d.ts +0 -24
  39. package/skills/dev-browser/dist/src/page-api.js +0 -103
  40. package/skills/dev-browser/dist/src/relay.d.ts +0 -26
  41. package/skills/dev-browser/dist/src/relay.js +0 -567
  42. package/skills/dev-browser/dist/src/runtime.d.ts +0 -34
  43. package/skills/dev-browser/dist/src/runtime.js +0 -44
  44. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +0 -22
  45. package/skills/dev-browser/dist/src/snapshot/browser-script.js +0 -868
  46. package/skills/dev-browser/dist/src/snapshot/index.d.ts +0 -13
  47. package/skills/dev-browser/dist/src/snapshot/index.js +0 -13
  48. package/skills/dev-browser/dist/src/snapshot/inject.d.ts +0 -12
  49. package/skills/dev-browser/dist/src/snapshot/inject.js +0 -12
  50. package/skills/dev-browser/dist/src/standalone.d.ts +0 -31
  51. package/skills/dev-browser/dist/src/standalone.js +0 -173
  52. package/skills/dev-browser/dist/src/startup.d.ts +0 -46
  53. package/skills/dev-browser/dist/src/startup.js +0 -77
  54. package/skills/dev-browser/dist/src/target-registry.d.ts +0 -28
  55. package/skills/dev-browser/dist/src/target-registry.js +0 -134
  56. package/skills/dev-browser/dist/src/types.d.ts +0 -26
  57. package/skills/dev-browser/dist/src/types.js +0 -1
  58. package/skills/dev-browser/package-lock.json +0 -1545
  59. package/skills/dev-browser/package.json +0 -35
  60. package/skills/dev-browser/references/scraping.md +0 -144
  61. package/skills/git-commit/SKILL.md +0 -124
  62. package/skills/time/SKILL.md +0 -119
  63. package/skills/time/scripts/time_cli.py +0 -143
@@ -1,13 +0,0 @@
1
- /**
2
- * ARIA Snapshot module for dev-browser.
3
- *
4
- * Provides Playwright-compatible ARIA snapshots with cross-connection ref persistence.
5
- * Refs are stored on window.__devBrowserRefs and survive across Playwright reconnections.
6
- *
7
- * Usage:
8
- * import { getSnapshotScript } from './snapshot';
9
- * const script = getSnapshotScript();
10
- * await page.evaluate(script);
11
- * // Now window.__devBrowser_getAISnapshot() and window.__devBrowser_selectSnapshotRef(ref) are available
12
- */
13
- export { getSnapshotScript, clearSnapshotScriptCache } from "./browser-script.js";
@@ -1,13 +0,0 @@
1
- /**
2
- * ARIA Snapshot module for dev-browser.
3
- *
4
- * Provides Playwright-compatible ARIA snapshots with cross-connection ref persistence.
5
- * Refs are stored on window.__devBrowserRefs and survive across Playwright reconnections.
6
- *
7
- * Usage:
8
- * import { getSnapshotScript } from './snapshot';
9
- * const script = getSnapshotScript();
10
- * await page.evaluate(script);
11
- * // Now window.__devBrowser_getAISnapshot() and window.__devBrowser_selectSnapshotRef(ref) are available
12
- */
13
- export { getSnapshotScript, clearSnapshotScriptCache } from "./browser-script.js";
@@ -1,12 +0,0 @@
1
- /**
2
- * Injectable snapshot script for browser context.
3
- *
4
- * This module provides the getSnapshotScript function that returns a
5
- * self-contained JavaScript string for injection into browser contexts.
6
- *
7
- * The script is injected via page.evaluate() and exposes:
8
- * - window.__devBrowser_getAISnapshot(): Returns ARIA snapshot YAML
9
- * - window.__devBrowser_selectSnapshotRef(ref): Returns element for given ref
10
- * - window.__devBrowserRefs: Map of ref -> Element (persists across connections)
11
- */
12
- export { getSnapshotScript, clearSnapshotScriptCache } from "./browser-script.js";
@@ -1,12 +0,0 @@
1
- /**
2
- * Injectable snapshot script for browser context.
3
- *
4
- * This module provides the getSnapshotScript function that returns a
5
- * self-contained JavaScript string for injection into browser contexts.
6
- *
7
- * The script is injected via page.evaluate() and exposes:
8
- * - window.__devBrowser_getAISnapshot(): Returns ARIA snapshot YAML
9
- * - window.__devBrowser_selectSnapshotRef(ref): Returns element for given ref
10
- * - window.__devBrowserRefs: Map of ref -> Element (persists across connections)
11
- */
12
- export { getSnapshotScript, clearSnapshotScriptCache } from "./browser-script.js";
@@ -1,31 +0,0 @@
1
- import { Hono } from "hono";
2
- import { type PageBackend, type Viewport } from "./page-api.js";
3
- import type { ServeOptions } from "./types.js";
4
- export interface DevBrowserServer {
5
- wsEndpoint: string;
6
- port: number;
7
- stop: () => Promise<void>;
8
- }
9
- interface StandalonePage {
10
- setViewportSize(viewport: Viewport): Promise<void>;
11
- close(): Promise<void>;
12
- on(event: "close", listener: () => void): void;
13
- }
14
- interface StandaloneContext {
15
- newPage(): Promise<StandalonePage>;
16
- newCDPSession(page: StandalonePage): Promise<{
17
- send(method: "Target.getTargetInfo"): Promise<{
18
- targetInfo: {
19
- targetId: string;
20
- };
21
- }>;
22
- detach(): Promise<void>;
23
- }>;
24
- }
25
- export declare function createStandalonePageBackend(context: StandaloneContext): PageBackend;
26
- export declare function createStandaloneApp({ backend, wsEndpoint, }: {
27
- backend: PageBackend;
28
- wsEndpoint: string;
29
- }): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
30
- export declare function serve(options?: ServeOptions): Promise<DevBrowserServer>;
31
- export type { ServeOptions } from "./types.js";
@@ -1,173 +0,0 @@
1
- import { once } from "node:events";
2
- import { serve as serveNode } from "@hono/node-server";
3
- import { Hono } from "hono";
4
- import { chromium } from "playwright";
5
- import { formatHttpUrl, normalizeLoopbackHost } from "./entrypoint.js";
6
- import { createPageApi, } from "./page-api.js";
7
- export function createStandalonePageBackend(context) {
8
- const pages = new Map();
9
- const pending = new Map();
10
- async function create(name, viewport) {
11
- const pagePromise = context.newPage();
12
- let page;
13
- try {
14
- page = await withTimeout(pagePromise, 30_000, "Page creation timed out after 30000ms");
15
- }
16
- catch (error) {
17
- void pagePromise.then((latePage) => latePage.close().catch(() => undefined), () => undefined);
18
- throw error;
19
- }
20
- try {
21
- if (viewport)
22
- await page.setViewportSize(viewport);
23
- const session = await context.newCDPSession(page);
24
- let targetId;
25
- try {
26
- ({ targetInfo: { targetId } } = await session.send("Target.getTargetInfo"));
27
- }
28
- finally {
29
- await session.detach();
30
- }
31
- const entry = { name, targetId, page };
32
- pages.set(name, entry);
33
- page.on("close", () => {
34
- if (pages.get(name) === entry)
35
- pages.delete(name);
36
- });
37
- return { name, targetId };
38
- }
39
- catch (error) {
40
- await page.close().catch(() => undefined);
41
- throw error;
42
- }
43
- }
44
- return {
45
- async list() {
46
- return [...pages.values()].map(({ name, targetId }) => ({ name, targetId }));
47
- },
48
- async getOrCreate(name, viewport) {
49
- const existing = pages.get(name);
50
- if (existing)
51
- return { name, targetId: existing.targetId };
52
- const inFlight = pending.get(name);
53
- if (inFlight)
54
- return inFlight;
55
- const creation = create(name, viewport);
56
- pending.set(name, creation);
57
- try {
58
- return await creation;
59
- }
60
- finally {
61
- if (pending.get(name) === creation)
62
- pending.delete(name);
63
- }
64
- },
65
- async close(name) {
66
- const entry = pages.get(name);
67
- if (!entry)
68
- return false;
69
- await entry.page.close();
70
- if (pages.get(name) === entry)
71
- pages.delete(name);
72
- return true;
73
- },
74
- };
75
- }
76
- export function createStandaloneApp({ backend, wsEndpoint, }) {
77
- const app = new Hono();
78
- app.get("/", (c) => c.json({ wsEndpoint, mode: "standalone" }));
79
- app.route("/", createPageApi({ backend, wsEndpoint }));
80
- return app;
81
- }
82
- export async function serve(options = {}) {
83
- const port = options.port ?? 9222;
84
- const host = normalizeLoopbackHost(options.host ?? "localhost");
85
- const cdpPort = options.cdpPort ?? 9223;
86
- validatePorts(port, cdpPort);
87
- const context = await chromium.launchPersistentContext("", {
88
- headless: options.headless ?? false,
89
- args: [`--remote-debugging-port=${cdpPort}`],
90
- });
91
- try {
92
- const response = await fetchWithRetry(`http://127.0.0.1:${cdpPort}/json/version`);
93
- const { webSocketDebuggerUrl: wsEndpoint } = (await response.json());
94
- const backend = createStandalonePageBackend(context);
95
- const app = createStandaloneApp({ backend, wsEndpoint });
96
- const server = serveNode({ fetch: app.fetch, port, hostname: host });
97
- const connections = new Set();
98
- server.on("connection", (socket) => {
99
- connections.add(socket);
100
- socket.on("close", () => connections.delete(socket));
101
- });
102
- await once(server, "listening");
103
- console.log(`HTTP API server running on ${formatHttpUrl(host, port)}`);
104
- let stopped = false;
105
- return {
106
- wsEndpoint,
107
- port,
108
- async stop() {
109
- if (stopped)
110
- return;
111
- stopped = true;
112
- for (const socket of connections)
113
- socket.destroy();
114
- connections.clear();
115
- for (const { name } of await backend.list()) {
116
- await backend.close(name).catch(() => undefined);
117
- }
118
- await context.close().catch(() => undefined);
119
- await closeServer(server);
120
- },
121
- };
122
- }
123
- catch (error) {
124
- await context.close().catch(() => undefined);
125
- throw error;
126
- }
127
- }
128
- function validatePorts(port, cdpPort) {
129
- if (!Number.isInteger(port) || port < 1 || port > 65535) {
130
- throw new Error(`Invalid port: ${port}. Must be between 1 and 65535`);
131
- }
132
- if (!Number.isInteger(cdpPort) || cdpPort < 1 || cdpPort > 65535) {
133
- throw new Error(`Invalid cdpPort: ${cdpPort}. Must be between 1 and 65535`);
134
- }
135
- if (port === cdpPort)
136
- throw new Error("port and cdpPort must be different");
137
- }
138
- async function fetchWithRetry(url, maxRetries = 5, delayMs = 500) {
139
- let lastError;
140
- for (let attempt = 0; attempt < maxRetries; attempt += 1) {
141
- try {
142
- const response = await fetch(url);
143
- if (response.ok)
144
- return response;
145
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
146
- }
147
- catch (error) {
148
- lastError = error;
149
- if (attempt + 1 < maxRetries) {
150
- await new Promise((resolve) => setTimeout(resolve, delayMs * (attempt + 1)));
151
- }
152
- }
153
- }
154
- const message = lastError instanceof Error ? lastError.message : String(lastError);
155
- throw new Error(`Failed after ${maxRetries} retries: ${message}`);
156
- }
157
- function withTimeout(promise, timeoutMs, message) {
158
- return new Promise((resolve, reject) => {
159
- const timer = setTimeout(() => reject(new Error(message)), timeoutMs);
160
- promise.then((value) => {
161
- clearTimeout(timer);
162
- resolve(value);
163
- }, (error) => {
164
- clearTimeout(timer);
165
- reject(error);
166
- });
167
- });
168
- }
169
- function closeServer(server) {
170
- return new Promise((resolve, reject) => {
171
- server.close((error) => (error ? reject(error) : resolve()));
172
- });
173
- }
@@ -1,46 +0,0 @@
1
- import { type EntrypointArgs } from "./entrypoint.js";
2
- interface StandaloneServer {
3
- port: number;
4
- wsEndpoint: string;
5
- stop: () => Promise<void>;
6
- }
7
- interface ExtensionServer {
8
- port: number;
9
- wsEndpoint: string;
10
- stop: () => Promise<void>;
11
- }
12
- export interface RunEntrypointDeps {
13
- serveStandalone: (options: {
14
- port: number;
15
- host: string;
16
- headless: boolean;
17
- cdpPort: number;
18
- }) => Promise<StandaloneServer>;
19
- serveExtension: (options: {
20
- port: number;
21
- host: string;
22
- }) => Promise<ExtensionServer>;
23
- registerShutdown: (stop: () => Promise<void>) => void;
24
- keepAlive: () => Promise<void>;
25
- log: (line: string) => void;
26
- ensureBrowser?: () => Promise<void>;
27
- preflightStandalone?: () => Promise<boolean>;
28
- }
29
- export interface PlaywrightChromiumPreflightDeps {
30
- isInstalled: () => boolean;
31
- }
32
- export interface PreflightStandaloneStartupDeps {
33
- checkServer: (host: string, port: number) => Promise<{
34
- ok: boolean;
35
- info?: {
36
- mode?: unknown;
37
- wsEndpoint?: unknown;
38
- };
39
- }>;
40
- isPortInUse: (port: number, host: string) => Promise<boolean>;
41
- log: (line: string) => void;
42
- }
43
- export declare function preflightStandaloneStartup(args: EntrypointArgs, deps: PreflightStandaloneStartupDeps): Promise<boolean>;
44
- export declare function assertPlaywrightChromiumAvailable(deps: PlaywrightChromiumPreflightDeps): void;
45
- export declare function runEntrypoint(args: EntrypointArgs, deps: RunEntrypointDeps): Promise<void>;
46
- export {};
@@ -1,77 +0,0 @@
1
- import { formatReadinessLines } from "./entrypoint.js";
2
- export async function preflightStandaloneStartup(args, deps) {
3
- const serverCheck = await deps.checkServer(args.host, args.port);
4
- if (serverCheck.ok &&
5
- serverCheck.info?.mode === "standalone" &&
6
- typeof serverCheck.info.wsEndpoint === "string" &&
7
- serverCheck.info.wsEndpoint.trim().length > 0) {
8
- deps.log(`Server already running on port ${args.port}`);
9
- return false;
10
- }
11
- if (await deps.isPortInUse(args.port, args.host)) {
12
- throw new Error(`HTTP port ${args.port} is already in use. Stop the existing service or use --port.`);
13
- }
14
- if (await deps.isPortInUse(args.cdpPort, "127.0.0.1")) {
15
- throw new Error(`CDP port ${args.cdpPort} is already in use. Close the existing browser or use --cdp-port.`);
16
- }
17
- return true;
18
- }
19
- export function assertPlaywrightChromiumAvailable(deps) {
20
- if (deps.isInstalled())
21
- return;
22
- throw new Error("Playwright Chromium is missing. From the dev-browser skill directory, run: " +
23
- "node node_modules/playwright/cli.js install chromium");
24
- }
25
- export async function runEntrypoint(args, deps) {
26
- if (args.mode === "extension") {
27
- const server = await deps.serveExtension({
28
- port: args.port,
29
- host: args.host,
30
- });
31
- for (const line of formatReadinessLines({
32
- mode: "extension",
33
- host: args.host,
34
- port: args.port,
35
- wsEndpoint: server.wsEndpoint,
36
- })) {
37
- deps.log(line);
38
- }
39
- deps.registerShutdown(() => server.stop());
40
- await deps.keepAlive();
41
- return;
42
- }
43
- const shouldStart = await deps.preflightStandalone?.();
44
- if (shouldStart === false) {
45
- return;
46
- }
47
- await deps.ensureBrowser?.();
48
- let settleServer;
49
- const serverReady = new Promise((resolve) => {
50
- settleServer = resolve;
51
- });
52
- deps.registerShutdown(async () => {
53
- await (await serverReady)?.stop();
54
- });
55
- try {
56
- const server = await deps.serveStandalone({
57
- port: args.port,
58
- host: args.host,
59
- headless: args.headless,
60
- cdpPort: args.cdpPort,
61
- });
62
- settleServer(server);
63
- for (const line of formatReadinessLines({
64
- mode: "standalone",
65
- host: args.host,
66
- port: args.port,
67
- wsEndpoint: server.wsEndpoint,
68
- })) {
69
- deps.log(line);
70
- }
71
- await deps.keepAlive();
72
- }
73
- catch (error) {
74
- settleServer(undefined);
75
- throw error;
76
- }
77
- }
@@ -1,28 +0,0 @@
1
- import type { PageDescriptor } from "./page-api.js";
2
- export interface TargetInfo {
3
- targetId: string;
4
- type: string;
5
- title: string;
6
- url: string;
7
- attached: boolean;
8
- [key: string]: unknown;
9
- }
10
- export interface ConnectedTarget {
11
- sessionId: string;
12
- targetId: string;
13
- targetInfo: TargetInfo;
14
- }
15
- export declare function createTargetRegistry(): {
16
- attach: (target: ConnectedTarget) => void;
17
- detach: (sessionId: string) => ConnectedTarget | undefined;
18
- updateTargetInfo: (targetInfo: TargetInfo) => ConnectedTarget | undefined;
19
- bindName: (name: string, targetId: string) => void;
20
- getByName: (name: string) => ConnectedTarget | undefined;
21
- getByTargetId: (targetId: string) => ConnectedTarget | undefined;
22
- getBySessionId: (sessionId: string) => ConnectedTarget | undefined;
23
- targets: () => ConnectedTarget[];
24
- list: () => PageDescriptor[];
25
- waitForAttach: (targetId: string, timeoutMs: number) => Promise<ConnectedTarget>;
26
- waitForDetach: (targetId: string, timeoutMs: number) => Promise<void>;
27
- disconnect: (error: Error) => void;
28
- };
@@ -1,134 +0,0 @@
1
- export function createTargetRegistry() {
2
- const byTargetId = new Map();
3
- const bySessionId = new Map();
4
- const names = new Map();
5
- const attachWaiters = new Map();
6
- const detachWaiters = new Map();
7
- function attach(target) {
8
- const previousTarget = byTargetId.get(target.targetId);
9
- if (previousTarget) {
10
- bySessionId.delete(previousTarget.sessionId);
11
- }
12
- const previousSession = bySessionId.get(target.sessionId);
13
- if (previousSession && previousSession.targetId !== target.targetId) {
14
- removeTarget(previousSession);
15
- }
16
- byTargetId.set(target.targetId, target);
17
- bySessionId.set(target.sessionId, target);
18
- resolveWaiters(attachWaiters, target.targetId, target);
19
- }
20
- function detach(sessionId) {
21
- const target = bySessionId.get(sessionId);
22
- if (!target)
23
- return undefined;
24
- removeTarget(target);
25
- return target;
26
- }
27
- function removeTarget(target) {
28
- bySessionId.delete(target.sessionId);
29
- byTargetId.delete(target.targetId);
30
- for (const [name, targetId] of names) {
31
- if (targetId === target.targetId)
32
- names.delete(name);
33
- }
34
- resolveWaiters(detachWaiters, target.targetId, undefined);
35
- }
36
- function updateTargetInfo(targetInfo) {
37
- const target = byTargetId.get(targetInfo.targetId);
38
- if (!target)
39
- return undefined;
40
- target.targetInfo = targetInfo;
41
- return target;
42
- }
43
- function bindName(name, targetId) {
44
- if (!byTargetId.has(targetId)) {
45
- throw new Error(`Target ${targetId} is not attached`);
46
- }
47
- names.set(name, targetId);
48
- }
49
- function getByName(name) {
50
- const targetId = names.get(name);
51
- return targetId ? byTargetId.get(targetId) : undefined;
52
- }
53
- function list() {
54
- const pages = [];
55
- for (const [name, targetId] of names) {
56
- if (byTargetId.has(targetId))
57
- pages.push({ name, targetId });
58
- }
59
- return pages;
60
- }
61
- function waitForAttach(targetId, timeoutMs) {
62
- const existing = byTargetId.get(targetId);
63
- if (existing)
64
- return Promise.resolve(existing);
65
- return waitFor(attachWaiters, targetId, timeoutMs, `Timed out waiting for target ${targetId} to attach after ${timeoutMs}ms`);
66
- }
67
- function waitForDetach(targetId, timeoutMs) {
68
- if (!byTargetId.has(targetId))
69
- return Promise.resolve();
70
- return waitFor(detachWaiters, targetId, timeoutMs, `Timed out waiting for target ${targetId} to detach after ${timeoutMs}ms`);
71
- }
72
- function disconnect(error) {
73
- rejectAll(attachWaiters, error);
74
- rejectAll(detachWaiters, error);
75
- byTargetId.clear();
76
- bySessionId.clear();
77
- names.clear();
78
- }
79
- return {
80
- attach,
81
- detach,
82
- updateTargetInfo,
83
- bindName,
84
- getByName,
85
- getByTargetId: (targetId) => byTargetId.get(targetId),
86
- getBySessionId: (sessionId) => bySessionId.get(sessionId),
87
- targets: () => [...byTargetId.values()],
88
- list,
89
- waitForAttach,
90
- waitForDetach,
91
- disconnect,
92
- };
93
- }
94
- function waitFor(waiters, key, timeoutMs, timeoutMessage) {
95
- return new Promise((resolve, reject) => {
96
- let pending;
97
- pending = {
98
- resolve,
99
- reject,
100
- timer: setTimeout(() => {
101
- removeWaiter(waiters, key, pending);
102
- reject(new Error(timeoutMessage));
103
- }, timeoutMs),
104
- };
105
- const entries = waiters.get(key) ?? new Set();
106
- entries.add(pending);
107
- waiters.set(key, entries);
108
- });
109
- }
110
- function removeWaiter(waiters, key, pending) {
111
- const entries = waiters.get(key);
112
- entries?.delete(pending);
113
- if (entries?.size === 0)
114
- waiters.delete(key);
115
- }
116
- function resolveWaiters(waiters, key, value) {
117
- const entries = waiters.get(key);
118
- if (!entries)
119
- return;
120
- waiters.delete(key);
121
- for (const pending of entries) {
122
- clearTimeout(pending.timer);
123
- pending.resolve(value);
124
- }
125
- }
126
- function rejectAll(waiters, error) {
127
- for (const entries of waiters.values()) {
128
- for (const pending of entries) {
129
- clearTimeout(pending.timer);
130
- pending.reject(error);
131
- }
132
- }
133
- waiters.clear();
134
- }
@@ -1,26 +0,0 @@
1
- import type { Viewport } from "./page-api.js";
2
- export interface ServeOptions {
3
- port?: number;
4
- host?: string;
5
- headless?: boolean;
6
- cdpPort?: number;
7
- }
8
- export type ViewportSize = Viewport;
9
- export interface GetPageRequest {
10
- name: string;
11
- /** Optional viewport size for new pages */
12
- viewport?: ViewportSize;
13
- }
14
- export interface GetPageResponse {
15
- wsEndpoint: string;
16
- name: string;
17
- targetId: string;
18
- }
19
- export interface ListPagesResponse {
20
- pages: string[];
21
- }
22
- export interface ServerInfoResponse {
23
- wsEndpoint: string;
24
- mode: "standalone" | "extension";
25
- extensionConnected?: boolean;
26
- }
@@ -1 +0,0 @@
1
- export {};