@ait-co/devtools 0.1.137 → 0.1.139

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 (119) hide show
  1. package/dist/{attach-orchestrator-Cjdhir2U.js → attach-orchestrator-6kz_ZdWL.js} +5 -3
  2. package/dist/{attach-orchestrator-Cjdhir2U.js.map → attach-orchestrator-6kz_ZdWL.js.map} +1 -1
  3. package/dist/{attach-orchestrator-CE0S09YU.js → attach-orchestrator-BEiz3wAx.js} +5 -3
  4. package/dist/{attach-orchestrator-CMoDuG2A.js.map → attach-orchestrator-BEiz3wAx.js.map} +1 -1
  5. package/dist/{attach-orchestrator-CMoDuG2A.js → attach-orchestrator-BG8TGJOZ.js} +5 -3
  6. package/dist/{attach-orchestrator-CE0S09YU.js.map → attach-orchestrator-BG8TGJOZ.js.map} +1 -1
  7. package/dist/{bundle-BKqyhEK9.d.ts → bundle-C796JIwG.d.ts} +65 -2
  8. package/dist/bundle-C796JIwG.d.ts.map +1 -0
  9. package/dist/{capture-ltuV0gZa.d.ts → capture-DsP525OZ.d.ts} +1 -1
  10. package/dist/{capture-ltuV0gZa.d.ts.map → capture-DsP525OZ.d.ts.map} +1 -1
  11. package/dist/{cdp-connection-BYE9meXe.d.ts → cdp-connection-rP1WdnH5.d.ts} +1 -1
  12. package/dist/{cdp-connection-BYE9meXe.d.ts.map → cdp-connection-rP1WdnH5.d.ts.map} +1 -1
  13. package/dist/{cell-D1y4shoV.js → cell-BMlFh08P.js} +2 -2
  14. package/dist/cell-BMlFh08P.js.map +1 -0
  15. package/dist/{cell-DHA578lX.js → cell-Dtgtusog.js} +90 -16
  16. package/dist/cell-Dtgtusog.js.map +1 -0
  17. package/dist/{cell-BIdSQb9T.js → cell-KsRXFdDs.js} +122 -16
  18. package/dist/cell-KsRXFdDs.js.map +1 -0
  19. package/dist/{debug-server-CBK7dn8O.js → debug-server-6c22qSWa.js} +132 -9
  20. package/dist/debug-server-6c22qSWa.js.map +1 -0
  21. package/dist/{debug-server-BQplCzf8.js → debug-server-BQHbaKPT.js} +134 -11
  22. package/dist/debug-server-BQHbaKPT.js.map +1 -0
  23. package/dist/{debug-server-D2wpPK3_.js → debug-server-DWat7d-9.js} +82 -6
  24. package/dist/debug-server-DWat7d-9.js.map +1 -0
  25. package/dist/devtools-opener-3Drge_RJ.js +75 -0
  26. package/dist/devtools-opener-3Drge_RJ.js.map +1 -0
  27. package/dist/devtools-opener-CJpEsXXQ.js +76 -0
  28. package/dist/devtools-opener-CJpEsXXQ.js.map +1 -0
  29. package/dist/devtools-opener-CxtryS8c.js +75 -0
  30. package/dist/devtools-opener-CxtryS8c.js.map +1 -0
  31. package/dist/in-app/auto.js +59 -12
  32. package/dist/in-app/auto.js.map +1 -1
  33. package/dist/in-app/index.d.ts +21 -2
  34. package/dist/in-app/index.d.ts.map +1 -1
  35. package/dist/in-app/index.js +60 -13
  36. package/dist/in-app/index.js.map +1 -1
  37. package/dist/mcp/cli.js +299 -60
  38. package/dist/mcp/cli.js.map +1 -1
  39. package/dist/mcp/server.js +1 -1
  40. package/dist/mock/index.d.ts +79 -1
  41. package/dist/mock/index.d.ts.map +1 -1
  42. package/dist/mock/index.js +218 -14
  43. package/dist/mock/index.js.map +1 -1
  44. package/dist/panel/index.js +171 -10
  45. package/dist/panel/index.js.map +1 -1
  46. package/dist/{pool-CmfvXnwh.d.ts → pool-CrP5CPvU.d.ts} +3 -3
  47. package/dist/{pool-CmfvXnwh.d.ts.map → pool-CrP5CPvU.d.ts.map} +1 -1
  48. package/dist/{qr-http-server-ZkT6F7is.js → qr-http-server-D1hpoyBF.js} +1 -1
  49. package/dist/{qr-http-server-ZkT6F7is.js.map → qr-http-server-D1hpoyBF.js.map} +1 -1
  50. package/dist/qr-http-server-D4rGz8M7.js +1640 -0
  51. package/dist/qr-http-server-D4rGz8M7.js.map +1 -0
  52. package/dist/{qr-http-server-C7q8Gn04.js → qr-http-server-DIjCV7h_.js} +1 -1
  53. package/dist/{qr-http-server-C7q8Gn04.js.map → qr-http-server-DIjCV7h_.js.map} +1 -1
  54. package/dist/{relay-factory-DVzpBRxz.js → relay-factory-C1X3G3WY.js} +71 -15
  55. package/dist/relay-factory-C1X3G3WY.js.map +1 -0
  56. package/dist/{relay-secret-store-CLEGyHou.js → relay-secret-store-Bmyleu0A.js} +1 -1
  57. package/dist/{relay-secret-store-CLEGyHou.js.map → relay-secret-store-Bmyleu0A.js.map} +1 -1
  58. package/dist/{relay-secret-store-DhzAnnj-.js → relay-secret-store-CQenfcSL.js} +2 -2
  59. package/dist/{relay-secret-store-DhzAnnj-.js.map → relay-secret-store-CQenfcSL.js.map} +1 -1
  60. package/dist/{relay-secret-store-BcVrWwTq.js → relay-secret-store-DKxs7zwq.js} +1 -1
  61. package/dist/{relay-secret-store-BcVrWwTq.js.map → relay-secret-store-DKxs7zwq.js.map} +1 -1
  62. package/dist/{relay-secret-store-DGduVJhs.js → relay-secret-store-WJ8EGkIl.js} +1 -1
  63. package/dist/{relay-secret-store-DGduVJhs.js.map → relay-secret-store-WJ8EGkIl.js.map} +1 -1
  64. package/dist/{relay-url-store-CKW8RQzf.js → relay-url-store-BR2XodiO.js} +2 -2
  65. package/dist/{relay-url-store-CKW8RQzf.js.map → relay-url-store-BR2XodiO.js.map} +1 -1
  66. package/dist/{relay-url-store-CdA58fgw.js → relay-url-store-CH63fVCm.js} +2 -2
  67. package/dist/{relay-url-store-B0X8TsGr.js.map → relay-url-store-CH63fVCm.js.map} +1 -1
  68. package/dist/{relay-url-store-CwKT7i04.js → relay-url-store-DaY1QPes.js} +2 -2
  69. package/dist/{relay-url-store-CwKT7i04.js.map → relay-url-store-DaY1QPes.js.map} +1 -1
  70. package/dist/{relay-url-store-B0X8TsGr.js → relay-url-store-xmUuTjXA.js} +2 -2
  71. package/dist/{relay-url-store-CdA58fgw.js.map → relay-url-store-xmUuTjXA.js.map} +1 -1
  72. package/dist/{relay-worker-6fy1eaIo.js → relay-worker-BUXI0K0b.js} +8 -4
  73. package/dist/{relay-worker-6fy1eaIo.js.map → relay-worker-BUXI0K0b.js.map} +1 -1
  74. package/dist/{relay-worker-DJnZkXza.d.ts → relay-worker-DcyboK43.d.ts} +30 -5
  75. package/dist/relay-worker-DcyboK43.d.ts.map +1 -0
  76. package/dist/{runtime-DfHHZms2.d.ts → runtime-BiigOuvb.d.ts} +30 -3
  77. package/dist/runtime-BiigOuvb.d.ts.map +1 -0
  78. package/dist/test-runner/bin.js +376 -38
  79. package/dist/test-runner/bin.js.map +1 -1
  80. package/dist/test-runner/bundle.d.ts +2 -2
  81. package/dist/test-runner/bundle.js +66 -13
  82. package/dist/test-runner/bundle.js.map +1 -1
  83. package/dist/test-runner/capture.d.ts +1 -1
  84. package/dist/test-runner/config.d.ts +58 -5
  85. package/dist/test-runner/config.d.ts.map +1 -1
  86. package/dist/test-runner/config.js +1 -1
  87. package/dist/test-runner/method-pace.d.ts +82 -0
  88. package/dist/test-runner/method-pace.d.ts.map +1 -0
  89. package/dist/test-runner/method-pace.js +120 -0
  90. package/dist/test-runner/method-pace.js.map +1 -0
  91. package/dist/test-runner/pool.d.ts +1 -1
  92. package/dist/test-runner/pool.js +1 -1
  93. package/dist/test-runner/relay-factory.d.ts +57 -4
  94. package/dist/test-runner/relay-factory.d.ts.map +1 -1
  95. package/dist/test-runner/relay-factory.js +70 -14
  96. package/dist/test-runner/relay-factory.js.map +1 -1
  97. package/dist/test-runner/relay-worker.d.ts +1 -1
  98. package/dist/test-runner/relay-worker.js +1 -1
  99. package/dist/test-runner/report.d.ts +3 -3
  100. package/dist/test-runner/rpc.d.ts +2 -2
  101. package/dist/test-runner/runtime.d.ts +2 -2
  102. package/dist/test-runner/runtime.js +83 -6
  103. package/dist/test-runner/runtime.js.map +1 -1
  104. package/dist/test-runner/task-graph.d.ts +1 -1
  105. package/dist/throttle-DKKzX1qC.js +59 -0
  106. package/dist/throttle-DKKzX1qC.js.map +1 -0
  107. package/dist/totp-Dwft0Kz7.js +3 -0
  108. package/package.json +1 -1
  109. package/dist/bundle-BKqyhEK9.d.ts.map +0 -1
  110. package/dist/cell-BIdSQb9T.js.map +0 -1
  111. package/dist/cell-D1y4shoV.js.map +0 -1
  112. package/dist/cell-DHA578lX.js.map +0 -1
  113. package/dist/debug-server-BQplCzf8.js.map +0 -1
  114. package/dist/debug-server-CBK7dn8O.js.map +0 -1
  115. package/dist/debug-server-D2wpPK3_.js.map +0 -1
  116. package/dist/relay-factory-DVzpBRxz.js.map +0 -1
  117. package/dist/relay-worker-DJnZkXza.d.ts.map +0 -1
  118. package/dist/runtime-DfHHZms2.d.ts.map +0 -1
  119. package/dist/totp-D1pulXLa.js +0 -3
