@ait-co/devtools 0.1.108 → 0.1.110

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 (79) hide show
  1. package/README.en.md +13 -31
  2. package/README.md +13 -31
  3. package/dist/bundle-KFs4t-wc.d.ts +96 -0
  4. package/dist/bundle-KFs4t-wc.d.ts.map +1 -0
  5. package/dist/in-app/auto.d.ts.map +1 -1
  6. package/dist/in-app/auto.js +40 -3
  7. package/dist/in-app/auto.js.map +1 -1
  8. package/dist/in-app/index.d.ts.map +1 -1
  9. package/dist/in-app/index.js +39 -2
  10. package/dist/in-app/index.js.map +1 -1
  11. package/dist/mcp/cli.d.ts +4 -16
  12. package/dist/mcp/cli.d.ts.map +1 -1
  13. package/dist/mcp/cli.js +803 -712
  14. package/dist/mcp/cli.js.map +1 -1
  15. package/dist/mcp/server.d.ts.map +1 -1
  16. package/dist/mcp/server.js +47 -59
  17. package/dist/mcp/server.js.map +1 -1
  18. package/dist/mock/index.d.ts.map +1 -1
  19. package/dist/mock/index.js +21 -2
  20. package/dist/mock/index.js.map +1 -1
  21. package/dist/panel/index.js +47 -32
  22. package/dist/panel/index.js.map +1 -1
  23. package/dist/{pool-Dkp7I9Bf.d.ts → pool-Bf6rQci4.d.ts} +210 -48
  24. package/dist/pool-Bf6rQci4.d.ts.map +1 -0
  25. package/dist/{qr-http-server-D4EAA7Il.js → qr-http-server-BJJt3ush.js} +8 -17
  26. package/dist/qr-http-server-BJJt3ush.js.map +1 -0
  27. package/dist/{qr-http-server-A9vld8r7.cjs → qr-http-server-BVS-HZjU.cjs} +8 -17
  28. package/dist/qr-http-server-BVS-HZjU.cjs.map +1 -0
  29. package/dist/{qr-http-server-Dj3Z0NHi.cjs → qr-http-server-C1T4RNbq.cjs} +8 -17
  30. package/dist/qr-http-server-C1T4RNbq.cjs.map +1 -0
  31. package/dist/{qr-http-server-HzdCLU8s.js → qr-http-server-Cs93vEPH.js} +8 -17
  32. package/dist/qr-http-server-Cs93vEPH.js.map +1 -0
  33. package/dist/{relay-worker-BzFQ3fv9.d.ts → relay-worker-xxanNQGs.d.ts} +3 -3
  34. package/dist/relay-worker-xxanNQGs.d.ts.map +1 -0
  35. package/dist/{runtime-ORdrpizY.d.ts → runtime-Wi5d6Ywz.d.ts} +3 -3
  36. package/dist/{runtime-ORdrpizY.d.ts.map → runtime-Wi5d6Ywz.d.ts.map} +1 -1
  37. package/dist/test-runner/bundle.d.ts +1 -1
  38. package/dist/test-runner/bundle.js +148 -11
  39. package/dist/test-runner/bundle.js.map +1 -1
  40. package/dist/test-runner/cli.d.ts +59 -14
  41. package/dist/test-runner/cli.d.ts.map +1 -1
  42. package/dist/test-runner/cli.js +171 -32
  43. package/dist/test-runner/cli.js.map +1 -1
  44. package/dist/test-runner/config.d.ts +1 -1
  45. package/dist/test-runner/pool.d.ts +1 -1
  46. package/dist/test-runner/relay-worker.d.ts +1 -1
  47. package/dist/test-runner/relay-worker.js.map +1 -1
  48. package/dist/test-runner/rpc.d.ts +1 -1
  49. package/dist/test-runner/rpc.d.ts.map +1 -1
  50. package/dist/test-runner/rpc.js +1 -1
  51. package/dist/test-runner/rpc.js.map +1 -1
  52. package/dist/test-runner/task-graph.d.ts +1 -1
  53. package/dist/{tunnel-BjJROkcj.js → tunnel-Cpn3mA4u.js} +3 -3
  54. package/dist/tunnel-Cpn3mA4u.js.map +1 -0
  55. package/dist/{tunnel-d_G9AIFn.cjs → tunnel-Dj8Kf2QS.cjs} +3 -3
  56. package/dist/tunnel-Dj8Kf2QS.cjs.map +1 -0
  57. package/dist/unplugin/index.cjs +1 -1
  58. package/dist/unplugin/index.d.cts +196 -34
  59. package/dist/unplugin/index.d.cts.map +1 -1
  60. package/dist/unplugin/index.d.ts +196 -34
  61. package/dist/unplugin/index.d.ts.map +1 -1
  62. package/dist/unplugin/index.js +1 -1
  63. package/dist/unplugin/tunnel.cjs +2 -2
  64. package/dist/unplugin/tunnel.cjs.map +1 -1
  65. package/dist/unplugin/tunnel.d.cts +1 -1
  66. package/dist/unplugin/tunnel.d.ts +1 -1
  67. package/dist/unplugin/tunnel.js +2 -2
  68. package/dist/unplugin/tunnel.js.map +1 -1
  69. package/package.json +14 -14
  70. package/dist/bundle-BJm5jk56.d.ts +0 -49
  71. package/dist/bundle-BJm5jk56.d.ts.map +0 -1
  72. package/dist/pool-Dkp7I9Bf.d.ts.map +0 -1
  73. package/dist/qr-http-server-A9vld8r7.cjs.map +0 -1
  74. package/dist/qr-http-server-D4EAA7Il.js.map +0 -1
  75. package/dist/qr-http-server-Dj3Z0NHi.cjs.map +0 -1
  76. package/dist/qr-http-server-HzdCLU8s.js.map +0 -1
  77. package/dist/relay-worker-BzFQ3fv9.d.ts.map +0 -1
  78. package/dist/tunnel-BjJROkcj.js.map +0 -1
  79. package/dist/tunnel-d_G9AIFn.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  //#region \0rolldown/runtime.js
