@mcesystems/apple-kit 1.0.79 → 1.0.81

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 (76) hide show
  1. package/dist/index.js +235 -143
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.mjs +231 -143
  4. package/dist/index.mjs.map +4 -4
  5. package/dist/types/index.d.ts +55 -12
  6. package/package.json +7 -6
  7. package/dist/resources/plist/ddm-managed-app.xml +0 -55
  8. package/dist/types/graphql/queries.d.ts +0 -9
  9. package/dist/types/graphql/queries.d.ts.map +0 -1
  10. package/dist/types/index.d.ts.map +0 -1
  11. package/dist/types/logic/actions/activation.d.ts +0 -12
  12. package/dist/types/logic/actions/activation.d.ts.map +0 -1
  13. package/dist/types/logic/actions/appState.d.ts +0 -2
  14. package/dist/types/logic/actions/appState.d.ts.map +0 -1
  15. package/dist/types/logic/actions/device.d.ts +0 -24
  16. package/dist/types/logic/actions/device.d.ts.map +0 -1
  17. package/dist/types/logic/actions/install.d.ts +0 -15
  18. package/dist/types/logic/actions/install.d.ts.map +0 -1
  19. package/dist/types/logic/actions/pair.d.ts +0 -6
  20. package/dist/types/logic/actions/pair.d.ts.map +0 -1
  21. package/dist/types/logic/actions/proxy.d.ts +0 -11
  22. package/dist/types/logic/actions/proxy.d.ts.map +0 -1
  23. package/dist/types/logic/actions/restore.d.ts +0 -36
  24. package/dist/types/logic/actions/restore.d.ts.map +0 -1
  25. package/dist/types/logic/actions/tool.d.ts +0 -8
  26. package/dist/types/logic/actions/tool.d.ts.map +0 -1
  27. package/dist/types/logic/actions/usbmuxd.d.ts +0 -10
  28. package/dist/types/logic/actions/usbmuxd.d.ts.map +0 -1
  29. package/dist/types/logic/activationFlow.d.ts +0 -16
  30. package/dist/types/logic/activationFlow.d.ts.map +0 -1
  31. package/dist/types/logic/appleDeviceKit.d.ts +0 -165
  32. package/dist/types/logic/appleDeviceKit.d.ts.map +0 -1
  33. package/dist/types/logic/dataParser.d.ts +0 -23
  34. package/dist/types/logic/dataParser.d.ts.map +0 -1
  35. package/dist/types/logic/iosCli.d.ts +0 -6
  36. package/dist/types/logic/iosCli.d.ts.map +0 -1
  37. package/dist/types/logic/iosClient.d.ts +0 -50
  38. package/dist/types/logic/iosClient.d.ts.map +0 -1
  39. package/dist/types/logic/profileParser.d.ts +0 -13
  40. package/dist/types/logic/profileParser.d.ts.map +0 -1
  41. package/dist/types/logic/utils/resolvePath.d.ts +0 -13
  42. package/dist/types/logic/utils/resolvePath.d.ts.map +0 -1
  43. package/dist/types/types/activation.d.ts +0 -28
  44. package/dist/types/types/activation.d.ts.map +0 -1
  45. package/dist/types/types/auth.d.ts +0 -13
  46. package/dist/types/types/auth.d.ts.map +0 -1
  47. package/dist/types/types/install.d.ts +0 -13
  48. package/dist/types/types/install.d.ts.map +0 -1
  49. package/dist/types/types/ios.d.ts +0 -166
  50. package/dist/types/types/ios.d.ts.map +0 -1
  51. package/dist/types/types/mdm.d.ts +0 -33
  52. package/dist/types/types/mdm.d.ts.map +0 -1
  53. package/dist/types/types/trust.d.ts +0 -10
  54. package/dist/types/types/trust.d.ts.map +0 -1
  55. package/dist/types/types/types.d.ts +0 -47
  56. package/dist/types/types/types.d.ts.map +0 -1
  57. package/dist/types/types/wifi.d.ts +0 -19
  58. package/dist/types/types/wifi.d.ts.map +0 -1
  59. package/dist/types/types.d.ts +0 -173
  60. package/dist/types/types.d.ts.map +0 -1
  61. package/dist/types/utils/authClient.d.ts +0 -7
  62. package/dist/types/utils/authClient.d.ts.map +0 -1
  63. package/dist/types/utils/ddmDeclaration.d.ts +0 -8
  64. package/dist/types/utils/ddmDeclaration.d.ts.map +0 -1
  65. package/dist/types/utils/debug.d.ts +0 -17
  66. package/dist/types/utils/debug.d.ts.map +0 -1
  67. package/dist/types/utils/installRawProfileRetry.d.ts +0 -7
  68. package/dist/types/utils/installRawProfileRetry.d.ts.map +0 -1
  69. package/dist/types/utils/mdmClient.d.ts +0 -7
  70. package/dist/types/utils/mdmClient.d.ts.map +0 -1
  71. package/dist/types/utils/templateLoader.d.ts +0 -8
  72. package/dist/types/utils/templateLoader.d.ts.map +0 -1
  73. package/dist/types/utils/trustProfile.d.ts +0 -12
  74. package/dist/types/utils/trustProfile.d.ts.map +0 -1
  75. package/dist/types/utils/wifiProfile.d.ts +0 -14
  76. package/dist/types/utils/wifiProfile.d.ts.map +0 -1