@@ -25897,7 +25897,8 @@ const DEFAULT_STATE = {
25897
25897
  frame: false,
25898
25898
  aitNavBar: true,
25899
25899
  aitNavBarType: "partner"
25900
- }
25900
+ },
25901
+ failureModes: { sdkLine: "2.x" }
25901
25902
  };
25902
25903
  function generateDeviceId() {
25903
25904
  const stored = localStorage.getItem("__ait_device_id");
@@ -26409,6 +26410,104 @@ function waitForPromptResponse(type) {
26409
26410
  });
26410
26411
  }
26411
26412
  //#endregion
26413
+ //#region src/mock/native-error.ts
26414
+ /**
26415
+ * 실패-모드 다이얼 — 네이티브 에러 envelope 조립 (devtools#770).
26416
+ *
26417
+ * env1(mock)이 env3(실기기)의 프로비저닝-의존 reject 계약을 재현할 수 있게 하는
26418
+ * 공용 헬퍼. `aitState.failureModes`(state.ts)에 per-API 코드를 설정하면, 각
26419
+ * mock 도메인(auth/ads 등)이 이 모듈의 {@link buildNativeError}로 실기기 캡처와
26420
+ * 필드 단위로 일치하는 에러 객체를 만들어 reject/onError한다.
26421
+ *
26422
+ * 코드 인벤토리와 envelope shape의 정본은 sdk-example#284 2.x↔3.0 diff
26423
+ * 매트릭스(2026-07-10 iOS run10 캡처 + 이후 manual 패스)다:
26424
+ *
26425
+ * - 2.x 라인: 네이티브 브리지가 `{ name, code, userInfo, moduleName, __isError }`
26426
+ * envelope을 얹은 `Error` 인스턴스로 reject한다. `errorKeys` 관측이 이 5개
26427
+ * 필드로 고정.
26428
+ * - 3.x 라인: 같은 실패가 "맨 Error"(위 envelope 필드 없음)로 평탄화된다 —
26429
+ * sdk-example#284 "패턴 ① 오류 envelope 평탄화" 표.
26430
+ *
26431
+ * `src/test-runner/bridge-stub.ts`의 `NativeBridgeErrorShape`/`makeNativeError`가
26432
+ * 같은 shape을 이미 CI 러너 쪽에서 재현하고 있다(devtools#740) — 이 모듈은 그
26433
+ * shape을 mock 소비자 표면(`src/mock/**`)에 대해 재사용 가능한 형태로 옮긴 것이다.
26434
+ * 두 모듈은 레이어가 다르다: test-runner 쪽은 env3 blocking-call 인터셉터(빌드에
26435
+ * 안 실림, CI 전용), 이쪽은 `@ait-co/devtools` 소비자가 `pnpm dev`에서 실제로
26436
+ * import하는 mock 런타임이다 — 서로 import하지 않는다(devtools#740이 test-runner
26437
+ * 전용 모듈임을 명시).
26438
+ */
26439
+ /** 코드별 기본 message/moduleName — 실기기 캡처 관측값. */
26440
+ const CODE_META = {
26441
+ APP_LOGIN: {
26442
+ message: "Login failed",
26443
+ moduleName: "RNTossLogin"
26444
+ },
26445
+ PLACEMENT_ID_FETCH_FAILED: {
26446
+ message: "Failed to fetch placement id",
26447
+ moduleName: "RNAdMob"
26448
+ },
26449
+ EXECUTION_ERROR: {
26450
+ message: "Execution error",
26451
+ moduleName: "RNFullScreenAd"
26452
+ },
26453
+ NO_PERMISSION: {
26454
+ message: "No permission",
26455
+ moduleName: "RNPermissions"
26456
+ },
26457
+ INVALID_REQUEST: {
26458
+ message: "Invalid request",
26459
+ moduleName: "RNPermissions"
26460
+ },
26461
+ INVALID_DATA: {
26462
+ message: "Invalid data",
26463
+ moduleName: "RNFileSystem"
26464
+ },
26465
+ FAILED_TO_GET_LOADED_AD: {
26466
+ message: "Failed to get loaded ad",
26467
+ moduleName: "RNAdMob"
26468
+ },
26469
+ APP_BRIDGE_THROTTLED: {
26470
+ message: "Too many app bridge calls from this method.",
26471
+ moduleName: "RNBridge"
26472
+ },
26473
+ "1006": {
26474
+ message: "광고가 로드 중이거나 준비되지 않았습니다",
26475
+ moduleName: "RNFullScreenAd"
26476
+ },
26477
+ "4000": {
26478
+ message: "Notification agreement failed",
26479
+ moduleName: "RNNotification"
26480
+ }
26481
+ };
26482
+ /**
26483
+ * `aitState.failureModes.sdkLine`이 가리키는 라인으로 네이티브 실패를 조립한다.
26484
+ *
26485
+ * - `'2.x'`(기본): {@link NativeErrorEnvelope} 필드가 실린 `Error` — 실기기 2.x
26486
+ * 캡처(`{name, code, userInfo, moduleName, __isError}`)와 필드 단위 일치.
26487
+ * - `'3.x'`: 같은 실패가 "맨 Error"로 평탄화된 것을 재현 — envelope 필드 없이
26488
+ * message만 실린 순수 `Error` 인스턴스.
26489
+ *
26490
+ * 호출부는 두 종류다:
26491
+ *
26492
+ * - **다이얼 게이트 뒤**(대부분): 프로비저닝처럼 환경에 따라 갈리는 실패는
26493
+ * 다이얼이 설정된 경우에만 재현한다 — 미설정 시 기존 동작 무변화
26494
+ * (zero behavior change). 호출 전에 다이얼 값을 명시적으로 확인한다.
26495
+ * - **무조건**(입력 검증): 빈 `data`나 알 수 없는 haptic type처럼 환경과 무관하게
26496
+ * 실기기가 **항상** 거부하는 입력은 다이얼 없이 바로 던진다. 이건 "가끔 일어나는
26497
+ * 실패"의 시뮬레이션이 아니라 결정적 계약이므로 opt-in 대상이 아니다.
26498
+ */
26499
+ function buildNativeError(code) {
26500
+ const meta = CODE_META[code];
26501
+ if (aitState.state.failureModes.sdkLine === "3.x") return new Error(meta.message);
26502
+ const err = new Error(meta.message);
26503
+ err.name = "Error";
26504
+ err.code = code;
26505
+ err.userInfo = {};
26506
+ err.moduleName = meta.moduleName;
26507
+ err.__isError = true;
26508
+ return err;
26509
+ }
26510
+ //#endregion
26412
26511
  //#region src/mock/permissions.ts
