@bryce3310687963/android-toolkit 0.0.0-stage → 1.0.50

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/index.d.ts ADDED
@@ -0,0 +1,346 @@
1
+ export interface AndroidContext {
2
+ runId: string;
3
+ query: string;
4
+ serial: string;
5
+ packageName: string;
6
+ adbPath: string;
7
+ actorKey?: string;
8
+ appVersion?: string;
9
+ slotKey?: string;
10
+ instanceId?: string;
11
+ externalIp?: string;
12
+ }
13
+
14
+ export interface ViewBounds {
15
+ left: number;
16
+ top: number;
17
+ right: number;
18
+ bottom: number;
19
+ width: number;
20
+ height: number;
21
+ centerX: number;
22
+ centerY: number;
23
+ }
24
+
25
+ export interface ViewNode {
26
+ resourceId: string;
27
+ id: string;
28
+ text: string;
29
+ contentDesc: string;
30
+ className: string;
31
+ packageName: string;
32
+ bounds: ViewBounds;
33
+ clickable: boolean;
34
+ enabled: boolean;
35
+ focusable: boolean;
36
+ focused: boolean;
37
+ scrollable: boolean;
38
+ visible: boolean;
39
+ children: ViewNode[];
40
+ }
41
+
42
+ export type ViewSelector = {
43
+ id?: string;
44
+ text?: string;
45
+ textContains?: string;
46
+ contentDesc?: string;
47
+ className?: string;
48
+ };
49
+
50
+ export interface WebViewHookConfig {
51
+ name: string | string[];
52
+ value: string[];
53
+ }
54
+
55
+ export interface DeviceCacheFileOptions {
56
+ dirName: string;
57
+ fileName: string;
58
+ text?: string;
59
+ timeoutMs?: number;
60
+ maxBuffer?: number;
61
+ }
62
+
63
+ export namespace Constants {
64
+ export const Code: Record<string, number>;
65
+ export const Status: Record<string, string>;
66
+ export const StoragePath: {
67
+ Input: '/apify_storage/input.json';
68
+ Output: '/apify_storage/output.json';
69
+ };
70
+ export const UnicodeIme: {
71
+ packageName: string;
72
+ component: string;
73
+ inputAction: string;
74
+ };
75
+ export const WebViewBridge: {
76
+ packageName: string;
77
+ actionCommand: string;
78
+ cacheDir: string;
79
+ hookConfigFile: string;
80
+ commandDir: string;
81
+ resultDir: string;
82
+ };
83
+ export const ActorKey: {
84
+ DoubaoAndroid: 'doubao.android';
85
+ ErineAndroid: 'erine.android';
86
+ WechatAndroid: 'wechat.android';
87
+ QwenAndroid: 'qwen.android';
88
+ YuanbaoAndroid: 'yuanbao.android';
89
+ XhsAndroid: 'xhs.android';
90
+ };
91
+ export const ActorInfo: Record<string, {
92
+ key: string;
93
+ name: string;
94
+ icon: string;
95
+ webviews: WebViewHookConfig[];
96
+ share: {
97
+ mode: 'clipboard';
98
+ prefix: string;
99
+ xurl: unknown[];
100
+ };
101
+ }>;
102
+ }
103
+
104
+ export namespace Errors {
105
+ export class CrawlerError extends Error {
106
+ code: number;
107
+ context: Record<string, unknown>;
108
+ constructor(input?: string | {
109
+ message?: string;
110
+ code?: number;
111
+ context?: Record<string, unknown>;
112
+ });
113
+ static isCrawlerError(error: unknown): boolean;
114
+ static from(error: unknown, fallback?: {
115
+ code?: number;
116
+ context?: Record<string, unknown>;
117
+ }): CrawlerError;
118
+ }
119
+ export function serializeError(error: unknown): Record<string, unknown>;
120
+ }
121
+
122
+ export interface LoggerAdapter {
123
+ info(message: string): void;
124
+ warning?(message: string): void;
125
+ warn?(message: string): void;
126
+ error?(message: string): void;
127
+ debug?(message: string): void;
128
+ }
129
+
130
+ export interface LoggerTemplate {
131
+ step(step: string, status?: string, details?: unknown, level?: 'info' | 'warn' | 'warning' | 'error' | 'success' | 'start' | 'debug'): void;
132
+ taskStart(detail?: unknown): void;
133
+ taskSuccess(detail?: unknown): void;
134
+ taskFail(detail?: unknown, error?: unknown): void;
135
+ launchStart(detail?: unknown): void;
136
+ launchSuccess(detail?: unknown): void;
137
+ launchFail(detail?: unknown, error?: unknown): void;
138
+ inputMethodSnapshotFail(error?: unknown): void;
139
+ inputMethodRestoreFail(error?: unknown): void;
140
+ stepStart(step?: string, detail?: unknown): void;
141
+ stepSuccess(step?: string, detail?: unknown): void;
142
+ stepFail(step?: string, error?: unknown): void;
143
+ stepRetry(step?: string, attempt?: unknown): void;
144
+ adbExec(detail?: unknown): void;
145
+ adbRetry(detail?: unknown): void;
146
+ mutationWaitStart(detail?: unknown): void;
147
+ mutationWaitSuccess(detail?: unknown): void;
148
+ mutationWaitWarn(detail?: unknown): void;
149
+ webViewCommand(detail?: unknown): void;
150
+ webViewSuccess(detail?: unknown): void;
151
+ webViewWarn(detail?: unknown): void;
152
+ webViewFail(error?: unknown): void;
153
+ screenshotStart(detail?: unknown): void;
154
+ screenshotDone(detail?: unknown): void;
155
+ shareStart(detail?: unknown): void;
156
+ shareSuccess(detail?: unknown): void;
157
+ shareFail(error?: unknown): void;
158
+ dataPush(detail?: unknown): void;
159
+ dataPushFail(error?: unknown): void;
160
+ info(message: string, detail?: unknown): void;
161
+ success(message: string, detail?: unknown): void;
162
+ warning(message: string, detail?: unknown): void;
163
+ warn(message: string, detail?: unknown): void;
164
+ error(message: string, detail?: unknown): void;
165
+ debug(message: string, detail?: unknown): void;
166
+ start(message: string, detail?: unknown): void;
167
+ }
168
+
169
+ export interface LoggerModule {
170
+ setLogger(logger: LoggerAdapter | null): void;
171
+ createLogger(scope?: string): ScopedLoggerModule;
172
+ useTemplate(logger?: LoggerAdapter | null): LoggerTemplate;
173
+ start(message: string, detail?: unknown): void;
174
+ success(message: string, detail?: unknown): void;
175
+ fail(message: string, error?: unknown): void;
176
+ warn(message: string, detail?: unknown): void;
177
+ warning(message: string, detail?: unknown): void;
178
+ error(message: string, detail?: unknown): void;
179
+ info(message: string, detail?: unknown): void;
180
+ debug(message: string, detail?: unknown): void;
181
+ duration(startedAt: number): string;
182
+ }
183
+
184
+ export interface ScopedLoggerModule {
185
+ start(message: string, detail?: unknown): void;
186
+ success(message: string, detail?: unknown): void;
187
+ fail(message: string, error?: unknown): void;
188
+ warn(message: string, detail?: unknown): void;
189
+ warning(message: string, detail?: unknown): void;
190
+ error(message: string, detail?: unknown): void;
191
+ info(message: string, detail?: unknown): void;
192
+ debug(message: string, detail?: unknown): void;
193
+ useTemplate(): LoggerTemplate;
194
+ }
195
+
196
+ export interface LogTemplate {
197
+ key: string;
198
+ label: string;
199
+ group: string;
200
+ attention: 'low' | 'medium' | 'high' | 'critical';
201
+ patterns: RegExp[];
202
+ defaultSelected?: boolean;
203
+ }
204
+
205
+ export interface NetworkCaptureModule {
206
+ path(ctx: AndroidContext, fileName?: string): string;
207
+ clear(ctx: AndroidContext, options?: {dirPath?: string}): Promise<boolean>;
208
+ writeRules(ctx: AndroidContext, options?: {rulesJson?: string | Record<string, unknown>}): Promise<boolean>;
209
+ readText(ctx: AndroidContext, fileName: string, options?: {maxBuffer?: number}): Promise<string>;
210
+ }
211
+
212
+ export interface AndroidToolkit {
213
+ Launch: {
214
+ run(handler: (args: {
215
+ input: Record<string, unknown>;
216
+ ctx: AndroidContext;
217
+ kit: AndroidToolkitRuntime;
218
+ ApifyKit: AndroidToolkitRuntime['ApifyKit'];
219
+ }) => Promise<void>, options?: Record<string, unknown>): Promise<void>;
220
+ };
221
+ ApifyKit: {
222
+ useApifyKit(options?: Record<string, unknown>): Promise<AndroidToolkitRuntime['ApifyKit']>;
223
+ };
224
+ DeviceInput: AndroidToolkitRuntime['DeviceInput'];
225
+ DeviceView: AndroidToolkitRuntime['DeviceView'];
226
+ DeviceSQLite: AndroidToolkitRuntime['DeviceSQLite'];
227
+ Device: AndroidToolkitRuntime['Device'];
228
+ Mutation: AndroidToolkitRuntime['Mutation'];
229
+ NetworkCapture: NetworkCaptureModule;
230
+ Share: AndroidToolkitRuntime['Share'];
231
+ WebView: AndroidToolkitRuntime['WebView'];
232
+ Constants: typeof Constants;
233
+ Errors: typeof Errors;
234
+ Logger: LoggerModule;
235
+ LOG_TEMPLATES: LogTemplate[];
236
+ $Internals: {
237
+ LOG_TEMPLATES: LogTemplate[];
238
+ stripAnsi(input: unknown): string;
239
+ };
240
+ Context: {
241
+ createAndroidContext(input?: Record<string, unknown>, defaults?: Record<string, unknown>): AndroidContext;
242
+ firstNonEmpty(...values: unknown[]): string;
243
+ requireNonEmpty(value: unknown, name: string): string;
244
+ };
245
+ }
246
+
247
+ export interface AndroidToolkitRuntime {
248
+ ApifyKit: {
249
+ runStep<T>(step: string, target: unknown, actionFn: () => Promise<T>, options?: Record<string, unknown>): Promise<T>;
250
+ runStepLoose<T>(step: string, target: unknown, actionFn: () => Promise<T>, options?: Record<string, unknown>): Promise<T>;
251
+ pushSuccess(data?: Record<string, unknown>, options?: Record<string, unknown>): Promise<void>;
252
+ pushFailed(error: unknown, meta?: Record<string, unknown>): Promise<void>;
253
+ pushArtifact(data?: Record<string, unknown>): Promise<void>;
254
+ hasPushed(): boolean;
255
+ };
256
+ Device: Record<string, (...args: any[]) => Promise<any>> & {
257
+ writeCacheFile(ctx: AndroidContext, options: DeviceCacheFileOptions): Promise<string>;
258
+ clearAppCache(ctx: AndroidContext, packageName?: string): Promise<void>;
259
+ };
260
+ DeviceSQLite: {
261
+ query(ctx: AndroidContext, options: Record<string, unknown>): Promise<Record<string, unknown>>;
262
+ health(ctx: AndroidContext, options?: Record<string, unknown>): Promise<Record<string, unknown>>;
263
+ };
264
+ DeviceInput: {
265
+ click(ctx: AndroidContext, selectorOrPoint: ViewSelector | ViewBounds | {x: number; y: number}, options?: Record<string, unknown>): Promise<DeviceClickResult>;
266
+ tap(ctx: AndroidContext, selectorOrPoint: ViewSelector | ViewBounds | {x: number; y: number}, options?: Record<string, unknown>): Promise<DeviceClickResult>;
267
+ fill(ctx: AndroidContext, selector: ViewSelector, text: string, options?: Record<string, unknown>): Promise<DeviceFillResult>;
268
+ type(ctx: AndroidContext, selector: ViewSelector, text: string, options?: Record<string, unknown>): Promise<DeviceFillResult>;
269
+ press(ctx: AndroidContext, key: string, options?: Record<string, unknown>): Promise<void>;
270
+ pressEnter(ctx: AndroidContext, options?: Record<string, unknown>): Promise<void>;
271
+ scroll(ctx: AndroidContext, selector: ViewSelector, direction: 'up' | 'down'): Promise<void>;
272
+ scrollStep(ctx: AndroidContext, selector: ViewSelector, direction: 'up' | 'down', options?: Record<string, unknown>): Promise<void>;
273
+ scrollToEnd(ctx: AndroidContext, selector: ViewSelector, options?: { settleMs?: number; optional?: boolean; timeoutMs?: number }): Promise<DeviceScrollResult>;
274
+ scrollToTop(ctx: AndroidContext, selector: ViewSelector, options?: { settleMs?: number; optional?: boolean; timeoutMs?: number }): Promise<DeviceScrollResult>;
275
+ };
276
+ DeviceView: {
277
+ snapshot(ctx: AndroidContext, options?: Record<string, unknown>): Promise<{xml: string; tree: ViewNode[]; roots: ViewNode[]; flat: ViewNode[]; nodes: ViewNode[]}>;
278
+ find(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<ViewNode>;
279
+ findAll(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<ViewNode[]>;
280
+ waitFor(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<ViewNode>;
281
+ bounds(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<ViewBounds>;
282
+ text(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<string>;
283
+ exists(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<boolean>;
284
+ isScrollable(ctx: AndroidContext, selector: ViewSelector, options?: Record<string, unknown>): Promise<boolean>;
285
+ hashNode(node: ViewNode): string;
286
+ };
287
+ Mutation: {
288
+ waitForStable(ctx: AndroidContext, selectors: ViewSelector | ViewSelector[] | string | string[], options?: Record<string, unknown>): Promise<Record<string, unknown>>;
289
+ waitForStableAcrossRoots(ctx: AndroidContext, selectors: ViewSelector | ViewSelector[] | string | string[], options?: Record<string, unknown>): Promise<Record<string, unknown>>;
290
+ useMonitor(ctx: AndroidContext, selectors: ViewSelector | ViewSelector[] | string | string[], options?: Record<string, unknown>): Promise<{stop(): Promise<Record<string, unknown>>}>;
291
+ };
292
+ NetworkCapture: NetworkCaptureModule;
293
+ WebView: {
294
+ configureHook(ctx: AndroidContext, actorInfo?: {webviews?: WebViewHookConfig[]}, options?: Record<string, unknown>): Promise<boolean>;
295
+ list(ctx: AndroidContext, options?: Record<string, unknown>): Promise<Record<string, unknown>[]>;
296
+ evaluate(ctx: AndroidContext, js: string, options?: Record<string, unknown>): Promise<{
297
+ id: string;
298
+ ok: boolean;
299
+ url: string;
300
+ title: string;
301
+ value: unknown;
302
+ error: string;
303
+ }>;
304
+ snapshot(ctx: AndroidContext, options?: Record<string, unknown>): Promise<{
305
+ url: string;
306
+ title: string;
307
+ text: string;
308
+ html: string;
309
+ raw: Record<string, unknown>;
310
+ }>;
311
+ waitForStable(ctx: AndroidContext, options?: Record<string, unknown>): Promise<Record<string, unknown>>;
312
+ click(ctx: AndroidContext, target?: string | Record<string, unknown>, options?: Record<string, unknown>): Promise<unknown>;
313
+ };
314
+ Share: {
315
+ captureScreen(ctx: AndroidContext, options?: Record<string, unknown>): Promise<string>;
316
+ captureLink(ctx: AndroidContext, options?: Record<string, unknown>): Promise<{link: string; source: string; payloadSnapshot: string}>;
317
+ };
318
+ Logger: LoggerModule;
319
+ }
320
+
321
+ export interface DeviceClickResult {
322
+ target?: ViewNode;
323
+ actual?: ViewNode;
324
+ point: {x: number; y: number};
325
+ }
326
+
327
+ export interface DeviceFillResult {
328
+ target?: ViewNode;
329
+ chars: number;
330
+ }
331
+
332
+ export interface DeviceScrollResult {
333
+ swipes: number;
334
+ stableRounds: number;
335
+ hash: string;
336
+ hashSource: string;
337
+ capped: boolean;
338
+ inferredBoundary?: boolean;
339
+ }
340
+
341
+ export function useAndroidToolKit(): AndroidToolkit;
342
+ export namespace useAndroidToolKit {
343
+ const Mode: {
344
+ default: 'default';
345
+ };
346
+ }
package/package.json CHANGED
@@ -1,6 +1,50 @@
1
1
  {
2
2
  "name": "@bryce3310687963/android-toolkit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.50",
4
+ "description": "Native Android automation toolkit for Apify-compatible actors.",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "browser": {
12
+ "types": "./browser.d.ts",
13
+ "default": "./dist/browser.js"
14
+ },
15
+ "types": "./index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs"
18
+ },
19
+ "./browser": {
20
+ "types": "./browser.d.ts",
21
+ "default": "./dist/browser.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist/",
26
+ "browser.d.ts",
27
+ "index.d.ts",
28
+ "README.md"
29
+ ],
30
+ "scripts": {
31
+ "build": "node build.js",
32
+ "check": "node --check index.js && node --check entrys/node.js && node --check entrys/browser.js && node --check build.js && find src -name '*.js' -maxdepth 3 -print0 | xargs -0 -n1 node --check",
33
+ "test": "node --test test/*.test.js",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "engines": {
37
+ "node": ">=22.5.0"
38
+ },
39
+ "dependencies": {
40
+ "fast-xml-parser": "^4.5.1",
41
+ "jimp": "^1.6.1",
42
+ "json-cycle": "^1.5.0"
43
+ },
44
+ "devDependencies": {
45
+ "esbuild": "^0.24.2"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ }
50
+ }