@ait-co/devtools 0.1.144 → 0.2.1
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/README.en.md +47 -218
- package/README.md +36 -246
- package/dist/in-app/auto.d.ts +1 -138
- package/dist/in-app/auto.js +28 -1102
- package/dist/in-app/auto.js.map +1 -1
- package/dist/in-app/index.d.ts +38 -547
- package/dist/in-app/index.d.ts.map +1 -1
- package/dist/in-app/index.js +62 -939
- package/dist/in-app/index.js.map +1 -1
- package/dist/mcp/cli.d.ts +1 -54
- package/dist/mcp/cli.js +33 -9720
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -88
- package/dist/mcp/server.js +36 -1076
- package/dist/mcp/server.js.map +1 -1
- package/dist/mock/index.d.ts +35 -21
- package/dist/mock/index.d.ts.map +1 -1
- package/dist/mock/index.js +81 -2
- package/dist/mock/index.js.map +1 -1
- package/dist/panel/index.js +80 -104
- package/dist/panel/index.js.map +1 -1
- package/dist/relay-url-store-CkVSQZMq.cjs +110 -0
- package/dist/relay-url-store-CkVSQZMq.cjs.map +1 -0
- package/dist/relay-url-store-dkII-DHD.js +109 -0
- package/dist/relay-url-store-dkII-DHD.js.map +1 -0
- package/dist/stubs/bin-devtools-mcp.js +58 -0
- package/dist/stubs/bin-devtools-mcp.js.map +1 -0
- package/dist/stubs/bin-devtools-test.d.ts +2 -0
- package/dist/stubs/bin-devtools-test.js +55 -0
- package/dist/stubs/bin-devtools-test.js.map +1 -0
- package/dist/test-runner/config.d.ts +1 -231
- package/dist/test-runner/config.js +41 -45
- package/dist/test-runner/config.js.map +1 -1
- package/dist/{tunnel-BGT9Curk.cjs → tunnel-BKZkOyQp.cjs} +1 -1
- package/dist/{tunnel-BGT9Curk.cjs.map → tunnel-BKZkOyQp.cjs.map} +1 -1
- package/dist/{tunnel-BOKmLzBO.js → tunnel-CqSCIrdU.js} +1 -1
- package/dist/{tunnel-BOKmLzBO.js.map → tunnel-CqSCIrdU.js.map} +1 -1
- package/dist/unplugin/index.cjs +9 -18
- package/dist/unplugin/index.cjs.map +1 -1
- package/dist/unplugin/index.d.cts +26 -5
- package/dist/unplugin/index.d.cts.map +1 -1
- package/dist/unplugin/index.d.ts +27 -6
- package/dist/unplugin/index.d.ts.map +1 -1
- package/dist/unplugin/index.js +10 -19
- package/dist/unplugin/index.js.map +1 -1
- package/package.json +10 -25
- package/dist/attach-orchestrator-0F0m_UqQ.js +0 -1845
- package/dist/attach-orchestrator-0F0m_UqQ.js.map +0 -1
- package/dist/attach-orchestrator-D65KxFy_.js +0 -1831
- package/dist/attach-orchestrator-D65KxFy_.js.map +0 -1
- package/dist/attach-orchestrator-DL3NQ9ca.js +0 -1846
- package/dist/attach-orchestrator-DL3NQ9ca.js.map +0 -1
- package/dist/bundle-C796JIwG.d.ts +0 -159
- package/dist/bundle-C796JIwG.d.ts.map +0 -1
- package/dist/capture-DsP525OZ.d.ts +0 -58
- package/dist/capture-DsP525OZ.d.ts.map +0 -1
- package/dist/cdp-connection-rP1WdnH5.d.ts +0 -287
- package/dist/cdp-connection-rP1WdnH5.d.ts.map +0 -1
- package/dist/cell-BaLvusOl.js +0 -68
- package/dist/cell-BaLvusOl.js.map +0 -1
- package/dist/cell-CBUS3-nT.js +0 -274
- package/dist/cell-CBUS3-nT.js.map +0 -1
- package/dist/cell-EBKKpAAT.js +0 -307
- package/dist/cell-EBKKpAAT.js.map +0 -1
- package/dist/chii-relay-B3ZhjGMi.js +0 -304
- package/dist/chii-relay-B3ZhjGMi.js.map +0 -1
- package/dist/chii-relay-CGMlePMd.cjs +0 -304
- package/dist/chii-relay-CGMlePMd.cjs.map +0 -1
- package/dist/debug-server-B3ABDrRI.js +0 -456
- package/dist/debug-server-B3ABDrRI.js.map +0 -1
- package/dist/debug-server-BWhwrVXa.js +0 -1158
- package/dist/debug-server-BWhwrVXa.js.map +0 -1
- package/dist/debug-server-CfQNxxGW.js +0 -600
- package/dist/debug-server-CfQNxxGW.js.map +0 -1
- package/dist/devtools-opener-3Drge_RJ.js +0 -75
- package/dist/devtools-opener-3Drge_RJ.js.map +0 -1
- package/dist/devtools-opener-CJpEsXXQ.js +0 -76
- package/dist/devtools-opener-CJpEsXXQ.js.map +0 -1
- package/dist/devtools-opener-CxtryS8c.js +0 -75
- package/dist/devtools-opener-CxtryS8c.js.map +0 -1
- package/dist/in-app/auto.d.ts.map +0 -1
- package/dist/mcp/cli.d.ts.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/pool-DcaaOwUq.d.ts +0 -14761
- package/dist/pool-DcaaOwUq.d.ts.map +0 -1
- package/dist/qr-http-server-C_lqOrgc.js +0 -1644
- package/dist/qr-http-server-C_lqOrgc.js.map +0 -1
- package/dist/qr-http-server-CopuMbub.js +0 -1644
- package/dist/qr-http-server-CopuMbub.js.map +0 -1
- package/dist/qr-http-server-DrbIVDjO.js +0 -1645
- package/dist/qr-http-server-DrbIVDjO.js.map +0 -1
- package/dist/relay-factory-N9QobQxG.js +0 -206
- package/dist/relay-factory-N9QobQxG.js.map +0 -1
- package/dist/relay-secret-store-BR0YIkNv.cjs +0 -241
- package/dist/relay-secret-store-BR0YIkNv.cjs.map +0 -1
- package/dist/relay-secret-store-Bmyleu0A.js +0 -154
- package/dist/relay-secret-store-Bmyleu0A.js.map +0 -1
- package/dist/relay-secret-store-CQenfcSL.js +0 -154
- package/dist/relay-secret-store-CQenfcSL.js.map +0 -1
- package/dist/relay-secret-store-CYM8CBIF.js +0 -240
- package/dist/relay-secret-store-CYM8CBIF.js.map +0 -1
- package/dist/relay-secret-store-DKxs7zwq.js +0 -153
- package/dist/relay-secret-store-DKxs7zwq.js.map +0 -1
- package/dist/relay-secret-store-WJ8EGkIl.js +0 -153
- package/dist/relay-secret-store-WJ8EGkIl.js.map +0 -1
- package/dist/relay-url-store-BR2XodiO.js +0 -123
- package/dist/relay-url-store-BR2XodiO.js.map +0 -1
- package/dist/relay-url-store-C1as_m5G.cjs +0 -115
- package/dist/relay-url-store-C1as_m5G.cjs.map +0 -1
- package/dist/relay-url-store-CH63fVCm.js +0 -122
- package/dist/relay-url-store-CH63fVCm.js.map +0 -1
- package/dist/relay-url-store-CzFo_84F.js +0 -114
- package/dist/relay-url-store-CzFo_84F.js.map +0 -1
- package/dist/relay-url-store-DaY1QPes.js +0 -123
- package/dist/relay-url-store-DaY1QPes.js.map +0 -1
- package/dist/relay-url-store-xmUuTjXA.js +0 -122
- package/dist/relay-url-store-xmUuTjXA.js.map +0 -1
- package/dist/relay-worker-B5HKkGUY.js +0 -832
- package/dist/relay-worker-B5HKkGUY.js.map +0 -1
- package/dist/relay-worker-YdlpZQl9.d.ts +0 -214
- package/dist/relay-worker-YdlpZQl9.d.ts.map +0 -1
- package/dist/rolldown-runtime-DGkTqVfb.js +0 -15
- package/dist/rolldown-runtime-DUslC3ob.js +0 -14
- package/dist/runtime-kn9DxOeg.d.ts +0 -249
- package/dist/runtime-kn9DxOeg.d.ts.map +0 -1
- package/dist/test-runner/bin.js +0 -2584
- package/dist/test-runner/bin.js.map +0 -1
- package/dist/test-runner/bridge-stub.d.ts +0 -125
- package/dist/test-runner/bridge-stub.d.ts.map +0 -1
- package/dist/test-runner/bridge-stub.js +0 -92
- package/dist/test-runner/bridge-stub.js.map +0 -1
- package/dist/test-runner/bundle.d.ts +0 -2
- package/dist/test-runner/bundle.js +0 -439
- package/dist/test-runner/bundle.js.map +0 -1
- package/dist/test-runner/capture.d.ts +0 -2
- package/dist/test-runner/capture.js +0 -44
- package/dist/test-runner/capture.js.map +0 -1
- package/dist/test-runner/config.d.ts.map +0 -1
- package/dist/test-runner/method-pace.d.ts +0 -82
- package/dist/test-runner/method-pace.d.ts.map +0 -1
- package/dist/test-runner/method-pace.js +0 -120
- package/dist/test-runner/method-pace.js.map +0 -1
- package/dist/test-runner/pool.d.ts +0 -2
- package/dist/test-runner/pool.js +0 -136
- package/dist/test-runner/pool.js.map +0 -1
- package/dist/test-runner/relay-factory.d.ts +0 -11245
- package/dist/test-runner/relay-factory.d.ts.map +0 -1
- package/dist/test-runner/relay-factory.js +0 -206
- package/dist/test-runner/relay-factory.js.map +0 -1
- package/dist/test-runner/relay-worker.d.ts +0 -2
- package/dist/test-runner/relay-worker.js +0 -2
- package/dist/test-runner/report.d.ts +0 -163
- package/dist/test-runner/report.d.ts.map +0 -1
- package/dist/test-runner/report.js +0 -198
- package/dist/test-runner/report.js.map +0 -1
- package/dist/test-runner/rpc.d.ts +0 -56
- package/dist/test-runner/rpc.d.ts.map +0 -1
- package/dist/test-runner/rpc.js +0 -98
- package/dist/test-runner/rpc.js.map +0 -1
- package/dist/test-runner/runtime.d.ts +0 -2
- package/dist/test-runner/runtime.js +0 -659
- package/dist/test-runner/runtime.js.map +0 -1
- package/dist/test-runner/task-graph.d.ts +0 -38
- package/dist/test-runner/task-graph.d.ts.map +0 -1
- package/dist/test-runner/task-graph.js +0 -182
- package/dist/test-runner/task-graph.js.map +0 -1
- package/dist/throttle-DKKzX1qC.js +0 -59
- package/dist/throttle-DKKzX1qC.js.map +0 -1
- package/dist/totp-BqmCLSNA.js +0 -189
- package/dist/totp-BqmCLSNA.js.map +0 -1
- package/dist/totp-CMHR5lsW.cjs +0 -191
- package/dist/totp-CMHR5lsW.cjs.map +0 -1
- package/dist/totp-CZLLKfOC.js +0 -200
- package/dist/totp-CZLLKfOC.js.map +0 -1
- package/dist/totp-DAxys-r0.js +0 -199
- package/dist/totp-DAxys-r0.js.map +0 -1
- package/dist/totp-DfekTBk3.js +0 -211
- package/dist/totp-DfekTBk3.js.map +0 -1
- package/dist/totp-Dwft0Kz7.js +0 -3
- package/dist/totp-WY6l0ysP.js +0 -190
- package/dist/totp-WY6l0ysP.js.map +0 -1
- /package/dist/{test-runner/bin.d.ts → stubs/bin-devtools-mcp.d.ts} +0 -0
package/dist/panel/index.js
CHANGED
|
@@ -25339,57 +25339,6 @@ const en = {
|
|
|
25339
25339
|
"notifications.option.newAgreement": "newAgreement (first-time agree)",
|
|
25340
25340
|
"notifications.option.alreadyAgreed": "alreadyAgreed (already opted-in)",
|
|
25341
25341
|
"notifications.option.agreementRejected": "agreementRejected (user declined)",
|
|
25342
|
-
"dashboard.lang.ko": "한국어",
|
|
25343
|
-
"dashboard.lang.en": "English",
|
|
25344
|
-
"dashboard.title": "AIT Debug Dashboard",
|
|
25345
|
-
"dashboard.updated": "Last updated: {ts}",
|
|
25346
|
-
"dashboard.tunnel.section": "Tunnel status",
|
|
25347
|
-
"dashboard.tunnel.up": "Connected",
|
|
25348
|
-
"dashboard.tunnel.down": "Disconnected",
|
|
25349
|
-
"dashboard.attach.section": "Attach QR",
|
|
25350
|
-
"dashboard.attach.hint": "Call the start_attach MCP tool to show the QR here.",
|
|
25351
|
-
"dashboard.attach.tunnelDown": "Relay disconnected — this QR is no longer valid. Restart the relay, then regenerate the QR.",
|
|
25352
|
-
"dashboard.pages.section": "Connected Pages",
|
|
25353
|
-
"dashboard.pages.empty": "No attached pages",
|
|
25354
|
-
"dashboard.url.copy": "Copy",
|
|
25355
|
-
"dashboard.url.copied": "Copied",
|
|
25356
|
-
"dashboard.inspector.section": "Inspector",
|
|
25357
|
-
"dashboard.inspector.open": "Open DevTools",
|
|
25358
|
-
"dashboard.inspector.waiting": "Attach a page to enable the \"Open DevTools\" button",
|
|
25359
|
-
"inspector.error.noTarget": "No page attached. Attach a device and try again.",
|
|
25360
|
-
"inspector.error.relayDown": "Relay is not active. Start a relay session first.",
|
|
25361
|
-
"dashboard.watchdog.title": "Server has shut down",
|
|
25362
|
-
"dashboard.watchdog.body": "The MCP server has stopped. This session is no longer active. You may close this tab.",
|
|
25363
|
-
"dashboard.watchdog.close": "Close tab",
|
|
25364
|
-
"dashboard.conn.lost": "Connection lost — reconnecting…",
|
|
25365
|
-
"dashboard.session.completeTitle": "Test run complete",
|
|
25366
|
-
"dashboard.session.completeBody": "The runner exited cleanly. See your terminal for results.",
|
|
25367
|
-
"dashboard.session.shutdownTitle": "Debug server stopped",
|
|
25368
|
-
"dashboard.session.shutdownBody": "The MCP server has shut down; this session is no longer live. You can close this tab.",
|
|
25369
|
-
"attach.title": "AIT Debug Session — QR Scan",
|
|
25370
|
-
"attach.deployment": "deployment: {label}",
|
|
25371
|
-
"attach.steps.section": "How to scan",
|
|
25372
|
-
"attach.faq.section": "Troubleshooting checklist",
|
|
25373
|
-
"attach.url.section": "URL (fallback)",
|
|
25374
|
-
"attach.mode.sandbox": "env 2 — AITC Sandbox App (PWA)",
|
|
25375
|
-
"attach.mode.intossDev": "env 3 — intoss-private relay dev",
|
|
25376
|
-
"attach.sandbox.step1": "Launch the launcher PWA icon on your home screen (if the Safari address bar is visible, it is not standalone).",
|
|
25377
|
-
"attach.sandbox.step2": "Scan this QR code with <strong>\"Scan QR with camera\"</strong> inside the launcher.",
|
|
25378
|
-
"attach.sandbox.step3": "The mini-app opens fullscreen and the debug session attaches automatically.",
|
|
25379
|
-
"attach.sandbox.step4": "<strong>Keep the app in the foreground until the test run finishes</strong> — backgrounding it will drop the debug session.",
|
|
25380
|
-
"attach.sandbox.faq.notInstalled": "<strong>Launcher is not installed</strong> — open <code>devtools.aitc.dev/launcher/</code> once and add it to your home screen",
|
|
25381
|
-
"attach.sandbox.faq.cameraApp": "<strong>Scanning with the camera app opens a Safari tab (bottom tab bar visible)</strong> — relaunch from the launcher icon and use the in-app scanner",
|
|
25382
|
-
"attach.sandbox.faq.totp": "<strong>QR expired (TOTP — 30-second step, ±6 steps (~3 min) accepted)</strong> — scan a fresh QR code",
|
|
25383
|
-
"attach.sandbox.faq.chii": "<strong>Chii injection failure / console is empty</strong> — verify the mini-app bundle has an <code>in-app</code> debug import",
|
|
25384
|
-
"attach.intoss.step1": "Open the Toss app.",
|
|
25385
|
-
"attach.intoss.step2": "Scan the QR code with your phone camera app.",
|
|
25386
|
-
"attach.intoss.step3": "Tap <strong>\"Open in Toss\"</strong> when the popup appears.",
|
|
25387
|
-
"attach.intoss.step4": "The mini-app opens and the debug session attaches automatically.",
|
|
25388
|
-
"attach.intoss.step5": "<strong>Keep the Toss app in the foreground until the test run finishes</strong> — backgrounding it will drop the debug session.",
|
|
25389
|
-
"attach.intoss.faq.appNotOpen": "<strong>Toss app does not open</strong> — check app version; scan with the system camera app (not the Toss in-app QR reader)",
|
|
25390
|
-
"attach.intoss.faq.prepare": "<strong>Mini-app stuck in PREPARE state</strong> — verify the deep-link has a <code>_deploymentId</code> parameter",
|
|
25391
|
-
"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",
|
|
25392
|
-
"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",
|
|
25393
25342
|
"launcher.title": "AITC DevTools Launcher",
|
|
25394
25343
|
"launcher.description": "Scan the terminal QR code or paste the tunnel URL.",
|
|
25395
25344
|
"launcher.installCta": "Install launcher to your phone",
|
|
@@ -25568,57 +25517,6 @@ const ko = {
|
|
|
25568
25517
|
"notifications.option.newAgreement": "newAgreement (최초 동의)",
|
|
25569
25518
|
"notifications.option.alreadyAgreed": "alreadyAgreed (이미 동의됨)",
|
|
25570
25519
|
"notifications.option.agreementRejected": "agreementRejected (사용자 거절)",
|
|
25571
|
-
"dashboard.lang.ko": "한국어",
|
|
25572
|
-
"dashboard.lang.en": "English",
|
|
25573
|
-
"dashboard.title": "AIT 디버그 Dashboard",
|
|
25574
|
-
"dashboard.updated": "마지막 갱신: {ts}",
|
|
25575
|
-
"dashboard.tunnel.section": "터널 상태",
|
|
25576
|
-
"dashboard.tunnel.up": "연결됨",
|
|
25577
|
-
"dashboard.tunnel.down": "끊어짐",
|
|
25578
|
-
"dashboard.attach.section": "Attach QR",
|
|
25579
|
-
"dashboard.attach.hint": "start_attach MCP tool을 호출하면 QR이 여기에 표시됩니다.",
|
|
25580
|
-
"dashboard.attach.tunnelDown": "relay 연결이 끊겼습니다 — 이 QR은 더 이상 유효하지 않습니다. relay를 재시작한 뒤 QR을 다시 생성하세요.",
|
|
25581
|
-
"dashboard.pages.section": "연결된 Pages",
|
|
25582
|
-
"dashboard.pages.empty": "attach된 페이지 없음",
|
|
25583
|
-
"dashboard.url.copy": "복사",
|
|
25584
|
-
"dashboard.url.copied": "복사됨",
|
|
25585
|
-
"dashboard.inspector.section": "인스펙터",
|
|
25586
|
-
"dashboard.inspector.open": "디버그 툴 열기",
|
|
25587
|
-
"dashboard.inspector.waiting": "페이지를 attach하면 \"디버그 툴 열기\" 버튼이 표시됩니다",
|
|
25588
|
-
"inspector.error.noTarget": "연결된 페이지가 없습니다. 기기를 attach한 후 다시 시도하세요.",
|
|
25589
|
-
"inspector.error.relayDown": "relay가 활성화되지 않았습니다. start_debug로 relay를 기동하세요.",
|
|
25590
|
-
"dashboard.watchdog.title": "서버가 종료되었습니다",
|
|
25591
|
-
"dashboard.watchdog.body": "MCP server가 종료되어 이 세션이 더 이상 유효하지 않습니다. 이 탭을 닫아도 됩니다.",
|
|
25592
|
-
"dashboard.watchdog.close": "탭 닫기",
|
|
25593
|
-
"dashboard.conn.lost": "연결 끊김 — 재연결 시도 중…",
|
|
25594
|
-
"dashboard.session.completeTitle": "테스트 실행 완료",
|
|
25595
|
-
"dashboard.session.completeBody": "러너가 정상 종료되었습니다. 결과는 터미널에서 확인하세요.",
|
|
25596
|
-
"dashboard.session.shutdownTitle": "디버그 서버가 종료되었습니다",
|
|
25597
|
-
"dashboard.session.shutdownBody": "MCP server가 종료되어 이 세션이 더 이상 유효하지 않습니다. 이 탭을 닫아도 됩니다.",
|
|
25598
|
-
"attach.title": "AIT 디버그 세션 — QR 스캔",
|
|
25599
|
-
"attach.deployment": "deployment: {label}",
|
|
25600
|
-
"attach.steps.section": "스캔 절차",
|
|
25601
|
-
"attach.faq.section": "진단 체크리스트",
|
|
25602
|
-
"attach.url.section": "URL (fallback)",
|
|
25603
|
-
"attach.mode.sandbox": "환경 2 — AITC Sandbox App (PWA)",
|
|
25604
|
-
"attach.mode.intossDev": "환경 3 — intoss-private relay dev",
|
|
25605
|
-
"attach.sandbox.step1": "홈 화면의 launcher PWA 아이콘으로 실행하세요 (Safari 주소창이 보이면 standalone이 아닙니다).",
|
|
25606
|
-
"attach.sandbox.step2": "launcher 안의 <strong>\"QR 카메라로 스캔\"</strong>으로 이 QR 코드를 스캔하세요.",
|
|
25607
|
-
"attach.sandbox.step3": "미니앱이 풀스크린으로 열리고 디버그 세션이 자동으로 attach됩니다.",
|
|
25608
|
-
"attach.sandbox.step4": "<strong>테스트가 끝날 때까지 앱을 화면 앞에 유지하세요</strong> — 백그라운드로 전환하면 디버그 세션이 끊어집니다.",
|
|
25609
|
-
"attach.sandbox.faq.notInstalled": "<strong>launcher가 설치돼 있지 않은 경우</strong> — <code>devtools.aitc.dev/launcher/</code>를 한 번 열어 홈 화면에 추가하세요",
|
|
25610
|
-
"attach.sandbox.faq.cameraApp": "<strong>카메라 앱으로 스캔하면 Safari 탭으로 열립니다 (하단 탭 바 노출)</strong> — launcher 아이콘으로 다시 실행해 인앱 스캔을 사용하세요",
|
|
25611
|
-
"attach.sandbox.faq.totp": "<strong>QR이 만료된 경우 (TOTP — 코드 1개는 30초 창, 만료 후 ~3분(±6 step) 이내 소급 허용)</strong> — 새 QR을 다시 스캔하세요",
|
|
25612
|
-
"attach.sandbox.faq.chii": "<strong>Chii 주입 실패 / 콘솔이 비어 있는 경우</strong> — 미니앱 번들에 <code>in-app</code> debug import가 있는지 확인",
|
|
25613
|
-
"attach.intoss.step1": "토스 앱을 실행하세요.",
|
|
25614
|
-
"attach.intoss.step2": "폰 카메라 앱으로 QR 코드를 스캔하세요.",
|
|
25615
|
-
"attach.intoss.step3": "팝업이 뜨면 <strong>\"토스로 열기\"</strong>를 탭하세요.",
|
|
25616
|
-
"attach.intoss.step4": "미니앱이 열리고 디버그 세션이 자동으로 attach됩니다.",
|
|
25617
|
-
"attach.intoss.step5": "<strong>테스트가 끝날 때까지 토스 앱을 화면 앞에 유지하세요</strong> — 백그라운드로 전환하면 디버그 세션이 끊어집니다.",
|
|
25618
|
-
"attach.intoss.faq.appNotOpen": "<strong>토스 앱이 안 열리는 경우</strong> — 앱 버전 확인, 카메라 앱으로 스캔 (토스 앱 내 QR 리더 X)",
|
|
25619
|
-
"attach.intoss.faq.prepare": "<strong>미니앱이 PREPARE 상태에서 멈추는 경우</strong> — deep-link에 <code>_deploymentId</code> 파라미터가 있는지 확인",
|
|
25620
|
-
"attach.intoss.faq.chii": "<strong>Chii 주입 실패 / 콘솔이 비어 있는 경우</strong> — 미니앱 번들에 <code>in-app</code> debug import가 있는지 확인",
|
|
25621
|
-
"attach.intoss.faq.totp": "<strong>TOTP gate Layer C가 비활성인 경우</strong> — relay 서버에 <code>AIT_DEBUG_TOTP_SECRET</code>이 설정돼 있는지 확인",
|
|
25622
25520
|
"launcher.title": "AITC DevTools Launcher",
|
|
25623
25521
|
"launcher.description": "터미널 QR을 스캔하거나 URL을 입력하세요.",
|
|
25624
25522
|
"launcher.installCta": "폰에 런처 설치하기",
|
|
@@ -25787,6 +25685,24 @@ function useT() {
|
|
|
25787
25685
|
return t;
|
|
25788
25686
|
}
|
|
25789
25687
|
//#endregion
|
|
25688
|
+
//#region src/mock/throttle-registry.ts
|
|
25689
|
+
/**
|
|
25690
|
+
* throttle 레지스트리 (devtools#834).
|
|
25691
|
+
*
|
|
25692
|
+
* 메서드별 마지막 *허용* 호출 시각만 담는 leaf 모듈이다. `state.ts`가 `reset()`에서
|
|
25693
|
+
* 이걸 비워야 하는데, 로직 본체(`throttle.ts`)는 거꾸로 `state.ts`를 읽는다 —
|
|
25694
|
+
* 그래서 **의존이 없는 이 파일로 레지스트리를 분리해** 순환 import를 피한다.
|
|
25695
|
+
*/
|
|
25696
|
+
/** 메서드별 마지막 *허용* 호출 시각(ms). */
|
|
25697
|
+
const lastAllowedAt = /* @__PURE__ */ new Map();
|
|
25698
|
+
/**
|
|
25699
|
+
* throttle 레지스트리를 비운다. `aitState.reset()`이 호출한다 — 상태를 되돌렸는데
|
|
25700
|
+
* 직전 세션의 호출 시각이 남아 있으면 첫 호출이 이유 없이 거부된다.
|
|
25701
|
+
*/
|
|
25702
|
+
function resetThrottleRegistry() {
|
|
25703
|
+
lastAllowedAt.clear();
|
|
25704
|
+
}
|
|
25705
|
+
//#endregion
|
|
25790
25706
|
//#region src/mock/state.ts
|
|
25791
25707
|
/** SDK 호출 로그 ring buffer 상한 */
|
|
25792
25708
|
const SDK_CALL_LOG_MAX = 200;
|
|
@@ -26016,6 +25932,7 @@ var AitStateManager = class {
|
|
|
26016
25932
|
...structuredClone(DEFAULT_STATE),
|
|
26017
25933
|
deviceId
|
|
26018
25934
|
};
|
|
25935
|
+
resetThrottleRegistry();
|
|
26019
25936
|
this._notify();
|
|
26020
25937
|
}
|
|
26021
25938
|
_notify() {
|
|
@@ -26433,7 +26350,9 @@ function waitForPromptResponse(type) {
|
|
|
26433
26350
|
* - 3.x 라인: 같은 실패가 "맨 Error"(위 envelope 필드 없음)로 평탄화된다 —
|
|
26434
26351
|
* sdk-example#284 "패턴 ① 오류 envelope 평탄화" 표.
|
|
26435
26352
|
*
|
|
26436
|
-
* `src/test-runner/bridge-stub.ts
|
|
26353
|
+
* `@ait-co/debugger`의 `packages/debugger/src/test-runner/bridge-stub.ts`(분리 전
|
|
26354
|
+
* 이 repo의 `src/test-runner/bridge-stub.ts`)에 있는
|
|
26355
|
+
* `NativeBridgeErrorShape`/`makeNativeError`가
|
|
26437
26356
|
* 같은 shape을 이미 CI 러너 쪽에서 재현하고 있다(devtools#740) — 이 모듈은 그
|
|
26438
26357
|
* shape을 mock 소비자 표면(`src/mock/**`)에 대해 재사용 가능한 형태로 옮긴 것이다.
|
|
26439
26358
|
* 두 모듈은 레이어가 다르다: test-runner 쪽은 env3 blocking-call 인터셉터(빌드에
|
|
@@ -26811,6 +26730,50 @@ const _fetchAlbumItems = async (options) => {
|
|
|
26811
26730
|
const _fetchAlbumItemsWithPermission = withPermission(_fetchAlbumItems, "photos");
|
|
26812
26731
|
Object.assign(_fetchAlbumItemsWithPermission, { isSupported: () => true });
|
|
26813
26732
|
//#endregion
|
|
26733
|
+
//#region src/mock/throttle.ts
|
|
26734
|
+
/**
|
|
26735
|
+
* THROTTLED 시뮬레이션 (devtools#834 — #770 §3 분리).
|
|
26736
|
+
*
|
|
26737
|
+
* 실기기 네이티브 브리지는 같은 메서드를 짧은 간격으로 연타하면
|
|
26738
|
+
* `APP_BRIDGE_THROTTLED`로 거부한다. 이 모듈은 그 per-method rate limit을
|
|
26739
|
+
* env1(mock)에서 **opt-in으로** 재현한다 — 다이얼(`failureModes.throttled`)이
|
|
26740
|
+
* 미설정이면 아무 일도 하지 않으므로 zero behavior change다.
|
|
26741
|
+
*
|
|
26742
|
+
* 설계 메모 두 가지:
|
|
26743
|
+
*
|
|
26744
|
+
* 1. **거부된 호출은 창을 갱신하지 않는다.** 마지막 *허용된* 호출 시각만 기록하므로,
|
|
26745
|
+
* `intervalMs` 안에서 계속 연타해도 창이 밀려나지 않고 최초 허용 시점 기준으로
|
|
26746
|
+
* 풀린다. 네이티브 rate limit의 통상 동작이자, 연타 중 영원히 막히는(창이 계속
|
|
26747
|
+
* 갱신되는) 반-패턴을 피한다.
|
|
26748
|
+
* 2. **`observe()`에 걸지 않는다.** `observe()`는 `fn`을 호출하기 *전에* 감싸므로
|
|
26749
|
+
* 거기서 throw하면 원래 Promise를 반환하는 API가 **동기 throw**로 바뀐다.
|
|
26750
|
+
* `threwSync`는 env1↔env3 동치 diff의 관측 축이라 그 차이가 곧 가짜 불일치가 된다.
|
|
26751
|
+
* 그래서 각 mock 구현 본문 안(= 그 API 자신의 sync/async 계약 안)에 수동 삽입한다.
|
|
26752
|
+
*/
|
|
26753
|
+
/**
|
|
26754
|
+
* `method`가 지금 throttle에 걸리면 네이티브 실패 에러를 돌려주고, 아니면
|
|
26755
|
+
* 호출 시각을 기록한 뒤 `undefined`를 돌려준다.
|
|
26756
|
+
*
|
|
26757
|
+
* 반환된 에러를 **호출부가 자신의 계약대로** 흘려보낸다 — async mock은 `throw`
|
|
26758
|
+
* (= reject), 콜백형 mock은 `onError(err)`. 그래서 이 함수 자체는 던지지 않는다.
|
|
26759
|
+
*/
|
|
26760
|
+
function throttleErrorFor(method) {
|
|
26761
|
+
const dial = aitState.state.failureModes.throttled;
|
|
26762
|
+
if (!dial?.methods.includes(method)) return void 0;
|
|
26763
|
+
const now = Date.now();
|
|
26764
|
+
const prev = lastAllowedAt.get(method);
|
|
26765
|
+
if (prev !== void 0 && now - prev < dial.intervalMs) return buildNativeError("APP_BRIDGE_THROTTLED");
|
|
26766
|
+
lastAllowedAt.set(method, now);
|
|
26767
|
+
}
|
|
26768
|
+
/**
|
|
26769
|
+
* `throttleErrorFor`의 throw 버전 — async mock 본문에서 한 줄로 쓴다.
|
|
26770
|
+
* async 함수 안에서 던지므로 호출자에게는 rejection으로 도달한다.
|
|
26771
|
+
*/
|
|
26772
|
+
function checkThrottle(method) {
|
|
26773
|
+
const err = throttleErrorFor(method);
|
|
26774
|
+
if (err) throw err;
|
|
26775
|
+
}
|
|
26776
|
+
//#endregion
|
|
26814
26777
|
//#region src/mock/device/clipboard.ts
|
|
26815
26778
|
/**
|
|
26816
26779
|
* Clipboard mock
|
|
@@ -26818,6 +26781,7 @@ Object.assign(_fetchAlbumItemsWithPermission, { isSupported: () => true });
|
|
|
26818
26781
|
*/
|
|
26819
26782
|
const _getClipboardText = async () => {
|
|
26820
26783
|
checkPermission("clipboard", "getClipboardText");
|
|
26784
|
+
checkThrottle("getClipboardText");
|
|
26821
26785
|
if (aitState.state.deviceModes.clipboard === "mock") return aitState.state.mockData.clipboardText;
|
|
26822
26786
|
try {
|
|
26823
26787
|
return await navigator.clipboard.readText();
|
|
@@ -26828,6 +26792,7 @@ const _getClipboardText = async () => {
|
|
|
26828
26792
|
withPermission(_getClipboardText, "clipboard");
|
|
26829
26793
|
const _setClipboardText = async (text) => {
|
|
26830
26794
|
checkPermission("clipboard", "setClipboardText");
|
|
26795
|
+
checkThrottle("setClipboardText");
|
|
26831
26796
|
if (aitState.state.deviceModes.clipboard === "mock") {
|
|
26832
26797
|
aitState.patch("mockData", { clipboardText: text });
|
|
26833
26798
|
return { text };
|
|
@@ -26979,6 +26944,7 @@ async function getCurrentLocationPrompt() {
|
|
|
26979
26944
|
}
|
|
26980
26945
|
const _getCurrentLocation = async (_options) => {
|
|
26981
26946
|
checkPermission("geolocation", "getCurrentLocation");
|
|
26947
|
+
checkThrottle("getCurrentLocation");
|
|
26982
26948
|
const mode = aitState.state.deviceModes.location;
|
|
26983
26949
|
if (mode === "web") return getCurrentLocationWeb();
|
|
26984
26950
|
if (mode === "prompt") return getCurrentLocationPrompt();
|
|
@@ -27446,6 +27412,11 @@ const GoogleAdMob = createMockProxy("GoogleAdMob", {
|
|
|
27446
27412
|
args.onError(buildNativeError(failureCode));
|
|
27447
27413
|
return;
|
|
27448
27414
|
}
|
|
27415
|
+
const throttleError = throttleErrorFor("loadAppsInTossAdMob");
|
|
27416
|
+
if (throttleError) {
|
|
27417
|
+
args.onError(throttleError);
|
|
27418
|
+
return;
|
|
27419
|
+
}
|
|
27449
27420
|
if (aitState.state.ads.forceNoFill) {
|
|
27450
27421
|
args.onError(/* @__PURE__ */ new Error("No fill"));
|
|
27451
27422
|
return;
|
|
@@ -27574,6 +27545,11 @@ const loadFullScreenAd = observe("loadFullScreenAd", "faithful", (args) => {
|
|
|
27574
27545
|
args.onError(buildNativeError(failureCode));
|
|
27575
27546
|
return;
|
|
27576
27547
|
}
|
|
27548
|
+
const throttleError = throttleErrorFor("loadFullScreenAd");
|
|
27549
|
+
if (throttleError) {
|
|
27550
|
+
args.onError(throttleError);
|
|
27551
|
+
return;
|
|
27552
|
+
}
|
|
27577
27553
|
if (aitState.state.ads.forceNoFill) {
|
|
27578
27554
|
args.onError(/* @__PURE__ */ new Error("No fill"));
|
|
27579
27555
|
return;
|
|
@@ -30295,7 +30271,7 @@ function Panel() {
|
|
|
30295
30271
|
color: "#666",
|
|
30296
30272
|
fontWeight: 400
|
|
30297
30273
|
},
|
|
30298
|
-
children: ["v", "0.1
|
|
30274
|
+
children: ["v", "0.2.1"]
|
|
30299
30275
|
}),
|
|
30300
30276
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
30301
30277
|
type: "button",
|