@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.
Files changed (63) hide show
  1. package/AGENTS.md +249 -0
  2. package/LICENSE +38 -0
  3. package/README.md +234 -0
  4. package/dist/behavioral/calibration.d.ts +145 -0
  5. package/dist/behavioral/calibration.d.ts.map +1 -0
  6. package/dist/behavioral/calibration.js +242 -0
  7. package/dist/behavioral/calibration.js.map +1 -0
  8. package/dist/behavioral-engine.d.ts +156 -0
  9. package/dist/behavioral-engine.d.ts.map +1 -0
  10. package/dist/behavioral-engine.js +521 -0
  11. package/dist/behavioral-engine.js.map +1 -0
  12. package/dist/blacktip.d.ts +289 -0
  13. package/dist/blacktip.d.ts.map +1 -0
  14. package/dist/blacktip.js +1574 -0
  15. package/dist/blacktip.js.map +1 -0
  16. package/dist/browser-core.d.ts +47 -0
  17. package/dist/browser-core.d.ts.map +1 -0
  18. package/dist/browser-core.js +375 -0
  19. package/dist/browser-core.js.map +1 -0
  20. package/dist/cli.d.ts +20 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +226 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/element-finder.d.ts +42 -0
  25. package/dist/element-finder.d.ts.map +1 -0
  26. package/dist/element-finder.js +240 -0
  27. package/dist/element-finder.js.map +1 -0
  28. package/dist/evasion.d.ts +39 -0
  29. package/dist/evasion.d.ts.map +1 -0
  30. package/dist/evasion.js +488 -0
  31. package/dist/evasion.js.map +1 -0
  32. package/dist/fingerprint.d.ts +19 -0
  33. package/dist/fingerprint.d.ts.map +1 -0
  34. package/dist/fingerprint.js +171 -0
  35. package/dist/fingerprint.js.map +1 -0
  36. package/dist/index.d.ts +19 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +14 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/logging.d.ts +13 -0
  41. package/dist/logging.d.ts.map +1 -0
  42. package/dist/logging.js +42 -0
  43. package/dist/logging.js.map +1 -0
  44. package/dist/observability.d.ts +69 -0
  45. package/dist/observability.d.ts.map +1 -0
  46. package/dist/observability.js +189 -0
  47. package/dist/observability.js.map +1 -0
  48. package/dist/proxy-pool.d.ts +101 -0
  49. package/dist/proxy-pool.d.ts.map +1 -0
  50. package/dist/proxy-pool.js +156 -0
  51. package/dist/proxy-pool.js.map +1 -0
  52. package/dist/snapshot.d.ts +59 -0
  53. package/dist/snapshot.d.ts.map +1 -0
  54. package/dist/snapshot.js +91 -0
  55. package/dist/snapshot.js.map +1 -0
  56. package/dist/types.d.ts +243 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +15 -0
  59. package/dist/types.js.map +1 -0
  60. package/examples/01-basic-navigate.ts +40 -0
  61. package/examples/02-login-with-mfa.ts +68 -0
  62. package/examples/03-agent-serve-mode.md +98 -0
  63. 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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"}