@showrun/core 0.1.7 → 0.1.8
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/browserLauncher.d.ts +5 -0
- package/dist/browserLauncher.d.ts.map +1 -1
- package/dist/browserLauncher.js +45 -9
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -3
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +6 -4
- package/package.json +1 -1
|
@@ -59,6 +59,11 @@ export interface LaunchBrowserConfig {
|
|
|
59
59
|
* Pack directory path for profile persistence
|
|
60
60
|
*/
|
|
61
61
|
packPath?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Direct user data directory override.
|
|
64
|
+
* When set, bypasses persistence resolution (sessionId/packPath).
|
|
65
|
+
*/
|
|
66
|
+
userDataDir?: string;
|
|
62
67
|
}
|
|
63
68
|
/**
|
|
64
69
|
* Launches a browser with the specified configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserLauncher.d.ts","sourceRoot":"","sources":["../src/browserLauncher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,WAAW,EAAE,kBAAkB,CAAC;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"browserLauncher.d.ts","sourceRoot":"","sources":["../src/browserLauncher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;OAEG;IACH,WAAW,EAAE,kBAAkB,CAAC;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0CxF;AA6JD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBtF"}
|
package/dist/browserLauncher.js
CHANGED
|
@@ -18,16 +18,23 @@ export async function launchBrowser(config) {
|
|
|
18
18
|
const { browserSettings = {}, headless = true, sessionId, packPath, } = config;
|
|
19
19
|
const engine = browserSettings.engine ?? 'camoufox';
|
|
20
20
|
let persistence = browserSettings.persistence ?? 'none';
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
// Use explicit userDataDir if provided, otherwise resolve from persistence settings
|
|
22
|
+
let userDataDir;
|
|
23
|
+
if (config.userDataDir) {
|
|
24
|
+
userDataDir = config.userDataDir;
|
|
25
|
+
persistence = 'profile'; // Treat explicit dir as profile persistence
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Auto-upgrade to profile persistence when packPath has an existing .browser-profile/
|
|
29
|
+
if (persistence === 'none' && packPath && existsSync(join(packPath, '.browser-profile'))) {
|
|
30
|
+
persistence = 'profile';
|
|
31
|
+
}
|
|
32
|
+
userDataDir = resolveBrowserDataDir({
|
|
33
|
+
persistence,
|
|
34
|
+
sessionId,
|
|
35
|
+
packPath,
|
|
36
|
+
});
|
|
24
37
|
}
|
|
25
|
-
// Resolve user data directory based on persistence mode
|
|
26
|
-
const userDataDir = resolveBrowserDataDir({
|
|
27
|
-
persistence,
|
|
28
|
-
sessionId,
|
|
29
|
-
packPath,
|
|
30
|
-
});
|
|
31
38
|
if (engine === 'camoufox') {
|
|
32
39
|
return launchCamoufox({
|
|
33
40
|
headless,
|
|
@@ -81,6 +88,33 @@ async function launchChromium(config) {
|
|
|
81
88
|
},
|
|
82
89
|
};
|
|
83
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Ensures the Camoufox browser binary is downloaded.
|
|
93
|
+
* Auto-fetches on first use so `npx showrun dashboard` works as a one-liner.
|
|
94
|
+
*/
|
|
95
|
+
async function ensureCamoufoxBrowser() {
|
|
96
|
+
try {
|
|
97
|
+
const pkgman = await import('camoufox-js/dist/pkgman.js');
|
|
98
|
+
const installDir = pkgman.INSTALL_DIR.toString();
|
|
99
|
+
// Check if browser is installed with a valid version file
|
|
100
|
+
if (existsSync(installDir)) {
|
|
101
|
+
try {
|
|
102
|
+
pkgman.installedVerStr();
|
|
103
|
+
return; // Already installed
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// version.json missing or corrupt — re-fetch
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
console.log('[ShowRun] Camoufox browser not found. Downloading automatically...');
|
|
110
|
+
const fetcher = new pkgman.CamoufoxFetcher();
|
|
111
|
+
await fetcher.install();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw new Error('Failed to auto-download Camoufox browser. Try "npx camoufox-js fetch" manually. ' +
|
|
115
|
+
`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
84
118
|
/**
|
|
85
119
|
* Launches Camoufox browser (Firefox-based anti-detection)
|
|
86
120
|
*
|
|
@@ -91,6 +125,8 @@ async function launchCamoufox(config) {
|
|
|
91
125
|
const { headless, userDataDir, persistence } = config;
|
|
92
126
|
// Desktop-only screen constraints to prevent mobile fingerprints
|
|
93
127
|
const screen = { minWidth: 1024, minHeight: 768 };
|
|
128
|
+
// Ensure the camoufox browser binary is downloaded before launching
|
|
129
|
+
await ensureCamoufoxBrowser();
|
|
94
130
|
// Dynamic import to avoid loading Camoufox when not needed
|
|
95
131
|
let Camoufox;
|
|
96
132
|
try {
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE;QACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC9B,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,CAAC;IACF,KAAK,CAAC,EAAE;QACN,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,UAAU,CAAC,EAAE;QACX,WAAW,CAAC,EAAE;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,GAAG,CAAC,EAAE,MAAM,CAAC;YACb,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE;QACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC9B,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,CAAC;IACF,KAAK,CAAC,EAAE;QACN,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,UAAU,CAAC,EAAE;QACX,WAAW,CAAC,EAAE;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,GAAG,CAAC,EAAE,MAAM,CAAC;YACb,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,sEAAsE;IACtE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yCAAyC;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CA0BpD;AA0BD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CA4B7C;AAMD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,mBAAmB,CAmBhD;AAqDD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAQ5D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CA0BvE;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsB/D;AAID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAS3C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAmB1F;AAID;;;GAGG;AACH,wBAAgB,UAAU,IAAI,mBAAmB,CAShD;AAID,eAAO,MAAM,uBAAuB,EAAE,aAoBrC,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -141,6 +141,7 @@ const CONFIG_TO_ENV = [
|
|
|
141
141
|
{ path: ['techniques', 'embedding', 'model'], envVar: 'EMBEDDING_MODEL' },
|
|
142
142
|
{ path: ['techniques', 'embedding', 'baseUrl'], envVar: 'EMBEDDING_BASE_URL' },
|
|
143
143
|
{ path: ['techniques', 'collectionName'], envVar: 'TECHNIQUES_COLLECTION' },
|
|
144
|
+
{ path: ['taskpacksDir'], envVar: 'SHOWRUN_TASKPACKS_DIR' },
|
|
144
145
|
];
|
|
145
146
|
function getNestedValue(obj, path) {
|
|
146
147
|
let current = obj;
|
|
@@ -293,8 +294,8 @@ export function ensureSystemPromptInConfigDir(filename, sourcePath) {
|
|
|
293
294
|
const destPath = join(globalDir, filename);
|
|
294
295
|
ensureDir(globalDir);
|
|
295
296
|
copyFileSync(sourcePath, destPath);
|
|
296
|
-
console.
|
|
297
|
-
console.
|
|
297
|
+
console.error(`[Config] Created config directory at ${globalDir}`);
|
|
298
|
+
console.error(`[Config] Copied ${filename} to ${destPath}`);
|
|
298
299
|
return destPath;
|
|
299
300
|
}
|
|
300
301
|
// ── Main entry point ───────────────────────────────────────────────────────
|
|
@@ -306,7 +307,7 @@ export function initConfig() {
|
|
|
306
307
|
const result = loadConfig();
|
|
307
308
|
applyConfigToEnv(result.config);
|
|
308
309
|
if (result.loadedFiles.length > 0) {
|
|
309
|
-
console.
|
|
310
|
+
console.error(`[Config] Loaded: ${result.loadedFiles.join(', ')}`);
|
|
310
311
|
}
|
|
311
312
|
return result;
|
|
312
313
|
}
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -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;AAWzC;;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;CAClC;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,
|
|
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;AAWzC;;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;CAClC;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,CAqQ5B"}
|
package/dist/runner.js
CHANGED
|
@@ -15,12 +15,14 @@ export async function runTaskPack(taskPack, inputs, options) {
|
|
|
15
15
|
// Ensure directories exist
|
|
16
16
|
mkdirSync(runDir, { recursive: true });
|
|
17
17
|
mkdirSync(artifactsDir, { recursive: true });
|
|
18
|
-
// Auto-detect if we can run headful
|
|
19
|
-
//
|
|
20
|
-
|
|
18
|
+
// Auto-detect if we can run headful
|
|
19
|
+
// On Linux, a DISPLAY (X11) or WAYLAND_DISPLAY is required for headful mode.
|
|
20
|
+
// On macOS/Windows, native window management handles it — no env var needed.
|
|
21
|
+
const isLinux = process.platform === 'linux';
|
|
22
|
+
const hasDisplay = !isLinux || !!process.env.DISPLAY || !!process.env.WAYLAND_DISPLAY;
|
|
21
23
|
const headless = requestedHeadless || !hasDisplay;
|
|
22
24
|
if (!requestedHeadless && !hasDisplay) {
|
|
23
|
-
console.error('[Warning] Headful mode requested but no DISPLAY environment variable found. ' +
|
|
25
|
+
console.error('[Warning] Headful mode requested but no DISPLAY/WAYLAND_DISPLAY environment variable found. ' +
|
|
24
26
|
'Falling back to headless mode. Set DISPLAY or use xvfb-run to enable headful mode.');
|
|
25
27
|
}
|
|
26
28
|
const startTime = Date.now();
|