@rester159/blacktip 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/AGENTS.md +249 -0
- package/LICENSE +38 -0
- package/README.md +234 -0
- package/dist/behavioral/calibration.d.ts +145 -0
- package/dist/behavioral/calibration.d.ts.map +1 -0
- package/dist/behavioral/calibration.js +242 -0
- package/dist/behavioral/calibration.js.map +1 -0
- package/dist/behavioral-engine.d.ts +156 -0
- package/dist/behavioral-engine.d.ts.map +1 -0
- package/dist/behavioral-engine.js +521 -0
- package/dist/behavioral-engine.js.map +1 -0
- package/dist/blacktip.d.ts +289 -0
- package/dist/blacktip.d.ts.map +1 -0
- package/dist/blacktip.js +1574 -0
- package/dist/blacktip.js.map +1 -0
- package/dist/browser-core.d.ts +47 -0
- package/dist/browser-core.d.ts.map +1 -0
- package/dist/browser-core.js +375 -0
- package/dist/browser-core.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +226 -0
- package/dist/cli.js.map +1 -0
- package/dist/element-finder.d.ts +42 -0
- package/dist/element-finder.d.ts.map +1 -0
- package/dist/element-finder.js +240 -0
- package/dist/element-finder.js.map +1 -0
- package/dist/evasion.d.ts +39 -0
- package/dist/evasion.d.ts.map +1 -0
- package/dist/evasion.js +488 -0
- package/dist/evasion.js.map +1 -0
- package/dist/fingerprint.d.ts +19 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +171 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +13 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +42 -0
- package/dist/logging.js.map +1 -0
- package/dist/observability.d.ts +69 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +189 -0
- package/dist/observability.js.map +1 -0
- package/dist/proxy-pool.d.ts +101 -0
- package/dist/proxy-pool.d.ts.map +1 -0
- package/dist/proxy-pool.js +156 -0
- package/dist/proxy-pool.js.map +1 -0
- package/dist/snapshot.d.ts +59 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +91 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +243 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/examples/01-basic-navigate.ts +40 -0
- package/examples/02-login-with-mfa.ts +68 -0
- package/examples/03-agent-serve-mode.md +98 -0
- package/package.json +62 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { type Server } from 'node:net';
|
|
3
|
+
import type { Frame, ElementHandle as PlaywrightElementHandle } from 'patchright';
|
|
4
|
+
import { BehavioralEngine } from './behavioral-engine.js';
|
|
5
|
+
import { ElementFinder } from './element-finder.js';
|
|
6
|
+
import { Logger } from './logging.js';
|
|
7
|
+
import type { BlackTipConfig, ProfileConfig, ActionResult, NavigateResult, ScreenshotResult, WaitResult, TabInfo, FrameInfo, ClickOptions, TypeOptions, ScrollOptions, HoverOptions, SelectOptions, PressKeyOptions, UploadFileOptions, NavigateOptions, ScreenshotOptions, WaitForOptions, WaitForNavigationOptions, ExtractTextOptions, PageContentOptions } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* BlackTip — Stealth browser instrument for AI agents.
|
|
10
|
+
*
|
|
11
|
+
* BlackTip is NOT an agent. It is a tool that an agent drives.
|
|
12
|
+
* Every action (click, type, scroll) is wrapped in human-like behavioral
|
|
13
|
+
* simulation that defeats bot detection.
|
|
14
|
+
*
|
|
15
|
+
* ## Quick Start (for AI agents)
|
|
16
|
+
*
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const bt = new BlackTip();
|
|
19
|
+
* await bt.launch();
|
|
20
|
+
* await bt.navigate('https://example.com');
|
|
21
|
+
* await bt.type('input[name="email"]', 'user@example.com', { paste: true });
|
|
22
|
+
* await bt.click('.submit-btn');
|
|
23
|
+
* await bt.close();
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* ## Agent Usage Guide
|
|
27
|
+
*
|
|
28
|
+
* Call `BlackTip.agentGuide()` to get detailed instructions for how an AI
|
|
29
|
+
* agent should use BlackTip. This includes critical patterns for React/Angular
|
|
30
|
+
* forms, Okta login pages, custom dropdowns, and common mistakes to avoid.
|
|
31
|
+
*
|
|
32
|
+
* ## Server Mode (recommended for agents)
|
|
33
|
+
*
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const bt = new BlackTip();
|
|
36
|
+
* await bt.serve(9779); // TCP server, send commands as JS strings
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* ## Key Methods
|
|
40
|
+
* - `navigate(url)` — go to URL
|
|
41
|
+
* - `click(selector)` — click by CSS/XPath
|
|
42
|
+
* - `clickText(text, {nth?})` — click by visible text (handles React/Okta)
|
|
43
|
+
* - `type(selector, text, {paste?})` — type into input (React-compatible)
|
|
44
|
+
* - `screenshot({path})` — capture page state
|
|
45
|
+
* - `executeJS(script)` — run JS in page context
|
|
46
|
+
* - `uploadFile(selector, path)` — upload a file
|
|
47
|
+
* - `waitFor(selector)` — wait for element
|
|
48
|
+
* - `extractText(selector)` — get text content
|
|
49
|
+
* - `frame(selector)` — interact with iframes
|
|
50
|
+
* - `serve(port)` — start TCP command server
|
|
51
|
+
*/
|
|
52
|
+
export declare class BlackTip extends EventEmitter {
|
|
53
|
+
private core;
|
|
54
|
+
private engine;
|
|
55
|
+
private finder;
|
|
56
|
+
private logger;
|
|
57
|
+
private config;
|
|
58
|
+
private customProfiles;
|
|
59
|
+
private launched;
|
|
60
|
+
constructor(config?: BlackTipConfig);
|
|
61
|
+
/**
|
|
62
|
+
* Launch the browser. Returns the agent usage guide — read it before
|
|
63
|
+
* driving BlackTip to avoid common mistakes.
|
|
64
|
+
*/
|
|
65
|
+
launch(): Promise<string>;
|
|
66
|
+
close(): Promise<void>;
|
|
67
|
+
isActive(): boolean;
|
|
68
|
+
navigate(url: string, options?: NavigateOptions): Promise<NavigateResult>;
|
|
69
|
+
click(selector: string, options?: ClickOptions): Promise<ActionResult>;
|
|
70
|
+
clickText(text: string, options?: ClickOptions & {
|
|
71
|
+
exact?: boolean;
|
|
72
|
+
nth?: number;
|
|
73
|
+
}): Promise<ActionResult>;
|
|
74
|
+
clickRole(role: string, options?: ClickOptions & {
|
|
75
|
+
name?: string;
|
|
76
|
+
nth?: number;
|
|
77
|
+
}): Promise<ActionResult>;
|
|
78
|
+
type(selector: string, text: string, options?: TypeOptions): Promise<ActionResult>;
|
|
79
|
+
scroll(options?: ScrollOptions): Promise<ActionResult>;
|
|
80
|
+
hover(selector: string, options?: HoverOptions): Promise<ActionResult>;
|
|
81
|
+
select(selector: string, value: string, options?: SelectOptions): Promise<ActionResult>;
|
|
82
|
+
pressKey(key: string, options?: PressKeyOptions): Promise<ActionResult>;
|
|
83
|
+
uploadFile(selector: string, filePath: string, options?: UploadFileOptions): Promise<ActionResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Click an element that triggers a download, wait for the download to
|
|
86
|
+
* complete, save it to `saveTo`, and return metadata about the file.
|
|
87
|
+
*
|
|
88
|
+
* Usage:
|
|
89
|
+
* const info = await bt.download('a.invoice-link', { saveTo: './invoice.pdf' });
|
|
90
|
+
* // info.path, info.size, info.suggestedFilename, info.url
|
|
91
|
+
*/
|
|
92
|
+
download(selector: string, options: {
|
|
93
|
+
saveTo: string;
|
|
94
|
+
timeout?: number;
|
|
95
|
+
}): Promise<{
|
|
96
|
+
path: string;
|
|
97
|
+
size: number;
|
|
98
|
+
suggestedFilename: string;
|
|
99
|
+
url: string;
|
|
100
|
+
}>;
|
|
101
|
+
extractText(selector: string, options?: ExtractTextOptions): Promise<string | string[]>;
|
|
102
|
+
extractAttribute(selector: string, attribute: string): Promise<string | null>;
|
|
103
|
+
/**
|
|
104
|
+
* Find an element inside an open shadow root reachable from the page.
|
|
105
|
+
* Useful for modern web component libraries (Lit, Stencil, Material Web,
|
|
106
|
+
* Ionic). See `ElementFinder.findInShadowDom` for limitations on closed
|
|
107
|
+
* shadow roots.
|
|
108
|
+
*/
|
|
109
|
+
findInShadowDom(cssSelector: string, options?: {
|
|
110
|
+
timeout?: number;
|
|
111
|
+
}): Promise<PlaywrightElementHandle>;
|
|
112
|
+
extractTable(selector: string): Promise<Record<string, string>[]>;
|
|
113
|
+
getPageContent(options?: PageContentOptions): Promise<string>;
|
|
114
|
+
waitFor(selector: string, options?: WaitForOptions): Promise<WaitResult>;
|
|
115
|
+
waitForNavigation(options?: WaitForNavigationOptions): Promise<void>;
|
|
116
|
+
screenshot(options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
117
|
+
/**
|
|
118
|
+
* Wait until the page has been "stable" for a configurable window.
|
|
119
|
+
* Stability means: no network requests fired for `networkIdleMs`, and
|
|
120
|
+
* no DOM mutations observed for `domIdleMs`. Replaces fixed sleep
|
|
121
|
+
* waits with a real signal, so you don't wait longer than necessary.
|
|
122
|
+
*
|
|
123
|
+
* Returns an object describing how long the wait took and why it
|
|
124
|
+
* completed (both-idle / network-only / dom-only / timeout).
|
|
125
|
+
*/
|
|
126
|
+
waitForStable(options?: {
|
|
127
|
+
networkIdleMs?: number;
|
|
128
|
+
domIdleMs?: number;
|
|
129
|
+
maxMs?: number;
|
|
130
|
+
pollMs?: number;
|
|
131
|
+
}): Promise<{
|
|
132
|
+
durationMs: number;
|
|
133
|
+
reason: string;
|
|
134
|
+
}>;
|
|
135
|
+
/**
|
|
136
|
+
* Wait for a text string to appear in the body innerText. Case-sensitive
|
|
137
|
+
* substring match by default. Use for server-rendered confirmations,
|
|
138
|
+
* OCR completion messages, and similar async content.
|
|
139
|
+
*/
|
|
140
|
+
waitForText(text: string, options?: {
|
|
141
|
+
timeout?: number;
|
|
142
|
+
pollMs?: number;
|
|
143
|
+
}): Promise<{
|
|
144
|
+
durationMs: number;
|
|
145
|
+
found: boolean;
|
|
146
|
+
}>;
|
|
147
|
+
/**
|
|
148
|
+
* Inspect an element: exists, visible, text, tag, key attributes,
|
|
149
|
+
* bounding box. One call replaces several hand-written executeJS
|
|
150
|
+
* queries.
|
|
151
|
+
*/
|
|
152
|
+
inspect(selector: string): Promise<{
|
|
153
|
+
exists: boolean;
|
|
154
|
+
visible: boolean;
|
|
155
|
+
tagName?: string;
|
|
156
|
+
text?: string;
|
|
157
|
+
attributes?: Record<string, string>;
|
|
158
|
+
boundingBox?: {
|
|
159
|
+
x: number;
|
|
160
|
+
y: number;
|
|
161
|
+
width: number;
|
|
162
|
+
height: number;
|
|
163
|
+
};
|
|
164
|
+
}>;
|
|
165
|
+
/**
|
|
166
|
+
* List options in an Angular/React-style custom dropdown that uses
|
|
167
|
+
* the `{baseId}_option-{n}` pattern. Returns `[{id, text}]`. Used
|
|
168
|
+
* heavily in Anthem/Okta forms.
|
|
169
|
+
*
|
|
170
|
+
* If `baseId` is given, matches options whose id starts with
|
|
171
|
+
* `${baseId}_option-`. Otherwise, tries to infer from the provided
|
|
172
|
+
* button selector by looking for `_button` suffix.
|
|
173
|
+
*/
|
|
174
|
+
listOptions(buttonSelectorOrBaseId: string): Promise<{
|
|
175
|
+
id: string;
|
|
176
|
+
text: string;
|
|
177
|
+
}[]>;
|
|
178
|
+
/**
|
|
179
|
+
* Return Performance API resource entries since `sinceMs` milliseconds
|
|
180
|
+
* ago, optionally filtered by a substring or regex match on the URL.
|
|
181
|
+
*/
|
|
182
|
+
networkSince(sinceMs: number, pattern?: string | RegExp): Promise<{
|
|
183
|
+
name: string;
|
|
184
|
+
startTime: number;
|
|
185
|
+
durationMs: number;
|
|
186
|
+
}[]>;
|
|
187
|
+
/**
|
|
188
|
+
* Boolean convenience: did a network request matching `pattern` fire
|
|
189
|
+
* in the last `sinceMs` milliseconds? Critical for "did my submit
|
|
190
|
+
* actually reach the server?" diagnostics.
|
|
191
|
+
*/
|
|
192
|
+
didRequestFireSince(pattern: string | RegExp, sinceMs: number): Promise<boolean>;
|
|
193
|
+
/**
|
|
194
|
+
* Proactively hide fixed/sticky overlays that commonly block clicks:
|
|
195
|
+
* chat widgets, cookie banners, "we value your feedback" modals,
|
|
196
|
+
* cookie consent, newsletter signups. Returns the count of hidden
|
|
197
|
+
* elements and a list of CSS selectors that were affected.
|
|
198
|
+
*/
|
|
199
|
+
dismissOverlays(): Promise<{
|
|
200
|
+
hidden: number;
|
|
201
|
+
selectors: string[];
|
|
202
|
+
}>;
|
|
203
|
+
frame(selector: string): Promise<BlackTipFrame>;
|
|
204
|
+
frames(): Promise<FrameInfo[]>;
|
|
205
|
+
getTabs(): Promise<TabInfo[]>;
|
|
206
|
+
newTab(url?: string): Promise<number>;
|
|
207
|
+
switchTab(index: number): Promise<void>;
|
|
208
|
+
closeTab(index?: number): Promise<void>;
|
|
209
|
+
newContext(): Promise<void>;
|
|
210
|
+
cookies(): Promise<{
|
|
211
|
+
name: string;
|
|
212
|
+
value: string;
|
|
213
|
+
domain: string;
|
|
214
|
+
path: string;
|
|
215
|
+
}[]>;
|
|
216
|
+
setCookies(cookies: {
|
|
217
|
+
name: string;
|
|
218
|
+
value: string;
|
|
219
|
+
domain: string;
|
|
220
|
+
path: string;
|
|
221
|
+
url?: string;
|
|
222
|
+
}[]): Promise<void>;
|
|
223
|
+
clearCookies(): Promise<void>;
|
|
224
|
+
executeJS(script: string): Promise<unknown>;
|
|
225
|
+
createProfile(name: string, config: Partial<ProfileConfig>): void;
|
|
226
|
+
getProfile(name: string): ProfileConfig;
|
|
227
|
+
listProfiles(): string[];
|
|
228
|
+
deleteProfile(name: string): void;
|
|
229
|
+
/**
|
|
230
|
+
* Returns detailed usage instructions for AI agents.
|
|
231
|
+
* Call this on first use to understand how to drive BlackTip correctly.
|
|
232
|
+
*/
|
|
233
|
+
static agentGuide(): string;
|
|
234
|
+
static pool(count: number, config?: BlackTipConfig): Promise<BlackTip[]>;
|
|
235
|
+
/**
|
|
236
|
+
* Start a TCP command server. Agents connect and send JS commands that
|
|
237
|
+
* execute with `bt` in scope. Each command returns a result and saves
|
|
238
|
+
* a screenshot to `screenshotPath`.
|
|
239
|
+
*
|
|
240
|
+
* Usage from CLI: node -e "net.createConnection(port).write('await bt.click(\"#btn\")\n__END__\n')"
|
|
241
|
+
* Or use the built-in CLI: npx blacktip serve
|
|
242
|
+
*/
|
|
243
|
+
serve(port?: number, screenshotPath?: string): Promise<Server>;
|
|
244
|
+
/**
|
|
245
|
+
* Pause execution inside a command and wait for a value to be sent via
|
|
246
|
+
* the RESUME protocol. Only usable when running under serve mode.
|
|
247
|
+
*
|
|
248
|
+
* Usage (from agent side):
|
|
249
|
+
* const value = await bt.pauseForInput({ prompt: "Enter SMS code" });
|
|
250
|
+
* await bt.type('input[name="credentials.passcode"]', value, { paste: true });
|
|
251
|
+
*
|
|
252
|
+
* The serve mode forwards a `{paused:true, pauseId, prompt}` frame to
|
|
253
|
+
* the client. When the client sends `RESUME <id>\n<value>`, this call
|
|
254
|
+
* resolves with the value. If `validate` is provided and the value
|
|
255
|
+
* doesn't match, the call rejects with a validation error.
|
|
256
|
+
*/
|
|
257
|
+
pauseForInput(options: {
|
|
258
|
+
prompt: string;
|
|
259
|
+
validate?: RegExp | ((v: string) => boolean);
|
|
260
|
+
timeoutMs?: number;
|
|
261
|
+
}): Promise<string>;
|
|
262
|
+
private executeAction;
|
|
263
|
+
private applyRetryStrategy;
|
|
264
|
+
private mouseX;
|
|
265
|
+
private mouseY;
|
|
266
|
+
private getMousePosition;
|
|
267
|
+
private performMouseMove;
|
|
268
|
+
private resolveProfile;
|
|
269
|
+
private ensureLaunched;
|
|
270
|
+
private sleep;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Frame context — same action methods as BlackTip, scoped to an iframe.
|
|
274
|
+
*/
|
|
275
|
+
export declare class BlackTipFrame {
|
|
276
|
+
private frame;
|
|
277
|
+
private engine;
|
|
278
|
+
private finder;
|
|
279
|
+
private logger;
|
|
280
|
+
constructor(frame: Frame, engine: BehavioralEngine, finder: ElementFinder, logger: Logger);
|
|
281
|
+
click(selector: string, options?: ClickOptions): Promise<ActionResult>;
|
|
282
|
+
type(selector: string, text: string, options?: TypeOptions): Promise<ActionResult>;
|
|
283
|
+
extractText(selector: string): Promise<string>;
|
|
284
|
+
hover(selector: string): Promise<ActionResult>;
|
|
285
|
+
select(selector: string, value: string): Promise<ActionResult>;
|
|
286
|
+
waitFor(selector: string, options?: WaitForOptions): Promise<WaitResult>;
|
|
287
|
+
private sleep;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=blacktip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blacktip.d.ts","sourceRoot":"","sources":["../src/blacktip.ts"],"names":[],"mappings":"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"}
|