2
2
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
3
3
  //#endregion
4
- //#region node_modules/.pnpm/react@19.2.6/node_modules/react/cjs/react.production.js
4
+ //#region node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react.production.js
5
5
  /**
6
6
  * @license React
7
7
  * react.production.js
@@ -358,10 +358,10 @@ var require_react_production = /* @__PURE__ */ __commonJSMin(((exports) => {
358
358
  exports.useTransition = function() {
359
359
  return ReactSharedInternals.H.useTransition();
360
360
  };
361
- exports.version = "19.2.6";
361
+ exports.version = "19.2.7";
362
362
  }));
363
363
  //#endregion
364
- //#region node_modules/.pnpm/react@19.2.6/node_modules/react/cjs/react.development.js
364
+ //#region node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react.development.js
365
365
  /**
366
366
  * @license React
367
367
  * react.development.js
@@ -1115,18 +1115,18 @@ var require_react_development = /* @__PURE__ */ __commonJSMin(((exports, module)
1115
1115
  exports.useTransition = function() {
1116
1116
  return resolveDispatcher().useTransition();
1117
1117
  };
1118
- exports.version = "19.2.6";
1118
+ exports.version = "19.2.7";
1119
1119
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
1120
1120
  })();
1121
1121
  }));
1122
1122
  //#endregion
1123
- //#region node_modules/.pnpm/react@19.2.6/node_modules/react/index.js
1123
+ //#region node_modules/.pnpm/react@19.2.7/node_modules/react/index.js
1124
1124
  var require_react = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1125
1125
  if (process.env.NODE_ENV === "production") module.exports = require_react_production();
1126
1126
  else module.exports = require_react_development();
1127
1127
  }));
1128
1128
  //#endregion
1129
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/cjs/react-dom.production.js
1129
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom.production.js
1130
1130
  /**
1131
1131
  * @license React
1132
1132
  * react-dom.production.js
@@ -1264,10 +1264,10 @@ var require_react_dom_production = /* @__PURE__ */ __commonJSMin(((exports) => {
1264
1264
  exports.useFormStatus = function() {
1265
1265
  return ReactSharedInternals.H.useHostTransitionStatus();
1266
1266
  };
1267
- exports.version = "19.2.6";
1267
+ exports.version = "19.2.7";
1268
1268
  }));
