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.
Files changed (126) hide show
  1. package/README.md +55 -182
  2. package/bin/abelworkflow.mjs +5 -3
  3. package/lib/cli/args.mjs +76 -0
  4. package/lib/cli/main.mjs +387 -0
  5. package/lib/cli/prompts.mjs +119 -0
  6. package/lib/config/dotenv.mjs +102 -0
  7. package/lib/config/jsonc.mjs +80 -0
  8. package/lib/config/store.mjs +310 -0
  9. package/lib/config/toml.mjs +638 -0
  10. package/lib/installer/assets.mjs +326 -0
  11. package/lib/installer/install.mjs +167 -0
  12. package/lib/installer/links.mjs +427 -0
  13. package/lib/installer/render.mjs +46 -0
  14. package/lib/installer/state.mjs +182 -0
  15. package/lib/paths.mjs +99 -0
  16. package/lib/providers/claude.mjs +388 -0
  17. package/lib/providers/codex.mjs +433 -0
  18. package/lib/providers/pi.mjs +362 -0
  19. package/lib/providers/skills.mjs +164 -0
  20. package/lib/templates/codex/agents/default.toml +7 -0
  21. package/lib/templates/codex/agents/explorer.toml +7 -0
  22. package/lib/templates/codex/agents/planner.toml +7 -0
  23. package/lib/templates/codex/agents/reviewer.toml +7 -0
  24. package/lib/templates/codex/agents/worker.toml +7 -0
  25. package/lib/templates/codex/config-base.toml +11 -3
  26. package/{AGENTS.md → lib/templates/workflow/AGENTS.md} +8 -3
  27. package/{commands → lib/templates/workflow/commands}/abel-diagnose.md +5 -5
  28. package/{commands → lib/templates/workflow/commands}/abel-implement.md +3 -8
  29. package/{commands → lib/templates/workflow/commands}/abel-init.md +1 -1
  30. package/{commands → lib/templates/workflow/commands}/abel-plan.md +1 -7
  31. package/{commands → lib/templates/workflow/commands}/abel-research.md +1 -1
  32. package/{.gitignore → lib/templates/workflow/gitignore.template} +0 -2
  33. package/lib/tools/cli-installer.mjs +277 -0
  34. package/package.json +43 -10
  35. package/skills/context7-auto-research/SKILL.md +5 -5
  36. package/skills/context7-auto-research/{context7-api.js → context7-api.cjs} +5 -8
  37. package/skills/dev-browser/SKILL.md +53 -33
  38. package/skills/dev-browser/dist/scripts/start.d.ts +2 -0
  39. package/skills/dev-browser/dist/scripts/start.d.ts.map +1 -0
  40. package/skills/dev-browser/dist/scripts/start.js +118 -0
  41. package/skills/dev-browser/dist/scripts/start.js.map +1 -0
  42. package/skills/dev-browser/dist/src/client.d.ts +93 -0
  43. package/skills/dev-browser/dist/src/client.d.ts.map +1 -0
  44. package/skills/dev-browser/dist/src/client.js +310 -0
  45. package/skills/dev-browser/dist/src/client.js.map +1 -0
  46. package/skills/dev-browser/dist/src/entrypoint.d.ts +29 -0
  47. package/skills/dev-browser/dist/src/entrypoint.d.ts.map +1 -0
  48. package/skills/dev-browser/dist/src/entrypoint.js +106 -0
  49. package/skills/dev-browser/dist/src/entrypoint.js.map +1 -0
  50. package/skills/dev-browser/dist/src/index.d.ts +4 -0
  51. package/skills/dev-browser/dist/src/index.d.ts.map +1 -0
  52. package/skills/dev-browser/dist/src/index.js +2 -0
  53. package/skills/dev-browser/dist/src/index.js.map +1 -0
  54. package/skills/dev-browser/dist/src/page-api.d.ts +25 -0
  55. package/skills/dev-browser/dist/src/page-api.d.ts.map +1 -0
  56. package/skills/dev-browser/dist/src/page-api.js +104 -0
  57. package/skills/dev-browser/dist/src/page-api.js.map +1 -0
  58. package/skills/dev-browser/dist/src/relay.d.ts +27 -0
  59. package/skills/dev-browser/dist/src/relay.d.ts.map +1 -0
  60. package/skills/dev-browser/dist/src/relay.js +521 -0
  61. package/skills/dev-browser/dist/src/relay.js.map +1 -0
  62. package/skills/dev-browser/dist/src/runtime.d.ts +45 -0
  63. package/skills/dev-browser/dist/src/runtime.d.ts.map +1 -0
  64. package/skills/dev-browser/dist/src/runtime.js +54 -0
  65. package/skills/dev-browser/dist/src/runtime.js.map +1 -0
  66. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +23 -0
  67. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts.map +1 -0
  68. package/skills/dev-browser/{src/snapshot/browser-script.ts → dist/src/snapshot/browser-script.js} +21 -30
  69. package/skills/dev-browser/dist/src/snapshot/browser-script.js.map +1 -0
  70. package/skills/dev-browser/dist/src/snapshot/index.d.ts +14 -0
  71. package/skills/dev-browser/dist/src/snapshot/index.d.ts.map +1 -0
  72. package/skills/dev-browser/{src/snapshot/index.ts → dist/src/snapshot/index.js} +2 -2
  73. package/skills/dev-browser/dist/src/snapshot/index.js.map +1 -0
  74. package/skills/dev-browser/dist/src/snapshot/inject.d.ts +13 -0
  75. package/skills/dev-browser/dist/src/snapshot/inject.d.ts.map +1 -0
  76. package/skills/dev-browser/{src/snapshot/inject.ts → dist/src/snapshot/inject.js} +2 -2
  77. package/skills/dev-browser/dist/src/snapshot/inject.js.map +1 -0
  78. package/skills/dev-browser/dist/src/standalone.d.ts +32 -0
  79. package/skills/dev-browser/dist/src/standalone.d.ts.map +1 -0
  80. package/skills/dev-browser/dist/src/standalone.js +174 -0
  81. package/skills/dev-browser/dist/src/standalone.js.map +1 -0
  82. package/skills/dev-browser/dist/src/startup.d.ts +55 -0
  83. package/skills/dev-browser/dist/src/startup.d.ts.map +1 -0
  84. package/skills/dev-browser/dist/src/startup.js +81 -0
  85. package/skills/dev-browser/dist/src/startup.js.map +1 -0
  86. package/skills/dev-browser/dist/src/target-registry.d.ts +29 -0
  87. package/skills/dev-browser/dist/src/target-registry.d.ts.map +1 -0
  88. package/skills/dev-browser/dist/src/target-registry.js +135 -0
  89. package/skills/dev-browser/dist/src/target-registry.js.map +1 -0
  90. package/skills/dev-browser/dist/src/types.d.ts +27 -0
  91. package/skills/dev-browser/dist/src/types.d.ts.map +1 -0
  92. package/skills/dev-browser/dist/src/types.js +2 -0
  93. package/skills/dev-browser/dist/src/types.js.map +1 -0
  94. package/skills/dev-browser/package-lock.json +67 -1510
  95. package/skills/dev-browser/package.json +18 -14
  96. package/skills/dev-browser/references/scraping.md +94 -105
  97. package/skills/grok-search/defaults.json +3 -0
  98. package/skills/grok-search/gitignore.template +4 -0
  99. package/skills/grok-search/scripts/_dotenv.py +5 -1
  100. package/skills/grok-search/scripts/groksearch_cli.py +15 -33
  101. package/skills/prompt-enhancer/TEMPLATE.md +0 -4
  102. package/skills/prompt-enhancer/requirements.txt +0 -1
  103. package/skills/prompt-enhancer/scripts/_dotenv.py +5 -1
  104. package/skills/prompt-enhancer/scripts/enhance.py +4 -51
  105. package/skills/prompt-enhancer/scripts/prompt_enhancer_entry.py +1 -16
  106. package/.skill-lock.json +0 -29
  107. package/lib/cli/logic.mjs +0 -213
  108. package/lib/cli.mjs +0 -3016
  109. package/skills/confidence-check/SKILL.md +0 -34
  110. package/skills/confidence-check/confidence.ts +0 -276
  111. package/skills/dev-browser/bun.lock +0 -460
  112. package/skills/dev-browser/scripts/start.ts +0 -280
  113. package/skills/dev-browser/src/client.ts +0 -474
  114. package/skills/dev-browser/src/entrypoint.ts +0 -157
  115. package/skills/dev-browser/src/index.ts +0 -289
  116. package/skills/dev-browser/src/relay.ts +0 -731
  117. package/skills/dev-browser/src/runtime.test.ts +0 -60
  118. package/skills/dev-browser/src/runtime.ts +0 -171
  119. package/skills/dev-browser/src/startup.test.ts +0 -95
  120. package/skills/dev-browser/src/startup.ts +0 -153
  121. package/skills/dev-browser/src/types.ts +0 -35
  122. package/skills/dev-browser/tsconfig.json +0 -36
  123. package/skills/dev-browser/vitest.config.ts +0 -12
  124. package/skills/sequential-think/SKILL.md +0 -198
  125. package/skills/sequential-think/scripts/.env.example +0 -5
  126. package/skills/sequential-think/scripts/sequential_think_cli.py +0 -253