26413
26512
  /**
26414
26513
  * web-framework 3.0+ 권한 에러 기반 클래스.
@@ -26466,9 +26565,42 @@ const permissionErrorMap = {
26466
26565
  setClipboardText: SetClipboardTextPermissionError
26467
26566
  };
26468
26567
  async function getPermission(permission) {
26568
+ const failureCode = permissionGateCode(permission);
26569
+ if (failureCode) throw buildNativeError(failureCode);
26469
26570
  return aitState.state.permissions[permission.name];
26470
26571
  }
26572
+ /**
26573
+ * 선언 게이트에 걸리는 이름·access 조합이면 다이얼에 등록된 native errorCode를
26574
+ * 돌려준다. 세 권한 API(`getPermission`/`requestPermission`/`openPermissionDialog`)가
26575
+ * **걸리는 조건**은 공유하지만 **떨어지는 코드**는 공유하지 않는다 — 아래 참조.
26576
+ */
26577
+ function permissionGateCode(permission) {
26578
+ if (permission.access === "access") return;
26579
+ return aitState.state.failureModes.getPermission?.[permission.name];
26580
+ }
26581
+ /**
26582
+ * `openPermissionDialog`가 선언 게이트에 걸렸을 때의 코드.
26583
+ *
26584
+ * 형제 API와 갈린다 — env3 run11 실측(2.x/iOS, sdk-example#313에서 시나리오 키가
26585
+ * 통일되며 비교 대상에 들어온 값):
26586
+ *
26587
+ * getPermission { geolocation, read } → rejected NO_PERMISSION
26588
+ * requestPermission { geolocation, read } → rejected NO_PERMISSION
26589
+ * openPermissionDialog { geolocation, read } → rejected INVALID_REQUEST
26590
+ * openPermissionDialog { camera, access } → resolved
26591
+ *
26592
+ * 즉 **걸리는 조건은 셋이 같고(access 축 모델 그대로) 코드만 갈린다.** 처음엔
26593
+ * `requestPermission`이 `openPermissionDialog`에 위임하니 게이트도 위임하면
26594
+ * 된다고 보고 한 지점에만 배선했는데, 그 모델은 코드 층위에서 실측과 어긋났다
26595
+ * (env1 NO_PERMISSION ↔ env3 INVALID_REQUEST). 그래서 `requestPermission`은
26596
+ * 위임 **전에** 자기 게이트를 먼저 타고, 다이얼로그를 여는 호출만 이 코드를 쓴다.
26597
+ *
26598
+ * 관측이 geolocation/read 한 조합뿐이라 이름·access별 분기는 두지 않는다 —
26599
+ * 근거 없는 확장은 #783에서 이름 단위 맵을 택한 원칙에 어긋난다.
26600
+ */
26601
+ const OPEN_DIALOG_GATE_CODE = "INVALID_REQUEST";
26471
26602
  async function openPermissionDialog(permission) {
26603
+ if (permissionGateCode(permission)) throw buildNativeError(OPEN_DIALOG_GATE_CODE);
26472
26604
  if (aitState.state.permissions[permission.name] === "allowed") return "allowed";
26473
26605
  aitState.patch("permissions", { [permission.name]: "allowed" });
26474
26606
  return "allowed";
@@ -26693,9 +26825,10 @@ const _setClipboardText = async (text) => {
26693
26825
  checkPermission("clipboard", "setClipboardText");
26694
26826
  if (aitState.state.deviceModes.clipboard === "mock") {
26695
26827
  aitState.patch("mockData", { clipboardText: text });
26696
- return;
26828
+ return { text };
26697
26829
  }
26698
26830
  await navigator.clipboard.writeText(text);
26831
+ return { text };
26699
26832
  };
26700
26833
  withPermission(_setClipboardText, "clipboard");
26701
26834
  //#endregion
@@ -26789,6 +26922,7 @@ function callVibrate(pattern) {
26789
26922
  return typeof navigator.vibrate === "function" ? navigator.vibrate(pattern) : false;
26790
26923
  }
26791
26924
  async function generateHapticFeedback(options) {
26925
+ if (!Object.hasOwn(HAPTIC_VIBRATE_PATTERN, options.type)) throw buildNativeError("EXECUTION_ERROR");
26792
26926
  const timestamp = Date.now();
26793
26927
  aitState.logAnalytics({
26794
26928
  type: "haptic",
@@ -26821,7 +26955,11 @@ function buildLocation() {
26821
26955
  };
26822
26956
  }
26823
26957
  async function getCurrentLocationMock() {
26824
- return buildLocation();
26958
+ const { coords, timestamp } = buildLocation();
26959
+ return {
26960
+ coords,
26961
+ timestamp
26962
+ };
26825
26963
  }
26826
26964
  async function getCurrentLocationWeb() {
26827
26965
  return new Promise((resolve) => {
@@ -26840,8 +26978,7 @@ async function getCurrentLocationWeb() {
26840
26978
  altitudeAccuracy: pos.coords.altitudeAccuracy ?? 0,
26841
26979
  heading: pos.coords.heading ?? 0
26842
26980
  },
26843
- timestamp: pos.timestamp,
26844
- accessLocation: "FINE"
26981
+ timestamp: pos.timestamp
26845
26982
  });
26846
26983
  }, () => {
26847
26984
  console.warn("[@ait-co/devtools] Geolocation failed, falling back to mock");
@@ -26850,7 +26987,11 @@ async function getCurrentLocationWeb() {
26850
26987
  });
26851
26988
  }
26852
26989
  async function getCurrentLocationPrompt() {
26853
- return waitForPromptResponse("location");
26990
+ const { coords, timestamp } = await waitForPromptResponse("location");
26991
+ return {
26992
+ coords,
26993
+ timestamp
26994
+ };
26854
26995
  }
26855
26996
  const _getCurrentLocation = async (_options) => {
26856
26997
  checkPermission("geolocation", "getCurrentLocation");
@@ -26968,13 +27109,16 @@ createMockProxy("Storage", {
26968
27109
  },
26969
27110
  setItem: async (key, value) => {
26970
27111
  localStorage.setItem(`__ait_storage:${key}`, value);
27112
+ return null;
26971
27113
  },
26972
27114
  removeItem: async (key) => {
26973
27115
  localStorage.removeItem(`__ait_storage:${key}`);
27116
+ return null;
26974
27117
  },
26975
27118
  clearItems: async () => {
26976
27119
  const keys = Object.keys(localStorage).filter((k) => k.startsWith("__ait_storage:"));
26977
27120
  for (const k of keys) localStorage.removeItem(k);
27121
+ return null;
26978
27122
  }
26979
27123
  });
26980
27124
  //#endregion
@@ -27313,6 +27457,11 @@ function _nextSlotId(adGroupId) {
27313
27457
  const GoogleAdMob = createMockProxy("GoogleAdMob", {
27314
27458
  loadAppsInTossAdMob: withIsSupported(observe("GoogleAdMob.loadAppsInTossAdMob", "faithful", (args) => {
27315
27459
  setTimeout(() => {
27460
+ const failureCode = aitState.state.failureModes.loadAdMob;
27461
+ if (failureCode) {
27462
+ args.onError(buildNativeError(failureCode));
27463
+ return;
27464
+ }
27316
27465
  if (aitState.state.ads.forceNoFill) {
27317
27466
  args.onError(/* @__PURE__ */ new Error("No fill"));
27318
27467
  return;
@@ -27344,7 +27493,10 @@ const GoogleAdMob = createMockProxy("GoogleAdMob", {
27344
27493
  }, 1500);
27345
27494
  return () => {};
27346
27495
  })),
27347
- isAppsInTossAdMobLoaded: withIsSupported(observe("GoogleAdMob.isAppsInTossAdMobLoaded", "faithful", async (_options) => aitState.state.ads.isLoaded))
27496
+ isAppsInTossAdMobLoaded: withIsSupported(observe("GoogleAdMob.isAppsInTossAdMobLoaded", "faithful", async (_options) => {
27497
+ if (_options?.adGroupId !== void 0 && _options.adGroupId.trim() === "") throw buildNativeError("INVALID_REQUEST");
27498
+ return aitState.state.ads.isLoaded;
27499
+ }))
27348
27500
  });
27349
27501
  const TossAds = createMockProxy("TossAds", {
27350
27502
  initialize: withIsSupported(observe("TossAds.initialize", "partial", (options) => {
@@ -27433,6 +27585,11 @@ const TossAds = createMockProxy("TossAds", {
27433
27585
  });
27434
27586
  const loadFullScreenAd = withIsSupported(observe("loadFullScreenAd", "faithful", (args) => {
27435
27587
  setTimeout(() => {
27588
+ const failureCode = aitState.state.failureModes.loadFullScreenAd;
27589
+ if (failureCode) {
27590
+ args.onError(buildNativeError(failureCode));
27591
+ return;
27592
+ }
27436
27593
  if (aitState.state.ads.forceNoFill) {
27437
27594
  args.onError(/* @__PURE__ */ new Error("No fill"));
27438
27595
  return;
@@ -27764,12 +27921,15 @@ const IAP = createMockProxy("IAP", {
27764
27921
  })) };
27765
27922
  },
27766
27923
  async getPendingOrders() {
27767
- return { orders: [...aitState.state.iap.pendingOrders] };
27924
+ const orders = [...aitState.state.iap.pendingOrders];
27925
+ return {
27926
+ orders,
27927
+ orderIds: orders.map((o) => o.orderId)
27928
+ };
27768
27929
  },
27769
27930
  async getCompletedOrRefundedOrders() {
27770
27931
  return {
27771
27932
  hasNext: false,
27772
- nextKey: null,
27773
27933
  orders: [...aitState.state.iap.completedOrders]
27774
27934
  };
27775
27935
  },
@@ -27792,6 +27952,7 @@ const IAP = createMockProxy("IAP", {
27792
27952
  return true;
27793
27953
  },
27794
27954
  async getSubscriptionInfo(_args) {
27955
+ if (aitState.state.failureModes.softResolve?.getSubscriptionInfo) return {};
27795
27956
  return { subscription: {
27796
27957
  catalogId: 1,
27797
27958
  status: "ACTIVE",
@@ -30146,7 +30307,7 @@ function Panel() {
30146
30307
  color: "#666",
30147
30308
  fontWeight: 400
30148
30309
  },
30149
- children: ["v", "0.1.137"]
30310
+ children: ["v", "0.1.139"]
30150
30311
  }),
30151
30312
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
30152
30313
  type: "button",