abelworkflow 0.9.2 → 1.0.0-rc.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/README.md +55 -182
- package/bin/abelworkflow.mjs +5 -3
- package/lib/cli/args.mjs +76 -0
- package/lib/cli/main.mjs +387 -0
- package/lib/cli/prompts.mjs +119 -0
- package/lib/config/dotenv.mjs +102 -0
- package/lib/config/jsonc.mjs +80 -0
- package/lib/config/store.mjs +310 -0
- package/lib/config/toml.mjs +638 -0
- package/lib/installer/assets.mjs +326 -0
- package/lib/installer/install.mjs +167 -0
- package/lib/installer/links.mjs +427 -0
- package/lib/installer/render.mjs +46 -0
- package/lib/installer/state.mjs +182 -0
- package/lib/paths.mjs +99 -0
- package/lib/providers/claude.mjs +388 -0
- package/lib/providers/codex.mjs +433 -0
- package/lib/providers/pi.mjs +362 -0
- package/lib/providers/skills.mjs +164 -0
- package/lib/templates/codex/agents/default.toml +7 -0
- package/lib/templates/codex/agents/explorer.toml +7 -0
- package/lib/templates/codex/agents/planner.toml +7 -0
- package/lib/templates/codex/agents/reviewer.toml +7 -0
- package/lib/templates/codex/agents/worker.toml +7 -0
- package/lib/templates/codex/config-base.toml +11 -3
- package/{AGENTS.md → lib/templates/workflow/AGENTS.md} +8 -3
- package/{commands → lib/templates/workflow/commands}/abel-diagnose.md +5 -5
- package/{commands → lib/templates/workflow/commands}/abel-implement.md +3 -8
- package/{commands → lib/templates/workflow/commands}/abel-init.md +1 -1
- package/{commands → lib/templates/workflow/commands}/abel-plan.md +1 -7
- package/{commands → lib/templates/workflow/commands}/abel-research.md +1 -1
- package/{.gitignore → lib/templates/workflow/gitignore.template} +0 -2
- package/lib/tools/cli-installer.mjs +277 -0
- package/package.json +43 -10
- package/skills/context7-auto-research/SKILL.md +5 -5
- package/skills/context7-auto-research/{context7-api.js → context7-api.cjs} +5 -8
- package/skills/dev-browser/SKILL.md +53 -33
- package/skills/dev-browser/dist/scripts/start.d.ts +2 -0
- package/skills/dev-browser/dist/scripts/start.d.ts.map +1 -0
- package/skills/dev-browser/dist/scripts/start.js +118 -0
- package/skills/dev-browser/dist/scripts/start.js.map +1 -0
- package/skills/dev-browser/dist/src/client.d.ts +93 -0
- package/skills/dev-browser/dist/src/client.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/client.js +310 -0
- package/skills/dev-browser/dist/src/client.js.map +1 -0
- package/skills/dev-browser/dist/src/entrypoint.d.ts +29 -0
- package/skills/dev-browser/dist/src/entrypoint.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/entrypoint.js +106 -0
- package/skills/dev-browser/dist/src/entrypoint.js.map +1 -0
- package/skills/dev-browser/dist/src/index.d.ts +4 -0
- package/skills/dev-browser/dist/src/index.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/index.js +2 -0
- package/skills/dev-browser/dist/src/index.js.map +1 -0
- package/skills/dev-browser/dist/src/page-api.d.ts +25 -0
- package/skills/dev-browser/dist/src/page-api.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/page-api.js +104 -0
- package/skills/dev-browser/dist/src/page-api.js.map +1 -0
- package/skills/dev-browser/dist/src/relay.d.ts +27 -0
- package/skills/dev-browser/dist/src/relay.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/relay.js +521 -0
- package/skills/dev-browser/dist/src/relay.js.map +1 -0
- package/skills/dev-browser/dist/src/runtime.d.ts +45 -0
- package/skills/dev-browser/dist/src/runtime.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/runtime.js +54 -0
- package/skills/dev-browser/dist/src/runtime.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +23 -0
- package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/browser-script.ts → dist/src/snapshot/browser-script.js} +21 -30
- package/skills/dev-browser/dist/src/snapshot/browser-script.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/index.d.ts +14 -0
- package/skills/dev-browser/dist/src/snapshot/index.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/index.ts → dist/src/snapshot/index.js} +2 -2
- package/skills/dev-browser/dist/src/snapshot/index.js.map +1 -0
- package/skills/dev-browser/dist/src/snapshot/inject.d.ts +13 -0
- package/skills/dev-browser/dist/src/snapshot/inject.d.ts.map +1 -0
- package/skills/dev-browser/{src/snapshot/inject.ts → dist/src/snapshot/inject.js} +2 -2
- package/skills/dev-browser/dist/src/snapshot/inject.js.map +1 -0
- package/skills/dev-browser/dist/src/standalone.d.ts +32 -0
- package/skills/dev-browser/dist/src/standalone.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/standalone.js +174 -0
- package/skills/dev-browser/dist/src/standalone.js.map +1 -0
- package/skills/dev-browser/dist/src/startup.d.ts +55 -0
- package/skills/dev-browser/dist/src/startup.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/startup.js +81 -0
- package/skills/dev-browser/dist/src/startup.js.map +1 -0
- package/skills/dev-browser/dist/src/target-registry.d.ts +29 -0
- package/skills/dev-browser/dist/src/target-registry.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/target-registry.js +135 -0
- package/skills/dev-browser/dist/src/target-registry.js.map +1 -0
- package/skills/dev-browser/dist/src/types.d.ts +27 -0
- package/skills/dev-browser/dist/src/types.d.ts.map +1 -0
- package/skills/dev-browser/dist/src/types.js +2 -0
- package/skills/dev-browser/dist/src/types.js.map +1 -0
- package/skills/dev-browser/package-lock.json +67 -1510
- package/skills/dev-browser/package.json +18 -14
- package/skills/dev-browser/references/scraping.md +94 -105
- package/skills/grok-search/defaults.json +3 -0
- package/skills/grok-search/gitignore.template +4 -0
- package/skills/grok-search/scripts/_dotenv.py +5 -1
- package/skills/grok-search/scripts/groksearch_cli.py +15 -33
- package/skills/prompt-enhancer/TEMPLATE.md +0 -4
- package/skills/prompt-enhancer/requirements.txt +0 -1
- package/skills/prompt-enhancer/scripts/_dotenv.py +5 -1
- package/skills/prompt-enhancer/scripts/enhance.py +4 -51
- package/skills/prompt-enhancer/scripts/prompt_enhancer_entry.py +1 -16
- package/.skill-lock.json +0 -29
- package/lib/cli/logic.mjs +0 -213
- package/lib/cli.mjs +0 -3016
- package/skills/confidence-check/SKILL.md +0 -34
- package/skills/confidence-check/confidence.ts +0 -276
- package/skills/dev-browser/bun.lock +0 -460
- package/skills/dev-browser/scripts/start.ts +0 -280
- package/skills/dev-browser/src/client.ts +0 -474
- package/skills/dev-browser/src/entrypoint.ts +0 -157
- package/skills/dev-browser/src/index.ts +0 -289
- package/skills/dev-browser/src/relay.ts +0 -731
- package/skills/dev-browser/src/runtime.test.ts +0 -60
- package/skills/dev-browser/src/runtime.ts +0 -171
- package/skills/dev-browser/src/startup.test.ts +0 -95
- package/skills/dev-browser/src/startup.ts +0 -153
- package/skills/dev-browser/src/types.ts +0 -35
- package/skills/dev-browser/tsconfig.json +0 -36
- package/skills/dev-browser/vitest.config.ts +0 -12
- package/skills/sequential-think/SKILL.md +0 -198
- package/skills/sequential-think/scripts/.env.example +0 -5
- package/skills/sequential-think/scripts/sequential_think_cli.py +0 -253
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type PageBackend } from "./page-api.js";
|
|
2
|
+
import { createTargetRegistry } from "./target-registry.js";
|
|
3
|
+
export interface RelayOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
targetTimeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface RelayServer {
|
|
9
|
+
wsEndpoint: string;
|
|
10
|
+
port: number;
|
|
11
|
+
stop(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare const WEBSOCKET_POLICY_VIOLATION_CODE = 1008;
|
|
14
|
+
export declare const CDP_ORIGIN_POLICY_REASON = "CDP endpoint requires an originless client";
|
|
15
|
+
export declare const EXTENSION_ORIGIN_POLICY_REASON = "Extension endpoint requires originless or chrome-extension client";
|
|
16
|
+
export declare function isTrustedCdpOrigin(origin: string | undefined): boolean;
|
|
17
|
+
export declare function isTrustedExtensionOrigin(origin: string | undefined): boolean;
|
|
18
|
+
type TargetRegistry = ReturnType<typeof createTargetRegistry>;
|
|
19
|
+
export declare function createExtensionPageBackend({ registry, isConnected, sendCommand, timeoutMs, }: {
|
|
20
|
+
registry: TargetRegistry;
|
|
21
|
+
isConnected: () => boolean;
|
|
22
|
+
sendCommand: (method: string, params?: Record<string, unknown>) => Promise<unknown>;
|
|
23
|
+
timeoutMs: number;
|
|
24
|
+
}): PageBackend;
|
|
25
|
+
export declare function serveRelay(options?: RelayOptions): Promise<RelayServer>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,eAAO,MAAM,+BAA+B,OAAO,CAAC;AACpD,eAAO,MAAM,wBAAwB,+CAA+C,CAAC;AACrF,eAAO,MAAM,8BAA8B,sEAC0B,CAAC;AAEtE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAiB5E;AA0DD,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE9D,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,WAAW,CAyEd;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqajF"}
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { serve } from "@hono/node-server";
|
|
2
|
+
import { createNodeWebSocket } from "@hono/node-ws";
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import { formatHttpUrl, formatWsUrl } from "./entrypoint.js";
|
|
5
|
+
import { PageBackendError, createPageApi, } from "./page-api.js";
|
|
6
|
+
import { createTargetRegistry, } from "./target-registry.js";
|
|
7
|
+
export const WEBSOCKET_POLICY_VIOLATION_CODE = 1008;
|
|
8
|
+
export const CDP_ORIGIN_POLICY_REASON = "CDP endpoint requires an originless client";
|
|
9
|
+
export const EXTENSION_ORIGIN_POLICY_REASON = "Extension endpoint requires originless or chrome-extension client";
|
|
10
|
+
export function isTrustedCdpOrigin(origin) {
|
|
11
|
+
return origin === undefined;
|
|
12
|
+
}
|
|
13
|
+
export function isTrustedExtensionOrigin(origin) {
|
|
14
|
+
if (origin === undefined)
|
|
15
|
+
return true;
|
|
16
|
+
try {
|
|
17
|
+
const url = new URL(origin);
|
|
18
|
+
return (url.protocol === "chrome-extension:" &&
|
|
19
|
+
/^[a-p]{32}$/.test(url.hostname) &&
|
|
20
|
+
(url.pathname === "" || url.pathname === "/") &&
|
|
21
|
+
url.username === "" &&
|
|
22
|
+
url.password === "" &&
|
|
23
|
+
url.port === "" &&
|
|
24
|
+
url.search === "" &&
|
|
25
|
+
url.hash === "");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function isCdpCommand(value) {
|
|
35
|
+
return isRecord(value)
|
|
36
|
+
&& typeof value.id === "number"
|
|
37
|
+
&& Number.isFinite(value.id)
|
|
38
|
+
&& typeof value.method === "string"
|
|
39
|
+
&& (value.params === undefined || isRecord(value.params))
|
|
40
|
+
&& (value.sessionId === undefined || typeof value.sessionId === "string");
|
|
41
|
+
}
|
|
42
|
+
export function createExtensionPageBackend({ registry, isConnected, sendCommand, timeoutMs, }) {
|
|
43
|
+
const pending = new Map();
|
|
44
|
+
async function create(name) {
|
|
45
|
+
if (!isConnected())
|
|
46
|
+
throw new PageBackendError(503, "extension not connected");
|
|
47
|
+
const result = (await sendCommand("Target.createTarget", { url: "about:blank" }));
|
|
48
|
+
if (typeof result?.targetId !== "string" || result.targetId.length === 0) {
|
|
49
|
+
throw new PageBackendError(502, "extension returned an invalid targetId");
|
|
50
|
+
}
|
|
51
|
+
if (!isConnected()) {
|
|
52
|
+
throw new PageBackendError(503, "extension connection closed");
|
|
53
|
+
}
|
|
54
|
+
let target;
|
|
55
|
+
try {
|
|
56
|
+
target = await registry.waitForAttach(result.targetId, timeoutMs);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof PageBackendError)
|
|
60
|
+
throw error;
|
|
61
|
+
const timeout = new PageBackendError(504, errorMessage(error));
|
|
62
|
+
try {
|
|
63
|
+
await sendCommand("Target.closeTarget", { targetId: result.targetId });
|
|
64
|
+
}
|
|
65
|
+
catch { }
|
|
66
|
+
throw timeout;
|
|
67
|
+
}
|
|
68
|
+
registry.bindName(name, target.targetId);
|
|
69
|
+
return { name, targetId: target.targetId };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
async list() {
|
|
73
|
+
return registry.list();
|
|
74
|
+
},
|
|
75
|
+
async getOrCreate(name) {
|
|
76
|
+
const existing = registry.getByName(name);
|
|
77
|
+
if (existing)
|
|
78
|
+
return { name, targetId: existing.targetId };
|
|
79
|
+
const inFlight = pending.get(name);
|
|
80
|
+
if (inFlight)
|
|
81
|
+
return inFlight;
|
|
82
|
+
const creation = create(name);
|
|
83
|
+
pending.set(name, creation);
|
|
84
|
+
try {
|
|
85
|
+
return await creation;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
if (pending.get(name) === creation)
|
|
89
|
+
pending.delete(name);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
async close(name) {
|
|
93
|
+
const target = registry.getByName(name);
|
|
94
|
+
if (!target)
|
|
95
|
+
return false;
|
|
96
|
+
if (!isConnected())
|
|
97
|
+
throw new PageBackendError(503, "extension not connected");
|
|
98
|
+
const result = (await sendCommand("Target.closeTarget", {
|
|
99
|
+
targetId: target.targetId,
|
|
100
|
+
}));
|
|
101
|
+
if (result?.success !== true) {
|
|
102
|
+
throw new PageBackendError(502, `extension failed to close target ${target.targetId}`);
|
|
103
|
+
}
|
|
104
|
+
if (!isConnected()) {
|
|
105
|
+
throw new PageBackendError(503, "extension connection closed");
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
await registry.waitForDetach(target.targetId, timeoutMs);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof PageBackendError)
|
|
112
|
+
throw error;
|
|
113
|
+
throw new PageBackendError(504, errorMessage(error));
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function serveRelay(options = {}) {
|
|
120
|
+
const requestedPort = options.port ?? 9222;
|
|
121
|
+
const host = options.host ?? "127.0.0.1";
|
|
122
|
+
const targetTimeoutMs = options.targetTimeoutMs ?? 5000;
|
|
123
|
+
const wsEndpoint = formatWsUrl(host, requestedPort, "/cdp");
|
|
124
|
+
const registry = createTargetRegistry();
|
|
125
|
+
const playwrightClients = new Map();
|
|
126
|
+
const extensionPending = new Map();
|
|
127
|
+
let extensionWs = null;
|
|
128
|
+
let extensionMessageId = 0;
|
|
129
|
+
let virtualSessionId = 0;
|
|
130
|
+
function log(...args) {
|
|
131
|
+
console.log("[relay]", ...args);
|
|
132
|
+
}
|
|
133
|
+
function isPlaywrightClientOwner(client) {
|
|
134
|
+
return playwrightClients.get(client.id) === client;
|
|
135
|
+
}
|
|
136
|
+
function sendToPlaywright(message, client) {
|
|
137
|
+
const encoded = JSON.stringify(message);
|
|
138
|
+
if (client) {
|
|
139
|
+
if (isPlaywrightClientOwner(client))
|
|
140
|
+
client.ws.send(encoded);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
for (const client of playwrightClients.values())
|
|
144
|
+
client.ws.send(encoded);
|
|
145
|
+
}
|
|
146
|
+
function sendAttached(target, client) {
|
|
147
|
+
const event = {
|
|
148
|
+
method: "Target.attachedToTarget",
|
|
149
|
+
params: {
|
|
150
|
+
sessionId: target.sessionId,
|
|
151
|
+
targetInfo: { ...target.targetInfo, attached: true },
|
|
152
|
+
waitingForDebugger: false,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
const clients = client ? [client] : playwrightClients.values();
|
|
156
|
+
for (const owner of clients) {
|
|
157
|
+
if (!isPlaywrightClientOwner(owner) || owner.knownTargets.has(target.targetId))
|
|
158
|
+
continue;
|
|
159
|
+
owner.knownTargets.add(target.targetId);
|
|
160
|
+
owner.ws.send(JSON.stringify(event));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function createSessionAlias(client, physicalSessionId, parentSessionId) {
|
|
164
|
+
let sessionId;
|
|
165
|
+
do {
|
|
166
|
+
sessionId = `dev-browser-virtual-${++virtualSessionId}`;
|
|
167
|
+
} while (registry.getBySessionId(sessionId) || client.sessionAliases.has(sessionId));
|
|
168
|
+
client.sessionAliases.set(sessionId, { physicalSessionId, parentSessionId });
|
|
169
|
+
return sessionId;
|
|
170
|
+
}
|
|
171
|
+
function resolveSessionId(client, sessionId) {
|
|
172
|
+
return sessionId
|
|
173
|
+
? (client.sessionAliases.get(sessionId)?.physicalSessionId ?? sessionId)
|
|
174
|
+
: undefined;
|
|
175
|
+
}
|
|
176
|
+
function sendSessionEvent(method, params, sessionId) {
|
|
177
|
+
for (const client of playwrightClients.values()) {
|
|
178
|
+
client.ws.send(JSON.stringify({ method, params, sessionId }));
|
|
179
|
+
if (!sessionId)
|
|
180
|
+
continue;
|
|
181
|
+
for (const [alias, binding] of client.sessionAliases) {
|
|
182
|
+
if (binding.physicalSessionId !== sessionId)
|
|
183
|
+
continue;
|
|
184
|
+
client.ws.send(JSON.stringify({ method, params, sessionId: alias }));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function sendDetached(physicalSessionId, params, target) {
|
|
189
|
+
const physicalParams = { ...params, sessionId: physicalSessionId };
|
|
190
|
+
for (const client of playwrightClients.values()) {
|
|
191
|
+
if (target)
|
|
192
|
+
client.knownTargets.delete(target.targetId);
|
|
193
|
+
client.ws.send(JSON.stringify({ method: "Target.detachedFromTarget", params: physicalParams }));
|
|
194
|
+
for (const [alias, binding] of client.sessionAliases) {
|
|
195
|
+
if (binding.physicalSessionId !== physicalSessionId)
|
|
196
|
+
continue;
|
|
197
|
+
client.sessionAliases.delete(alias);
|
|
198
|
+
client.ws.send(JSON.stringify({
|
|
199
|
+
method: "Target.detachedFromTarget",
|
|
200
|
+
params: { ...params, sessionId: alias },
|
|
201
|
+
sessionId: binding.parentSessionId,
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function rejectExtensionPending(error) {
|
|
207
|
+
for (const pending of extensionPending.values())
|
|
208
|
+
pending.reject(error);
|
|
209
|
+
extensionPending.clear();
|
|
210
|
+
}
|
|
211
|
+
function closePlaywrightClients(reason) {
|
|
212
|
+
for (const client of playwrightClients.values())
|
|
213
|
+
client.ws.close(1000, reason);
|
|
214
|
+
playwrightClients.clear();
|
|
215
|
+
}
|
|
216
|
+
function disconnectExtension(error) {
|
|
217
|
+
rejectExtensionPending(error);
|
|
218
|
+
registry.disconnect(error);
|
|
219
|
+
extensionWs = null;
|
|
220
|
+
closePlaywrightClients(error.message);
|
|
221
|
+
}
|
|
222
|
+
async function sendToExtension(method, params, timeoutMs = 30_000) {
|
|
223
|
+
const ws = extensionWs;
|
|
224
|
+
if (!ws)
|
|
225
|
+
throw new PageBackendError(503, "extension not connected");
|
|
226
|
+
const id = ++extensionMessageId;
|
|
227
|
+
ws.send(JSON.stringify({ id, method, params }));
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
const timer = setTimeout(() => {
|
|
230
|
+
extensionPending.delete(id);
|
|
231
|
+
reject(new Error(`Extension request timeout after ${timeoutMs}ms: ${method}`));
|
|
232
|
+
}, timeoutMs);
|
|
233
|
+
extensionPending.set(id, {
|
|
234
|
+
resolve: (result) => {
|
|
235
|
+
clearTimeout(timer);
|
|
236
|
+
resolve(result);
|
|
237
|
+
},
|
|
238
|
+
reject: (error) => {
|
|
239
|
+
clearTimeout(timer);
|
|
240
|
+
reject(error);
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const sendCdpCommand = (method, params) => sendToExtension("forwardCDPCommand", { method, params });
|
|
246
|
+
const pageBackend = createExtensionPageBackend({
|
|
247
|
+
registry,
|
|
248
|
+
isConnected: () => extensionWs !== null,
|
|
249
|
+
sendCommand: sendCdpCommand,
|
|
250
|
+
timeoutMs: targetTimeoutMs,
|
|
251
|
+
});
|
|
252
|
+
async function routeCdpCommand(client, { method, params, sessionId }) {
|
|
253
|
+
const physicalSessionId = resolveSessionId(client, sessionId);
|
|
254
|
+
switch (method) {
|
|
255
|
+
case "Browser.getVersion":
|
|
256
|
+
return {
|
|
257
|
+
protocolVersion: "1.3",
|
|
258
|
+
product: "Chrome/Extension-Bridge",
|
|
259
|
+
revision: "1.0.0",
|
|
260
|
+
userAgent: "dev-browser-relay/1.0.0",
|
|
261
|
+
jsVersion: "V8",
|
|
262
|
+
};
|
|
263
|
+
case "Browser.setDownloadBehavior":
|
|
264
|
+
case "Target.setDiscoverTargets":
|
|
265
|
+
return {};
|
|
266
|
+
case "Target.setAutoAttach":
|
|
267
|
+
if (!sessionId)
|
|
268
|
+
return {};
|
|
269
|
+
break;
|
|
270
|
+
case "Target.attachToBrowserTarget":
|
|
271
|
+
return { sessionId: "browser" };
|
|
272
|
+
case "Target.detachFromTarget": {
|
|
273
|
+
const detachedSessionId = params?.sessionId;
|
|
274
|
+
if (typeof detachedSessionId === "string" && client.sessionAliases.delete(detachedSessionId)) {
|
|
275
|
+
return {};
|
|
276
|
+
}
|
|
277
|
+
if (sessionId === "browser" || params?.sessionId === "browser")
|
|
278
|
+
return {};
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case "Target.attachToTarget": {
|
|
282
|
+
const targetId = params?.targetId;
|
|
283
|
+
if (typeof targetId !== "string")
|
|
284
|
+
throw new Error("targetId is required");
|
|
285
|
+
const target = registry.getByTargetId(targetId);
|
|
286
|
+
if (!target)
|
|
287
|
+
throw new Error(`Target ${targetId} not found`);
|
|
288
|
+
return {
|
|
289
|
+
sessionId: createSessionAlias(client, target.sessionId, sessionId),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
case "Target.getTargetInfo": {
|
|
293
|
+
const targetId = params?.targetId;
|
|
294
|
+
const target = typeof targetId === "string"
|
|
295
|
+
? registry.getByTargetId(targetId)
|
|
296
|
+
: physicalSessionId
|
|
297
|
+
? registry.getBySessionId(physicalSessionId)
|
|
298
|
+
: undefined;
|
|
299
|
+
return { targetInfo: target?.targetInfo };
|
|
300
|
+
}
|
|
301
|
+
case "Target.getTargets":
|
|
302
|
+
return {
|
|
303
|
+
targetInfos: registry.targets().map(({ targetInfo }) => ({
|
|
304
|
+
...targetInfo,
|
|
305
|
+
attached: true,
|
|
306
|
+
})),
|
|
307
|
+
};
|
|
308
|
+
case "Target.createTarget":
|
|
309
|
+
case "Target.closeTarget":
|
|
310
|
+
return sendCdpCommand(method, params);
|
|
311
|
+
}
|
|
312
|
+
return sendToExtension("forwardCDPCommand", {
|
|
313
|
+
sessionId: physicalSessionId,
|
|
314
|
+
method,
|
|
315
|
+
params,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
const app = new Hono();
|
|
319
|
+
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
|
|
320
|
+
app.get("/", (c) => c.json({
|
|
321
|
+
wsEndpoint,
|
|
322
|
+
extensionConnected: extensionWs !== null,
|
|
323
|
+
mode: "extension",
|
|
324
|
+
}));
|
|
325
|
+
app.route("/", createPageApi({ backend: pageBackend, wsEndpoint }));
|
|
326
|
+
app.get("/cdp/:clientId?", upgradeWebSocket((c) => {
|
|
327
|
+
const clientId = c.req.param("clientId") ?? `client-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
328
|
+
const trustedOrigin = isTrustedCdpOrigin(c.req.header("origin"));
|
|
329
|
+
return {
|
|
330
|
+
onOpen(_event, ws) {
|
|
331
|
+
if (!trustedOrigin) {
|
|
332
|
+
ws.close(WEBSOCKET_POLICY_VIOLATION_CODE, CDP_ORIGIN_POLICY_REASON);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (playwrightClients.has(clientId)) {
|
|
336
|
+
ws.close(1000, "Client ID already connected");
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
playwrightClients.set(clientId, {
|
|
340
|
+
id: clientId,
|
|
341
|
+
ws,
|
|
342
|
+
knownTargets: new Set(),
|
|
343
|
+
sessionAliases: new Map(),
|
|
344
|
+
});
|
|
345
|
+
},
|
|
346
|
+
async onMessage(event, ws) {
|
|
347
|
+
if (!trustedOrigin)
|
|
348
|
+
return;
|
|
349
|
+
let parsed;
|
|
350
|
+
try {
|
|
351
|
+
parsed = JSON.parse(event.data.toString());
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (!isCdpCommand(parsed))
|
|
357
|
+
return;
|
|
358
|
+
const command = parsed;
|
|
359
|
+
const { id, method, params, sessionId } = command;
|
|
360
|
+
const client = playwrightClients.get(clientId);
|
|
361
|
+
if (!client || client.ws !== ws)
|
|
362
|
+
return;
|
|
363
|
+
if (!extensionWs) {
|
|
364
|
+
sendToPlaywright({ id, sessionId, error: { message: "extension not connected" } }, client);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
const result = await routeCdpCommand(client, { method, params, sessionId });
|
|
369
|
+
if (method === "Target.setAutoAttach" && !sessionId) {
|
|
370
|
+
for (const target of registry.targets())
|
|
371
|
+
sendAttached(target, client);
|
|
372
|
+
}
|
|
373
|
+
if (method === "Target.setDiscoverTargets" && params?.discover === true) {
|
|
374
|
+
for (const target of registry.targets()) {
|
|
375
|
+
sendToPlaywright({
|
|
376
|
+
method: "Target.targetCreated",
|
|
377
|
+
params: { targetInfo: { ...target.targetInfo, attached: true } },
|
|
378
|
+
}, client);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (method === "Target.attachToTarget") {
|
|
382
|
+
const targetId = params?.targetId;
|
|
383
|
+
if (typeof targetId === "string") {
|
|
384
|
+
const target = registry.getByTargetId(targetId);
|
|
385
|
+
if (target)
|
|
386
|
+
sendAttached(target, client);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
sendToPlaywright({ id, sessionId, result }, client);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
sendToPlaywright({ id, sessionId, error: { message: errorMessage(error) } }, client);
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
onClose(_event, ws) {
|
|
396
|
+
if (!trustedOrigin)
|
|
397
|
+
return;
|
|
398
|
+
const client = playwrightClients.get(clientId);
|
|
399
|
+
if (client?.ws === ws)
|
|
400
|
+
playwrightClients.delete(clientId);
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
}));
|
|
404
|
+
app.get("/extension", upgradeWebSocket((c) => {
|
|
405
|
+
const trustedOrigin = isTrustedExtensionOrigin(c.req.header("origin"));
|
|
406
|
+
return {
|
|
407
|
+
onOpen(_event, ws) {
|
|
408
|
+
if (!trustedOrigin) {
|
|
409
|
+
ws.close(WEBSOCKET_POLICY_VIOLATION_CODE, EXTENSION_ORIGIN_POLICY_REASON);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
if (extensionWs) {
|
|
413
|
+
const old = extensionWs;
|
|
414
|
+
disconnectExtension(new PageBackendError(503, "extension connection replaced"));
|
|
415
|
+
old.close(4001, "Extension replaced");
|
|
416
|
+
}
|
|
417
|
+
extensionWs = ws;
|
|
418
|
+
log("Extension connected");
|
|
419
|
+
},
|
|
420
|
+
onMessage(event, ws) {
|
|
421
|
+
if (!trustedOrigin)
|
|
422
|
+
return;
|
|
423
|
+
if (extensionWs !== ws)
|
|
424
|
+
return;
|
|
425
|
+
let parsed;
|
|
426
|
+
try {
|
|
427
|
+
parsed = JSON.parse(event.data.toString());
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
ws.close(1000, "Invalid JSON");
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (!isRecord(parsed)) {
|
|
434
|
+
ws.close(1003, "Invalid extension message");
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const message = parsed;
|
|
438
|
+
if ("id" in message) {
|
|
439
|
+
if (typeof message.id !== "number")
|
|
440
|
+
return;
|
|
441
|
+
const pending = extensionPending.get(message.id);
|
|
442
|
+
if (!pending)
|
|
443
|
+
return;
|
|
444
|
+
extensionPending.delete(message.id);
|
|
445
|
+
if (message.error)
|
|
446
|
+
pending.reject(new PageBackendError(502, message.error));
|
|
447
|
+
else
|
|
448
|
+
pending.resolve(message.result);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
if (message.method !== "forwardCDPEvent")
|
|
452
|
+
return;
|
|
453
|
+
const { method, params, sessionId } = message.params;
|
|
454
|
+
if (method === "Target.attachedToTarget") {
|
|
455
|
+
const attached = params;
|
|
456
|
+
const target = {
|
|
457
|
+
sessionId: attached.sessionId,
|
|
458
|
+
targetId: attached.targetInfo.targetId,
|
|
459
|
+
targetInfo: attached.targetInfo,
|
|
460
|
+
};
|
|
461
|
+
registry.attach(target);
|
|
462
|
+
sendAttached(target);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
if (method === "Target.detachedFromTarget") {
|
|
466
|
+
const detached = params;
|
|
467
|
+
const target = registry.detach(detached.sessionId);
|
|
468
|
+
sendDetached(detached.sessionId, detached, target);
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (method === "Target.targetInfoChanged") {
|
|
472
|
+
const changed = params;
|
|
473
|
+
registry.updateTargetInfo(changed.targetInfo);
|
|
474
|
+
sendToPlaywright({ method, params: changed });
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
sendSessionEvent(method, params, sessionId);
|
|
478
|
+
},
|
|
479
|
+
onClose(_event, ws) {
|
|
480
|
+
if (!trustedOrigin)
|
|
481
|
+
return;
|
|
482
|
+
if (extensionWs !== ws)
|
|
483
|
+
return;
|
|
484
|
+
log("Extension disconnected");
|
|
485
|
+
disconnectExtension(new PageBackendError(503, "extension connection closed"));
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
}));
|
|
489
|
+
const server = serve({ fetch: app.fetch, port: requestedPort, hostname: host });
|
|
490
|
+
injectWebSocket(server);
|
|
491
|
+
await waitForListening(server);
|
|
492
|
+
log(`HTTP: ${formatHttpUrl(host, requestedPort)}`);
|
|
493
|
+
let stopped = false;
|
|
494
|
+
return {
|
|
495
|
+
wsEndpoint,
|
|
496
|
+
port: requestedPort,
|
|
497
|
+
async stop() {
|
|
498
|
+
if (stopped)
|
|
499
|
+
return;
|
|
500
|
+
stopped = true;
|
|
501
|
+
const ws = extensionWs;
|
|
502
|
+
disconnectExtension(new PageBackendError(503, "relay server stopped"));
|
|
503
|
+
ws?.close(1000, "Server stopped");
|
|
504
|
+
await new Promise((resolve, reject) => {
|
|
505
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
506
|
+
});
|
|
507
|
+
},
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function waitForListening(server) {
|
|
511
|
+
if (server.listening)
|
|
512
|
+
return Promise.resolve();
|
|
513
|
+
return new Promise((resolve, reject) => {
|
|
514
|
+
server.once("listening", resolve);
|
|
515
|
+
server.once("error", reject);
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
function errorMessage(error) {
|
|
519
|
+
return error instanceof Error ? error.message : String(error);
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface RuntimeCommand {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface TcpPortProbe {
|
|
6
|
+
once(event: "error" | "listening", listener: () => void): this;
|
|
7
|
+
listen(port: number, host: string): unknown;
|
|
8
|
+
close(callback: () => void): unknown;
|
|
9
|
+
}
|
|
10
|
+
export type TcpPortProbeFactory = () => TcpPortProbe;
|
|
11
|
+
export type PlaywrightChromiumExecutableName = "chromium" | "chromium-headless-shell";
|
|
12
|
+
export interface ChromiumInstallCheckOptions {
|
|
13
|
+
headless: boolean;
|
|
14
|
+
findExecutable: (name: PlaywrightChromiumExecutableName) => {
|
|
15
|
+
executablePath: () => string | undefined;
|
|
16
|
+
} | undefined;
|
|
17
|
+
exists: (path: string) => boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface RuntimePackageLock {
|
|
20
|
+
packages?: Record<string, {
|
|
21
|
+
dependencies?: Record<string, string>;
|
|
22
|
+
version?: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export interface InvalidRuntimeDependenciesOptions {
|
|
26
|
+
skillDir: string;
|
|
27
|
+
lockedDependencies: Record<string, string>;
|
|
28
|
+
readPackageVersion: (packageJsonPath: string) => string | undefined;
|
|
29
|
+
}
|
|
30
|
+
export declare function getRuntimeDependencyInstallCommand(): RuntimeCommand;
|
|
31
|
+
export declare function getPlaywrightInstallCommand({ skillDir, nodeExecutable, }: {
|
|
32
|
+
skillDir: string;
|
|
33
|
+
nodeExecutable?: string;
|
|
34
|
+
}): RuntimeCommand;
|
|
35
|
+
export declare function isTcpPortInUse(port: number, host?: string, createProbe?: TcpPortProbeFactory): Promise<boolean>;
|
|
36
|
+
export declare function isPlaywrightChromiumInstalled({ headless, findExecutable, exists, }: ChromiumInstallCheckOptions): boolean;
|
|
37
|
+
export declare function getLockedRuntimeDependencies(lockfile: RuntimePackageLock): Record<string, string>;
|
|
38
|
+
export declare function getInvalidRuntimeDependencies({ skillDir, lockedDependencies, readPackageVersion, }: InvalidRuntimeDependenciesOptions): string[];
|
|
39
|
+
export declare function resolveRuntimePaths(skillDir: string): {
|
|
40
|
+
skillDir: string;
|
|
41
|
+
};
|
|
42
|
+
export declare function resolveImportMetaDir(moduleUrl: string): string;
|
|
43
|
+
export declare function resolveSkillDirFromEntrypoint(moduleUrl: string): string;
|
|
44
|
+
export declare function shouldUseShellForPackageCommands(platform: NodeJS.Platform): boolean;
|
|
45
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,gCAAgC,GAAG,UAAU,GAAG,yBAAyB,CAAC;AAEtF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,CAAC,IAAI,EAAE,gCAAgC,KACnD;QAAE,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;KAAE,GAC5C,SAAS,CAAC;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN;QACE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CACF,CAAC;CACH;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,kBAAkB,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACrE;AAED,wBAAgB,kCAAkC,IAAI,cAAc,CAEnE;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,QAAQ,EACR,cAAiC,GAClC,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,cAAc,CAKjB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,SAAc,EAClB,WAAW,GAAE,mBAAkC,GAC9C,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,EACR,cAAc,EACd,MAAM,GACP,EAAE,2BAA2B,GAAG,OAAO,CAIvC;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,QAAQ,EACR,kBAAkB,EAClB,kBAAkB,GACnB,EAAE,iCAAiC,GAAG,MAAM,EAAE,CAO9C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM;;EAEnD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGvE;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAEnF"}
|