@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.
Files changed (62) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +33 -0
  3. package/cordis.patch.yml +21 -0
  4. package/dist/aria-bundle.d.ts +9 -0
  5. package/dist/aria-bundle.d.ts.map +1 -0
  6. package/dist/aria-bundle.js +16 -0
  7. package/dist/aria-bundle.js.map +1 -0
  8. package/dist/aria.d.ts +45 -0
  9. package/dist/aria.d.ts.map +1 -0
  10. package/dist/aria.js +79 -0
  11. package/dist/aria.js.map +1 -0
  12. package/dist/assets/background.js.txt +242 -0
  13. package/dist/assets/manifest.json.txt +14 -0
  14. package/dist/assets/options.html.txt +53 -0
  15. package/dist/assets/options.js.txt +23 -0
  16. package/dist/index.d.ts +45 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +35 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/invariant.d.ts +16 -0
  21. package/dist/invariant.d.ts.map +1 -0
  22. package/dist/invariant.js +22 -0
  23. package/dist/invariant.js.map +1 -0
  24. package/dist/relay/bridge.d.ts +36 -0
  25. package/dist/relay/bridge.d.ts.map +1 -0
  26. package/dist/relay/bridge.js +860 -0
  27. package/dist/relay/bridge.js.map +1 -0
  28. package/dist/relay/index.d.ts +16 -0
  29. package/dist/relay/index.d.ts.map +1 -0
  30. package/dist/relay/index.js +15 -0
  31. package/dist/relay/index.js.map +1 -0
  32. package/dist/relay/kind.d.ts +30 -0
  33. package/dist/relay/kind.d.ts.map +1 -0
  34. package/dist/relay/kind.js +33 -0
  35. package/dist/relay/kind.js.map +1 -0
  36. package/dist/relay/protocol.d.ts +101 -0
  37. package/dist/relay/protocol.d.ts.map +1 -0
  38. package/dist/relay/protocol.js +12 -0
  39. package/dist/relay/protocol.js.map +1 -0
  40. package/dist/relay/server.d.ts +44 -0
  41. package/dist/relay/server.d.ts.map +1 -0
  42. package/dist/relay/server.js +173 -0
  43. package/dist/relay/server.js.map +1 -0
  44. package/dist/service.d.ts +157 -0
  45. package/dist/service.d.ts.map +1 -0
  46. package/dist/service.js +291 -0
  47. package/dist/service.js.map +1 -0
  48. package/dist/stealth-scripts.d.ts +11 -0
  49. package/dist/stealth-scripts.d.ts.map +1 -0
  50. package/dist/stealth-scripts.js +2010 -0
  51. package/dist/stealth-scripts.js.map +1 -0
  52. package/dist/stealth.d.ts +62 -0
  53. package/dist/stealth.d.ts.map +1 -0
  54. package/dist/stealth.js +194 -0
  55. package/dist/stealth.js.map +1 -0
  56. package/dist/types.d.ts +58 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +6 -0
  59. package/dist/types.js.map +1 -0
  60. package/examples/agent-preset/agent.cordis.yml +19 -0
  61. package/examples/agent-preset/preset.yml +3 -0
  62. 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"}
@@ -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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"}
@@ -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,6 @@
1
+ /**
2
+ * Types shared across the browser service, its tool consumer, and tests.
3
+ * @module @hy-sde-org/dsh-browser/types
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -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: {}
@@ -0,0 +1,3 @@
1
+ name: Agentic Browser
2
+ description: Coding agent with an agentic browser tool — open/run/state over launch (stealth), CDP-attach, or the local relay + extension over the host ctx.browser service. For stock DeepSeek Harness releases (rc.2+).
3
+ order: 8
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
+ }