@@ -0,0 +1,310 @@
1
+ import { chromium } from "playwright";
2
+ import { getSnapshotScript } from "./snapshot/browser-script.js";
3
+ /**
4
+ * Wait for a page to finish loading using document.readyState and performance API.
5
+ *
6
+ * Uses browser-use's approach of:
7
+ * - Checking document.readyState for 'complete'
8
+ * - Monitoring pending network requests via Performance API
9
+ * - Filtering out ads, tracking, and non-critical resources
10
+ * - Graceful timeout handling (continues even if timeout reached)
11
+ */
12
+ export async function waitForPageLoad(page, options = {}) {
13
+ const { timeout = 10000, pollInterval = 50, minimumWait = 100, waitForNetworkIdle = true, } = options;
14
+ const startTime = Date.now();
15
+ let lastState = null;
16
+ // Wait minimum time first
17
+ if (minimumWait > 0) {
18
+ await new Promise((resolve) => setTimeout(resolve, minimumWait));
19
+ }
20
+ // Poll until ready or timeout
21
+ while (Date.now() - startTime < timeout) {
22
+ try {
23
+ lastState = await getPageLoadState(page);
24
+ // Check if document is complete
25
+ const documentReady = lastState.documentReadyState === "complete";
26
+ // Check if network is idle (no pending critical requests)
27
+ const networkIdle = !waitForNetworkIdle || lastState.pendingRequests.length === 0;
28
+ if (documentReady && networkIdle) {
29
+ return {
30
+ success: true,
31
+ readyState: lastState.documentReadyState,
32
+ pendingRequests: lastState.pendingRequests.length,
33
+ waitTimeMs: Date.now() - startTime,
34
+ timedOut: false,
35
+ };
36
+ }
37
+ }
38
+ catch {
39
+ // Page may be navigating, continue polling
40
+ }
41
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
42
+ }
43
+ // Timeout reached - return current state
44
+ return {
45
+ success: false,
46
+ readyState: lastState?.documentReadyState ?? "unknown",
47
+ pendingRequests: lastState?.pendingRequests.length ?? 0,
48
+ waitTimeMs: Date.now() - startTime,
49
+ timedOut: true,
50
+ };
51
+ }
52
+ /**
53
+ * Get the current page load state including document ready state and pending requests.
54
+ * Filters out ads, tracking, and non-critical resources that shouldn't block loading.
55
+ */
56
+ async function getPageLoadState(page) {
57
+ const result = await page.evaluate(() => {
58
+ // Access browser globals via globalThis for TypeScript compatibility
59
+ /* eslint-disable @typescript-eslint/no-explicit-any */
60
+ const g = globalThis;
61
+ /* eslint-enable @typescript-eslint/no-explicit-any */
62
+ const perf = g.performance;
63
+ const doc = g.document;
64
+ const now = perf.now();
65
+ const resources = perf.getEntriesByType("resource");
66
+ const pending = [];
67
+ // Common ad/tracking domains and patterns to filter out
68
+ const adPatterns = [
69
+ "doubleclick.net",
70
+ "googlesyndication.com",
71
+ "googletagmanager.com",
72
+ "google-analytics.com",
73
+ "facebook.net",
74
+ "connect.facebook.net",
75
+ "analytics",
76
+ "ads",
77
+ "tracking",
78
+ "pixel",
79
+ "hotjar.com",
80
+ "clarity.ms",
81
+ "mixpanel.com",
82
+ "segment.com",
83
+ "newrelic.com",
84
+ "nr-data.net",
85
+ "/tracker/",
86
+ "/collector/",
87
+ "/beacon/",
88
+ "/telemetry/",
89
+ "/log/",
90
+ "/events/",
91
+ "/track.",
92
+ "/metrics/",
93
+ ];
94
+ // Non-critical resource types
95
+ const nonCriticalTypes = ["img", "image", "icon", "font"];
96
+ for (const entry of resources) {
97
+ // Resources with responseEnd === 0 are still loading
98
+ if (entry.responseEnd === 0) {
99
+ const url = entry.name;
100
+ // Filter out ads and tracking
101
+ const isAd = adPatterns.some((pattern) => url.includes(pattern));
102
+ if (isAd)
103
+ continue;
104
+ // Filter out data: URLs and very long URLs
105
+ if (url.startsWith("data:") || url.length > 500)
106
+ continue;
107
+ const loadingDuration = now - entry.startTime;
108
+ // Skip requests loading > 10 seconds (likely stuck/polling)
109
+ if (loadingDuration > 10000)
110
+ continue;
111
+ const resourceType = entry.initiatorType || "unknown";
112
+ // Filter out non-critical resources loading > 3 seconds
113
+ if (nonCriticalTypes.includes(resourceType) && loadingDuration > 3000)
114
+ continue;
115
+ // Filter out image URLs even if type is unknown
116
+ const isImageUrl = /\.(jpg|jpeg|png|gif|webp|svg|ico)(\?|$)/i.test(url);
117
+ if (isImageUrl && loadingDuration > 3000)
118
+ continue;
119
+ pending.push({
120
+ url,
121
+ loadingDurationMs: Math.round(loadingDuration),
122
+ resourceType,
123
+ });
124
+ }
125
+ }
126
+ return {
127
+ documentReadyState: doc.readyState,
128
+ documentLoading: doc.readyState !== "complete",
129
+ pendingRequests: pending,
130
+ };
131
+ });
132
+ return result;
133
+ }
134
+ export async function findPageByTargetId(browser, targetId) {
135
+ for (const context of browser.contexts()) {
136
+ for (const page of context.pages()) {
137
+ let session;
138
+ try {
139
+ session = await context.newCDPSession(page);
140
+ const { targetInfo } = await session.send("Target.getTargetInfo");
141
+ if (targetInfo.targetId === targetId)
142
+ return page;
143
+ }
144
+ catch (error) {
145
+ const message = error instanceof Error ? error.message : String(error);
146
+ if (!message.includes("Target closed") && !message.includes("Session closed")) {
147
+ console.warn(`Unexpected error checking page target: ${message}`);
148
+ }
149
+ }
150
+ finally {
151
+ await session?.detach().catch(() => undefined);
152
+ }
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ export async function connect(serverUrl = "http://localhost:9222") {
158
+ let browser = null;
159
+ let connectingPromise = null;
160
+ async function ensureConnected() {
161
+ // Return existing connection if still active
162
+ if (browser && browser.isConnected()) {
163
+ return browser;
164
+ }
165
+ // If already connecting, wait for that connection (prevents race condition)
166
+ if (connectingPromise) {
167
+ return connectingPromise;
168
+ }
169
+ // Start new connection with mutex
170
+ connectingPromise = (async () => {
171
+ try {
172
+ const { wsEndpoint } = await fetchServerInfo(serverUrl);
173
+ // Connect to the browser via CDP
174
+ browser = await chromium.connectOverCDP(wsEndpoint);
175
+ return browser;
176
+ }
177
+ finally {
178
+ connectingPromise = null;
179
+ }
180
+ })();
181
+ return connectingPromise;
182
+ }
183
+ // Helper to get a page by name (used by multiple methods)
184
+ async function getPage(name, options) {
185
+ // Request the page from server (creates if doesn't exist)
186
+ const res = await fetch(`${serverUrl}/pages`, {
187
+ method: "POST",
188
+ headers: { "Content-Type": "application/json" },
189
+ body: JSON.stringify({ name, viewport: options?.viewport }),
190
+ });
191
+ if (!res.ok) {
192
+ throw new Error(`Failed to get page: ${await res.text()}`);
193
+ }
194
+ const pageInfo = (await res.json());
195
+ const { targetId } = pageInfo;
196
+ // Connect to browser
197
+ const b = await ensureConnected();
198
+ const page = await waitForExactPage(b, targetId);
199
+ if (!page) {
200
+ throw new Error(`Page "${name}" not found in browser contexts`);
201
+ }
202
+ return page;
203
+ }
204
+ return {
205
+ page: getPage,
206
+ async list() {
207
+ const res = await fetch(`${serverUrl}/pages`);
208
+ const data = (await res.json());
209
+ return data.pages;
210
+ },
211
+ async close(name) {
212
+ const res = await fetch(`${serverUrl}/pages/${encodeURIComponent(name)}`, {
213
+ method: "DELETE",
214
+ });
215
+ if (!res.ok) {
216
+ throw new Error(`Failed to close page: ${await res.text()}`);
217
+ }
218
+ },
219
+ async disconnect() {
220
+ // Just disconnect the CDP connection - pages persist on server
221
+ if (browser) {
222
+ await browser.close();
223
+ browser = null;
224
+ }
225
+ },
226
+ async getAISnapshot(name) {
227
+ // Get the page
228
+ const page = await getPage(name);
229
+ // Inject the snapshot script and call getAISnapshot
230
+ const snapshotScript = getSnapshotScript();
231
+ const snapshot = await page.evaluate((script) => {
232
+ // Inject script if not already present
233
+ // Note: page.evaluate runs in browser context where window exists
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
235
+ const w = globalThis;
236
+ if (!w.__devBrowser_getAISnapshot) {
237
+ // eslint-disable-next-line no-eval
238
+ eval(script);
239
+ }
240
+ return w.__devBrowser_getAISnapshot();
241
+ }, snapshotScript);
242
+ return snapshot;
243
+ },
244
+ async selectSnapshotRef(name, ref) {
245
+ // Get the page
246
+ const page = await getPage(name);
247
+ // Find the element using the stored refs
248
+ const elementHandle = await page.evaluateHandle((refId) => {
249
+ // Note: page.evaluateHandle runs in browser context where globalThis is the window
250
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
+ const w = globalThis;
252
+ const refs = w.__devBrowserRefs;
253
+ if (!refs) {
254
+ throw new Error("No snapshot refs found. Call getAISnapshot first.");
255
+ }
256
+ const element = refs[refId];
257
+ if (!element) {
258
+ throw new Error(`Ref "${refId}" not found. Available refs: ${Object.keys(refs).join(", ")}`);
259
+ }
260
+ return element;
261
+ }, ref);
262
+ // Check if we got an element
263
+ const element = elementHandle.asElement();
264
+ if (!element) {
265
+ await elementHandle.dispose();
266
+ return null;
267
+ }
268
+ return element;
269
+ },
270
+ async getServerInfo() {
271
+ return fetchServerInfo(serverUrl);
272
+ },
273
+ };
274
+ }
275
+ async function fetchServerInfo(serverUrl) {
276
+ const res = await fetch(serverUrl);
277
+ if (!res.ok) {
278
+ throw new Error(`Server returned ${res.status}: ${await res.text()}`);
279
+ }
280
+ return parseServerInfo(await res.json());
281
+ }
282
+ function parseServerInfo(value) {
283
+ const info = typeof value === "object" && value !== null
284
+ ? value
285
+ : {};
286
+ const mode = Object.hasOwn(info, "mode") ? info.mode : "standalone";
287
+ if (mode !== "standalone" && mode !== "extension") {
288
+ throw new Error(`Invalid dev-browser server mode: expected "standalone" or "extension", received ${JSON.stringify(mode)}`);
289
+ }
290
+ if (typeof info.wsEndpoint !== "string" || info.wsEndpoint.trim().length === 0) {
291
+ throw new Error(`Invalid dev-browser wsEndpoint: expected a non-empty string, received ${JSON.stringify(info.wsEndpoint)}`);
292
+ }
293
+ return {
294
+ wsEndpoint: info.wsEndpoint,
295
+ mode,
296
+ extensionConnected: info.extensionConnected,
297
+ };
298
+ }
299
+ async function waitForExactPage(browser, targetId) {
300
+ const deadline = Date.now() + 5000;
301
+ do {
302
+ const page = await findPageByTargetId(browser, targetId);
303
+ if (page)
304
+ return page;
305
+ if (Date.now() >= deadline)
306
+ return null;
307
+ await new Promise((resolve) => setTimeout(resolve, 25));
308
+ } while (true);
309
+ }
310
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type EntrypointMode = "standalone" | "extension";
2
+ export interface EntrypointArgs {
3
+ mode: EntrypointMode;
4
+ host: string;
5
+ port: number;
6
+ cdpPort: number;
7
+ headless: boolean;
8
+ }
9
+ export interface StandaloneReadinessInfo {
10
+ mode: "standalone";
11
+ host: string;
12
+ port: number;
13
+ wsEndpoint: string;
14
+ }
15
+ export interface ExtensionReadinessInfo {
16
+ mode: "extension";
17
+ host: string;
18
+ port: number;
19
+ wsEndpoint: string;
20
+ }
21
+ export type ReadinessInfo = StandaloneReadinessInfo | ExtensionReadinessInfo;
22
+ export declare const DEFAULT_HOST = "localhost";
23
+ export declare function formatHostForUrl(host: string): string;
24
+ export declare function formatHttpUrl(host: string, port: number): string;
25
+ export declare function formatWsUrl(host: string, port: number, path?: string): string;
26
+ export declare function resolveHostForProbe(host: string): string;
27
+ export declare function parseEntrypointArgs(argv: string[], env?: Record<string, string | undefined>): EntrypointArgs;
28
+ export declare function formatReadinessLines(info: ReadinessInfo): string[];
29
+ //# sourceMappingURL=entrypoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoint.d.ts","sourceRoot":"","sources":["../../src/entrypoint.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;AAE7E,eAAO,MAAM,YAAY,cAAc,CAAC;AAIxC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,MAAM,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,cAAc,CA6ChB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAmBlE"}
@@ -0,0 +1,106 @@
1
+ export const DEFAULT_HOST = "localhost";
2
+ const DEFAULT_PORT = 9222;
3
+ const DEFAULT_CDP_PORT = 9223;
4
+ export function formatHostForUrl(host) {
5
+ const normalizedHost = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
6
+ return normalizedHost.includes(":") ? `[${normalizedHost}]` : normalizedHost;
7
+ }
8
+ export function formatHttpUrl(host, port) {
9
+ return `http://${formatHostForUrl(host)}:${port}`;
10
+ }
11
+ export function formatWsUrl(host, port, path = "") {
12
+ return `ws://${formatHostForUrl(host)}:${port}${path}`;
13
+ }
14
+ export function resolveHostForProbe(host) {
15
+ const normalizedHost = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
16
+ if (normalizedHost === "0.0.0.0") {
17
+ return "127.0.0.1";
18
+ }
19
+ if (normalizedHost === "::") {
20
+ return "::1";
21
+ }
22
+ return normalizedHost;
23
+ }
24
+ export function parseEntrypointArgs(argv, env = process.env) {
25
+ let index = 0;
26
+ let mode = "standalone";
27
+ const first = argv[0];
28
+ if (first && !first.startsWith("--")) {
29
+ if (first !== "standalone" && first !== "extension") {
30
+ throw new Error(`Unknown mode: ${first}`);
31
+ }
32
+ mode = first;
33
+ index = 1;
34
+ }
35
+ const args = {
36
+ mode,
37
+ host: env.HOST?.trim() || DEFAULT_HOST,
38
+ port: readEnvPort(env.PORT, "PORT") ?? DEFAULT_PORT,
39
+ cdpPort: DEFAULT_CDP_PORT,
40
+ headless: env.HEADLESS?.trim().toLowerCase() === "true",
41
+ };
42
+ while (index < argv.length) {
43
+ const token = argv[index++];
44
+ switch (token) {
45
+ case "--headless":
46
+ args.headless = true;
47
+ break;
48
+ case "--host":
49
+ args.host = readValue(argv, index - 1);
50
+ index += 1;
51
+ break;
52
+ case "--port":
53
+ args.port = parsePort(readValue(argv, index - 1), "port");
54
+ index += 1;
55
+ break;
56
+ case "--cdp-port":
57
+ args.cdpPort = parsePort(readValue(argv, index - 1), "cdpPort");
58
+ index += 1;
59
+ break;
60
+ default:
61
+ throw new Error(`Unknown argument: ${token}`);
62
+ }
63
+ }
64
+ return args;
65
+ }
66
+ export function formatReadinessLines(info) {
67
+ if (info.mode === "standalone") {
68
+ return [
69
+ "Dev browser server started",
70
+ ` HTTP: ${formatHttpUrl(info.host, info.port)}`,
71
+ ` WebSocket: ${info.wsEndpoint}`,
72
+ "",
73
+ "Ready",
74
+ ];
75
+ }
76
+ return [
77
+ "CDP relay server started",
78
+ ` HTTP: ${formatHttpUrl(info.host, info.port)}`,
79
+ ` CDP endpoint: ${info.wsEndpoint}`,
80
+ ` Extension endpoint: ${formatWsUrl(info.host, info.port, "/extension")}`,
81
+ "",
82
+ "Waiting for extension to connect...",
83
+ ];
84
+ }
85
+ function readValue(argv, optionIndex) {
86
+ const value = argv[optionIndex + 1];
87
+ if (!value || value.startsWith("--")) {
88
+ throw new Error(`Missing value for ${argv[optionIndex]}`);
89
+ }
90
+ return value;
91
+ }
92
+ function parsePort(value, label) {
93
+ const port = Number.parseInt(value, 10);
94
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
95
+ throw new Error(`Invalid ${label}: ${value}`);
96
+ }
97
+ return port;
98
+ }
99
+ function readEnvPort(value, label) {
100
+ const normalized = value?.trim();
101
+ if (!normalized) {
102
+ return undefined;
103
+ }
104
+ return parsePort(normalized, label);
105
+ }
106
+ //# sourceMappingURL=entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoint.js","sourceRoot":"","sources":["../../src/entrypoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { createStandaloneApp, createStandalonePageBackend, serve } from "./standalone.js";
2
+ export type { DevBrowserServer } from "./standalone.js";
3
+ export type { GetPageResponse, ListPagesResponse, ServeOptions, ServerInfoResponse, } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createStandaloneApp, createStandalonePageBackend, serve } from "./standalone.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Hono } from "hono";
2
+ export interface Viewport {
3
+ width: number;
4
+ height: number;
5
+ }
6
+ export interface PageDescriptor {
7
+ name: string;
8
+ targetId: string;
9
+ }
10
+ export interface PageBackend {
11
+ list(): Promise<PageDescriptor[]>;
12
+ getOrCreate(name: string, viewport?: Viewport): Promise<PageDescriptor>;
13
+ close(name: string): Promise<boolean>;
14
+ }
15
+ type PageBackendStatus = 400 | 404 | 409 | 500 | 502 | 503 | 504;
16
+ export declare class PageBackendError extends Error {
17
+ readonly status: PageBackendStatus;
18
+ constructor(status: PageBackendStatus, message: string);
19
+ }
20
+ export declare function createPageApi({ backend, wsEndpoint, }: {
21
+ backend: PageBackend;
22
+ wsEndpoint: string;
23
+ }): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
24
+ export {};
25
+ //# sourceMappingURL=page-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-api.d.ts","sourceRoot":"","sources":["../../src/page-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAE1C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAClC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED,KAAK,iBAAiB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEjE,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;gBAAzB,MAAM,EAAE,iBAAiB,EAClC,OAAO,EAAE,MAAM;CAKlB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,UAAU,GACX,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,8EAqDA"}
@@ -0,0 +1,104 @@
1
+ import { Hono } from "hono";
2
+ export class PageBackendError extends Error {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message);
6
+ this.status = status;
7
+ this.name = "PageBackendError";
8
+ }
9
+ }
10
+ export function createPageApi({ backend, wsEndpoint, }) {
11
+ const app = new Hono();
12
+ app.get("/pages", async (c) => {
13
+ try {
14
+ const pages = await backend.list();
15
+ return c.json({ pages: pages.map(({ name }) => name) });
16
+ }
17
+ catch (error) {
18
+ return backendError(c, error);
19
+ }
20
+ });
21
+ app.post("/pages", async (c) => {
22
+ const originError = rejectBrowserMutation(c);
23
+ if (originError)
24
+ return originError;
25
+ if (c.req.header("content-type")?.split(";", 1)[0]?.trim().toLowerCase() !== "application/json") {
26
+ return c.json({ error: "content-type must be application/json" }, 415);
27
+ }
28
+ let body;
29
+ try {
30
+ body = await c.req.json();
31
+ }
32
+ catch {
33
+ return c.json({ error: "request body must be valid JSON" }, 400);
34
+ }
35
+ const validation = validatePageRequest(body);
36
+ if (typeof validation === "string") {
37
+ return c.json({ error: validation }, 400);
38
+ }
39
+ try {
40
+ const page = await backend.getOrCreate(validation.name, validation.viewport);
41
+ return c.json({ wsEndpoint, ...page });
42
+ }
43
+ catch (error) {
44
+ return backendError(c, error);
45
+ }
46
+ });
47
+ app.delete("/pages/:name", async (c) => {
48
+ const originError = rejectBrowserMutation(c);
49
+ if (originError)
50
+ return originError;
51
+ try {
52
+ if (!(await backend.close(c.req.param("name")))) {
53
+ return c.json({ error: "page not found" }, 404);
54
+ }
55
+ return c.json({ success: true });
56
+ }
57
+ catch (error) {
58
+ return backendError(c, error);
59
+ }
60
+ });
61
+ return app;
62
+ }
63
+ function rejectBrowserMutation(c) {
64
+ if (c.req.header("origin") !== undefined) {
65
+ return c.json({ error: "browser-origin requests are not allowed" }, 403);
66
+ }
67
+ return null;
68
+ }
69
+ function validatePageRequest(body) {
70
+ if (!isRecord(body) || typeof body.name !== "string") {
71
+ return "name is required and must be a string";
72
+ }
73
+ if (body.name.length === 0) {
74
+ return "name cannot be empty";
75
+ }
76
+ if (body.name.length > 256) {
77
+ return "name must be 256 characters or less";
78
+ }
79
+ if (body.viewport === undefined) {
80
+ return { name: body.name };
81
+ }
82
+ if (!isRecord(body.viewport) ||
83
+ !isPositiveInteger(body.viewport.width) ||
84
+ !isPositiveInteger(body.viewport.height)) {
85
+ return "viewport must have positive integer width and height";
86
+ }
87
+ return {
88
+ name: body.name,
89
+ viewport: { width: body.viewport.width, height: body.viewport.height },
90
+ };
91
+ }
92
+ function isRecord(value) {
93
+ return typeof value === "object" && value !== null && !Array.isArray(value);
94
+ }
95
+ function isPositiveInteger(value) {
96
+ return typeof value === "number" && Number.isInteger(value) && value > 0;
97
+ }
98
+ function backendError(c, error) {
99
+ if (error instanceof PageBackendError) {
100
+ return c.json({ error: error.message }, error.status);
101
+ }
102
+ return c.json({ error: error instanceof Error ? error.message : "internal server error" }, 500);
103
+ }
104
+ //# sourceMappingURL=page-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-api.js","sourceRoot":"","sources":["../../src/page-api.ts"],"names":[],"mappings":"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"}