@hy-sde-org/dsh-browser 0.1.1-rc.2
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/LICENSE +37 -0
- package/README.md +33 -0
- package/cordis.patch.yml +21 -0
- package/dist/aria-bundle.d.ts +9 -0
- package/dist/aria-bundle.d.ts.map +1 -0
- package/dist/aria-bundle.js +16 -0
- package/dist/aria-bundle.js.map +1 -0
- package/dist/aria.d.ts +45 -0
- package/dist/aria.d.ts.map +1 -0
- package/dist/aria.js +79 -0
- package/dist/aria.js.map +1 -0
- package/dist/assets/background.js.txt +242 -0
- package/dist/assets/manifest.json.txt +14 -0
- package/dist/assets/options.html.txt +53 -0
- package/dist/assets/options.js.txt +23 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/invariant.d.ts +16 -0
- package/dist/invariant.d.ts.map +1 -0
- package/dist/invariant.js +22 -0
- package/dist/invariant.js.map +1 -0
- package/dist/relay/bridge.d.ts +36 -0
- package/dist/relay/bridge.d.ts.map +1 -0
- package/dist/relay/bridge.js +860 -0
- package/dist/relay/bridge.js.map +1 -0
- package/dist/relay/index.d.ts +16 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +15 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/relay/kind.d.ts +30 -0
- package/dist/relay/kind.d.ts.map +1 -0
- package/dist/relay/kind.js +33 -0
- package/dist/relay/kind.js.map +1 -0
- package/dist/relay/protocol.d.ts +101 -0
- package/dist/relay/protocol.d.ts.map +1 -0
- package/dist/relay/protocol.js +12 -0
- package/dist/relay/protocol.js.map +1 -0
- package/dist/relay/server.d.ts +44 -0
- package/dist/relay/server.d.ts.map +1 -0
- package/dist/relay/server.js +173 -0
- package/dist/relay/server.js.map +1 -0
- package/dist/service.d.ts +157 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +291 -0
- package/dist/service.js.map +1 -0
- package/dist/stealth-scripts.d.ts +11 -0
- package/dist/stealth-scripts.d.ts.map +1 -0
- package/dist/stealth-scripts.js +2010 -0
- package/dist/stealth-scripts.js.map +1 -0
- package/dist/stealth.d.ts +62 -0
- package/dist/stealth.d.ts.map +1 -0
- package/dist/stealth.js +194 -0
- package/dist/stealth.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/examples/agent-preset/agent.cordis.yml +19 -0
- package/examples/agent-preset/preset.yml +3 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-scripts.js","sourceRoot":"","sources":["../src/stealth-scripts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth browser launch + user-agent spoofing, ported from oh-my-pi's
|
|
3
|
+
* `packages/coding-agent/src/tools/browser/launch.ts` (MIT, see port_omp.md).
|
|
4
|
+
*
|
|
5
|
+
* Puppeteer's `--enable-automation` flag sets `navigator.webdriver=true` and
|
|
6
|
+
* shows the "controlled by automated software" infobar. Playwright's default
|
|
7
|
+
* launch adds a similar set; we suppress the machine-tell flags and apply an
|
|
8
|
+
* `Emulation.setUserAgentOverride` (+ client hints) on every target so a
|
|
9
|
+
* launched browser looks like a normal Chrome install.
|
|
10
|
+
* @module @hy-sde-org/dsh-browser/stealth
|
|
11
|
+
*/
|
|
12
|
+
import type { Browser, CDPSession, Page } from 'playwright-core';
|
|
13
|
+
/** Default viewport used for launched browsers. */
|
|
14
|
+
export declare const DEFAULT_VIEWPORT: {
|
|
15
|
+
readonly width: 1365;
|
|
16
|
+
readonly height: 768;
|
|
17
|
+
readonly deviceScaleFactor: 1.25;
|
|
18
|
+
};
|
|
19
|
+
/** Default flags suppressed: Edge keeps `--enable-automation` (stability). */
|
|
20
|
+
export declare function stealthIgnoreDefaultArgs(executablePath?: string): string[];
|
|
21
|
+
/** Additional launch args reducing automation fingerprints. */
|
|
22
|
+
export declare const STEALTH_LAUNCH_ARGS: readonly ["--disable-blink-features=AutomationControlled", "--no-first-run", "--no-default-browser-check", "--disable-background-networking", "--disable-component-update", "--disable-sync", "--disable-features=Translate,PrivacySandboxSettings4", "--disable-domain-reliability", "--disable-breakpad"];
|
|
23
|
+
/** User-agent + client-hints override, mirroring omp's `UserAgentOverride`. */
|
|
24
|
+
export interface UserAgentOverride {
|
|
25
|
+
userAgent: string;
|
|
26
|
+
platform: string;
|
|
27
|
+
acceptLanguage: string;
|
|
28
|
+
userAgentMetadata: {
|
|
29
|
+
brands: Array<{
|
|
30
|
+
brand: string;
|
|
31
|
+
version: string;
|
|
32
|
+
}>;
|
|
33
|
+
fullVersion: string;
|
|
34
|
+
fullVersionList: Array<{
|
|
35
|
+
brand: string;
|
|
36
|
+
version: string;
|
|
37
|
+
}>;
|
|
38
|
+
platform: string;
|
|
39
|
+
platformVersion: string;
|
|
40
|
+
architecture: string;
|
|
41
|
+
bitness: string;
|
|
42
|
+
model: string;
|
|
43
|
+
mobile: boolean;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Derive a realistic chrome UA (+ client hints) from a Playwright browser. */
|
|
47
|
+
export declare function resolveUserAgentOverride(browser: Browser): Promise<UserAgentOverride>;
|
|
48
|
+
/**
|
|
49
|
+
* Apply the UA override on the browser session. Playwright (unlike Puppeteer)
|
|
50
|
+
* does not expose child sessions through `CDPSession.connection`, so the
|
|
51
|
+
* per-target override is applied on each page through
|
|
52
|
+
* {@link applyUserAgentToPage} after creation — the service calls both for
|
|
53
|
+
* every launched page.
|
|
54
|
+
*/
|
|
55
|
+
export declare function configureUserAgentTargets(browser: Browser, override: UserAgentOverride): Promise<CDPSession | null>;
|
|
56
|
+
/** Apply the UA override to one page (launched or attached). */
|
|
57
|
+
export declare function applyUserAgentToPage(page: Page, override: UserAgentOverride): Promise<void>;
|
|
58
|
+
/** Apply all stealth init scripts to a just-created page (before navigation). */
|
|
59
|
+
export declare function preparePage(page: Page): Promise<void>;
|
|
60
|
+
/** Apply the spoofed UA override to a new browser connection (once per browser). */
|
|
61
|
+
export declare function applyUserAgentOverride(browser: Browser, override: UserAgentOverride): Promise<CDPSession | null>;
|
|
62
|
+
//# sourceMappingURL=stealth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth.d.ts","sourceRoot":"","sources":["../src/stealth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGhE,mDAAmD;AACnD,eAAO,MAAM,gBAAgB;;;;CAAiE,CAAA;AAuB9F,8EAA8E;AAC9E,wBAAgB,wBAAwB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1E;AAED,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,6SAUtB,CAAA;AAEV,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE;QACjB,MAAM,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACjD,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC1D,QAAQ,EAAE,MAAM,CAAA;QAChB,eAAe,EAAE,MAAM,CAAA;QACvB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;CACF;AAYD,+EAA+E;AAC/E,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2E3F;AAoBD;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;AAED,gEAAgE;AAChE,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjG;AAED,iFAAiF;AACjF,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAEhH"}
|
package/dist/stealth.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth browser launch + user-agent spoofing, ported from oh-my-pi's
|
|
3
|
+
* `packages/coding-agent/src/tools/browser/launch.ts` (MIT, see port_omp.md).
|
|
4
|
+
*
|
|
5
|
+
* Puppeteer's `--enable-automation` flag sets `navigator.webdriver=true` and
|
|
6
|
+
* shows the "controlled by automated software" infobar. Playwright's default
|
|
7
|
+
* launch adds a similar set; we suppress the machine-tell flags and apply an
|
|
8
|
+
* `Emulation.setUserAgentOverride` (+ client hints) on every target so a
|
|
9
|
+
* launched browser looks like a normal Chrome install.
|
|
10
|
+
* @module @hy-sde-org/dsh-browser/stealth
|
|
11
|
+
*/
|
|
12
|
+
import { installStealth } from "./stealth-scripts.js";
|
|
13
|
+
/** Default viewport used for launched browsers. */
|
|
14
|
+
export const DEFAULT_VIEWPORT = { width: 1365, height: 768, deviceScaleFactor: 1.25 };
|
|
15
|
+
const ENABLE_AUTOMATION_FLAG = '--enable-automation';
|
|
16
|
+
/** Puppeteer/Playwright automation-tell launch flags to suppress (when present). */
|
|
17
|
+
const STEALTH_IGNORE_DEFAULT_ARGS = [
|
|
18
|
+
ENABLE_AUTOMATION_FLAG,
|
|
19
|
+
'--disable-extensions',
|
|
20
|
+
'--disable-default-apps',
|
|
21
|
+
'--disable-component-extensions-with-background-pages',
|
|
22
|
+
'--disable-popup-blocking',
|
|
23
|
+
'--disable-client-side-phishing-detection',
|
|
24
|
+
'--allow-pre-commit-input',
|
|
25
|
+
'--disable-ipc-flooding-protection',
|
|
26
|
+
'--metrics-recording-only',
|
|
27
|
+
];
|
|
28
|
+
function isEdgeExecutable(executablePath) {
|
|
29
|
+
if (!executablePath)
|
|
30
|
+
return false;
|
|
31
|
+
const name = executablePath.replaceAll('\\', '/').split('/').pop()?.toLowerCase() ?? '';
|
|
32
|
+
return name === 'msedge.exe' || name === 'microsoft edge' || name.startsWith('microsoft-edge');
|
|
33
|
+
}
|
|
34
|
+
/** Default flags suppressed: Edge keeps `--enable-automation` (stability). */
|
|
35
|
+
export function stealthIgnoreDefaultArgs(executablePath) {
|
|
36
|
+
if (!isEdgeExecutable(executablePath))
|
|
37
|
+
return [...STEALTH_IGNORE_DEFAULT_ARGS];
|
|
38
|
+
return STEALTH_IGNORE_DEFAULT_ARGS.filter(arg => arg !== ENABLE_AUTOMATION_FLAG);
|
|
39
|
+
}
|
|
40
|
+
/** Additional launch args reducing automation fingerprints. */
|
|
41
|
+
export const STEALTH_LAUNCH_ARGS = [
|
|
42
|
+
'--disable-blink-features=AutomationControlled',
|
|
43
|
+
'--no-first-run',
|
|
44
|
+
'--no-default-browser-check',
|
|
45
|
+
'--disable-background-networking',
|
|
46
|
+
'--disable-component-update',
|
|
47
|
+
'--disable-sync',
|
|
48
|
+
'--disable-features=Translate,PrivacySandboxSettings4',
|
|
49
|
+
'--disable-domain-reliability',
|
|
50
|
+
'--disable-breakpad',
|
|
51
|
+
];
|
|
52
|
+
function hostArchitecture() {
|
|
53
|
+
if (process.arch === 'arm64')
|
|
54
|
+
return 'arm';
|
|
55
|
+
if (process.arch.includes('64'))
|
|
56
|
+
return 'x86';
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
function hostBitness() {
|
|
60
|
+
return process.arch.includes('64') ? '64' : '';
|
|
61
|
+
}
|
|
62
|
+
/** Derive a realistic chrome UA (+ client hints) from a Playwright browser. */
|
|
63
|
+
export async function resolveUserAgentOverride(browser) {
|
|
64
|
+
let rawUserAgent = '';
|
|
65
|
+
try {
|
|
66
|
+
const session = await browser.newBrowserCDPSession();
|
|
67
|
+
const version = (await session.send('Browser.getVersion'));
|
|
68
|
+
rawUserAgent = version.userAgent ?? '';
|
|
69
|
+
await session.detach();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
rawUserAgent = '';
|
|
73
|
+
}
|
|
74
|
+
if (!rawUserAgent) {
|
|
75
|
+
const version = browser.version();
|
|
76
|
+
rawUserAgent = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version} Safari/537.36`;
|
|
77
|
+
}
|
|
78
|
+
let userAgent = rawUserAgent.replace('HeadlessChrome/', 'Chrome/');
|
|
79
|
+
if (userAgent.includes('Linux') && !userAgent.includes('Android')) {
|
|
80
|
+
userAgent = userAgent.replace(/\(([^)]+)\)/, '(Windows NT 10.0; Win64; x64)');
|
|
81
|
+
}
|
|
82
|
+
const uaVersionMatch = userAgent.match(/Chrome\/([\d.]+)/);
|
|
83
|
+
const browserVersionMatch = (browser.version()).match(/\/([\d.]+)/);
|
|
84
|
+
const legacyVersion = uaVersionMatch?.[1] ?? browserVersionMatch?.[1] ?? '0';
|
|
85
|
+
const fullVersion = browserVersionMatch?.[1] ?? legacyVersion;
|
|
86
|
+
const majorVersion = Number.parseInt(legacyVersion.split('.')[0] ?? '0', 10) || 0;
|
|
87
|
+
const isAndroid = userAgent.includes('Android');
|
|
88
|
+
const isMac = userAgent.includes('Mac OS X');
|
|
89
|
+
const isWindows = userAgent.includes('Windows');
|
|
90
|
+
const platform = isMac ? 'MacIntel' : isAndroid ? 'Android' : userAgent.includes('Linux') ? 'Linux' : 'Win32';
|
|
91
|
+
const platformFull = isMac ? 'macOS' : isAndroid ? 'Android' : userAgent.includes('Linux') ? 'Linux' : 'Windows';
|
|
92
|
+
const platformVersion = isMac
|
|
93
|
+
? ''
|
|
94
|
+
: isAndroid
|
|
95
|
+
? (userAgent.match(/Android ([^;]+)/)?.[1] ?? '')
|
|
96
|
+
: isWindows
|
|
97
|
+
? (userAgent.match(/Windows NT ([\d.]+)/)?.[1] ?? '')
|
|
98
|
+
: '';
|
|
99
|
+
const architecture = isAndroid ? '' : hostArchitecture();
|
|
100
|
+
const bitness = isAndroid ? '' : hostBitness();
|
|
101
|
+
const model = isAndroid ? (userAgent.match(/Android.*?;\s([^)]+)/)?.[1] ?? '') : '';
|
|
102
|
+
const brandOrders = [
|
|
103
|
+
[0, 1, 2],
|
|
104
|
+
[0, 2, 1],
|
|
105
|
+
[1, 0, 2],
|
|
106
|
+
[1, 2, 0],
|
|
107
|
+
[2, 0, 1],
|
|
108
|
+
[2, 1, 0],
|
|
109
|
+
];
|
|
110
|
+
const order = brandOrders[majorVersion % brandOrders.length] ?? brandOrders[0];
|
|
111
|
+
const escapedChars = [' ', ' ', ';'];
|
|
112
|
+
const greaseyBrand = `Not${escapedChars[order[0]]}A${escapedChars[order[1]]}${escapedChars[order[2]]}Brand`;
|
|
113
|
+
const brands = [];
|
|
114
|
+
brands[order[0]] = { brand: greaseyBrand, version: '99' };
|
|
115
|
+
brands[order[1]] = { brand: 'Chromium', version: String(majorVersion) };
|
|
116
|
+
brands[order[2]] = { brand: 'Google Chrome', version: String(majorVersion) };
|
|
117
|
+
const fullVersionList = brands.map(({ brand }) => ({
|
|
118
|
+
brand,
|
|
119
|
+
version: brand === greaseyBrand ? '99.0.0.0' : fullVersion,
|
|
120
|
+
}));
|
|
121
|
+
return {
|
|
122
|
+
userAgent,
|
|
123
|
+
platform,
|
|
124
|
+
acceptLanguage: 'en-US,en',
|
|
125
|
+
userAgentMetadata: {
|
|
126
|
+
brands,
|
|
127
|
+
fullVersion,
|
|
128
|
+
fullVersionList,
|
|
129
|
+
platform: platformFull,
|
|
130
|
+
platformVersion,
|
|
131
|
+
architecture,
|
|
132
|
+
bitness,
|
|
133
|
+
model,
|
|
134
|
+
mobile: isAndroid,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async function sendUserAgentOverride(session, override) {
|
|
139
|
+
try {
|
|
140
|
+
await session.send('Network.enable');
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// page/browser may already have Network enabled — ignore
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
await session.send('Network.setUserAgentOverride', { ...override });
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// ignore per-target failure; Emulation override below is the important one
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
await session.send('Emulation.setUserAgentOverride', { ...override });
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// ignore
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Apply the UA override on the browser session. Playwright (unlike Puppeteer)
|
|
160
|
+
* does not expose child sessions through `CDPSession.connection`, so the
|
|
161
|
+
* per-target override is applied on each page through
|
|
162
|
+
* {@link applyUserAgentToPage} after creation — the service calls both for
|
|
163
|
+
* every launched page.
|
|
164
|
+
*/
|
|
165
|
+
export async function configureUserAgentTargets(browser, override) {
|
|
166
|
+
try {
|
|
167
|
+
const session = await browser.newBrowserCDPSession();
|
|
168
|
+
await sendUserAgentOverride(session, override);
|
|
169
|
+
return session;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** Apply the UA override to one page (launched or attached). */
|
|
176
|
+
export async function applyUserAgentToPage(page, override) {
|
|
177
|
+
try {
|
|
178
|
+
const session = await page.context().newCDPSession(page);
|
|
179
|
+
await sendUserAgentOverride(session, override);
|
|
180
|
+
await session.detach();
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// per-page override is best-effort; the browser-session override still applies
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** Apply all stealth init scripts to a just-created page (before navigation). */
|
|
187
|
+
export async function preparePage(page) {
|
|
188
|
+
await installStealth(page);
|
|
189
|
+
}
|
|
190
|
+
/** Apply the spoofed UA override to a new browser connection (once per browser). */
|
|
191
|
+
export function applyUserAgentOverride(browser, override) {
|
|
192
|
+
return configureUserAgentTargets(browser, override);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=stealth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth.js","sourceRoot":"","sources":["../src/stealth.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types shared across the browser service, its tool consumer, and tests.
|
|
3
|
+
* @module @hy-sde-org/dsh-browser/types
|
|
4
|
+
*/
|
|
5
|
+
/** Which browser backend a tab belongs to. */
|
|
6
|
+
export type BrowserKind = {
|
|
7
|
+
kind: 'launch';
|
|
8
|
+
path?: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'attach';
|
|
11
|
+
cdpUrl: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'relay';
|
|
14
|
+
cdpUrl: string;
|
|
15
|
+
};
|
|
16
|
+
export type BrowserKindTag = BrowserKind['kind'];
|
|
17
|
+
/** One live element snapshot row inside an observation's aria tree. */
|
|
18
|
+
export interface ObservationEntry {
|
|
19
|
+
ref: string;
|
|
20
|
+
role: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
/** "checked", "pressed", … */
|
|
24
|
+
state?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Page observation returned by the service to the tool. */
|
|
27
|
+
export interface PageObservation {
|
|
28
|
+
title: string;
|
|
29
|
+
url: string;
|
|
30
|
+
aria: string;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
}
|
|
34
|
+
export interface ScreenshotResult {
|
|
35
|
+
path: string;
|
|
36
|
+
width?: number;
|
|
37
|
+
height?: number;
|
|
38
|
+
}
|
|
39
|
+
/** Service configuration for `ctx.browser` (config row values). */
|
|
40
|
+
export interface BrowserConfig {
|
|
41
|
+
/** Resolvable browser executable path; empty lets Playwright find one. */
|
|
42
|
+
browserPath?: string;
|
|
43
|
+
/** Headless mode for launched browsers (default true). */
|
|
44
|
+
headless?: boolean;
|
|
45
|
+
/** Default viewport for launched browsers. */
|
|
46
|
+
viewport?: {
|
|
47
|
+
width: number;
|
|
48
|
+
height: number;
|
|
49
|
+
deviceScaleFactor?: number;
|
|
50
|
+
};
|
|
51
|
+
/** Relay endpoint (default `http://127.0.0.1:9224`). */
|
|
52
|
+
relayUrl?: string;
|
|
53
|
+
/** Token the extension must present at `ws://…/ext?token=` (unset = open). */
|
|
54
|
+
relayToken?: string;
|
|
55
|
+
/** Timeout in ms applied to navigation calls (default 30_000). */
|
|
56
|
+
timeoutMs?: number;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;AAEhD,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxE,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# User agent preset for @hy-sde-org/dsh-browser on OFFICIAL DeepSeek Harness
|
|
2
|
+
# releases (dsh-v0.1.1-rc.2 and later).
|
|
3
|
+
#
|
|
4
|
+
# Install: copy this directory to ~/.dsh/.agent-presets/<id>/ (pick any id),
|
|
5
|
+
# then select the preset in the Web UI preset picker (or `dsh agent` CLI).
|
|
6
|
+
#
|
|
7
|
+
# The `browser` SERVICE row is added host-wide by the plugin's own
|
|
8
|
+
# cordis.patch.yml when you run `dsh plugin add`; this preset contributes
|
|
9
|
+
# ONLY the model-facing tool row. `@hy-sde-org/dsh-tool-browser` registers no
|
|
10
|
+
# service of its own — it resolves the host instance across the plane
|
|
11
|
+
# boundary, so no realm/isolate is needed here.
|
|
12
|
+
#
|
|
13
|
+
# Copy any other rows from the preset you normally use (persona, bash, todo,
|
|
14
|
+
# ask-user, skills, ...) next to these; only the browser row is special. If
|
|
15
|
+
# the package isn't installed, the loader reports the missing plugin on boot.
|
|
16
|
+
|
|
17
|
+
- id: tool-browser
|
|
18
|
+
name: '@hy-sde-org/dsh-tool-browser'
|
|
19
|
+
config: {}
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hy-sde-org/dsh-browser",
|
|
3
|
+
"version": "0.1.1-rc.2",
|
|
4
|
+
"description": "Agentic browser plumbing for DeepSeek Harness: the host ctx.browser service (launch with stealth, CDP-attach, and a local relay + companion Chrome extension driving the user's own tabs) backing the browser tool in @hy-sde-org/dsh-tool-browser — a standalone plugin with no upstream harness changes required.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./types": {
|
|
14
|
+
"types": "./dist/types.d.ts",
|
|
15
|
+
"default": "./dist/types.js"
|
|
16
|
+
},
|
|
17
|
+
"./service": {
|
|
18
|
+
"types": "./dist/service.d.ts",
|
|
19
|
+
"default": "./dist/service.js"
|
|
20
|
+
},
|
|
21
|
+
"./stealth": {
|
|
22
|
+
"types": "./dist/stealth.d.ts",
|
|
23
|
+
"default": "./dist/stealth.js"
|
|
24
|
+
},
|
|
25
|
+
"./aria": {
|
|
26
|
+
"types": "./dist/aria.d.ts",
|
|
27
|
+
"default": "./dist/aria.js"
|
|
28
|
+
},
|
|
29
|
+
"./relay": {
|
|
30
|
+
"types": "./dist/relay/index.d.ts",
|
|
31
|
+
"default": "./dist/relay/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./invariant": {
|
|
34
|
+
"types": "./dist/invariant.d.ts",
|
|
35
|
+
"default": "./dist/invariant.js"
|
|
36
|
+
},
|
|
37
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"assets",
|
|
43
|
+
"cordis.patch.yml",
|
|
44
|
+
"examples/agent-preset/agent.cordis.yml",
|
|
45
|
+
"examples/agent-preset/preset.yml",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=22.19.0"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "git+https://github.com/hy-sde/dsh-browser.git"
|
|
58
|
+
},
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"dsh": {
|
|
61
|
+
"bundle": {
|
|
62
|
+
"patch": "./cordis.patch.yml"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
67
|
+
"playwright-core": "^1.61.1",
|
|
68
|
+
"ws": "^8.21.0"
|
|
69
|
+
},
|
|
70
|
+
"peerDependencies": {
|
|
71
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
72
|
+
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
76
|
+
"@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
|
|
77
|
+
"@types/node": "^24.0.0",
|
|
78
|
+
"@types/ws": "^8.5.0",
|
|
79
|
+
"playwright-core": "^1.61.1",
|
|
80
|
+
"typescript": "^5.9.3",
|
|
81
|
+
"vitest": "^3.2.7",
|
|
82
|
+
"ws": "^8.21.0"
|
|
83
|
+
},
|
|
84
|
+
"keywords": [
|
|
85
|
+
"deepseek",
|
|
86
|
+
"agent",
|
|
87
|
+
"harness",
|
|
88
|
+
"dsh-plugin",
|
|
89
|
+
"browser",
|
|
90
|
+
"cdp",
|
|
91
|
+
"chrome"
|
|
92
|
+
],
|
|
93
|
+
"scripts": {
|
|
94
|
+
"clean": "rm -rf dist",
|
|
95
|
+
"build": "tsc -p tsconfig.build.json && cp -r src/assets dist/assets",
|
|
96
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
97
|
+
"test": "vitest run"
|
|
98
|
+
}
|
|
99
|
+
}
|