@showrun/core 0.1.10 → 0.2.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/dist/loader.js CHANGED
@@ -29,17 +29,27 @@ export class TaskPackLoader {
29
29
  if (!manifest.id || !manifest.name || !manifest.version) {
30
30
  throw new Error('taskpack.json missing required fields: id, name, version');
31
31
  }
32
- // Only json-dsl format is supported
33
- if (manifest.kind !== 'json-dsl') {
34
- throw new Error('taskpack.json must have "kind": "json-dsl". Other formats are no longer supported.');
32
+ // Validate kind
33
+ const validKinds = ['json-dsl', 'playwright-js'];
34
+ if (!validKinds.includes(manifest.kind)) {
35
+ throw new Error(`taskpack.json "kind" must be one of: ${validKinds.join(', ')}. Got: "${manifest.kind}"`);
35
36
  }
36
37
  return manifest;
37
38
  }
38
39
  /**
39
- * Load task pack from directory (json-dsl format only)
40
+ * Load task pack from directory
40
41
  */
41
42
  static async loadTaskPack(packPath) {
42
43
  const manifest = this.loadManifest(packPath);
44
+ if (manifest.kind === 'playwright-js') {
45
+ return this.loadPlaywrightJsPack(packPath, manifest);
46
+ }
47
+ return this.loadJsonDslPack(packPath, manifest);
48
+ }
49
+ /**
50
+ * Load a json-dsl task pack
51
+ */
52
+ static loadJsonDslPack(packPath, manifest) {
43
53
  const flowPath = join(packPath, 'flow.json');
44
54
  if (!existsSync(flowPath)) {
45
55
  throw new Error(`flow.json not found for json-dsl pack: ${flowPath}`);
@@ -72,6 +82,31 @@ export class TaskPackLoader {
72
82
  ...(snapshots ? { snapshots } : {}),
73
83
  };
74
84
  }
85
+ /**
86
+ * Load a playwright-js task pack
87
+ */
88
+ static loadPlaywrightJsPack(packPath, manifest) {
89
+ const flowPath = join(packPath, 'flow.playwright.js');
90
+ if (!existsSync(flowPath)) {
91
+ throw new Error(`flow.playwright.js not found for playwright-js pack: ${flowPath}`);
92
+ }
93
+ const source = readFileSync(flowPath, 'utf-8');
94
+ return {
95
+ metadata: {
96
+ id: manifest.id,
97
+ name: manifest.name,
98
+ version: manifest.version,
99
+ description: manifest.description,
100
+ },
101
+ kind: 'playwright-js',
102
+ inputs: manifest.inputs || {},
103
+ collectibles: manifest.collectibles || [],
104
+ flow: [], // Not used for playwright-js packs
105
+ playwrightJsSource: source,
106
+ auth: manifest.auth,
107
+ browser: manifest.browser,
108
+ };
109
+ }
75
110
  /**
76
111
  * Load secrets from .secrets.json file in pack directory
77
112
  * Returns empty object if file doesn't exist
@@ -33,4 +33,8 @@ export declare function writeFlowJson(packDir: string, flowData: {
33
33
  collectibles?: CollectibleDefinition[];
34
34
  flow: DslStep[];
35
35
  }, skipValidation?: boolean): void;
36
+ /**
37
+ * Write flow.playwright.js
38
+ */
39
+ export declare function writePlaywrightJs(packDir: string, source: string): void;
36
40
  //# sourceMappingURL=packUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packUtils.d.ts","sourceRoot":"","sources":["../src/packUtils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAUnD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IACR,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,EACD,cAAc,UAAQ,GACrB,IAAI,CAoBN"}
1
+ {"version":3,"file":"packUtils.d.ts","sourceRoot":"","sources":["../src/packUtils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAUnD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IACR,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,EACD,cAAc,UAAQ,GACrB,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvE"}
package/dist/packUtils.js CHANGED
@@ -95,3 +95,10 @@ export function writeFlowJson(packDir, flowData, skipValidation = false) {
95
95
  const content = JSON.stringify(flowData, null, 2) + '\n';
96
96
  atomicWrite(flowPath, content);
97
97
  }
98
+ /**
99
+ * Write flow.playwright.js
100
+ */
101
+ export function writePlaywrightJs(packDir, source) {
102
+ const flowPath = join(packDir, 'flow.playwright.js');
103
+ atomicWrite(flowPath, source);
104
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAGhB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EAEX,iBAAiB,EACjB,WAAW,EACX,YAAY,EAEb,MAAM,YAAY,CAAC;AAMpB,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAyCD,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,CAAC,EAAE,MAAM;IAQ1B,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAS/C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+C9D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAIpC,eAAe,IAAI,OAAO;IAOpB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA4E1D,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAWxE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B1E,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAcvC,OAAO;IAwCrB;;;OAGG;YACW,mBAAmB;YAkCnB,kBAAkB;CAcjC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAGhB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EAEX,iBAAiB,EACjB,WAAW,EACX,YAAY,EAEb,MAAM,YAAY,CAAC;AAsBpB,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAyCD,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,CAAC,EAAE,MAAM;IAQ1B,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAS/C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+C9D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAIpC,eAAe,IAAI,OAAO;IAOpB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAiH1D,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAWxE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD1E,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAcvC,OAAO;IAwCrB;;;OAGG;YACW,mBAAmB;YAkCnB,kBAAkB;CAcjC"}
@@ -6,9 +6,24 @@
6
6
  * automatically refreshes access tokens before they expire.
7
7
  */
8
8
  import { join } from 'path';
9
+ import { readFileSync } from 'fs';
9
10
  import { TaskPackLoader } from '../loader.js';
10
- import { readJsonFile, ensureDir, writeTaskPackManifest, writeFlowJson } from '../packUtils.js';
11
+ import { readJsonFile, ensureDir, writeTaskPackManifest, writeFlowJson, writePlaywrightJs } from '../packUtils.js';
12
+ import { SHOWRUN_VERSION } from '../version.js';
11
13
  import { loadTokens, saveTokens, clearTokens } from './tokenStore.js';
14
+ function getCurrentShowrunVersion() {
15
+ return SHOWRUN_VERSION;
16
+ }
17
+ function withCurrentShowrunVersion(manifest) {
18
+ const currentVersion = getCurrentShowrunVersion();
19
+ const existingVersions = manifest.showrunVersions ?? [];
20
+ return {
21
+ ...manifest,
22
+ showrunVersions: existingVersions.includes(currentVersion)
23
+ ? existingVersions
24
+ : [...existingVersions, currentVersion],
25
+ };
26
+ }
12
27
  // ── Error class ───────────────────────────────────────────────────────────
13
28
  export class RegistryError extends Error {
14
29
  status;
@@ -124,9 +139,24 @@ export class RegistryClient {
124
139
  const { packPath, slug: userSlug, visibility = 'public', changelog } = params;
125
140
  const warnings = [];
126
141
  // Load local pack
127
- const manifest = TaskPackLoader.loadManifest(packPath);
128
- const flowPath = join(packPath, 'flow.json');
129
- const flowData = readJsonFile(flowPath);
142
+ const manifest = withCurrentShowrunVersion(TaskPackLoader.loadManifest(packPath));
143
+ writeTaskPackManifest(packPath, manifest);
144
+ // Load flow data based on pack kind
145
+ let flowData;
146
+ let playwrightJsSource;
147
+ if (manifest.kind === 'playwright-js') {
148
+ // playwright-js packs use flow.playwright.js (raw source code)
149
+ // The registry expects 'playwrightJsSource' at top level, not inside 'flow'
150
+ const flowPath = join(packPath, 'flow.playwright.js');
151
+ playwrightJsSource = readFileSync(flowPath, 'utf-8');
152
+ // For playwright-js, no flow object is needed
153
+ flowData = undefined;
154
+ }
155
+ else {
156
+ // json-dsl packs use flow.json
157
+ const flowPath = join(packPath, 'flow.json');
158
+ flowData = readJsonFile(flowPath);
159
+ }
130
160
  const slug = userSlug || manifest.id;
131
161
  // Try to get existing pack; create if 404.
132
162
  // Publish uses the short slug — server infers the @username scope from the
@@ -149,19 +179,38 @@ export class RegistryClient {
149
179
  throw err;
150
180
  }
151
181
  }
152
- // Publish version
153
- const versionData = await this.request('POST', `/api/packs/${encodeURIComponent(slug)}/versions`, {
182
+ // Build the manifest payload for the registry
183
+ // For playwright-js packs, inputs and collectibles must be included in the manifest
184
+ // (the registry validates this)
185
+ const manifestPayload = {
186
+ id: manifest.id,
187
+ name: manifest.name,
154
188
  version: manifest.version,
155
- manifest: {
156
- id: manifest.id,
157
- name: manifest.name,
158
- version: manifest.version,
159
- description: manifest.description,
160
- kind: manifest.kind,
161
- },
162
- flow: flowData,
189
+ description: manifest.description,
190
+ kind: manifest.kind,
191
+ showrunVersions: manifest.showrunVersions,
192
+ };
193
+ // Include inputs and collectibles for playwright-js packs (required by registry)
194
+ if (manifest.kind === 'playwright-js') {
195
+ manifestPayload.inputs = manifest.inputs || {};
196
+ manifestPayload.collectibles = manifest.collectibles || [];
197
+ }
198
+ // Build the version request body
199
+ // For playwright-js, playwrightJsSource goes at top level
200
+ // For json-dsl, flow data goes under 'flow' key
201
+ const versionBody = {
202
+ version: manifest.version,
203
+ manifest: manifestPayload,
163
204
  changelog,
164
- }, true);
205
+ };
206
+ if (manifest.kind === 'playwright-js') {
207
+ versionBody.playwrightJsSource = playwrightJsSource;
208
+ }
209
+ else {
210
+ versionBody.flow = flowData;
211
+ }
212
+ // Publish version
213
+ const versionData = await this.request('POST', `/api/packs/${encodeURIComponent(slug)}/versions`, versionBody, true);
165
214
  // The API may return version as a string or as an object with a nested version field
166
215
  const rawVersion = versionData.version;
167
216
  const version = typeof rawVersion === 'string'
@@ -203,6 +252,21 @@ export class RegistryClient {
203
252
  const packDir = join(destDir, ref);
204
253
  ensureDir(packDir);
205
254
  writeTaskPackManifest(packDir, versionData.manifest);
255
+ const currentVersion = getCurrentShowrunVersion();
256
+ const declaredVersions = versionData.manifest.showrunVersions ?? [];
257
+ if (declaredVersions.length > 0 && !declaredVersions.includes(currentVersion)) {
258
+ console.warn(`[ShowRun] Warning: installed pack ${ref}@${targetVersion} declares compatibility with ShowRun ${declaredVersions.join(', ')}, but current version is ${currentVersion}.`);
259
+ }
260
+ if (versionData.manifest.kind === 'playwright-js') {
261
+ if (!versionData.playwrightJsSource) {
262
+ throw new RegistryError(`Registry version payload for "${ref}" is missing playwrightJsSource`, 500, versionData);
263
+ }
264
+ writePlaywrightJs(packDir, versionData.playwrightJsSource);
265
+ return;
266
+ }
267
+ if (!versionData.flow) {
268
+ throw new RegistryError(`Registry version payload for "${ref}" is missing flow`, 500, versionData);
269
+ }
206
270
  writeFlowJson(packDir, versionData.flow);
207
271
  }
208
272
  // ── Reports ──────────────────────────────────────────────────────────
package/dist/runner.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ import { type Page } from 'playwright';
1
2
  import type { TaskPack, RunResult } from './types.js';
2
3
  import type { Logger } from './types.js';
4
+ import type { NetworkCaptureApi } from './networkCapture.js';
3
5
  /**
4
6
  * Options for running a task pack
5
7
  */
@@ -45,6 +47,29 @@ export interface RunTaskPackOptions {
45
47
  * instead of launching a new one.
46
48
  */
47
49
  cdpUrl?: string;
50
+ /**
51
+ * Executor for playwright-js packs.
52
+ * If not provided, playwright-js packs will throw an error.
53
+ */
54
+ playwrightJsExecutor?: (source: string, scope: {
55
+ page: Page;
56
+ context: import('playwright').BrowserContext;
57
+ frame: import('playwright').Frame;
58
+ inputs: Record<string, unknown>;
59
+ secrets: Record<string, string>;
60
+ showrun: {
61
+ network: {
62
+ list: NetworkCaptureApi['list'];
63
+ find: NetworkCaptureApi['find'];
64
+ get: NetworkCaptureApi['get'];
65
+ replay: NetworkCaptureApi['replay'];
66
+ };
67
+ };
68
+ util: import('./util/index.js').PlaywrightJsUtil;
69
+ }, timeoutMs?: number) => Promise<{
70
+ collectibles: Record<string, unknown>;
71
+ logs: string[];
72
+ }>;
48
73
  }
49
74
  /**
50
75
  * Result of running a task pack with paths
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAczC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAqR5B"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAYzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;QACL,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC;QAC7C,KAAK,EAAE,OAAO,YAAY,EAAE,KAAK,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAChC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAChC,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC9B,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;aACrC,CAAC;SACH,CAAC;QACF,IAAI,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,CAAC;KAClD,EACD,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAiV5B"}
package/dist/runner.js CHANGED
@@ -6,6 +6,7 @@ import { isFlowHttpCompatible } from './httpReplay.js';
6
6
  import { resolveProxy } from './proxy/proxyService.js';
7
7
  import { createReplayTransport } from './transport/index.js';
8
8
  import { writeSnapshots, extractTopLevelKeys, detectSensitiveHeaders, } from './requestSnapshot.js';
9
+ import { createPlaywrightJsUtil } from './util/index.js';
9
10
  /**
10
11
  * Runs a task pack with Playwright
11
12
  * This is a reusable function that can be used by both CLI and MCP server
@@ -38,9 +39,11 @@ export async function runTaskPack(taskPack, inputs, options) {
38
39
  if (taskPack.browser?.proxy?.enabled && !resolvedProxy) {
39
40
  console.log('[runner] Proxy enabled in pack but credentials not configured, running without proxy');
40
41
  }
41
- // ─── HTTP-first execution ───────────────────────────────────────────
42
+ // ─── playwright-js packs always need a browser ─────────────────────
43
+ const isPlaywrightJs = taskPack.kind === 'playwright-js';
44
+ // ─── HTTP-first execution (json-dsl only) ─────────────────────────
42
45
  const snapshots = taskPack.snapshots ?? null;
43
- if (!options.skipHttpReplay && isFlowHttpCompatible(taskPack.flow, snapshots)) {
46
+ if (!isPlaywrightJs && !options.skipHttpReplay && isFlowHttpCompatible(taskPack.flow, snapshots)) {
44
47
  logger.log({
45
48
  type: 'run_started',
46
49
  data: {
@@ -67,7 +70,7 @@ export async function runTaskPack(taskPack, inputs, options) {
67
70
  let runContext = null;
68
71
  try {
69
72
  // Log run start (only if not already logged above)
70
- if (options.skipHttpReplay || !isFlowHttpCompatible(taskPack.flow, snapshots)) {
73
+ if (isPlaywrightJs || options.skipHttpReplay || !isFlowHttpCompatible(taskPack.flow, snapshots)) {
71
74
  logger.log({
72
75
  type: 'run_started',
73
76
  data: {
@@ -103,44 +106,92 @@ export async function runTaskPack(taskPack, inputs, options) {
103
106
  version: () => 'unknown',
104
107
  };
105
108
  runContext = RunContextFactory.create(page, browserProxy, logger, artifactsDir, networkCapture);
106
- // Execute declarative DSL flow
107
- const flowResult = await runFlow(runContext, taskPack.flow, {
108
- inputs: inputsWithDefaults,
109
- auth: taskPack.auth,
110
- sessionId: options.sessionId,
111
- profileId: options.profileId,
112
- cacheDir: options.cacheDir,
113
- secrets,
114
- });
115
- // Filter collectibles to only include those defined in the pack
116
- // This prevents intermediate variables from polluting the output
117
- const definedCollectibleNames = new Set((taskPack.collectibles || []).map(c => c.name));
118
- const filteredCollectibles = {};
119
- for (const [key, value] of Object.entries(flowResult.collectibles)) {
120
- if (definedCollectibleNames.has(key)) {
121
- filteredCollectibles[key] = value;
109
+ let result;
110
+ if (isPlaywrightJs) {
111
+ // ─── playwright-js execution ────────────────────────────────────
112
+ if (!taskPack.playwrightJsSource) {
113
+ throw new Error('playwright-js pack is missing playwrightJsSource');
114
+ }
115
+ if (!options.playwrightJsExecutor) {
116
+ throw new Error('playwright-js packs require a playwrightJsExecutor option');
117
+ }
118
+ const jsStartTime = Date.now();
119
+ const jsResult = await options.playwrightJsExecutor(taskPack.playwrightJsSource, {
120
+ page,
121
+ context: browserSession.context,
122
+ frame: page.mainFrame(),
123
+ inputs: inputsWithDefaults,
124
+ secrets,
125
+ showrun: {
126
+ network: {
127
+ list: networkCapture.list.bind(networkCapture),
128
+ find: networkCapture.find.bind(networkCapture),
129
+ get: networkCapture.get.bind(networkCapture),
130
+ replay: networkCapture.replay.bind(networkCapture),
131
+ },
132
+ },
133
+ util: createPlaywrightJsUtil(page),
134
+ });
135
+ const returnValue = jsResult.collectibles;
136
+ // Filter collectibles to only include those defined in the pack
137
+ const definedCollectibleNames = new Set((taskPack.collectibles || []).map(c => c.name));
138
+ const filteredCollectibles = {};
139
+ for (const [key, value] of Object.entries(returnValue)) {
140
+ if (definedCollectibleNames.has(key)) {
141
+ filteredCollectibles[key] = value;
142
+ }
143
+ }
144
+ result = {
145
+ collectibles: filteredCollectibles,
146
+ meta: {
147
+ url: page.url(),
148
+ durationMs: Date.now() - jsStartTime,
149
+ notes: 'Executed playwright-js flow',
150
+ },
151
+ };
152
+ // Surface captured console logs
153
+ if (jsResult.logs && jsResult.logs.length > 0) {
154
+ result._logs = jsResult.logs;
122
155
  }
123
156
  }
124
- // Convert RunFlowResult to RunResult format
125
- const result = {
126
- collectibles: filteredCollectibles,
127
- meta: {
128
- url: flowResult.meta.url,
129
- durationMs: flowResult.meta.durationMs,
130
- notes: `Executed ${flowResult.meta.stepsExecuted}/${flowResult.meta.stepsTotal} steps`,
131
- },
132
- };
133
- // Propagate diagnostic hints if present
134
- if (flowResult._hints && flowResult._hints.length > 0) {
135
- result._hints = flowResult._hints;
136
- }
137
- // Capture snapshots for network_replay steps after successful browser run
138
- if (packPath && networkCapture) {
139
- try {
140
- captureSnapshots(taskPack, flowResult, networkCapture, packPath);
157
+ else {
158
+ // ─── json-dsl execution ─────────────────────────────────────────
159
+ const flowResult = await runFlow(runContext, taskPack.flow, {
160
+ inputs: inputsWithDefaults,
161
+ auth: taskPack.auth,
162
+ sessionId: options.sessionId,
163
+ profileId: options.profileId,
164
+ cacheDir: options.cacheDir,
165
+ secrets,
166
+ });
167
+ // Filter collectibles to only include those defined in the pack
168
+ const definedCollectibleNames = new Set((taskPack.collectibles || []).map(c => c.name));
169
+ const filteredCollectibles = {};
170
+ for (const [key, value] of Object.entries(flowResult.collectibles)) {
171
+ if (definedCollectibleNames.has(key)) {
172
+ filteredCollectibles[key] = value;
173
+ }
174
+ }
175
+ result = {
176
+ collectibles: filteredCollectibles,
177
+ meta: {
178
+ url: flowResult.meta.url,
179
+ durationMs: flowResult.meta.durationMs,
180
+ notes: `Executed ${flowResult.meta.stepsExecuted}/${flowResult.meta.stepsTotal} steps`,
181
+ },
182
+ };
183
+ // Propagate diagnostic hints if present
184
+ if (flowResult._hints && flowResult._hints.length > 0) {
185
+ result._hints = flowResult._hints;
141
186
  }
142
- catch (snapErr) {
143
- console.warn(`[runner] Failed to capture snapshots: ${snapErr instanceof Error ? snapErr.message : String(snapErr)}`);
187
+ // Capture snapshots for network_replay steps after successful browser run
188
+ if (packPath && networkCapture) {
189
+ try {
190
+ captureSnapshots(taskPack, flowResult, networkCapture, packPath);
191
+ }
192
+ catch (snapErr) {
193
+ console.warn(`[runner] Failed to capture snapshots: ${snapErr instanceof Error ? snapErr.message : String(snapErr)}`);
194
+ }
144
195
  }
145
196
  }
146
197
  const durationMs = Date.now() - startTime;
package/dist/types.d.ts CHANGED
@@ -84,6 +84,11 @@ export interface TaskPackMetadata {
84
84
  name: string;
85
85
  version: string;
86
86
  description?: string;
87
+ /**
88
+ * Execution timeout in milliseconds (default: 300000 = 5 minutes)
89
+ * Can be overridden by CLI --timeout flag
90
+ */
91
+ timeoutMs?: number;
87
92
  }
88
93
  /**
89
94
  * Task Pack manifest (taskpack.json)
@@ -94,9 +99,14 @@ export interface TaskPackMetadata {
94
99
  */
95
100
  export interface TaskPackManifest extends TaskPackMetadata {
96
101
  /**
97
- * Pack kind: must be "json-dsl"
102
+ * ShowRun versions known to be compatible with this pack.
103
+ * Used by the registry to communicate runtime compatibility.
104
+ */
105
+ showrunVersions?: string[];
106
+ /**
107
+ * Pack kind
98
108
  */
99
- kind: 'json-dsl';
109
+ kind: 'json-dsl' | 'playwright-js';
100
110
  /**
101
111
  * Auth configuration for resilience and recovery
102
112
  */
@@ -109,6 +119,14 @@ export interface TaskPackManifest extends TaskPackMetadata {
109
119
  * Browser configuration
110
120
  */
111
121
  browser?: BrowserSettings;
122
+ /**
123
+ * Input schema (used by playwright-js packs where inputs are declared in taskpack.json)
124
+ */
125
+ inputs?: InputSchema;
126
+ /**
127
+ * Collectible definitions (used by playwright-js packs where collectibles are declared in taskpack.json)
128
+ */
129
+ collectibles?: CollectibleDefinition[];
112
130
  }
113
131
  /**
114
132
  * Run context provided to task pack execution
@@ -136,6 +154,10 @@ export interface RunResult {
136
154
  * These help AI agents understand why data extraction may have failed.
137
155
  */
138
156
  _hints?: string[];
157
+ /**
158
+ * Captured console.log output from playwright-js flows.
159
+ */
160
+ _logs?: string[];
139
161
  }
140
162
  /**
141
163
  * Logger interface for structured logging
@@ -314,10 +336,18 @@ export interface TaskPack {
314
336
  metadata: TaskPackMetadata;
315
337
  inputs: InputSchema;
316
338
  collectibles: CollectibleDefinition[];
339
+ /**
340
+ * Pack kind (default: 'json-dsl')
341
+ */
342
+ kind?: 'json-dsl' | 'playwright-js';
317
343
  /**
318
344
  * Declarative flow of DSL steps
319
345
  */
320
346
  flow: DslStep[];
347
+ /**
348
+ * Raw Playwright JS source code (for playwright-js packs)
349
+ */
350
+ playwrightJsSource?: string;
321
351
  /**
322
352
  * Auth configuration for resilience and recovery
323
353
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Utility functions exposed to playwright-js flows via context.util
3
+ *
4
+ * These utilities help with common automation challenges like
5
+ * CAPTCHA solving, waiting for specific conditions, etc.
6
+ */
7
+ import type { Page } from 'playwright';
8
+ import { detectCloudflareTurnstile, solveCloudflareTurnstile, type TurnstileDetectionResult, type TurnstileSolveResult } from './turnstile.js';
9
+ export { detectCloudflareTurnstile, solveCloudflareTurnstile };
10
+ export type { TurnstileDetectionResult, TurnstileSolveResult };
11
+ /**
12
+ * Utility object available in playwright-js flows as `util`
13
+ */
14
+ export interface PlaywrightJsUtil {
15
+ /**
16
+ * Detect Cloudflare Turnstile checkbox position on the page.
17
+ *
18
+ * Uses image-based detection since Turnstile uses shadow-DOM
19
+ * which blocks direct element inspection.
20
+ *
21
+ * @example
22
+ * ```javascript
23
+ * const result = await util.detectCloudflareTurnstile();
24
+ * if (result.found) {
25
+ * console.log(`Turnstile at (${result.x}, ${result.y})`);
26
+ * }
27
+ * ```
28
+ */
29
+ detectCloudflareTurnstile: (options?: {
30
+ scale?: number;
31
+ }) => Promise<TurnstileDetectionResult>;
32
+ /**
33
+ * Detect and solve Cloudflare Turnstile by clicking the checkbox.
34
+ *
35
+ * This function detects the widget, clicks the checkbox, and waits
36
+ * for verification. Automatically retries if detection fails.
37
+ *
38
+ * @example
39
+ * ```javascript
40
+ * const result = await util.solveCloudflareTurnstile();
41
+ * if (result.success) {
42
+ * console.log('Turnstile solved!');
43
+ * } else {
44
+ * console.log('Failed:', result.error);
45
+ * }
46
+ * ```
47
+ */
48
+ solveCloudflareTurnstile: (options?: {
49
+ /** Scale factor for HiDPI displays (default: 1) */
50
+ scale?: number;
51
+ /** Time to wait after clicking (default: 2000ms) */
52
+ waitAfterClick?: number;
53
+ /** Number of retry attempts (default: 3) */
54
+ retries?: number;
55
+ /** Delay between retries (default: 1000ms) */
56
+ retryDelay?: number;
57
+ }) => Promise<TurnstileSolveResult>;
58
+ }
59
+ /**
60
+ * Create the util object for a playwright-js execution context.
61
+ *
62
+ * @param page - Playwright Page object to bind utilities to
63
+ * @returns Utility object with bound methods
64
+ */
65
+ export declare function createPlaywrightJsUtil(page: Page): PlaywrightJsUtil;
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;;;;OAaG;IACH,yBAAyB,EAAE,CAAC,OAAO,CAAC,EAAE;QACpC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAExC;;;;;;;;;;;;;;;OAeG;IACH,wBAAwB,EAAE,CAAC,OAAO,CAAC,EAAE;QACnC,mDAAmD;QACnD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,oDAAoD;QACpD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,4CAA4C;QAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,8CAA8C;QAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAKnE"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Utility functions exposed to playwright-js flows via context.util
3
+ *
4
+ * These utilities help with common automation challenges like
5
+ * CAPTCHA solving, waiting for specific conditions, etc.
6
+ */
7
+ import { detectCloudflareTurnstile, solveCloudflareTurnstile, } from './turnstile.js';
8
+ // Re-export for direct usage
9
+ export { detectCloudflareTurnstile, solveCloudflareTurnstile };
10
+ /**
11
+ * Create the util object for a playwright-js execution context.
12
+ *
13
+ * @param page - Playwright Page object to bind utilities to
14
+ * @returns Utility object with bound methods
15
+ */
16
+ export function createPlaywrightJsUtil(page) {
17
+ return {
18
+ detectCloudflareTurnstile: (options) => detectCloudflareTurnstile(page, options),
19
+ solveCloudflareTurnstile: (options) => solveCloudflareTurnstile(page, options),
20
+ };
21
+ }