1269
1269
  //#endregion
1270
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/cjs/react-dom.development.js
1270
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom.development.js
1271
1271
  /**
1272
1272
  * @license React
1273
1273
  * react-dom.development.js
@@ -1437,12 +1437,12 @@ var require_react_dom_development = /* @__PURE__ */ __commonJSMin(((exports) =>
1437
1437
  exports.useFormStatus = function() {
1438
1438
  return resolveDispatcher().useHostTransitionStatus();
1439
1439
  };
1440
- exports.version = "19.2.6";
1440
+ exports.version = "19.2.7";
1441
1441
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
1442
1442
  })();
1443
1443
  }));
1444
1444
  //#endregion
1445
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/index.js
1445
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/index.js
1446
1446
  var require_react_dom = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1447
1447
  function checkDCE() {
1448
1448
  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") return;
@@ -1949,7 +1949,7 @@ var require_scheduler = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1949
1949
  else module.exports = require_scheduler_development();
1950
1950
  }));
1951
1951
  //#endregion
1952
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/cjs/react-dom-client.production.js
1952
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.production.js
1953
1953
  /**
1954
1954
  * @license React
1955
1955
  * react-dom-client.production.js
@@ -10992,7 +10992,7 @@ var require_react_dom_client_production = /* @__PURE__ */ __commonJSMin(((export
10992
10992
  }
10993
10993
  };
10994
10994
  var isomorphicReactPackageVersion$jscomp$inline_1840 = React.version;
10995
- if ("19.2.6" !== isomorphicReactPackageVersion$jscomp$inline_1840) throw Error(formatProdErrorMessage(527, isomorphicReactPackageVersion$jscomp$inline_1840, "19.2.6"));
10995
+ if ("19.2.7" !== isomorphicReactPackageVersion$jscomp$inline_1840) throw Error(formatProdErrorMessage(527, isomorphicReactPackageVersion$jscomp$inline_1840, "19.2.7"));
10996
10996
  ReactDOMSharedInternals.findDOMNode = function(componentOrElement) {
10997
10997
  var fiber = componentOrElement._reactInternals;
10998
10998
  if (void 0 === fiber) {
@@ -11007,10 +11007,10 @@ var require_react_dom_client_production = /* @__PURE__ */ __commonJSMin(((export
11007
11007
  };
11008
11008
  var internals$jscomp$inline_2347 = {
11009
11009
  bundleType: 0,
11010
- version: "19.2.6",
11010
+ version: "19.2.7",
11011
11011
  rendererPackageName: "react-dom",
11012
11012
  currentDispatcherRef: ReactSharedInternals,
11013
- reconcilerVersion: "19.2.6"
11013
+ reconcilerVersion: "19.2.7"
11014
11014
  };
11015
11015
  if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
11016
11016
  var hook$jscomp$inline_2348 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -11047,10 +11047,10 @@ var require_react_dom_client_production = /* @__PURE__ */ __commonJSMin(((export
11047
11047
  listenToAllSupportedEvents(container);
11048
11048
  return new ReactDOMHydrationRoot(initialChildren);
11049
11049
  };
11050
- exports.version = "19.2.6";
11050
+ exports.version = "19.2.7";
11051
11051
  }));
11052
11052
  //#endregion
11053
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/cjs/react-dom-client.development.js
11053
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/cjs/react-dom-client.development.js
11054
11054
  /**
11055
11055
  * @license React
11056
11056
  * react-dom-client.development.js
@@ -25096,7 +25096,7 @@ var require_react_dom_client_development = /* @__PURE__ */ __commonJSMin(((expor
25096
25096
  };
25097
25097
  (function() {
25098
25098
  var isomorphicReactPackageVersion = React.version;
25099
- if ("19.2.6" !== isomorphicReactPackageVersion) throw Error("Incompatible React versions: The \"react\" and \"react-dom\" packages must have the exact same version. Instead got:\n - react: " + (isomorphicReactPackageVersion + "\n - react-dom: 19.2.6\nLearn more: https://react.dev/warnings/version-mismatch"));
25099
+ if ("19.2.7" !== isomorphicReactPackageVersion) throw Error("Incompatible React versions: The \"react\" and \"react-dom\" packages must have the exact same version. Instead got:\n - react: " + (isomorphicReactPackageVersion + "\n - react-dom: 19.2.7\nLearn more: https://react.dev/warnings/version-mismatch"));
25100
25100
  })();
25101
25101
  "function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://react.dev/link/react-polyfills");
25102
25102
  ReactDOMSharedInternals.findDOMNode = function(componentOrElement) {
@@ -25114,10 +25114,10 @@ var require_react_dom_client_development = /* @__PURE__ */ __commonJSMin(((expor
25114
25114
  if (!(function() {
25115
25115
  var internals = {
25116
25116
  bundleType: 1,
25117
- version: "19.2.6",
25117
+ version: "19.2.7",
25118
25118
  rendererPackageName: "react-dom",
25119
25119
  currentDispatcherRef: ReactSharedInternals,
25120
- reconcilerVersion: "19.2.6"
25120
+ reconcilerVersion: "19.2.7"
25121
25121
  };
25122
25122
  internals.overrideHookState = overrideHookState;
25123
25123
  internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -25171,12 +25171,12 @@ var require_react_dom_client_development = /* @__PURE__ */ __commonJSMin(((expor
25171
25171
  listenToAllSupportedEvents(container);
25172
25172
  return new ReactDOMHydrationRoot(initialChildren);
25173
25173
  };
25174
- exports.version = "19.2.6";
25174
+ exports.version = "19.2.7";
25175
25175
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
25176
25176
  })();
25177
25177
  }));
25178
25178
  //#endregion
25179
- //#region node_modules/.pnpm/react-dom@19.2.6_react@19.2.6/node_modules/react-dom/client.js
25179
+ //#region node_modules/.pnpm/react-dom@19.2.7_react@19.2.7/node_modules/react-dom/client.js
25180
25180
  var require_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
25181
25181
  function checkDCE() {
25182
25182
  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") return;
@@ -25347,7 +25347,7 @@ const en = {
25347
25347
  "dashboard.tunnel.up": "Connected",
25348
25348
  "dashboard.tunnel.down": "Disconnected",
25349
25349
  "dashboard.attach.section": "Attach QR",
25350
- "dashboard.attach.hint": "Call the build_attach_url MCP tool to show the QR here.",
25350
+ "dashboard.attach.hint": "Call the start_attach MCP tool to show the QR here.",
25351
25351
  "dashboard.attach.tunnelDown": "Relay disconnected — this QR is no longer valid. Restart the relay, then regenerate the QR.",
25352
25352
  "dashboard.pages.section": "Connected Pages",
25353
25353
  "dashboard.pages.empty": "No attached pages",
@@ -25365,7 +25365,6 @@ const en = {
25365
25365
  "attach.url.section": "URL (fallback)",
25366
25366
  "attach.mode.sandbox": "env 2 — AITC Sandbox App (PWA)",
25367
25367
  "attach.mode.intossDev": "env 3 — intoss-private relay dev",
25368
- "attach.mode.intossLive": "env 4 — intoss live relay debug",
25369
25368
  "attach.sandbox.step1": "Launch the launcher PWA icon on your home screen (if the Safari address bar is visible, it is not standalone).",
25370
25369
  "attach.sandbox.step2": "Scan this QR code with <strong>\"Scan QR with camera\"</strong> inside the launcher.",
25371
25370
  "attach.sandbox.step3": "The mini-app opens fullscreen and the debug session attaches automatically.",
@@ -25381,7 +25380,6 @@ const en = {
25381
25380
  "attach.intoss.faq.prepare": "<strong>Mini-app stuck in PREPARE state</strong> — verify the deep-link has a <code>_deploymentId</code> parameter",
25382
25381
  "attach.intoss.faq.chii": "<strong>Chii injection failure / console is empty</strong> — verify the mini-app bundle has an <code>in-app</code> debug import",
25383
25382
  "attach.intoss.faq.totp": "<strong>TOTP gate Layer C is inactive</strong> — check that <code>AIT_DEBUG_TOTP_SECRET</code> is set on the relay server",
25384
- "attach.intoss.faq.liveReadOnly": "<strong>LIVE session is read-only</strong> — <code>call_sdk</code>/<code>evaluate</code> require an explicit <code>confirm</code>",
25385
25383
  "launcher.title": "AITC DevTools Launcher",
25386
25384
  "launcher.description": "Scan the terminal QR code or paste the tunnel URL.",
25387
25385
  "launcher.installCta": "Install launcher to your phone",
@@ -25568,7 +25566,7 @@ const ko = {
25568
25566
  "dashboard.tunnel.up": "연결됨",
25569
25567
  "dashboard.tunnel.down": "끊어짐",
25570
25568
  "dashboard.attach.section": "Attach QR",
25571
- "dashboard.attach.hint": "build_attach_url MCP tool을 호출하면 QR이 여기에 표시됩니다.",
25569
+ "dashboard.attach.hint": "start_attach MCP tool을 호출하면 QR이 여기에 표시됩니다.",
25572
25570
  "dashboard.attach.tunnelDown": "relay 연결이 끊겼습니다 — 이 QR은 더 이상 유효하지 않습니다. relay를 재시작한 뒤 QR을 다시 생성하세요.",
25573
25571
  "dashboard.pages.section": "연결된 Pages",
25574
25572
  "dashboard.pages.empty": "attach된 페이지 없음",
@@ -25586,7 +25584,6 @@ const ko = {
25586
25584
  "attach.url.section": "URL (fallback)",
25587
25585
  "attach.mode.sandbox": "환경 2 — AITC Sandbox App (PWA)",
25588
25586
  "attach.mode.intossDev": "환경 3 — intoss-private relay dev",
25589
- "attach.mode.intossLive": "환경 4 — intoss live relay debug",
25590
25587
  "attach.sandbox.step1": "홈 화면의 launcher PWA 아이콘으로 실행하세요 (Safari 주소창이 보이면 standalone이 아닙니다).",
25591
25588
  "attach.sandbox.step2": "launcher 안의 <strong>\"QR 카메라로 스캔\"</strong>으로 이 QR 코드를 스캔하세요.",
25592
25589
  "attach.sandbox.step3": "미니앱이 풀스크린으로 열리고 디버그 세션이 자동으로 attach됩니다.",
@@ -25602,7 +25599,6 @@ const ko = {
25602
25599
  "attach.intoss.faq.prepare": "<strong>미니앱이 PREPARE 상태에서 멈추는 경우</strong> — deep-link에 <code>_deploymentId</code> 파라미터가 있는지 확인",
25603
25600
  "attach.intoss.faq.chii": "<strong>Chii 주입 실패 / 콘솔이 비어 있는 경우</strong> — 미니앱 번들에 <code>in-app</code> debug import가 있는지 확인",
25604
25601
  "attach.intoss.faq.totp": "<strong>TOTP gate Layer C가 비활성인 경우</strong> — relay 서버에 <code>AIT_DEBUG_TOTP_SECRET</code>이 설정돼 있는지 확인",
25605
- "attach.intoss.faq.liveReadOnly": "<strong>LIVE 세션은 read-only입니다</strong> — <code>call_sdk</code>/<code>evaluate</code> 실행에는 명시적 <code>confirm</code>이 필요합니다",
25606
25602
  "launcher.title": "AITC DevTools Launcher",
25607
25603
  "launcher.description": "터미널 QR을 스캔하거나 URL을 입력하세요.",
25608
25604
  "launcher.installCta": "폰에 런처 설치하기",
@@ -26011,7 +26007,7 @@ if (!globalRef[SINGLETON_KEY]) globalRef[SINGLETON_KEY] = new AitStateManager();
26011
26007
  const aitState = globalRef[SINGLETON_KEY];
26012
26008
  if (typeof window !== "undefined") window.__ait = aitState;
26013
26009
  //#endregion
26014
- //#region node_modules/.pnpm/react@19.2.6/node_modules/react/cjs/react-jsx-runtime.production.js
26010
+ //#region node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react-jsx-runtime.production.js
26015
26011
  /**
26016
26012
  * @license React
26017
26013
  * react-jsx-runtime.production.js
@@ -26045,7 +26041,7 @@ var require_react_jsx_runtime_production = /* @__PURE__ */ __commonJSMin(((expor
26045
26041
  exports.jsxs = jsxProd;
26046
26042
  }));
26047
26043
  //#endregion
26048
- //#region node_modules/.pnpm/react@19.2.6/node_modules/react/cjs/react-jsx-runtime.development.js
26044
+ //#region node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react-jsx-runtime.development.js
26049
26045
  /**
26050
26046
  * @license React
26051
26047
  * react-jsx-runtime.development.js
@@ -26715,6 +26711,10 @@ withPermission(_fetchContacts, "contacts");
26715
26711
  * generateHapticFeedback — 영역 3 (하드웨어 API 관측):
26716
26712
  * - 10종 HapticFeedbackType을 navigator.vibrate 패턴으로 매핑(근사, best-effort).
26717
26713
  * - `typeof navigator.vibrate === 'function'` 가드 — API 없는 환경에서 throw 없이 skip.
26714
+ * - @ait-co/polyfill 동시 사용 시 재귀 방지: polyfill이 navigator.vibrate를 override하고
26715
+ * 내부에서 mock의 generateHapticFeedback을 호출하므로 무한 재귀가 발생한다. polyfill이
26716
+ * 원본 vibrate를 BACKUP_KEY(Symbol.for('@ait-co/polyfill/vibrate.original'))에 저장하면
26717
+ * 그 원본을 직접 호출해 재귀를 끊는다.
26718
26718
  * - sdkCallLog에 🟡(partial)로 기록. params: { hapticType, vibrated: boolean }.
26719
26719
  * - 시그니처 불변 — __typecheck.ts의 Assert<Mock, Original> 통과.
26720
26720
  */
@@ -26756,14 +26756,29 @@ const HAPTIC_VIBRATE_PATTERN = {
26756
26756
  10
26757
26757
  ]
26758
26758
  };
26759
+ /**
26760
+ * navigator.vibrate를 안전하게 호출한다.
26761
+ *
26762
+ * @ait-co/polyfill/auto가 설치된 환경에서는 navigator.vibrate가 polyfill shim으로
26763
+ * override되어 있고, 그 shim은 내부적으로 mock의 generateHapticFeedback을 호출한다.
26764
+ * mock이 다시 navigator.vibrate(현재 = shim)를 호출하면 무한 재귀가 발생한다.
26765
+ * polyfill은 원본 vibrate를 BACKUP_KEY에 저장하므로 그쪽을 직접 호출한다.
26766
+ */
26767
+ const POLYFILL_VIBRATE_BACKUP = Symbol.for("@ait-co/polyfill/vibrate.original");
26768
+ function callVibrate(pattern) {
26769
+ if (typeof navigator === "undefined") return false;
26770
+ const nav = navigator;
26771
+ const original = POLYFILL_VIBRATE_BACKUP in nav ? nav[POLYFILL_VIBRATE_BACKUP] : null;
26772
+ if (typeof original === "function") return original(pattern);
26773
+ return typeof navigator.vibrate === "function" ? navigator.vibrate(pattern) : false;
26774
+ }
26759
26775
  async function generateHapticFeedback(options) {
26760
26776
  const timestamp = Date.now();
26761
26777
  aitState.logAnalytics({
26762
26778
  type: "haptic",
26763
26779
  params: { hapticType: options.type }
26764
26780
  });
26765
- const pattern = HAPTIC_VIBRATE_PATTERN[options.type] ?? 30;
26766
- const vibrated = typeof navigator.vibrate === "function" ? navigator.vibrate(pattern) : false;
26781
+ const vibrated = callVibrate(HAPTIC_VIBRATE_PATTERN[options.type] ?? 30);
26767
26782
  aitState.logSdkCall({
26768
26783
  method: "generateHapticFeedback",
26769
26784
  args: [{ type: options.type }],
@@ -30115,7 +30130,7 @@ function Panel() {
30115
30130
  color: "#666",
30116
30131
  fontWeight: 400
30117
30132
  },
30118
- children: ["v", "0.1.108"]
30133
+ children: ["v", "0.1.110"]
30119
30134
  }),
30120
30135
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
30121
30136
  type: "button",