@@ -1,6 +1,7 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
3
  import { ChildProcess } from 'node:child_process';
4
+ import { EventEmitter } from 'node:events';
4
5
 
5
6
  export interface DeviceListOutput {
6
7
  deviceList: string[];
@@ -19,7 +20,8 @@ export interface IosCommandResult {
19
20
  export interface LogMessage {
20
21
  level: "info" | "error" | "warn" | "debug";
21
22
  msg: string;
22
- timestamp: string;
23
+ time: string;
24
+ err?: string;
23
25
  }
24
26
  export type CommandOutput = Record<string, unknown>[] | DeviceListOutput[] | [
25
27
  LockdownInfo
@@ -217,10 +219,6 @@ export declare class AppleDeviceKit {
217
219
  private ensureNotDisposed;
218
220
  info(): Promise<LockdownInfo>;
219
221
  listDevices(): Promise<IosListResult>;
220
- /**
221
- * Check if device is paired/trusted with this computer
222
- */
223
- isPaired(): Promise<boolean>;
224
222
  /**
225
223
  * Wait for device to be paired
226
224
  * Polls the pairing status until successful or timeout
@@ -228,7 +226,7 @@ export declare class AppleDeviceKit {
228
226
  * @param timeout Timeout in milliseconds (default: 120000)
229
227
  * @param pollInterval Poll interval in milliseconds (default: 1000)
230
228
  */
231
- waitForPairing(timeout?: number, pollInterval?: number): Promise<boolean>;
229
+ waitForPairing(timeout?: number, pollInterval?: number, signal?: AbortSignal): Promise<boolean>;
232
230
  /**
233
231
  * Attempt to pair/trust the device
234
232
  * User must accept the trust dialog on the device
@@ -247,7 +245,7 @@ export declare class AppleDeviceKit {
247
245
  * @param onWaitingForTrust Callback when waiting for user to accept trust dialog
248
246
  * @returns true if device is now trusted
249
247
  */
250
- trustDevice(timeout?: number, onWaitingForTrust?: () => void): Promise<boolean>;
248
+ trustDevice(timeout?: number, pollInterval?: number, onWaitingForTrust?: () => void, signal?: AbortSignal): Promise<boolean>;
251
249
  /**
252
250
  * Unpair/untrust the device
253
251
  */
@@ -307,12 +305,17 @@ export declare class AppleDeviceKit {
307
305
  * Activate the device using the activation flow.
308
306
  *
309
307
  * This flow can install WiFi/MDM/trust profiles and skip setup steps.
308
+ * Returns { promise, events } so callers can attach listeners before the flow completes.
309
+ * Pass an AbortSignal to cancel the flow (on each retry or between steps).
310
310
  *
311
311
  * Note: This requires a valid activation record or Apple server access.
312
312
  *
313
313
  * Precondition: the device must be paired and trusted.
314
314
  */
315
- activate(): Promise<(() => Promise<void>) | undefined>;
315
+ activate(signal?: AbortSignal): {
316
+ promise: Promise<(() => Promise<void>) | undefined>;
317
+ events: EventEmitter;
318
+ };
316
319
  /**
317
320
  * Get the device UDID
318
321
  */
@@ -349,8 +352,9 @@ export declare class AppleDeviceKit {
349
352
  export declare class IosClient {
350
353
  private iosPath;
351
354
  private udid;
352
- private usbmuxdAddress?;
353
- constructor(iosPath: string, udid: string, usbmuxdAddress?: string | undefined);
355
+ private readonly _usbmuxdAddress?;
356
+ constructor(iosPath: string, udid: string, _usbmuxdAddress?: string | undefined);
357
+ get usbmuxdAddress(): string | undefined;
354
358
  private safeParseJson;
355
359
  private parseFsyncTreeStdout;
356
360
  private parseIosOutput;
@@ -399,7 +403,11 @@ export declare class ActivationFlow {
399
403
  private readonly iosClient;
400
404
  private mdmClient;
401
405
  constructor(udid: string, iosClient: IosClient);
402
- run(steps?: string[]): Promise<(() => Promise<void>) | undefined>;
406
+ run(steps?: string[], signal?: AbortSignal): {
407
+ promise: Promise<(() => Promise<void>) | undefined>;
408
+ events: EventEmitter;
409
+ };
410
+ private runInternal;
403
411
  private installWifiProfile;
404
412
  private installMdmProfile;
405
413
  private removeWifiProfile;
@@ -407,6 +415,40 @@ export declare class ActivationFlow {
407
415
  private retryActivateCommand;
408
416
  private retry;
409
417
  }
418
+ /**
419
+ * Activation flow event names (use with EventEmitter.on/emit).
420
+ */
421
+ export declare const ACTIVATION_FLOW_EVENT_ACTIVATION_DONE = "activationDone";
422
+ export declare const ACTIVATION_FLOW_EVENT_WIFI_INSTALLED = "wifiInstalled";
423
+ export declare const ACTIVATION_FLOW_EVENT_MDM_PROFILE_INSTALLED = "mdmProfileInstalled";
424
+ export declare const ACTIVATION_FLOW_EVENT_STEPS_SKIPPED = "stepsSkipped";
425
+ /**
426
+ * Payload when activation completes (1-based attempt that succeeded).
427
+ */
428
+ export interface ActivationDonePayload {
429
+ attempt: number;
430
+ }
431
+ /**
432
+ * Payload for steps that complete after retries (0 = first try succeeded).
433
+ */
434
+ export interface RetriesPayload {
435
+ retries: number;
436
+ }
437
+ /**
438
+ * Payload when skip-steps command completes (steps requested to skip).
439
+ */
440
+ export interface StepsSkippedPayload {
441
+ steps: string[];
442
+ }
443
+ /**
444
+ * Event name to payload type map for activation flow events.
445
+ */
446
+ export interface ActivationFlowEventMap {
447
+ [ACTIVATION_FLOW_EVENT_ACTIVATION_DONE]: ActivationDonePayload;
448
+ [ACTIVATION_FLOW_EVENT_WIFI_INSTALLED]: RetriesPayload;
449
+ [ACTIVATION_FLOW_EVENT_MDM_PROFILE_INSTALLED]: RetriesPayload;
450
+ [ACTIVATION_FLOW_EVENT_STEPS_SKIPPED]: StepsSkippedPayload;
451
+ }
410
452
  interface DeviceListOutput$1 {
411
453
  deviceList: string[];
412
454
  }
@@ -424,7 +466,8 @@ interface IosCommandResult$1 {
424
466
  interface LogMessage$1 {
425
467
  level: "info" | "error" | "warn" | "debug";
426
468
  msg: string;
427
- timestamp: string;
469
+ time: string;
470
+ err?: string;
428
471
  }
429
472
  type CommandOutput$1 = Record<string, unknown>[] | DeviceListOutput$1[] | [
430
473
  LockdownInfo$1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcesystems/apple-kit",
3
- "version": "1.0.79",
3
+ "version": "1.0.81",
4
4
  "description": "iOS device management toolkit using libimobiledevice command-line tools",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -37,9 +37,8 @@
37
37
  "graphql-request": "^5.2.0",
38
38
  "tsx": "^4.21.0",
39
39
  "plist": "^3.1.0",
40
- "@mcesystems/mdm-client-g4": "1.0.79",
41
- "@mcesystems/tool-debug-g4": "1.0.79",
42
- "@mcesystems/usbmuxd-instance-manager": "1.0.79"
40
+ "@mcesystems/mdm-client-g4": "1.0.81",
41
+ "@mcesystems/tool-debug-g4": "1.0.81"
43
42
  },
44
43
  "devDependencies": {
45
44
  "@types/node": "^22.10.2",
@@ -53,7 +52,9 @@
53
52
  "rimraf": "^6.0.1",
54
53
  "typescript": "^5.7.2",
55
54
  "vitest": "^2.1.8",
56
- "@types/plist": "^3.0.5"
55
+ "@types/plist": "^3.0.5",
56
+ "@mcesystems/usb-device-listener": "1.0.81",
57
+ "@mcesystems/usbmuxd-instance-manager": "1.0.81"
57
58
  },
58
59
  "files": [
59
60
  "dist",
@@ -74,7 +75,7 @@
74
75
  "check:types": "tsc --noEmit",
75
76
  "activate:example": "tsx src/examples/activationExample.ts",
76
77
  "ios:example": "tsx src/examples/iosExample.ts",
77
- "usbmuxd:example": "cross-env DEBUG=* tsx src/examples/usbmuxdIntegrationExample.ts",
78
+ "usbmuxd:example": "tsx src/examples/usbmuxdIntegrationExample.ts",
78
79
  "pack": "npm pack",
79
80
  "test": "vitest run",
80
81
  "test:watch": "vitest"
@@ -1,55 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>PayloadContent</key>
6
- <array>
7
- <dict>
8
- <key>PayloadType</key>
9
- <string>com.apple.declarative-device-management</string>
10
- <key>PayloadVersion</key>
11
- <integer>1</integer>
12
- <key>PayloadIdentifier</key>
13
- <string>{{profileId}}.declarations</string>
14
- <key>PayloadUUID</key>
15
- <string>{{payloadUuid}}</string>
16
- <key>PayloadDisplayName</key>
17
- <string>DDM Declarations</string>
18
- <key>Declarations</key>
19
- <dict>
20
- <key>Configurations</key>
21
- <array>
22
- <dict>
23
- <key>Identifier</key>
24
- <string>{{declarationIdentifier}}</string>
25
- <key>Type</key>
26
- <string>com.apple.configuration.app.managed</string>
27
- <key>Payload</key>
28
- <dict>
29
- <key>AppComposedIdentifier</key>
30
- <string>{{bundleId}} ({{teamId}})</string>
31
- <key>InstallBehavior</key>
32
- <dict>
33
- <key>Install</key>
34
- <string>{{installBehavior}}</string>
35
- </dict>
36
- </dict>
37
- </dict>
38
- </array>
39
- </dict>
40
- </dict>
41
- </array>
42
- <key>PayloadType</key>
43
- <string>Configuration</string>
44
- <key>PayloadVersion</key>
45
- <integer>1</integer>
46
- <key>PayloadIdentifier</key>
47
- <string>{{profileId}}</string>
48
- <key>PayloadUUID</key>
49
- <string>{{profileUuid}}</string>
50
- <key>PayloadDisplayName</key>
51
- <string>{{displayName}}</string>
52
- <key>PayloadOrganization</key>
53
- <string>{{organizationName}}</string>
54
- </dict>
55
- </plist>
@@ -1,9 +0,0 @@
1
- /**
2
- * GraphQL queries and mutations for MDM API
3
- */
4
- export declare const GENERATE_ENROLLMENT_PROFILE: string;
5
- export declare const INSTALL_APP: string;
6
- export declare const WAIT_FOR_DEVICE_TO_ENROLL: string;
7
- export declare const AUTHORIZE_QUERY = "\n query Authorize($input: AuthorizeInput!) {\n authorize(input: $input) {\n status\n authorization_code\n }\n }\n";
8
- export declare const TOKEN_QUERY = "\n query Token($input: TokenInput!) {\n token(input: $input) {\n status\n access_token\n expires_in\n }\n }\n";
9
- //# sourceMappingURL=queries.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/graphql/queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,2BAA2B,QAOvC,CAAC;AAEF,eAAO,MAAM,WAAW,QAOvB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAQrC,CAAC;AAEF,eAAO,MAAM,eAAe,yIAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,yIAQvB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { ActivationState } from "@/types";
2
- export declare function getActivationState(udid: string): Promise<ActivationState>;
3
- export declare function activate(udid: string): Promise<boolean>;
4
- export interface ApplicationConfig {
5
- name: string;
6
- bundleId: string;
7
- version: string;
8
- build: string;
9
- icon: string;
10
- iconData: Buffer;
11
- }
12
- //# sourceMappingURL=activation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activation.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI/C,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB/E;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB7D;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB"}
@@ -1,2 +0,0 @@
1
- export declare function isAppOpened(bundleId: string, udid: string): Promise<boolean>;
2
- //# sourceMappingURL=appState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appState.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/appState.ts"],"names":[],"mappings":"AAiBA,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBlF"}
@@ -1,24 +0,0 @@
1
- import type { IosListResult, IosProfileListResult, LockdownInfo } from "@/types/ios";
2
- import type { IosClient } from "../iosClient";
3
- export declare class DeviceActions {
4
- private readonly udid;
5
- private readonly iosClient;
6
- constructor(udid: string, iosClient: IosClient);
7
- info(): Promise<LockdownInfo>;
8
- listDevices(): Promise<IosListResult>;
9
- wipe(): Promise<void>;
10
- removeProfile(profileIdentifier: string): Promise<void>;
11
- listProfiles(): Promise<IosProfileListResult>;
12
- pair(): Promise<boolean>;
13
- isPaired(): Promise<boolean>;
14
- trustDevice({ timeout, onWaitingForTrust, }: {
15
- timeout?: number;
16
- onWaitingForTrust?: () => void;
17
- }): Promise<boolean>;
18
- waitForPairing({ timeout, pollInterval, }: {
19
- timeout?: number;
20
- pollInterval?: number;
21
- }): Promise<boolean>;
22
- unpair(): Promise<boolean>;
23
- }
24
- //# sourceMappingURL=device.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/device.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAqB9C,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS;IAKzB,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAS7B,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAKrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,aAAa,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAK7C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAa5B,WAAW,CAAC,EACxB,OAAe,EACf,iBAAiB,GACjB,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB7D,cAAc,CAAC,EAC3B,OAAgB,EAChB,YAAmB,GACnB,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAiBvC"}
@@ -1,15 +0,0 @@
1
- import type { IosCommandResult } from "@/types/ios";
2
- import type { AppInfo } from "@/types/types";
3
- import { type InstallAppMdmOptions } from "@mcesystems/mdm-client-g4";
4
- import type { IosClient } from "../iosClient";
5
- export declare class InstallActions {
6
- private readonly udid;
7
- private readonly iosClient;
8
- constructor(udid: string, iosClient: IosClient);
9
- installLocalApp(ipaPath: string): Promise<IosCommandResult>;
10
- installManagedApp(ipaPath: string, options: InstallAppMdmOptions): Promise<IosCommandResult>;
11
- uninstallApp(bundleId: string): Promise<IosCommandResult>;
12
- listApps(): Promise<AppInfo[]>;
13
- isAppInstalled(bundleId: string): Promise<boolean>;
14
- }
15
- //# sourceMappingURL=install.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,2BAA2B,CAAC;AAEvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,qBAAa,cAAc;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS;IAKzB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAK3D,iBAAiB,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,CAAC;IAWf,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKzD,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAW9B,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/D"}
@@ -1,6 +0,0 @@
1
- export declare function isPaired(udid: string): Promise<boolean>;
2
- export declare function trustDevice(udid: string, timeout?: number, onWaitingForTrust?: () => void): Promise<boolean>;
3
- export declare function waitForPairing(udid: string, timeout?: number, pollInterval?: number): Promise<boolean>;
4
- export declare function pair(udid: string): Promise<boolean>;
5
- export declare function unpair(udid: string): Promise<boolean>;
6
- //# sourceMappingURL=pair.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/pair.ts"],"names":[],"mappings":"AAKA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa7D;AAED,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,SAAQ,EACf,iBAAiB,CAAC,EAAE,MAAM,IAAI,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmClB;AAED,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,SAAS,EAChB,YAAY,SAAO,GACjB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzD;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa3D"}
@@ -1,11 +0,0 @@
1
- import type { PortForwardResult } from "@/types/types";
2
- import type { IosClient } from "../iosClient";
3
- export declare class ProxyActions {
4
- private readonly udid;
5
- private readonly iosClient;
6
- private childProcess;
7
- constructor(udid: string, iosClient: IosClient);
8
- startPortForward(localPort: number, devicePort: number): Promise<PortForwardResult>;
9
- killPortForward(): Promise<void>;
10
- }
11
- //# sourceMappingURL=proxy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,qBAAa,YAAY;IAGvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAH3B,OAAO,CAAC,YAAY,CAAwC;gBAE1C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS;IAKzB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0BnF,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7C"}
@@ -1,36 +0,0 @@
1
- export interface RestoreOptions {
2
- /**
3
- * Timeout in milliseconds (default: 300000 = 5 minutes)
4
- * Restore operations can take a long time, especially with firmware download
5
- */
6
- timeout?: number;
7
- /**
8
- * Path to IPSW file. If not provided, will restore to latest available firmware
9
- */
10
- ipswPath?: string;
11
- /**
12
- * Use erase mode instead of full restore (faster, but may not work on all devices)
13
- */
14
- erase?: boolean;
15
- }
16
- export interface RestoreResult {
17
- success: boolean;
18
- stdout: string;
19
- stderr: string;
20
- exitCode: number;
21
- }
22
- /**
23
- * Restore an iOS device using idevicerestore
24
- *
25
- * This will restore the device to factory settings. If an IPSW path is provided,
26
- * it will restore to that firmware version. Otherwise, it will restore to the
27
- * latest available firmware for the device.
28
- *
29
- * WARNING: This operation will erase all data on the device!
30
- *
31
- * @param udid Device UDID
32
- * @param options Restore options
33
- * @returns Restore result
34
- */
35
- export declare function restoreDevice(udid: string, options?: RestoreOptions): Promise<RestoreResult>;
36
- //# sourceMappingURL=restore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/restore.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA0ExB"}
@@ -1,8 +0,0 @@
1
- import { type ExecOptions } from "node:child_process";
2
- import type { AppleToolType } from "@/types/types";
3
- import type { ExecResult } from "./device";
4
- /**
5
- * Execute an idevice tool command
6
- */
7
- export declare function runIDeviceTool(toolName: AppleToolType, args?: string[], options?: ExecOptions): Promise<ExecResult>;
8
- //# sourceMappingURL=tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AAG5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C;;GAEG;AACH,wBAAsB,cAAc,CACnC,QAAQ,EAAE,aAAa,EACvB,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,WAAgB,GACvB,OAAO,CAAC,UAAU,CAAC,CASrB"}
@@ -1,10 +0,0 @@
1
- import { type ChildProcess } from "node:child_process";
2
- type UsbmuxdOptions = {
3
- resourcesDir?: string;
4
- };
5
- export declare function startUsbmuxd(foreground?: boolean, options?: UsbmuxdOptions): ChildProcess;
6
- export declare function stopUsbmuxd(): void;
7
- export declare function isUsbmuxdRunning(): boolean;
8
- export declare function ensureUsbmuxd(foreground?: boolean, options?: UsbmuxdOptions): ChildProcess;
9
- export {};
10
- //# sourceMappingURL=usbmuxd.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usbmuxd.d.ts","sourceRoot":"","sources":["../../../../src/logic/actions/usbmuxd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAK9D,KAAK,cAAc,GAAG;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,wBAAgB,YAAY,CAAC,UAAU,UAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,CAqDvF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED,wBAAgB,aAAa,CAAC,UAAU,UAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,CAMxF"}
@@ -1,16 +0,0 @@
1
- import type { IosClient } from "./iosClient";
2
- export declare class ActivationFlow {
3
- private readonly udid;
4
- private readonly iosClient;
5
- private mdmClient;
6
- constructor(udid: string, iosClient: IosClient);
7
- run(steps?: string[]): Promise<(() => Promise<void>) | undefined>;
8
- private installWifiProfile;
9
- private installMdmProfile;
10
- private removeWifiProfile;
11
- private retryIosCommand;
12
- private retryActivateCommand;
13
- private retry;
14
- }
15
- export declare function resolveIosBinaryPath(): string | undefined;
16
- //# sourceMappingURL=activationFlow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activationFlow.d.ts","sourceRoot":"","sources":["../../../src/logic/activationFlow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,qBAAa,cAAc;IAIzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ3B,OAAO,CAAC,SAAS,CAAwB;gBAGvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS;IAKzB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;YAWhE,kBAAkB;YAelB,iBAAiB;YAyBjB,iBAAiB;YAUjB,eAAe;YAOf,oBAAoB;YAOpB,KAAK;CAwBnB;AAiCD,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAIzD"}
@@ -1,165 +0,0 @@
1
- import type { IosCommandResult, IosListResult, IosProfileListResult, LockdownInfo } from "@/types/ios";
2
- import type { AppInfo, PortForwardResult } from "@/types/types";
3
- import type { InstallAppMdmOptions } from "@mcesystems/mdm-client-g4";
4
- /**
5
- * AppleDeviceKit - iOS device operations wrapper
6
- *
7
- * Uses idevice command-line tools for iOS device operations.
8
- * Each instance is associated with a specific device by UDID.
9
- *
10
- * Port forwarding is managed automatically - each logical port (USB hub position)
11
- * gets a dynamically allocated local port that is tracked and cleaned up on dispose.
12
- *
13
- * IMPORTANT: Call dispose() when the kit is no longer needed to clean up
14
- * any running proxy processes and release port allocations.
15
- */
16
- export declare class AppleDeviceKit {
17
- private readonly logicalPort;
18
- private deviceId;
19
- private proxyProcess;
20
- private localDevicePort;
21
- private isDisposed;
22
- private readonly iosClient;
23
- private readonly deviceActions;
24
- private readonly installActions;
25
- private readonly activationFlow;
26
- private readonly proxyActions;
27
- private tunnelProcess;
28
- constructor(udid: string, logicalPort: number, usbmuxdAddress?: string);
29
- static setResourcesDir(dir: string): void;
30
- /**
31
- * Throws if the kit has been disposed
32
- */
33
- private ensureNotDisposed;
34
- info(): Promise<LockdownInfo>;
35
- listDevices(): Promise<IosListResult>;
36
- /**
37
- * Check if device is paired/trusted with this computer
38
- */
39
- isPaired(): Promise<boolean>;
40
- /**
41
- * Wait for device to be paired
42
- * Polls the pairing status until successful or timeout
43
- *
44
- * @param timeout Timeout in milliseconds (default: 120000)
45
- * @param pollInterval Poll interval in milliseconds (default: 1000)
46
- */
47
- waitForPairing(timeout?: number, pollInterval?: number): Promise<boolean>;
48
- /**
49
- * Attempt to pair/trust the device
50
- * User must accept the trust dialog on the device
51
- */
52
- pair(): Promise<boolean>;
53
- /**
54
- * Trust/pair the device - initiates pairing and waits for user to accept
55
- *
56
- * This is the recommended method for establishing trust with a device.
57
- * It will:
58
- * 1. Check if already paired
59
- * 2. If not, initiate pairing (shows "Trust This Computer?" on device)
60
- * 3. Wait for user to accept the trust dialog
61
- *
62
- * @param timeout Timeout in milliseconds to wait for user acceptance (default: 60000)
63
- * @param onWaitingForTrust Callback when waiting for user to accept trust dialog
64
- * @returns true if device is now trusted
65
- */
66
- trustDevice(timeout?: number, onWaitingForTrust?: () => void): Promise<boolean>;
67
- /**
68
- * Unpair/untrust the device
69
- */
70
- unpair(): Promise<boolean>;
71
- /**
72
- * Install an IPA file on the device (install agent)
73
- *
74
- * @param ipaPath Path to the IPA file
75
- */
76
- installApp(ipaPath: string, options: InstallAppMdmOptions): Promise<IosCommandResult>;
77
- /**
78
- * Uninstall an app by bundle ID (uninstall agent)
79
- *
80
- * @param bundleId Application bundle identifier
81
- */
82
- uninstallApp(bundleId: string): Promise<IosCommandResult>;
83
- /**
84
- * Check if an app is installed on the device
85
- *
86
- * @param bundleId Application bundle identifier
87
- */
88
- isAppInstalled(bundleId: string): Promise<boolean>;
89
- /**
90
- * List all installed user applications
91
- */
92
- listApps(): Promise<AppInfo[]>;
93
- /**
94
- * Start port forwarding and wait for it to be ready.
95
- * The local port is automatically allocated based on the logical port.
96
- *
97
- * We need port forwarding to be able to connect to the device from the computer
98
- * and communicate with it using the local port.
99
- *
100
- * Note: Only one port forward can be active at a time per kit instance.
101
- * Starting a new port forward will kill any existing one.
102
- *
103
- * @param devicePort Device port to forward to
104
- * @param startupTimeout Time to wait for proxy to start (ms)
105
- * @returns The port forward result with the allocated local port
106
- */
107
- startPortForwardAsync(devicePort: number): Promise<PortForwardResult>;
108
- /**
109
- * Kill the current port forwarding process if running
110
- */
111
- private killProxyProcess;
112
- /**
113
- * Close the current port forwarding session and release the port
114
- */
115
- closePortForward(): void;
116
- /**
117
- * Wipe the device
118
- */
119
- wipe(): Promise<void>;
120
- removeProfile(profileIdentifier: string): Promise<void>;
121
- listProfiles(): Promise<IosProfileListResult>;
122
- /**
123
- * Activate the device using the activation flow.
124
- *
125
- * This flow can install WiFi/MDM/trust profiles and skip setup steps.
126
- *
127
- * Note: This requires a valid activation record or Apple server access.
128
- *
129
- * Precondition: the device must be paired and trusted.
130
- */
131
- activate(): Promise<(() => Promise<void>) | undefined>;
132
- /**
133
- * Get the device UDID
134
- */
135
- getDeviceId(): string;
136
- /**
137
- * Get the logical port number (USB hub position)
138
- */
139
- getLogicalPort(): number;
140
- /**
141
- * Get the currently allocated local port for forwarding
142
- * Returns undefined if no port forward is active
143
- */
144
- getDevicePort(): number | null;
145
- /**
146
- * Check if this kit has been disposed
147
- */
148
- get disposed(): boolean;
149
- /**
150
- * Check if a port forward is currently active
151
- */
152
- get hasActivePortForward(): boolean;
153
- /**
154
- * Dispose of the kit and clean up all resources.
155
- * This will kill any running proxy processes and release port allocations.
156
- *
157
- * After calling dispose(), the kit instance should not be used.
158
- */
159
- dispose(): void;
160
- /**
161
- * Symbol.dispose implementation for using with `using` keyword (TypeScript 5.2+)
162
- */
163
- [Symbol.dispose](): void;
164
- }
165
- //# sourceMappingURL=appleDeviceKit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appleDeviceKit.d.ts","sourceRoot":"","sources":["../../../src/logic/appleDeviceKit.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { AppInfo, DeviceListEntry } from "../types/types";
2
- /**
3
- * Parse plist-style output from ideviceinfo
4
- *
5
- * @param output ideviceinfo output
6
- * @returns Plist output
7
- */
8
- export declare function parsePlistOutput(output: string): Record<string, string>;
9
- /**
10
- * Parse idevice_id output
11
- *
12
- * @param output idevice_id output
13
- * @returns Device list
14
- */
15
- export declare function parseDeviceList(output: string): DeviceListEntry[];
16
- /**
17
- * Parse ideviceinstaller list output
18
- *
19
- * @param output ideviceinstaller list output
20
- * @returns App list
21
- */
22
- export declare function parseAppList(output: string): AppInfo[];
23
- //# sourceMappingURL=dataParser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataParser.d.ts","sourceRoot":"","sources":["../../../src/logic/dataParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcvE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CAmBjE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAkBtD"}