droidline 0.1.12 → 0.1.13

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/dist/client.js CHANGED
@@ -362,7 +362,8 @@ export class Device extends DeviceCommands {
362
362
  }
363
363
  async _saveImage(cmd, params) {
364
364
  const { path, ...rest } = params;
365
- if (typeof path === "string" && rest.format === undefined) {
365
+ // Only screenshot has a format; pull saves the bytes as they are.
366
+ if (typeof path === "string" && cmd === "screenshot" && rest.format === undefined) {
366
367
  const format = IMAGE_FORMATS[extname(path).toLowerCase()];
367
368
  if (format)
368
369
  rest.format = format;
@@ -155,8 +155,16 @@ export interface Contact {
155
155
  emails?: any;
156
156
  [field: string]: any;
157
157
  }
158
+ export interface FileEntry {
159
+ name?: any;
160
+ path?: any;
161
+ size?: any;
162
+ time?: any;
163
+ dir?: any;
164
+ [field: string]: any;
165
+ }
158
166
  /** Error codes the server can answer with, from spec/commands.json. */
159
- export type ErrorCode = "NOT_FOUND" | "AMBIGUOUS" | "NOT_CLICKABLE" | "TIMEOUT" | "NO_ACCESSIBILITY" | "NO_IME" | "NO_PERMISSION" | "APP_NOT_FOUND" | "ACTIVITY_BLOCKED" | "PROXY_FAILED" | "UNKNOWN_CMD" | "UNSUPPORTED" | "BAD_ARGS" | "DEVICE_NOT_FOUND" | "DEVICE_OFFLINE" | "DEVICE_AMBIGUOUS" | "DEVICE_LEASED" | "LEASE_NOT_FOUND" | "NO_FREE_DEVICE" | "OCR_UNAVAILABLE" | "AGENT_RESTARTED" | "UNAUTHORIZED" | "PAIRING_FAILED" | "INTERNAL";
167
+ export type ErrorCode = "NOT_FOUND" | "AMBIGUOUS" | "NOT_CLICKABLE" | "TIMEOUT" | "NO_ACCESSIBILITY" | "NO_IME" | "NO_PERMISSION" | "APP_NOT_FOUND" | "ACTIVITY_BLOCKED" | "PROXY_FAILED" | "SEND_FAILED" | "LOCATION_OFF" | "UNKNOWN_CMD" | "UNSUPPORTED" | "BAD_ARGS" | "DEVICE_NOT_FOUND" | "DEVICE_OFFLINE" | "DEVICE_AMBIGUOUS" | "DEVICE_LEASED" | "LEASE_NOT_FOUND" | "NO_FREE_DEVICE" | "OCR_UNAVAILABLE" | "AGENT_RESTARTED" | "UNAUTHORIZED" | "PAIRING_FAILED" | "INTERNAL";
160
168
  /** HTTP status and default retryable flag of each error code. */
161
169
  export declare const ERRORS: Readonly<Record<ErrorCode, {
162
170
  readonly http: number;
@@ -580,6 +588,43 @@ export interface ContactsOptions {
580
588
  /** Most contacts to return, up to 500. @default 50 */
581
589
  max?: number;
582
590
  }
591
+ export interface WaitSmsOptions {
592
+ /** Only from a number or sender containing this. Spaces and dashes are ignored. */
593
+ address?: string;
594
+ /** Only messages whose text contains this, ignoring case. */
595
+ contains?: string;
596
+ /** Seconds to wait. @default 60 */
597
+ timeout?: number;
598
+ }
599
+ export interface SmsSendResult {
600
+ parts: number;
601
+ }
602
+ export interface FilesOptions {
603
+ /** Folder to list. Empty means the top of shared storage. @default "" */
604
+ path?: string;
605
+ /** name sorts by name, time puts the newest first. @default "name" */
606
+ sort?: "name" | "time";
607
+ /** Most entries to return, up to 1000. @default 200 */
608
+ max?: number;
609
+ }
610
+ export interface PullResult {
611
+ name: string;
612
+ size: number;
613
+ data: string;
614
+ }
615
+ export interface LocationOptions {
616
+ /** Seconds to wait for a new fix. @default 10 */
617
+ timeout?: number;
618
+ /** A fix the phone already has is good enough if it is at most this old. 0 always asks for a new one. @default 60 */
619
+ max_age?: number;
620
+ }
621
+ export interface LocationResult {
622
+ lat: number;
623
+ lon: number;
624
+ accuracy: number;
625
+ time: number;
626
+ provider: string;
627
+ }
583
628
  export interface ChromeGoOptions {
584
629
  /** Open in a new tab. @default false */
585
630
  new_tab?: boolean;
@@ -4419,6 +4464,276 @@ export declare abstract class DeviceCommands {
4419
4464
  * @example await d.contacts("Kim")
4420
4465
  */
4421
4466
  contacts(query?: string, max?: number, opts?: ContactsOptions): Promise<Array<Contact>>;
4467
+ /**
4468
+ * Wait for a new text message and return it.
4469
+ *
4470
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4471
+ *
4472
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4473
+ * @param contains Only messages whose text contains this, ignoring case.
4474
+ * @param timeout Seconds to wait. Default: 60.
4475
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4476
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4477
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4478
+ */
4479
+ wait_sms(opts?: WaitSmsOptions): Promise<Sms>;
4480
+ /**
4481
+ * Wait for a new text message and return it.
4482
+ *
4483
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4484
+ *
4485
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4486
+ * @param contains Only messages whose text contains this, ignoring case.
4487
+ * @param timeout Seconds to wait. Default: 60.
4488
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4489
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4490
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4491
+ */
4492
+ wait_sms(address?: string, opts?: WaitSmsOptions): Promise<Sms>;
4493
+ /**
4494
+ * Wait for a new text message and return it.
4495
+ *
4496
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4497
+ *
4498
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4499
+ * @param contains Only messages whose text contains this, ignoring case.
4500
+ * @param timeout Seconds to wait. Default: 60.
4501
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4502
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4503
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4504
+ */
4505
+ wait_sms(address?: string, contains?: string, opts?: WaitSmsOptions): Promise<Sms>;
4506
+ /**
4507
+ * Wait for a new text message and return it.
4508
+ *
4509
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4510
+ *
4511
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4512
+ * @param contains Only messages whose text contains this, ignoring case.
4513
+ * @param timeout Seconds to wait. Default: 60.
4514
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4515
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4516
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4517
+ */
4518
+ wait_sms(address?: string, contains?: string, timeout?: number, opts?: WaitSmsOptions): Promise<Sms>;
4519
+ /**
4520
+ * Wait for a new text message and return it.
4521
+ *
4522
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4523
+ *
4524
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4525
+ * @param contains Only messages whose text contains this, ignoring case.
4526
+ * @param timeout Seconds to wait. Default: 60.
4527
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4528
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4529
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4530
+ * @alias wait_sms
4531
+ */
4532
+ waitSms(opts?: WaitSmsOptions): Promise<Sms>;
4533
+ /**
4534
+ * Wait for a new text message and return it.
4535
+ *
4536
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4537
+ *
4538
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4539
+ * @param contains Only messages whose text contains this, ignoring case.
4540
+ * @param timeout Seconds to wait. Default: 60.
4541
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4542
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4543
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4544
+ * @alias wait_sms
4545
+ */
4546
+ waitSms(address?: string, opts?: WaitSmsOptions): Promise<Sms>;
4547
+ /**
4548
+ * Wait for a new text message and return it.
4549
+ *
4550
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4551
+ *
4552
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4553
+ * @param contains Only messages whose text contains this, ignoring case.
4554
+ * @param timeout Seconds to wait. Default: 60.
4555
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4556
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4557
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4558
+ * @alias wait_sms
4559
+ */
4560
+ waitSms(address?: string, contains?: string, opts?: WaitSmsOptions): Promise<Sms>;
4561
+ /**
4562
+ * Wait for a new text message and return it.
4563
+ *
4564
+ * Optional, needs the SMS permission like sms. The PC checks the phone's inbox every second, and only messages that arrive after the call starts count. The MCP server lists this tool only when --tools names it.
4565
+ *
4566
+ * @param address Only from a number or sender containing this. Spaces and dashes are ignored.
4567
+ * @param contains Only messages whose text contains this, ignoring case.
4568
+ * @param timeout Seconds to wait. Default: 60.
4569
+ * @param opts Optional parameters by name, see WaitSmsOptions.
4570
+ * @throws {DroidlineError} with code TIMEOUT, NO_PERMISSION.
4571
+ * @example await d.wait_sms({ contains: "인증번호", timeout: 120 })
4572
+ * @alias wait_sms
4573
+ */
4574
+ waitSms(address?: string, contains?: string, timeout?: number, opts?: WaitSmsOptions): Promise<Sms>;
4575
+ /**
4576
+ * Send a text message from the phone.
4577
+ *
4578
+ * Optional. Allow sending SMS on the app's Setup tab first. Sends from the phone's default SIM, and your carrier may charge for it. Long text goes out as several parts. Answers after the network accepts every part, or SEND_FAILED. The MCP server lists this tool only when --tools names it.
4579
+ *
4580
+ * @param number Phone number to send to.
4581
+ * @param text Message text.
4582
+ * @throws {DroidlineError} with code SEND_FAILED, NO_PERMISSION.
4583
+ * @example await d.sms_send("01012345678", "On my way")
4584
+ */
4585
+ sms_send(number: string, text: string): Promise<SmsSendResult>;
4586
+ /**
4587
+ * Send a text message from the phone.
4588
+ *
4589
+ * Optional. Allow sending SMS on the app's Setup tab first. Sends from the phone's default SIM, and your carrier may charge for it. Long text goes out as several parts. Answers after the network accepts every part, or SEND_FAILED. The MCP server lists this tool only when --tools names it.
4590
+ *
4591
+ * @param number Phone number to send to.
4592
+ * @param text Message text.
4593
+ * @throws {DroidlineError} with code SEND_FAILED, NO_PERMISSION.
4594
+ * @example await d.sms_send("01012345678", "On my way")
4595
+ * @alias sms_send
4596
+ */
4597
+ smsSend(number: string, text: string): Promise<SmsSendResult>;
4598
+ /**
4599
+ * Start a phone call.
4600
+ *
4601
+ * Optional. Allow phone calls on the app's Setup tab first. Opens the phone app already dialing and answers right away; end the call with hang_up. The MCP server lists this tool only when --tools names it.
4602
+ *
4603
+ * @param number Phone number to call.
4604
+ * @throws {DroidlineError} with code NO_PERMISSION.
4605
+ * @example await d.dial("01012345678")
4606
+ */
4607
+ dial(number: string): Promise<void>;
4608
+ /**
4609
+ * End the current call, or reject a ringing one.
4610
+ *
4611
+ * Optional, needs the phone permission like dial. Answers false when there was no call. The MCP server lists this tool only when --tools names it.
4612
+ *
4613
+ * @throws {DroidlineError} with code NO_PERMISSION.
4614
+ * @example await d.hang_up()
4615
+ */
4616
+ hang_up(): Promise<boolean>;
4617
+ /**
4618
+ * End the current call, or reject a ringing one.
4619
+ *
4620
+ * Optional, needs the phone permission like dial. Answers false when there was no call. The MCP server lists this tool only when --tools names it.
4621
+ *
4622
+ * @throws {DroidlineError} with code NO_PERMISSION.
4623
+ * @example await d.hang_up()
4624
+ * @alias hang_up
4625
+ */
4626
+ hangUp(): Promise<boolean>;
4627
+ /**
4628
+ * List a folder in the phone's shared storage.
4629
+ *
4630
+ * Optional. Allow file access on the app's Setup tab first. Paths are relative to shared storage (/sdcard), such as DCIM/Screenshots or Download, and cannot leave it. The MCP server lists this tool only when --tools names it.
4631
+ *
4632
+ * @param path Folder to list. Empty means the top of shared storage. Default: "".
4633
+ * @param sort name sorts by name, time puts the newest first. Default: "name".
4634
+ * @param max Most entries to return, up to 1000. Default: 200.
4635
+ * @param opts Optional parameters by name, see FilesOptions.
4636
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4637
+ * @example await d.files("DCIM/Screenshots", { sort: "time", max: 1 })
4638
+ */
4639
+ files(opts?: FilesOptions): Promise<Array<FileEntry>>;
4640
+ /**
4641
+ * List a folder in the phone's shared storage.
4642
+ *
4643
+ * Optional. Allow file access on the app's Setup tab first. Paths are relative to shared storage (/sdcard), such as DCIM/Screenshots or Download, and cannot leave it. The MCP server lists this tool only when --tools names it.
4644
+ *
4645
+ * @param path Folder to list. Empty means the top of shared storage. Default: "".
4646
+ * @param sort name sorts by name, time puts the newest first. Default: "name".
4647
+ * @param max Most entries to return, up to 1000. Default: 200.
4648
+ * @param opts Optional parameters by name, see FilesOptions.
4649
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4650
+ * @example await d.files("DCIM/Screenshots", { sort: "time", max: 1 })
4651
+ */
4652
+ files(path?: string, opts?: FilesOptions): Promise<Array<FileEntry>>;
4653
+ /**
4654
+ * List a folder in the phone's shared storage.
4655
+ *
4656
+ * Optional. Allow file access on the app's Setup tab first. Paths are relative to shared storage (/sdcard), such as DCIM/Screenshots or Download, and cannot leave it. The MCP server lists this tool only when --tools names it.
4657
+ *
4658
+ * @param path Folder to list. Empty means the top of shared storage. Default: "".
4659
+ * @param sort name sorts by name, time puts the newest first. Default: "name".
4660
+ * @param max Most entries to return, up to 1000. Default: 200.
4661
+ * @param opts Optional parameters by name, see FilesOptions.
4662
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4663
+ * @example await d.files("DCIM/Screenshots", { sort: "time", max: 1 })
4664
+ */
4665
+ files(path?: string, sort?: "name" | "time", opts?: FilesOptions): Promise<Array<FileEntry>>;
4666
+ /**
4667
+ * List a folder in the phone's shared storage.
4668
+ *
4669
+ * Optional. Allow file access on the app's Setup tab first. Paths are relative to shared storage (/sdcard), such as DCIM/Screenshots or Download, and cannot leave it. The MCP server lists this tool only when --tools names it.
4670
+ *
4671
+ * @param path Folder to list. Empty means the top of shared storage. Default: "".
4672
+ * @param sort name sorts by name, time puts the newest first. Default: "name".
4673
+ * @param max Most entries to return, up to 1000. Default: 200.
4674
+ * @param opts Optional parameters by name, see FilesOptions.
4675
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4676
+ * @example await d.files("DCIM/Screenshots", { sort: "time", max: 1 })
4677
+ */
4678
+ files(path?: string, sort?: "name" | "time", max?: number, opts?: FilesOptions): Promise<Array<FileEntry>>;
4679
+ /**
4680
+ * Copy a file from the phone's shared storage to the PC.
4681
+ *
4682
+ * Optional, needs file access like files. Up to 32 MB. Without path the SDKs return the bytes and the CLI saves the file under its own name. The MCP server lists this tool only when --tools names it.
4683
+ *
4684
+ * @param file File on the phone, relative to shared storage, such as Download/report.pdf.
4685
+ * @param path Save to this local file.
4686
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4687
+ * @example await d.pull("Download/report.pdf", "report.pdf")
4688
+ */
4689
+ pull(file: string): Promise<Buffer>;
4690
+ /**
4691
+ * Copy a file from the phone's shared storage to the PC.
4692
+ *
4693
+ * Optional, needs file access like files. Up to 32 MB. Without path the SDKs return the bytes and the CLI saves the file under its own name. The MCP server lists this tool only when --tools names it.
4694
+ *
4695
+ * @param file File on the phone, relative to shared storage, such as Download/report.pdf.
4696
+ * @param path Save to this local file.
4697
+ * @throws {DroidlineError} with code BAD_ARGS, NO_PERMISSION.
4698
+ * @example await d.pull("Download/report.pdf", "report.pdf")
4699
+ */
4700
+ pull(file: string, path: string): Promise<string>;
4701
+ /**
4702
+ * The phone's current location.
4703
+ *
4704
+ * Optional. Allow location on the app's Setup tab first, including "Allow all the time", because Droidline asks while it runs in the background. Answers LOCATION_OFF when location is turned off on the phone. The MCP server lists this tool only when --tools names it.
4705
+ *
4706
+ * @param timeout Seconds to wait for a new fix. Default: 10.
4707
+ * @param max_age A fix the phone already has is good enough if it is at most this old. 0 always asks for a new one. Default: 60.
4708
+ * @param opts Optional parameters by name, see LocationOptions.
4709
+ * @throws {DroidlineError} with code TIMEOUT, LOCATION_OFF, NO_PERMISSION.
4710
+ * @example await d.location()
4711
+ */
4712
+ location(opts?: LocationOptions): Promise<LocationResult>;
4713
+ /**
4714
+ * The phone's current location.
4715
+ *
4716
+ * Optional. Allow location on the app's Setup tab first, including "Allow all the time", because Droidline asks while it runs in the background. Answers LOCATION_OFF when location is turned off on the phone. The MCP server lists this tool only when --tools names it.
4717
+ *
4718
+ * @param timeout Seconds to wait for a new fix. Default: 10.
4719
+ * @param max_age A fix the phone already has is good enough if it is at most this old. 0 always asks for a new one. Default: 60.
4720
+ * @param opts Optional parameters by name, see LocationOptions.
4721
+ * @throws {DroidlineError} with code TIMEOUT, LOCATION_OFF, NO_PERMISSION.
4722
+ * @example await d.location()
4723
+ */
4724
+ location(timeout?: number, opts?: LocationOptions): Promise<LocationResult>;
4725
+ /**
4726
+ * The phone's current location.
4727
+ *
4728
+ * Optional. Allow location on the app's Setup tab first, including "Allow all the time", because Droidline asks while it runs in the background. Answers LOCATION_OFF when location is turned off on the phone. The MCP server lists this tool only when --tools names it.
4729
+ *
4730
+ * @param timeout Seconds to wait for a new fix. Default: 10.
4731
+ * @param max_age A fix the phone already has is good enough if it is at most this old. 0 always asks for a new one. Default: 60.
4732
+ * @param opts Optional parameters by name, see LocationOptions.
4733
+ * @throws {DroidlineError} with code TIMEOUT, LOCATION_OFF, NO_PERMISSION.
4734
+ * @example await d.location()
4735
+ */
4736
+ location(timeout?: number, max_age?: number, opts?: LocationOptions): Promise<LocationResult>;
4422
4737
  }
4423
4738
  /** Commands the PC server answers itself. Droidline extends this and implements _run. */
4424
4739
  export declare abstract class ClientCommands extends EventEmitter {
package/dist/generated.js CHANGED
@@ -24,6 +24,10 @@ export const ERRORS = {
24
24
  ACTIVITY_BLOCKED: { http: 422, retryable: false },
25
25
  /** Upstream connection or authentication failed. reason is auth, timeout, refused or protocol. */
26
26
  PROXY_FAILED: { http: 502, retryable: true },
27
+ /** The phone or the network refused the message. reason says why, such as no_service or radio_off. */
28
+ SEND_FAILED: { http: 502, retryable: true },
29
+ /** Turn on location in the phone's quick settings or Settings, then try again. */
30
+ LOCATION_OFF: { http: 409, retryable: false },
27
31
  /** Command not supported. The agent version is returned. */
28
32
  UNKNOWN_CMD: { http: 404, retryable: false },
29
33
  /** The phone's Android version cannot do this without ADB or root. */
@@ -394,6 +398,36 @@ export class DeviceCommands {
394
398
  async contacts(...args) {
395
399
  return this._run("contacts", "value", collect("contacts", args, [], ["query", "max"]));
396
400
  }
401
+ async wait_sms(...args) {
402
+ return this._run("wait_sms", "value", collect("wait_sms", args, [], ["address", "contains", "timeout"]));
403
+ }
404
+ async waitSms(...args) {
405
+ return this._run("wait_sms", "value", collect("wait_sms", args, [], ["address", "contains", "timeout"]));
406
+ }
407
+ async sms_send(...args) {
408
+ return this._run("sms_send", "fields", collect("sms_send", args, ["number", "text"], []));
409
+ }
410
+ async smsSend(...args) {
411
+ return this._run("sms_send", "fields", collect("sms_send", args, ["number", "text"], []));
412
+ }
413
+ async dial(...args) {
414
+ return this._run("dial", "none", collect("dial", args, ["number"], []));
415
+ }
416
+ async hang_up(...args) {
417
+ return this._run("hang_up", "value", collect("hang_up", args, [], []));
418
+ }
419
+ async hangUp(...args) {
420
+ return this._run("hang_up", "value", collect("hang_up", args, [], []));
421
+ }
422
+ async files(...args) {
423
+ return this._run("files", "value", collect("files", args, [], ["path", "sort", "max"]));
424
+ }
425
+ async pull(...args) {
426
+ return this._saveImage("pull", collect("pull", args, ["file"], ["path"]));
427
+ }
428
+ async location(...args) {
429
+ return this._run("location", "fields", collect("location", args, [], ["timeout", "max_age"]));
430
+ }
397
431
  }
398
432
  /** Commands the PC server answers itself. Droidline extends this and implements _run. */
399
433
  export class ClientCommands extends EventEmitter {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droidline",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Android automation from Node.js: test your apps on real phones, script the tasks you repeat and run many phones at once. No ADB, no USB cable, no root.",
5
5
  "license": "MIT",
6
6
  "type": "module",