sweetlink 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +237 -0
- package/dist/daemon/src/codename.d.ts +8 -0
- package/dist/daemon/src/codename.d.ts.map +1 -0
- package/dist/daemon/src/codename.js +42 -0
- package/dist/daemon/src/codename.js.map +1 -0
- package/dist/daemon/src/index.d.ts +3 -0
- package/dist/daemon/src/index.d.ts.map +1 -0
- package/dist/daemon/src/index.js +675 -0
- package/dist/daemon/src/index.js.map +1 -0
- package/dist/shared/src/env.d.ts +24 -0
- package/dist/shared/src/env.d.ts.map +1 -0
- package/dist/shared/src/env.js +39 -0
- package/dist/shared/src/env.js.map +1 -0
- package/dist/shared/src/index.d.ts +211 -0
- package/dist/shared/src/index.d.ts.map +1 -0
- package/dist/shared/src/index.js +73 -0
- package/dist/shared/src/index.js.map +1 -0
- package/dist/shared/src/node.d.ts +12 -0
- package/dist/shared/src/node.d.ts.map +1 -0
- package/dist/shared/src/node.js +67 -0
- package/dist/shared/src/node.js.map +1 -0
- package/dist/src/codex.d.ts +11 -0
- package/dist/src/codex.d.ts.map +1 -0
- package/dist/src/codex.js +67 -0
- package/dist/src/codex.js.map +1 -0
- package/dist/src/commands/click.d.ts +3 -0
- package/dist/src/commands/click.d.ts.map +1 -0
- package/dist/src/commands/click.js +93 -0
- package/dist/src/commands/click.js.map +1 -0
- package/dist/src/commands/run-js.d.ts +4 -0
- package/dist/src/commands/run-js.d.ts.map +1 -0
- package/dist/src/commands/run-js.js +28 -0
- package/dist/src/commands/run-js.js.map +1 -0
- package/dist/src/commands/trust-ca.d.ts +3 -0
- package/dist/src/commands/trust-ca.d.ts.map +1 -0
- package/dist/src/commands/trust-ca.js +43 -0
- package/dist/src/commands/trust-ca.js.map +1 -0
- package/dist/src/core/config-file.d.ts +41 -0
- package/dist/src/core/config-file.d.ts.map +1 -0
- package/dist/src/core/config-file.js +284 -0
- package/dist/src/core/config-file.js.map +1 -0
- package/dist/src/core/config.d.ts +23 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +132 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/env.d.ts +11 -0
- package/dist/src/core/env.d.ts.map +1 -0
- package/dist/src/core/env.js +30 -0
- package/dist/src/core/env.js.map +1 -0
- package/dist/src/devtools-registry.d.ts +3 -0
- package/dist/src/devtools-registry.d.ts.map +1 -0
- package/dist/src/devtools-registry.js +294 -0
- package/dist/src/devtools-registry.js.map +1 -0
- package/dist/src/env.d.ts +16 -0
- package/dist/src/env.d.ts.map +1 -0
- package/dist/src/env.js +17 -0
- package/dist/src/env.js.map +1 -0
- package/dist/src/http.d.ts +2 -0
- package/dist/src/http.d.ts.map +1 -0
- package/dist/src/http.js +53 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +1941 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/runtime/browser/client.d.ts +10 -0
- package/dist/src/runtime/browser/client.d.ts.map +1 -0
- package/dist/src/runtime/browser/client.js +497 -0
- package/dist/src/runtime/browser/client.js.map +1 -0
- package/dist/src/runtime/browser/commands/index.d.ts +10 -0
- package/dist/src/runtime/browser/commands/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/commands/index.js +219 -0
- package/dist/src/runtime/browser/commands/index.js.map +1 -0
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts +6 -0
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts.map +1 -0
- package/dist/src/runtime/browser/dom-to-image-loader.js +50 -0
- package/dist/src/runtime/browser/dom-to-image-loader.js.map +1 -0
- package/dist/src/runtime/browser/index.d.ts +4 -0
- package/dist/src/runtime/browser/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/index.js +4 -0
- package/dist/src/runtime/browser/index.js.map +1 -0
- package/dist/src/runtime/browser/module-loader.d.ts +6 -0
- package/dist/src/runtime/browser/module-loader.d.ts.map +1 -0
- package/dist/src/runtime/browser/module-loader.js +26 -0
- package/dist/src/runtime/browser/module-loader.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/hooks.d.ts +71 -0
- package/dist/src/runtime/browser/screenshot/hooks.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/hooks.js +219 -0
- package/dist/src/runtime/browser/screenshot/hooks.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/index.d.ts +9 -0
- package/dist/src/runtime/browser/screenshot/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/index.js +90 -0
- package/dist/src/runtime/browser/screenshot/index.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts +13 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js +51 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts +12 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js +136 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/targets.d.ts +6 -0
- package/dist/src/runtime/browser/screenshot/targets.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/targets.js +53 -0
- package/dist/src/runtime/browser/screenshot/targets.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/utils.d.ts +9 -0
- package/dist/src/runtime/browser/screenshot/utils.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/utils.js +471 -0
- package/dist/src/runtime/browser/screenshot/utils.js.map +1 -0
- package/dist/src/runtime/browser/selector-discovery.d.ts +9 -0
- package/dist/src/runtime/browser/selector-discovery.d.ts.map +1 -0
- package/dist/src/runtime/browser/selector-discovery.js +218 -0
- package/dist/src/runtime/browser/selector-discovery.js.map +1 -0
- package/dist/src/runtime/browser/storage/session-storage.d.ts +13 -0
- package/dist/src/runtime/browser/storage/session-storage.d.ts.map +1 -0
- package/dist/src/runtime/browser/storage/session-storage.js +119 -0
- package/dist/src/runtime/browser/storage/session-storage.js.map +1 -0
- package/dist/src/runtime/browser/types.d.ts +96 -0
- package/dist/src/runtime/browser/types.d.ts.map +1 -0
- package/dist/src/runtime/browser/types.js +6 -0
- package/dist/src/runtime/browser/types.js.map +1 -0
- package/dist/src/runtime/browser/utils/console.d.ts +5 -0
- package/dist/src/runtime/browser/utils/console.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/console.js +54 -0
- package/dist/src/runtime/browser/utils/console.js.map +1 -0
- package/dist/src/runtime/browser/utils/environment.d.ts +3 -0
- package/dist/src/runtime/browser/utils/environment.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/environment.js +13 -0
- package/dist/src/runtime/browser/utils/environment.js.map +1 -0
- package/dist/src/runtime/browser/utils/errors.d.ts +3 -0
- package/dist/src/runtime/browser/utils/errors.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/errors.js +42 -0
- package/dist/src/runtime/browser/utils/errors.js.map +1 -0
- package/dist/src/runtime/browser/utils/number.d.ts +2 -0
- package/dist/src/runtime/browser/utils/number.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/number.js +2 -0
- package/dist/src/runtime/browser/utils/number.js.map +1 -0
- package/dist/src/runtime/browser/utils/object.d.ts +3 -0
- package/dist/src/runtime/browser/utils/object.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/object.js +9 -0
- package/dist/src/runtime/browser/utils/object.js.map +1 -0
- package/dist/src/runtime/browser/utils/sanitize.d.ts +2 -0
- package/dist/src/runtime/browser/utils/sanitize.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/sanitize.js +28 -0
- package/dist/src/runtime/browser/utils/sanitize.js.map +1 -0
- package/dist/src/runtime/browser/utils/time.d.ts +2 -0
- package/dist/src/runtime/browser/utils/time.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/time.js +7 -0
- package/dist/src/runtime/browser/utils/time.js.map +1 -0
- package/dist/src/runtime/chrome/constants.d.ts +5 -0
- package/dist/src/runtime/chrome/constants.d.ts.map +1 -0
- package/dist/src/runtime/chrome/constants.js +5 -0
- package/dist/src/runtime/chrome/constants.js.map +1 -0
- package/dist/src/runtime/chrome/cookies.d.ts +20 -0
- package/dist/src/runtime/chrome/cookies.d.ts.map +1 -0
- package/dist/src/runtime/chrome/cookies.js +139 -0
- package/dist/src/runtime/chrome/cookies.js.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts +6 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.js +49 -0
- package/dist/src/runtime/chrome/diagnostics.js.map +1 -0
- package/dist/src/runtime/chrome/focus.d.ts +2 -0
- package/dist/src/runtime/chrome/focus.d.ts.map +1 -0
- package/dist/src/runtime/chrome/focus.js +41 -0
- package/dist/src/runtime/chrome/focus.js.map +1 -0
- package/dist/src/runtime/chrome/launch.d.ts +23 -0
- package/dist/src/runtime/chrome/launch.d.ts.map +1 -0
- package/dist/src/runtime/chrome/launch.js +102 -0
- package/dist/src/runtime/chrome/launch.js.map +1 -0
- package/dist/src/runtime/chrome/puppeteer.d.ts +7 -0
- package/dist/src/runtime/chrome/puppeteer.d.ts.map +1 -0
- package/dist/src/runtime/chrome/puppeteer.js +87 -0
- package/dist/src/runtime/chrome/puppeteer.js.map +1 -0
- package/dist/src/runtime/chrome/reuse/constants.d.ts +4 -0
- package/dist/src/runtime/chrome/reuse/constants.d.ts.map +1 -0
- package/dist/src/runtime/chrome/reuse/constants.js +4 -0
- package/dist/src/runtime/chrome/reuse/constants.js.map +1 -0
- package/dist/src/runtime/chrome/reuse.d.ts +13 -0
- package/dist/src/runtime/chrome/reuse.d.ts.map +1 -0
- package/dist/src/runtime/chrome/reuse.js +183 -0
- package/dist/src/runtime/chrome/reuse.js.map +1 -0
- package/dist/src/runtime/chrome/session.d.ts +13 -0
- package/dist/src/runtime/chrome/session.d.ts.map +1 -0
- package/dist/src/runtime/chrome/session.js +47 -0
- package/dist/src/runtime/chrome/session.js.map +1 -0
- package/dist/src/runtime/chrome.d.ts +9 -0
- package/dist/src/runtime/chrome.d.ts.map +1 -0
- package/dist/src/runtime/chrome.js +10 -0
- package/dist/src/runtime/chrome.js.map +1 -0
- package/dist/src/runtime/cookies.d.ts +37 -0
- package/dist/src/runtime/cookies.d.ts.map +1 -0
- package/dist/src/runtime/cookies.js +592 -0
- package/dist/src/runtime/cookies.js.map +1 -0
- package/dist/src/runtime/devstack.d.ts +14 -0
- package/dist/src/runtime/devstack.d.ts.map +1 -0
- package/dist/src/runtime/devstack.js +174 -0
- package/dist/src/runtime/devstack.js.map +1 -0
- package/dist/src/runtime/devtools/background.d.ts +5 -0
- package/dist/src/runtime/devtools/background.d.ts.map +1 -0
- package/dist/src/runtime/devtools/background.js +109 -0
- package/dist/src/runtime/devtools/background.js.map +1 -0
- package/dist/src/runtime/devtools/cdp.d.ts +16 -0
- package/dist/src/runtime/devtools/cdp.d.ts.map +1 -0
- package/dist/src/runtime/devtools/cdp.js +392 -0
- package/dist/src/runtime/devtools/cdp.js.map +1 -0
- package/dist/src/runtime/devtools/config.d.ts +12 -0
- package/dist/src/runtime/devtools/config.d.ts.map +1 -0
- package/dist/src/runtime/devtools/config.js +78 -0
- package/dist/src/runtime/devtools/config.js.map +1 -0
- package/dist/src/runtime/devtools/constants.d.ts +10 -0
- package/dist/src/runtime/devtools/constants.d.ts.map +1 -0
- package/dist/src/runtime/devtools/constants.js +18 -0
- package/dist/src/runtime/devtools/constants.js.map +1 -0
- package/dist/src/runtime/devtools/diagnostics.d.ts +8 -0
- package/dist/src/runtime/devtools/diagnostics.d.ts.map +1 -0
- package/dist/src/runtime/devtools/diagnostics.js +189 -0
- package/dist/src/runtime/devtools/diagnostics.js.map +1 -0
- package/dist/src/runtime/devtools/oauth.d.ts +9 -0
- package/dist/src/runtime/devtools/oauth.d.ts.map +1 -0
- package/dist/src/runtime/devtools/oauth.js +130 -0
- package/dist/src/runtime/devtools/oauth.js.map +1 -0
- package/dist/src/runtime/devtools/types.d.ts +108 -0
- package/dist/src/runtime/devtools/types.d.ts.map +1 -0
- package/dist/src/runtime/devtools/types.js +2 -0
- package/dist/src/runtime/devtools/types.js.map +1 -0
- package/dist/src/runtime/devtools.d.ts +8 -0
- package/dist/src/runtime/devtools.d.ts.map +1 -0
- package/dist/src/runtime/devtools.js +9 -0
- package/dist/src/runtime/devtools.js.map +1 -0
- package/dist/src/runtime/next-devtools.d.ts +2 -0
- package/dist/src/runtime/next-devtools.d.ts.map +1 -0
- package/dist/src/runtime/next-devtools.js +72 -0
- package/dist/src/runtime/next-devtools.js.map +1 -0
- package/dist/src/runtime/screenshot.d.ts +78 -0
- package/dist/src/runtime/screenshot.d.ts.map +1 -0
- package/dist/src/runtime/screenshot.js +232 -0
- package/dist/src/runtime/screenshot.js.map +1 -0
- package/dist/src/runtime/scripts.d.ts +16 -0
- package/dist/src/runtime/scripts.d.ts.map +1 -0
- package/dist/src/runtime/scripts.js +110 -0
- package/dist/src/runtime/scripts.js.map +1 -0
- package/dist/src/runtime/session.d.ts +64 -0
- package/dist/src/runtime/session.d.ts.map +1 -0
- package/dist/src/runtime/session.js +205 -0
- package/dist/src/runtime/session.js.map +1 -0
- package/dist/src/runtime/smoke.d.ts +36 -0
- package/dist/src/runtime/smoke.d.ts.map +1 -0
- package/dist/src/runtime/smoke.js +417 -0
- package/dist/src/runtime/smoke.js.map +1 -0
- package/dist/src/runtime/url.d.ts +10 -0
- package/dist/src/runtime/url.d.ts.map +1 -0
- package/dist/src/runtime/url.js +147 -0
- package/dist/src/runtime/url.js.map +1 -0
- package/dist/src/screenshot-hooks.d.ts +13 -0
- package/dist/src/screenshot-hooks.d.ts.map +1 -0
- package/dist/src/screenshot-hooks.js +56 -0
- package/dist/src/screenshot-hooks.js.map +1 -0
- package/dist/src/shared/env.d.ts +23 -0
- package/dist/src/shared/env.d.ts.map +1 -0
- package/dist/src/shared/env.js +38 -0
- package/dist/src/shared/env.js.map +1 -0
- package/dist/src/shared/index.d.ts +211 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +73 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/node.d.ts +12 -0
- package/dist/src/shared/node.d.ts.map +1 -0
- package/dist/src/shared/node.js +67 -0
- package/dist/src/shared/node.js.map +1 -0
- package/dist/src/token.d.ts +4 -0
- package/dist/src/token.d.ts.map +1 -0
- package/dist/src/token.js +58 -0
- package/dist/src/token.js.map +1 -0
- package/dist/src/types.d.ts +17 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/util/app-label.d.ts +5 -0
- package/dist/src/util/app-label.d.ts.map +1 -0
- package/dist/src/util/app-label.js +21 -0
- package/dist/src/util/app-label.js.map +1 -0
- package/dist/src/util/errors.d.ts +9 -0
- package/dist/src/util/errors.d.ts.map +1 -0
- package/dist/src/util/errors.js +56 -0
- package/dist/src/util/errors.js.map +1 -0
- package/dist/src/util/path.d.ts +3 -0
- package/dist/src/util/path.d.ts.map +1 -0
- package/dist/src/util/path.js +6 -0
- package/dist/src/util/path.js.map +1 -0
- package/dist/src/util/regex.d.ts +4 -0
- package/dist/src/util/regex.d.ts.map +1 -0
- package/dist/src/util/regex.js +5 -0
- package/dist/src/util/regex.js.map +1 -0
- package/dist/src/util/time.d.ts +3 -0
- package/dist/src/util/time.d.ts.map +1 -0
- package/dist/src/util/time.js +7 -0
- package/dist/src/util/time.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { SweetLinkCommandResult, SweetLinkScreenshotRenderer } from '../../shared/src/index.js';
|
|
2
|
+
import type { CliConfig } from '../types.js';
|
|
3
|
+
import type { SweetLinkConsoleDump } from './session.js';
|
|
4
|
+
export interface DevToolsCaptureOptions {
|
|
5
|
+
readonly devtoolsUrl: string;
|
|
6
|
+
readonly sessionUrl: string;
|
|
7
|
+
readonly selector?: string;
|
|
8
|
+
readonly quality: number;
|
|
9
|
+
readonly mode: 'full' | 'element';
|
|
10
|
+
readonly outputPath: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SweetLinkScreenshotResultPayload {
|
|
13
|
+
readonly mimeType: 'image/jpeg';
|
|
14
|
+
readonly base64: string;
|
|
15
|
+
readonly width: number;
|
|
16
|
+
readonly height: number;
|
|
17
|
+
readonly renderer: SweetLinkScreenshotRenderer;
|
|
18
|
+
}
|
|
19
|
+
export type ScreenshotFallbackContext = {
|
|
20
|
+
readonly config: CliConfig;
|
|
21
|
+
readonly token: string;
|
|
22
|
+
readonly sessionId: string;
|
|
23
|
+
readonly payload: {
|
|
24
|
+
readonly type: 'screenshot';
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly mode: 'full' | 'element';
|
|
27
|
+
readonly selector?: string;
|
|
28
|
+
readonly quality: number;
|
|
29
|
+
readonly timeoutMs: number;
|
|
30
|
+
readonly renderer?: SweetLinkScreenshotRenderer;
|
|
31
|
+
readonly hooks?: unknown;
|
|
32
|
+
};
|
|
33
|
+
readonly outputPath: string;
|
|
34
|
+
readonly prompt: string | undefined;
|
|
35
|
+
readonly suppressOutput: boolean;
|
|
36
|
+
};
|
|
37
|
+
export type HtmlToImageFallbackOutcome = {
|
|
38
|
+
readonly handled: true;
|
|
39
|
+
} | {
|
|
40
|
+
readonly handled: false;
|
|
41
|
+
readonly fallbackResult: SweetLinkCommandResult;
|
|
42
|
+
};
|
|
43
|
+
export type DevToolsRecoveryContext = {
|
|
44
|
+
readonly sessionUrl?: string;
|
|
45
|
+
readonly devtoolsUrl: string;
|
|
46
|
+
readonly selector?: string;
|
|
47
|
+
readonly quality: number;
|
|
48
|
+
readonly mode: 'full' | 'element';
|
|
49
|
+
readonly outputPath: string;
|
|
50
|
+
readonly prompt: string | undefined;
|
|
51
|
+
readonly suppressOutput: boolean;
|
|
52
|
+
readonly logInfo: (...args: unknown[]) => void;
|
|
53
|
+
readonly failureReason?: string | null;
|
|
54
|
+
readonly appLabel?: string;
|
|
55
|
+
};
|
|
56
|
+
export declare function maybeDescribeScreenshot(prompt: string | undefined, imagePath: string, options?: {
|
|
57
|
+
silent?: boolean;
|
|
58
|
+
appLabel?: string;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
export declare function maybeAnalyzeConsoleWithPrompt(prompt: string | undefined, selector: string, events: SweetLinkConsoleDump[], options?: {
|
|
61
|
+
silent?: boolean;
|
|
62
|
+
appLabel?: string;
|
|
63
|
+
}): Promise<boolean>;
|
|
64
|
+
export declare function tryHtmlToImageFallback(context: ScreenshotFallbackContext & {
|
|
65
|
+
readonly rendererOverride: SweetLinkScreenshotRenderer;
|
|
66
|
+
readonly failureReason?: string | null;
|
|
67
|
+
}): Promise<HtmlToImageFallbackOutcome>;
|
|
68
|
+
export declare function attemptDevToolsCapture(options: DevToolsCaptureOptions): Promise<{
|
|
69
|
+
width: number;
|
|
70
|
+
height: number;
|
|
71
|
+
sizeKb: number;
|
|
72
|
+
renderer: 'puppeteer';
|
|
73
|
+
} | null>;
|
|
74
|
+
export declare function tryDevToolsRecovery(context: DevToolsRecoveryContext): Promise<boolean>;
|
|
75
|
+
export declare function persistScreenshotResult(outputPath: string, result: SweetLinkCommandResult, options?: {
|
|
76
|
+
silent?: boolean;
|
|
77
|
+
}): Promise<SweetLinkScreenshotResultPayload>;
|
|
78
|
+
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../../src/runtime/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { runCodexImagePrompt, runCodexTextPrompt } from '../codex.js';
|
|
3
|
+
import { fetchJson } from '../http.js';
|
|
4
|
+
import { describeAppForPrompt } from '../util/app-label.js';
|
|
5
|
+
import { extractEventMessage, isErrnoException } from '../util/errors.js';
|
|
6
|
+
import { TRAILING_SLASH_PATTERN } from '../util/regex.js';
|
|
7
|
+
import { formatConsoleArg } from './devtools.js';
|
|
8
|
+
export async function maybeDescribeScreenshot(prompt, imagePath, options = {}) {
|
|
9
|
+
const question = prompt?.trim();
|
|
10
|
+
if (!question) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const appDescription = describeAppForPrompt(options.appLabel);
|
|
14
|
+
const combinedPrompt = `You are analyzing a screenshot from ${appDescription} (treat it like a typical product dashboard). Inspect the image carefully before answering.\nQuestion: ${question}`;
|
|
15
|
+
if (!options.silent) {
|
|
16
|
+
console.log(`Asking Codex about screenshot: ${question}`);
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const exitCode = await runCodexImagePrompt(imagePath, combinedPrompt);
|
|
20
|
+
if (exitCode !== 0) {
|
|
21
|
+
console.warn(`Codex exited with status ${exitCode}.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const message = extractEventMessage(error);
|
|
26
|
+
const missing = isErrnoException(error) && error.code === 'ENOENT';
|
|
27
|
+
const prefix = missing ? 'Codex CLI not found' : `Codex CLI failed: ${message}`;
|
|
28
|
+
console.warn(missing ? `${prefix}; install it or add it to $PATH to use --prompt.` : prefix);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function maybeAnalyzeConsoleWithPrompt(prompt, selector, events, options = {}) {
|
|
32
|
+
const question = prompt?.trim();
|
|
33
|
+
if (!question) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const lines = events.length > 0
|
|
37
|
+
? events.map((event) => {
|
|
38
|
+
const timestamp = new Date(event.timestamp ?? Date.now()).toLocaleTimeString();
|
|
39
|
+
const argsText = event.args && event.args.length > 0 ? event.args.map((value) => formatConsoleArg(value)).join(' ') : '';
|
|
40
|
+
const suffix = argsText.length > 0 ? `: ${argsText}` : '';
|
|
41
|
+
return `[${timestamp}] ${event.level}${suffix}`;
|
|
42
|
+
})
|
|
43
|
+
: ['(no console events were captured after the click)'];
|
|
44
|
+
const appDescription = describeAppForPrompt(options.appLabel);
|
|
45
|
+
const combinedPrompt = `You are analyzing console output from ${appDescription} immediately after triggering a click on selector "${selector}". ` +
|
|
46
|
+
'Review the log lines below (most recent last) and answer the agent’s question.\n\n' +
|
|
47
|
+
`Console output:\n${lines.join('\n')}\n\nQuestion: ${question}`;
|
|
48
|
+
if (!options.silent) {
|
|
49
|
+
console.log(`Asking Codex about console output after ${selector}: ${question}`);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const exitCode = await runCodexTextPrompt(combinedPrompt);
|
|
53
|
+
if (exitCode !== 0) {
|
|
54
|
+
console.warn(`Codex exited with status ${exitCode}.`);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const message = extractEventMessage(error);
|
|
61
|
+
const missing = isErrnoException(error) && error.code === 'ENOENT';
|
|
62
|
+
const prefix = missing ? 'Codex CLI not found' : `Codex CLI failed: ${message}`;
|
|
63
|
+
console.warn(missing ? `${prefix}; install it or add it to $PATH to use --prompt.` : prefix);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function tryHtmlToImageFallback(context) {
|
|
68
|
+
const { rendererOverride, failureReason, config, token, sessionId, payload, outputPath, prompt, suppressOutput } = context;
|
|
69
|
+
console.warn(`Requested renderer "${rendererOverride}" failed: ${failureReason ?? 'Unknown error'}`);
|
|
70
|
+
console.warn('Falling back to html-to-image renderer…');
|
|
71
|
+
const fallbackResponse = await fetchJson(`${config.daemonBaseUrl}/sessions/${encodeURIComponent(sessionId)}/command`, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: {
|
|
74
|
+
Authorization: `Bearer ${token}`,
|
|
75
|
+
'Content-Type': 'application/json',
|
|
76
|
+
},
|
|
77
|
+
body: JSON.stringify({ ...payload, renderer: 'html-to-image' }),
|
|
78
|
+
});
|
|
79
|
+
const fallbackResult = fallbackResponse.result;
|
|
80
|
+
if (!fallbackResult.ok) {
|
|
81
|
+
console.error('Fallback html-to-image renderer also failed.');
|
|
82
|
+
return { handled: false, fallbackResult };
|
|
83
|
+
}
|
|
84
|
+
await persistScreenshotResult(outputPath, fallbackResult, { silent: suppressOutput });
|
|
85
|
+
await maybeDescribeScreenshot(prompt, outputPath, { silent: suppressOutput, appLabel: config.appLabel });
|
|
86
|
+
return { handled: true };
|
|
87
|
+
}
|
|
88
|
+
export async function attemptDevToolsCapture(options) {
|
|
89
|
+
const { devtoolsUrl, sessionUrl, selector, quality, mode, outputPath } = options;
|
|
90
|
+
const normalizedUrl = devtoolsUrl.replace(TRAILING_SLASH_PATTERN, '');
|
|
91
|
+
try {
|
|
92
|
+
const versionResponse = await fetch(`${normalizedUrl}/json/version`, { method: 'GET' });
|
|
93
|
+
if (!versionResponse.ok) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
let puppeteer;
|
|
101
|
+
try {
|
|
102
|
+
({ default: puppeteer } = await import('puppeteer'));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.warn('Puppeteer is unavailable:', error);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const browser = await puppeteer.connect({ browserURL: normalizedUrl, defaultViewport: null, protocolTimeout: 5000 });
|
|
109
|
+
try {
|
|
110
|
+
const pages = await browser.pages();
|
|
111
|
+
const sessionUrlObj = new URL(sessionUrl);
|
|
112
|
+
const target = pages.find((page) => page.url() === sessionUrl) ||
|
|
113
|
+
pages.find((page) => page.url()?.startsWith(sessionUrlObj.origin));
|
|
114
|
+
if (!target) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
await target.bringToFront();
|
|
118
|
+
const jpegQuality = Math.min(100, Math.max(1, Math.round(quality * 100)));
|
|
119
|
+
let buffer;
|
|
120
|
+
let width = 0;
|
|
121
|
+
let height = 0;
|
|
122
|
+
if (selector) {
|
|
123
|
+
await target.waitForSelector(selector, { timeout: 10_000 });
|
|
124
|
+
const element = await target.$(selector);
|
|
125
|
+
if (!element) {
|
|
126
|
+
throw new Error(`Selector ${selector} not found in target page`);
|
|
127
|
+
}
|
|
128
|
+
const box = await element.boundingBox();
|
|
129
|
+
const raw = (await element.screenshot({ type: 'jpeg', quality: jpegQuality }));
|
|
130
|
+
await writeFile(outputPath, raw, { mode: 0o600 });
|
|
131
|
+
buffer = raw;
|
|
132
|
+
width = box ? Math.round(box.width) : 0;
|
|
133
|
+
height = box ? Math.round(box.height) : 0;
|
|
134
|
+
}
|
|
135
|
+
else if (mode === 'full') {
|
|
136
|
+
const raw = (await target.screenshot({
|
|
137
|
+
type: 'jpeg',
|
|
138
|
+
quality: jpegQuality,
|
|
139
|
+
fullPage: true,
|
|
140
|
+
}));
|
|
141
|
+
await writeFile(outputPath, raw, { mode: 0o600 });
|
|
142
|
+
buffer = raw;
|
|
143
|
+
const dims = await target.evaluate(() => ({
|
|
144
|
+
width: document.documentElement.scrollWidth,
|
|
145
|
+
height: document.documentElement.scrollHeight,
|
|
146
|
+
}));
|
|
147
|
+
width = Math.round(dims.width);
|
|
148
|
+
height = Math.round(dims.height);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const clip = await target.evaluate(() => {
|
|
152
|
+
const explicit = document.querySelector('[data-sweetlink-target="top-posters-card"]');
|
|
153
|
+
const cards = explicit ? [explicit] : [...document.querySelectorAll('div.col-span-1')];
|
|
154
|
+
const targetCard = cards.find((card) => [...card.querySelectorAll('span, h2, h3')].some((node) => (node.textContent || '').trim().toLowerCase() === 'top posters'));
|
|
155
|
+
if (!targetCard) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
targetCard.scrollIntoView({ behavior: 'auto', block: 'center' });
|
|
159
|
+
const rect = targetCard.getBoundingClientRect();
|
|
160
|
+
return {
|
|
161
|
+
x: Math.max(0, Math.floor(rect.left) - 8),
|
|
162
|
+
y: Math.max(0, Math.floor(rect.top) - 8),
|
|
163
|
+
width: Math.ceil(rect.width) + 16,
|
|
164
|
+
height: Math.ceil(rect.height) + 16,
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
if (!clip) {
|
|
168
|
+
throw new Error('Unable to locate Top Posters card in target tab');
|
|
169
|
+
}
|
|
170
|
+
const raw = (await target.screenshot({ type: 'jpeg', quality: jpegQuality, clip }));
|
|
171
|
+
await writeFile(outputPath, raw, { mode: 0o600 });
|
|
172
|
+
buffer = raw;
|
|
173
|
+
width = Math.round(clip.width);
|
|
174
|
+
height = Math.round(clip.height);
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
width,
|
|
178
|
+
height,
|
|
179
|
+
sizeKb: buffer.length / 1024,
|
|
180
|
+
renderer: 'puppeteer',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.warn('DevTools capture failed:', error instanceof Error ? error.message : error);
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
await browser.disconnect();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export async function tryDevToolsRecovery(context) {
|
|
192
|
+
const { sessionUrl, devtoolsUrl, selector, quality, mode, outputPath, prompt, suppressOutput, logInfo, failureReason, } = context;
|
|
193
|
+
if (!sessionUrl) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const devtoolsFallback = await attemptDevToolsCapture({
|
|
197
|
+
devtoolsUrl,
|
|
198
|
+
outputPath,
|
|
199
|
+
sessionUrl,
|
|
200
|
+
selector,
|
|
201
|
+
quality,
|
|
202
|
+
mode,
|
|
203
|
+
});
|
|
204
|
+
if (!devtoolsFallback) {
|
|
205
|
+
console.warn('Puppeteer fallback did not succeed; showing original renderer error.');
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
const reason = failureReason ?? 'unknown error';
|
|
209
|
+
logInfo(`Renderer failure (${reason}) recovered via Puppeteer fallback (${devtoolsFallback.width}x${devtoolsFallback.height}, ${devtoolsFallback.sizeKb.toFixed(1)} KB).`);
|
|
210
|
+
if (!suppressOutput) {
|
|
211
|
+
console.log(`Saved screenshot to ${outputPath} (${devtoolsFallback.width}x${devtoolsFallback.height}, ${devtoolsFallback.sizeKb.toFixed(1)} KB, method: ${devtoolsFallback.renderer}).`);
|
|
212
|
+
}
|
|
213
|
+
await maybeDescribeScreenshot(prompt, outputPath, { silent: suppressOutput, appLabel: context.appLabel });
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
export async function persistScreenshotResult(outputPath, result, options = {}) {
|
|
217
|
+
if (!result.ok) {
|
|
218
|
+
throw new Error(result.error ?? 'Screenshot command failed');
|
|
219
|
+
}
|
|
220
|
+
const data = result.data;
|
|
221
|
+
if (!data || typeof data.base64 !== 'string') {
|
|
222
|
+
throw new Error('Screenshot succeeded but no image payload was returned.');
|
|
223
|
+
}
|
|
224
|
+
const buffer = Buffer.from(data.base64, 'base64');
|
|
225
|
+
await writeFile(outputPath, buffer, { mode: 0o600 });
|
|
226
|
+
const sizeInKb = buffer.length / 1024;
|
|
227
|
+
if (!options.silent) {
|
|
228
|
+
console.log(`Saved screenshot to ${outputPath} (${data.width}x${data.height}, ${sizeInKb.toFixed(1)} KB, method: ${data.renderer}).`);
|
|
229
|
+
}
|
|
230
|
+
return data;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../src/runtime/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SweetLinkCommandResult } from '../../shared/src/index.js';
|
|
2
|
+
export interface RunJsOptions {
|
|
3
|
+
code?: string[];
|
|
4
|
+
file?: string;
|
|
5
|
+
captureConsole?: boolean;
|
|
6
|
+
timeout: number;
|
|
7
|
+
}
|
|
8
|
+
/** Resolve inline or file-based JavaScript payloads for run-js commands. */
|
|
9
|
+
export declare function resolveScript(options: RunJsOptions, inline?: string[]): Promise<string>;
|
|
10
|
+
/** Loads an optional beforeScript snippet for screenshot hooks. */
|
|
11
|
+
export declare function resolveHookSnippet(value?: string): Promise<string | null>;
|
|
12
|
+
/** Pretty-prints a command result to stdout. */
|
|
13
|
+
export declare function renderCommandResult(result: SweetLinkCommandResult): void;
|
|
14
|
+
/** Formats unknown result payloads safely for logging. */
|
|
15
|
+
export declare function formatResultData(value: unknown): string;
|
|
16
|
+
//# sourceMappingURL=scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../src/runtime/scripts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGxE,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4EAA4E;AAC5E,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7F;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB/E;AAED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAwCxE;AAMD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmBvD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { inspect } from 'node:util';
|
|
4
|
+
import { sweetLinkDebug } from '../env.js';
|
|
5
|
+
/** Resolve inline or file-based JavaScript payloads for run-js commands. */
|
|
6
|
+
export async function resolveScript(options, inline) {
|
|
7
|
+
if (options.file) {
|
|
8
|
+
const fileContents = await readFile(options.file, 'utf8');
|
|
9
|
+
return fileContents.toString();
|
|
10
|
+
}
|
|
11
|
+
if (options.code && options.code.length > 0) {
|
|
12
|
+
return options.code.join(' ');
|
|
13
|
+
}
|
|
14
|
+
if (inline?.length) {
|
|
15
|
+
return inline.join(' ');
|
|
16
|
+
}
|
|
17
|
+
throw new Error('Provide JavaScript inline (e.g. `pnpm sweetlink run-js <id> "console.log(1)"`) or use --code/--file to supply a script.');
|
|
18
|
+
}
|
|
19
|
+
/** Loads an optional beforeScript snippet for screenshot hooks. */
|
|
20
|
+
export async function resolveHookSnippet(value) {
|
|
21
|
+
if (!value) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
if (trimmed.length === 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (trimmed.startsWith('@')) {
|
|
29
|
+
const candidatePath = trimmed.slice(1).trim();
|
|
30
|
+
if (!candidatePath) {
|
|
31
|
+
throw new Error('Expected a file path after @ for --before-script.');
|
|
32
|
+
}
|
|
33
|
+
const absolute = path.isAbsolute(candidatePath) ? candidatePath : path.resolve(candidatePath);
|
|
34
|
+
const hookContents = await readFile(absolute, 'utf8');
|
|
35
|
+
return hookContents.toString();
|
|
36
|
+
}
|
|
37
|
+
if (trimmed.startsWith('file://')) {
|
|
38
|
+
const filePath = trimmed.slice('file://'.length);
|
|
39
|
+
const hookContents = await readFile(filePath, 'utf8');
|
|
40
|
+
return hookContents.toString();
|
|
41
|
+
}
|
|
42
|
+
return trimmed;
|
|
43
|
+
}
|
|
44
|
+
/** Pretty-prints a command result to stdout. */
|
|
45
|
+
export function renderCommandResult(result) {
|
|
46
|
+
if (result.ok) {
|
|
47
|
+
console.log('✅ Script executed successfully');
|
|
48
|
+
if (sweetLinkDebug) {
|
|
49
|
+
console.log('[sweetlink] command result payload', result);
|
|
50
|
+
}
|
|
51
|
+
if (hasCommandResultData(result)) {
|
|
52
|
+
const formatted = formatResultData(result.data);
|
|
53
|
+
if (formatted.includes('\n')) {
|
|
54
|
+
console.log(`Result:\n${formatted}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log('Result:', formatted);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (result.console?.length) {
|
|
61
|
+
console.log('\nConsole output:');
|
|
62
|
+
for (const entry of result.console) {
|
|
63
|
+
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
64
|
+
console.log(`[${timestamp}] ${entry.level}:`, ...entry.args);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.error('❌ Script failed');
|
|
70
|
+
console.error('Error:', result.error);
|
|
71
|
+
if (typeof result.error === 'string' && result.error.includes('Session not found or offline')) {
|
|
72
|
+
console.error('Hint: run `pnpm sweetlink sessions` to list active SweetLink sessions and grab a fresh id.');
|
|
73
|
+
}
|
|
74
|
+
if (result.stack) {
|
|
75
|
+
console.error(result.stack);
|
|
76
|
+
}
|
|
77
|
+
if (result.console?.length) {
|
|
78
|
+
console.error('\nConsole output before failure:');
|
|
79
|
+
for (const entry of result.console) {
|
|
80
|
+
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
81
|
+
console.error(`[${timestamp}] ${entry.level}:`, ...entry.args);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
}
|
|
86
|
+
const hasCommandResultData = (value) => typeof value === 'object' && value !== null && 'data' in value;
|
|
87
|
+
/** Formats unknown result payloads safely for logging. */
|
|
88
|
+
export function formatResultData(value) {
|
|
89
|
+
if (value === undefined) {
|
|
90
|
+
return '(undefined)';
|
|
91
|
+
}
|
|
92
|
+
if (value === null) {
|
|
93
|
+
return 'null';
|
|
94
|
+
}
|
|
95
|
+
if (typeof value === 'string') {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
return JSON.stringify(value, null, 2);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
try {
|
|
103
|
+
return inspect(value, { depth: 2, breakLength: 60 });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return '[unserializable result]';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/runtime/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAS3C,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB,EAAE,MAAiB;IAC1E,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,yHAAyH,CAC1H,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAc;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9F,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,mBAAmB,CAAC,MAA8B;IAChE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;IAC9G,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,oBAAoB,GAAG,CAC3B,KAA6B,EACiC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AAElI,0DAA0D;AAC1D,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,yBAAyB,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { SweetLinkSelectorCandidate, SweetLinkSelectorDiscoveryResult } from '../../shared/src/index.js';
|
|
2
|
+
import { type SweetLinkCommandResult } from '../../shared/src/index.js';
|
|
3
|
+
import type { CliConfig } from '../types.js';
|
|
4
|
+
export interface SweetLinkSessionSummaryResponse {
|
|
5
|
+
readonly sessions: Array<{
|
|
6
|
+
readonly sessionId: string;
|
|
7
|
+
readonly codename?: string;
|
|
8
|
+
readonly url: string;
|
|
9
|
+
readonly title: string;
|
|
10
|
+
readonly topOrigin: string;
|
|
11
|
+
readonly createdAt: number;
|
|
12
|
+
readonly lastSeenAt: number;
|
|
13
|
+
readonly heartbeatMsAgo?: number;
|
|
14
|
+
readonly consoleEventsBuffered?: number;
|
|
15
|
+
readonly consoleErrorsBuffered?: number;
|
|
16
|
+
readonly pendingCommandCount?: number;
|
|
17
|
+
readonly socketState?: 'open' | 'closing' | 'closed' | 'connecting' | 'unknown';
|
|
18
|
+
readonly userAgent?: string;
|
|
19
|
+
readonly lastConsoleEventAt?: number | null;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
export type SweetLinkSessionSummary = SweetLinkSessionSummaryResponse['sessions'][number];
|
|
23
|
+
export interface SweetLinkConsoleDump {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly timestamp: number;
|
|
26
|
+
readonly level: string;
|
|
27
|
+
readonly args: unknown[];
|
|
28
|
+
}
|
|
29
|
+
export interface RunScriptCommandOptions {
|
|
30
|
+
readonly sessionId: string;
|
|
31
|
+
readonly code: string;
|
|
32
|
+
readonly timeoutMs: number;
|
|
33
|
+
readonly captureConsole?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface BuildClickScriptOptions {
|
|
36
|
+
readonly selector: string;
|
|
37
|
+
readonly scrollIntoView: boolean;
|
|
38
|
+
readonly bubbles: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare function fetchSessionSummaries(config: CliConfig, existingToken?: string): Promise<SweetLinkSessionSummary[]>;
|
|
41
|
+
/** Formats a session id + codename pair for CLI display. */
|
|
42
|
+
export declare function formatSessionHeadline(session: {
|
|
43
|
+
sessionId: string;
|
|
44
|
+
codename?: string;
|
|
45
|
+
}): string;
|
|
46
|
+
/** Resolves a human codename or short id to an active SweetLink session. */
|
|
47
|
+
export declare function resolveSessionIdFromHint(sessionHint: string, config: CliConfig): Promise<string>;
|
|
48
|
+
/** Sends a SweetLink runScript command and returns the raw command result. */
|
|
49
|
+
export declare function executeRunScriptCommand(config: CliConfig, options: RunScriptCommandOptions): Promise<SweetLinkCommandResult>;
|
|
50
|
+
/** Returns recent console events captured for a SweetLink session. */
|
|
51
|
+
export declare function fetchConsoleEvents(config: CliConfig, sessionId: string): Promise<SweetLinkConsoleDump[]>;
|
|
52
|
+
export declare function getSessionSummaryById(config: CliConfig, token: string, sessionId: string): Promise<SweetLinkSessionSummary | undefined>;
|
|
53
|
+
/** Returns the resolved prompt string for CLI commands. */
|
|
54
|
+
export declare function resolvePromptOption(options: {
|
|
55
|
+
prompt?: string;
|
|
56
|
+
question?: string;
|
|
57
|
+
}): string | undefined;
|
|
58
|
+
/** Builds a DOM click script scoped to the provided selector. */
|
|
59
|
+
export declare function buildClickScript({ selector, scrollIntoView, bubbles }: BuildClickScriptOptions): string;
|
|
60
|
+
/** Shared guard ensuring candidates from selector discovery are valid. */
|
|
61
|
+
export declare const isSweetLinkSelectorCandidate: (value: unknown) => value is SweetLinkSelectorCandidate;
|
|
62
|
+
/** Wrapper guards selector discovery responses. */
|
|
63
|
+
export declare const isSweetLinkSelectorDiscoveryResult: (value: unknown) => value is SweetLinkSelectorDiscoveryResult;
|
|
64
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtime/session.ts"],"names":[],"mappings":"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"}
|