@ait-co/devtools 0.1.132 → 0.1.133
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{attach-orchestrator-ca34r46y.js → attach-orchestrator-CE0S09YU.js} +110 -5
- package/dist/attach-orchestrator-CE0S09YU.js.map +1 -0
- package/dist/{attach-orchestrator-BiaYiNOr.js → attach-orchestrator-CMoDuG2A.js} +110 -5
- package/dist/attach-orchestrator-CMoDuG2A.js.map +1 -0
- package/dist/cell-BIdSQb9T.js +201 -0
- package/dist/cell-BIdSQb9T.js.map +1 -0
- package/dist/{cell-Cw4fVOl2.js → cell-D1y4shoV.js} +1 -21
- package/dist/cell-D1y4shoV.js.map +1 -0
- package/dist/cell-DHA578lX.js +200 -0
- package/dist/cell-DHA578lX.js.map +1 -0
- package/dist/{debug-server-Ch5p0ryv.js → debug-server-CS1BS2BX.js} +2 -2
- package/dist/{debug-server-Ch5p0ryv.js.map → debug-server-CS1BS2BX.js.map} +1 -1
- package/dist/{debug-server-DoWAtTNj.js → debug-server-DmzuK2c6.js} +7 -8
- package/dist/{debug-server-DoWAtTNj.js.map → debug-server-DmzuK2c6.js.map} +1 -1
- package/dist/{debug-server-BBUzxZSf.js → debug-server-DnNCoNiR.js} +7 -7
- package/dist/{debug-server-BBUzxZSf.js.map → debug-server-DnNCoNiR.js.map} +1 -1
- package/dist/mcp/cli.js +111 -4
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/panel/index.js +1 -1
- package/dist/{pool-BtLh7U1y.d.ts → pool-x28Wv1ty.d.ts} +2 -2
- package/dist/{pool-BtLh7U1y.d.ts.map → pool-x28Wv1ty.d.ts.map} +1 -1
- package/dist/{qr-http-server-KB147M-S.js → qr-http-server-C_DTp9WU.js} +1 -1
- package/dist/{qr-http-server-KB147M-S.js.map → qr-http-server-C_DTp9WU.js.map} +1 -1
- package/dist/{relay-factory-cNgPfrWg.js → relay-factory-BQfmK7RP.js} +6 -6
- package/dist/{relay-factory-cNgPfrWg.js.map → relay-factory-BQfmK7RP.js.map} +1 -1
- package/dist/{relay-secret-store-CFc9n0OA.js → relay-secret-store-CLEGyHou.js} +2 -2
- package/dist/{relay-secret-store-CFc9n0OA.js.map → relay-secret-store-CLEGyHou.js.map} +1 -1
- package/dist/{relay-secret-store-DzxDsK6S.js → relay-secret-store-DGduVJhs.js} +2 -2
- package/dist/{relay-secret-store-DzxDsK6S.js.map → relay-secret-store-DGduVJhs.js.map} +1 -1
- package/dist/{relay-url-store-D3rY-GJJ.js → relay-url-store-B0X8TsGr.js} +2 -2
- package/dist/{relay-url-store-D3rY-GJJ.js.map → relay-url-store-B0X8TsGr.js.map} +1 -1
- package/dist/{relay-url-store-DGQ-HPQC.js → relay-url-store-CKW8RQzf.js} +2 -2
- package/dist/{relay-url-store-DGQ-HPQC.js.map → relay-url-store-CKW8RQzf.js.map} +1 -1
- package/dist/{relay-worker-BMSnlyls.d.ts → relay-worker-DtX_eszH.d.ts} +13 -1
- package/dist/relay-worker-DtX_eszH.d.ts.map +1 -0
- package/dist/{relay-worker-l34xNuci.js → relay-worker-MZq4fLv8.js} +8 -4
- package/dist/{relay-worker-l34xNuci.js.map → relay-worker-MZq4fLv8.js.map} +1 -1
- package/dist/rolldown-runtime-DGkTqVfb.js +15 -0
- package/dist/rolldown-runtime-DUslC3ob.js +14 -0
- package/dist/test-runner/bin.js +15 -101
- package/dist/test-runner/bin.js.map +1 -1
- package/dist/test-runner/config.d.ts +1 -1
- package/dist/test-runner/config.js +1 -1
- package/dist/test-runner/pool.d.ts +1 -1
- package/dist/test-runner/pool.js +1 -1
- package/dist/test-runner/relay-factory.js +3 -3
- package/dist/test-runner/relay-worker.d.ts +1 -1
- package/dist/test-runner/relay-worker.js +1 -1
- package/dist/test-runner/report.d.ts +10 -1
- package/dist/test-runner/report.d.ts.map +1 -1
- package/dist/test-runner/report.js +1 -0
- package/dist/test-runner/report.js.map +1 -1
- package/dist/{totp-DvOYkYim.js → totp-CZLLKfOC.js} +2 -14
- package/dist/{totp-DvOYkYim.js.map → totp-CZLLKfOC.js.map} +1 -1
- package/dist/totp-DAxys-r0.js +199 -0
- package/dist/totp-DAxys-r0.js.map +1 -0
- package/package.json +1 -1
- package/dist/attach-orchestrator-BiaYiNOr.js.map +0 -1
- package/dist/attach-orchestrator-ca34r46y.js.map +0 -1
- package/dist/cell-Bi8MAPA8.js +0 -88
- package/dist/cell-Bi8MAPA8.js.map +0 -1
- package/dist/cell-Cw4fVOl2.js.map +0 -1
- package/dist/cell-rr6gL9AT.js +0 -89
- package/dist/cell-rr6gL9AT.js.map +0 -1
- package/dist/log-CUik_tHp.js +0 -95
- package/dist/log-CUik_tHp.js.map +0 -1
- package/dist/relay-worker-BMSnlyls.d.ts.map +0 -1
package/dist/cell-Bi8MAPA8.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { buildIndicatorExpression } from "./attach-orchestrator-BiaYiNOr.js";
|
|
2
|
-
//#region src/test-runner/cell.ts
|
|
3
|
-
/**
|
|
4
|
-
* Cell injection utility for the `devtools-test` CLI (issue #684 §4.1).
|
|
5
|
-
*
|
|
6
|
-
* Injects arbitrary globals into the page via `Runtime.evaluate` BEFORE the
|
|
7
|
-
* first test bundle is injected. The injected values are session-global — one
|
|
8
|
-
* call covers all files in the run.
|
|
9
|
-
*
|
|
10
|
-
* The primary use-case is injecting `__AIT_CELL__` (sdkLine/platform) so
|
|
11
|
-
* sdk-example's `aitCapture.ts` picks up the correct test-axis values instead
|
|
12
|
-
* of falling back to `'2.x'`/`'mock'`.
|
|
13
|
-
*
|
|
14
|
-
* devtools does NOT know the shape of `__AIT_CELL__` — it only provides the
|
|
15
|
-
* general injection mechanism. The caller (CLI or MCP auto-attach path) is
|
|
16
|
-
* responsible for constructing the cell object.
|
|
17
|
-
*
|
|
18
|
-
* SECRET-HANDLING: cell values (sdkLine/platform) are not secrets and may be
|
|
19
|
-
* logged at the caller's discretion. This module does NOT log them itself.
|
|
20
|
-
*
|
|
21
|
-
* Node-only. react-free. CdpConnection only.
|
|
22
|
-
*/
|
|
23
|
-
/**
|
|
24
|
-
* Injects each key of `globals` into `globalThis` in the page via a single
|
|
25
|
-
* `Runtime.evaluate` call. Must be called BEFORE the first `bundleTestFile`
|
|
26
|
-
* inject — the cell is session-global and applies to all subsequent files.
|
|
27
|
-
*
|
|
28
|
-
* Throws if the CDP evaluate returns an exception.
|
|
29
|
-
*
|
|
30
|
-
* @param conn - The live CDP connection (relay-attached page).
|
|
31
|
-
* @param globals - Plain-JSON-serialisable key→value map to assign onto `globalThis`.
|
|
32
|
-
*/
|
|
33
|
-
async function injectGlobals(conn, globals) {
|
|
34
|
-
const expr = `(() => { Object.assign(globalThis, ${JSON.stringify(globals)}); return true; })()`;
|
|
35
|
-
const result = await conn.send("Runtime.evaluate", {
|
|
36
|
-
expression: expr,
|
|
37
|
-
returnByValue: true
|
|
38
|
-
});
|
|
39
|
-
if (result.exceptionDetails) {
|
|
40
|
-
const msg = result.exceptionDetails.exception?.description ?? result.exceptionDetails.text ?? "unknown error";
|
|
41
|
-
throw new Error(`injectGlobals: Runtime.evaluate threw: ${msg}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Injects (or updates) the "Debugger Connected"/"Debugger Disconnected"
|
|
46
|
-
* on-phone indicator via `Runtime.evaluate` (#730).
|
|
47
|
-
*
|
|
48
|
-
* Uses the same CDP mechanism as {@link injectGlobals} — a single
|
|
49
|
-
* `Runtime.evaluate` round-trip with the expression built by
|
|
50
|
-
* {@link buildIndicatorExpression}. The indicator is a LIVE badge rendered at
|
|
51
|
-
* the bottom-left of the page (position:fixed, safe-area-aware): the badge's
|
|
52
|
-
* controller is idempotent, so calling this again (e.g. right before
|
|
53
|
-
* `close()` with `{ state: 'disconnected' }`) UPDATES the existing badge in
|
|
54
|
-
* place instead of injecting a duplicate.
|
|
55
|
-
*
|
|
56
|
-
* **Isolation**: unlike {@link injectGlobals}, this function NEVER throws to
|
|
57
|
-
* its caller. Injection failure (e.g. page detached during inject, CSS not
|
|
58
|
-
* supported) is swallowed and logged as `console.debug` — the badge is
|
|
59
|
-
* informational UI and must never block attach success or test execution.
|
|
60
|
-
* This is the same fire-and-forget spirit as the in-page console mount in
|
|
61
|
-
* `src/in-app/attach.ts`.
|
|
62
|
-
*
|
|
63
|
-
* Call this ONLY on the manual debug paths (start_attach MCP, devtools-test
|
|
64
|
-
* CLI). Do NOT call on the `run_tests` auto-attach path — the badge
|
|
65
|
-
* would contaminate screenshots, measure_safe_area probes, and DOM snapshots
|
|
66
|
-
* taken during automated measurement runs.
|
|
67
|
-
*
|
|
68
|
-
* SECRET-HANDLING: the injected expression contains no secrets, relay URLs,
|
|
69
|
-
* wss addresses, or TOTP codes — it is pure DOM UI text + enum state built by
|
|
70
|
-
* {@link buildIndicatorExpression}.
|
|
71
|
-
*
|
|
72
|
-
* @param conn - The live CDP connection (relay-attached page).
|
|
73
|
-
* @param opts - Optional overrides forwarded to {@link buildIndicatorExpression}.
|
|
74
|
-
*/
|
|
75
|
-
async function injectDebugIndicator(conn, opts) {
|
|
76
|
-
try {
|
|
77
|
-
await conn.send("Runtime.evaluate", {
|
|
78
|
-
expression: buildIndicatorExpression(opts),
|
|
79
|
-
returnByValue: true
|
|
80
|
-
});
|
|
81
|
-
} catch (err) {
|
|
82
|
-
console.debug("[@ait-co/devtools] debug indicator inject skipped:", err);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
//#endregion
|
|
86
|
-
export { injectDebugIndicator, injectGlobals };
|
|
87
|
-
|
|
88
|
-
//# sourceMappingURL=cell-Bi8MAPA8.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell-Bi8MAPA8.js","names":[],"sources":["../src/test-runner/cell.ts"],"sourcesContent":["/**\n * Cell injection utility for the `devtools-test` CLI (issue #684 §4.1).\n *\n * Injects arbitrary globals into the page via `Runtime.evaluate` BEFORE the\n * first test bundle is injected. The injected values are session-global — one\n * call covers all files in the run.\n *\n * The primary use-case is injecting `__AIT_CELL__` (sdkLine/platform) so\n * sdk-example's `aitCapture.ts` picks up the correct test-axis values instead\n * of falling back to `'2.x'`/`'mock'`.\n *\n * devtools does NOT know the shape of `__AIT_CELL__` — it only provides the\n * general injection mechanism. The caller (CLI or MCP auto-attach path) is\n * responsible for constructing the cell object.\n *\n * SECRET-HANDLING: cell values (sdkLine/platform) are not secrets and may be\n * logged at the caller's discretion. This module does NOT log them itself.\n *\n * Node-only. react-free. CdpConnection only.\n */\n\nimport { buildIndicatorExpression } from '../mcp/attach-orchestrator.js';\nimport type { CdpConnection } from '../mcp/cdp-connection.js';\n\n/**\n * Injects each key of `globals` into `globalThis` in the page via a single\n * `Runtime.evaluate` call. Must be called BEFORE the first `bundleTestFile`\n * inject — the cell is session-global and applies to all subsequent files.\n *\n * Throws if the CDP evaluate returns an exception.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param globals - Plain-JSON-serialisable key→value map to assign onto `globalThis`.\n */\nexport async function injectGlobals(\n conn: CdpConnection,\n globals: Record<string, unknown>,\n): Promise<void> {\n // JSON.stringify is safe here: globals values are plain data (sdkLine/platform\n // strings or simple objects). If a value is not JSON-serialisable this throws\n // at call time, which surfaces the error early and clearly.\n const expr = `(() => { Object.assign(globalThis, ${JSON.stringify(globals)}); return true; })()`;\n const result = await conn.send('Runtime.evaluate', { expression: expr, returnByValue: true });\n if (result.exceptionDetails) {\n const msg =\n result.exceptionDetails.exception?.description ??\n result.exceptionDetails.text ??\n 'unknown error';\n throw new Error(`injectGlobals: Runtime.evaluate threw: ${msg}`);\n }\n}\n\n/**\n * Injects (or updates) the \"Debugger Connected\"/\"Debugger Disconnected\"\n * on-phone indicator via `Runtime.evaluate` (#730).\n *\n * Uses the same CDP mechanism as {@link injectGlobals} — a single\n * `Runtime.evaluate` round-trip with the expression built by\n * {@link buildIndicatorExpression}. The indicator is a LIVE badge rendered at\n * the bottom-left of the page (position:fixed, safe-area-aware): the badge's\n * controller is idempotent, so calling this again (e.g. right before\n * `close()` with `{ state: 'disconnected' }`) UPDATES the existing badge in\n * place instead of injecting a duplicate.\n *\n * **Isolation**: unlike {@link injectGlobals}, this function NEVER throws to\n * its caller. Injection failure (e.g. page detached during inject, CSS not\n * supported) is swallowed and logged as `console.debug` — the badge is\n * informational UI and must never block attach success or test execution.\n * This is the same fire-and-forget spirit as the in-page console mount in\n * `src/in-app/attach.ts`.\n *\n * Call this ONLY on the manual debug paths (start_attach MCP, devtools-test\n * CLI). Do NOT call on the `run_tests` auto-attach path — the badge\n * would contaminate screenshots, measure_safe_area probes, and DOM snapshots\n * taken during automated measurement runs.\n *\n * SECRET-HANDLING: the injected expression contains no secrets, relay URLs,\n * wss addresses, or TOTP codes — it is pure DOM UI text + enum state built by\n * {@link buildIndicatorExpression}.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param opts - Optional overrides forwarded to {@link buildIndicatorExpression}.\n */\nexport async function injectDebugIndicator(\n conn: CdpConnection,\n opts?: { label?: string; disconnectedLabel?: string; state?: 'attached' | 'disconnected' },\n): Promise<void> {\n try {\n await conn.send('Runtime.evaluate', {\n expression: buildIndicatorExpression(opts),\n returnByValue: true,\n });\n } catch (err) {\n // Badge injection is informational UI — swallow and log; never propagate.\n console.debug('[@ait-co/devtools] debug indicator inject skipped:', err);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAsB,cACpB,MACA,SACe;CAIf,MAAM,OAAO,sCAAsC,KAAK,UAAU,QAAQ,CAAC;CAC3E,MAAM,SAAS,MAAM,KAAK,KAAK,oBAAoB;EAAE,YAAY;EAAM,eAAe;EAAM,CAAC;AAC7F,KAAI,OAAO,kBAAkB;EAC3B,MAAM,MACJ,OAAO,iBAAiB,WAAW,eACnC,OAAO,iBAAiB,QACxB;AACF,QAAM,IAAI,MAAM,0CAA0C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCpE,eAAsB,qBACpB,MACA,MACe;AACf,KAAI;AACF,QAAM,KAAK,KAAK,oBAAoB;GAClC,YAAY,yBAAyB,KAAK;GAC1C,eAAe;GAChB,CAAC;UACK,KAAK;AAEZ,UAAQ,MAAM,sDAAsD,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell-Cw4fVOl2.js","names":[],"sources":["../src/test-runner/cell.ts"],"sourcesContent":["/**\n * Cell injection utility for the `devtools-test` CLI (issue #684 §4.1).\n *\n * Injects arbitrary globals into the page via `Runtime.evaluate` BEFORE the\n * first test bundle is injected. The injected values are session-global — one\n * call covers all files in the run.\n *\n * The primary use-case is injecting `__AIT_CELL__` (sdkLine/platform) so\n * sdk-example's `aitCapture.ts` picks up the correct test-axis values instead\n * of falling back to `'2.x'`/`'mock'`.\n *\n * devtools does NOT know the shape of `__AIT_CELL__` — it only provides the\n * general injection mechanism. The caller (CLI or MCP auto-attach path) is\n * responsible for constructing the cell object.\n *\n * SECRET-HANDLING: cell values (sdkLine/platform) are not secrets and may be\n * logged at the caller's discretion. This module does NOT log them itself.\n *\n * Node-only. react-free. CdpConnection only.\n */\n\nimport { buildIndicatorExpression } from '../mcp/attach-orchestrator.js';\nimport type { CdpConnection } from '../mcp/cdp-connection.js';\n\n/**\n * Injects each key of `globals` into `globalThis` in the page via a single\n * `Runtime.evaluate` call. Must be called BEFORE the first `bundleTestFile`\n * inject — the cell is session-global and applies to all subsequent files.\n *\n * Throws if the CDP evaluate returns an exception.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param globals - Plain-JSON-serialisable key→value map to assign onto `globalThis`.\n */\nexport async function injectGlobals(\n conn: CdpConnection,\n globals: Record<string, unknown>,\n): Promise<void> {\n // JSON.stringify is safe here: globals values are plain data (sdkLine/platform\n // strings or simple objects). If a value is not JSON-serialisable this throws\n // at call time, which surfaces the error early and clearly.\n const expr = `(() => { Object.assign(globalThis, ${JSON.stringify(globals)}); return true; })()`;\n const result = await conn.send('Runtime.evaluate', { expression: expr, returnByValue: true });\n if (result.exceptionDetails) {\n const msg =\n result.exceptionDetails.exception?.description ??\n result.exceptionDetails.text ??\n 'unknown error';\n throw new Error(`injectGlobals: Runtime.evaluate threw: ${msg}`);\n }\n}\n\n/**\n * Injects (or updates) the \"Debugger Connected\"/\"Debugger Disconnected\"\n * on-phone indicator via `Runtime.evaluate` (#730).\n *\n * Uses the same CDP mechanism as {@link injectGlobals} — a single\n * `Runtime.evaluate` round-trip with the expression built by\n * {@link buildIndicatorExpression}. The indicator is a LIVE badge rendered at\n * the bottom-left of the page (position:fixed, safe-area-aware): the badge's\n * controller is idempotent, so calling this again (e.g. right before\n * `close()` with `{ state: 'disconnected' }`) UPDATES the existing badge in\n * place instead of injecting a duplicate.\n *\n * **Isolation**: unlike {@link injectGlobals}, this function NEVER throws to\n * its caller. Injection failure (e.g. page detached during inject, CSS not\n * supported) is swallowed and logged as `console.debug` — the badge is\n * informational UI and must never block attach success or test execution.\n * This is the same fire-and-forget spirit as the in-page console mount in\n * `src/in-app/attach.ts`.\n *\n * Call this ONLY on the manual debug paths (start_attach MCP, devtools-test\n * CLI). Do NOT call on the `run_tests` auto-attach path — the badge\n * would contaminate screenshots, measure_safe_area probes, and DOM snapshots\n * taken during automated measurement runs.\n *\n * SECRET-HANDLING: the injected expression contains no secrets, relay URLs,\n * wss addresses, or TOTP codes — it is pure DOM UI text + enum state built by\n * {@link buildIndicatorExpression}.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param opts - Optional overrides forwarded to {@link buildIndicatorExpression}.\n */\nexport async function injectDebugIndicator(\n conn: CdpConnection,\n opts?: { label?: string; disconnectedLabel?: string; state?: 'attached' | 'disconnected' },\n): Promise<void> {\n try {\n await conn.send('Runtime.evaluate', {\n expression: buildIndicatorExpression(opts),\n returnByValue: true,\n });\n } catch (err) {\n // Badge injection is informational UI — swallow and log; never propagate.\n console.debug('[@ait-co/devtools] debug indicator inject skipped:', err);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAsB,cACpB,MACA,SACe;CAIf,MAAM,OAAO,sCAAsC,KAAK,UAAU,QAAQ,CAAC;CAC3E,MAAM,SAAS,MAAM,KAAK,KAAK,oBAAoB;EAAE,YAAY;EAAM,eAAe;EAAM,CAAC;AAC7F,KAAI,OAAO,kBAAkB;EAC3B,MAAM,MACJ,OAAO,iBAAiB,WAAW,eACnC,OAAO,iBAAiB,QACxB;AACF,QAAM,IAAI,MAAM,0CAA0C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCpE,eAAsB,qBACpB,MACA,MACe;AACf,KAAI;AACF,QAAM,KAAK,KAAK,oBAAoB;GAClC,YAAY,yBAAyB,KAAK;GAC1C,eAAe;GAChB,CAAC;UACK,KAAK;AAEZ,UAAQ,MAAM,sDAAsD,IAAI"}
|
package/dist/cell-rr6gL9AT.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { buildIndicatorExpression } from "./attach-orchestrator-ca34r46y.js";
|
|
3
|
-
//#region src/test-runner/cell.ts
|
|
4
|
-
/**
|
|
5
|
-
* Cell injection utility for the `devtools-test` CLI (issue #684 §4.1).
|
|
6
|
-
*
|
|
7
|
-
* Injects arbitrary globals into the page via `Runtime.evaluate` BEFORE the
|
|
8
|
-
* first test bundle is injected. The injected values are session-global — one
|
|
9
|
-
* call covers all files in the run.
|
|
10
|
-
*
|
|
11
|
-
* The primary use-case is injecting `__AIT_CELL__` (sdkLine/platform) so
|
|
12
|
-
* sdk-example's `aitCapture.ts` picks up the correct test-axis values instead
|
|
13
|
-
* of falling back to `'2.x'`/`'mock'`.
|
|
14
|
-
*
|
|
15
|
-
* devtools does NOT know the shape of `__AIT_CELL__` — it only provides the
|
|
16
|
-
* general injection mechanism. The caller (CLI or MCP auto-attach path) is
|
|
17
|
-
* responsible for constructing the cell object.
|
|
18
|
-
*
|
|
19
|
-
* SECRET-HANDLING: cell values (sdkLine/platform) are not secrets and may be
|
|
20
|
-
* logged at the caller's discretion. This module does NOT log them itself.
|
|
21
|
-
*
|
|
22
|
-
* Node-only. react-free. CdpConnection only.
|
|
23
|
-
*/
|
|
24
|
-
/**
|
|
25
|
-
* Injects each key of `globals` into `globalThis` in the page via a single
|
|
26
|
-
* `Runtime.evaluate` call. Must be called BEFORE the first `bundleTestFile`
|
|
27
|
-
* inject — the cell is session-global and applies to all subsequent files.
|
|
28
|
-
*
|
|
29
|
-
* Throws if the CDP evaluate returns an exception.
|
|
30
|
-
*
|
|
31
|
-
* @param conn - The live CDP connection (relay-attached page).
|
|
32
|
-
* @param globals - Plain-JSON-serialisable key→value map to assign onto `globalThis`.
|
|
33
|
-
*/
|
|
34
|
-
async function injectGlobals(conn, globals) {
|
|
35
|
-
const expr = `(() => { Object.assign(globalThis, ${JSON.stringify(globals)}); return true; })()`;
|
|
36
|
-
const result = await conn.send("Runtime.evaluate", {
|
|
37
|
-
expression: expr,
|
|
38
|
-
returnByValue: true
|
|
39
|
-
});
|
|
40
|
-
if (result.exceptionDetails) {
|
|
41
|
-
const msg = result.exceptionDetails.exception?.description ?? result.exceptionDetails.text ?? "unknown error";
|
|
42
|
-
throw new Error(`injectGlobals: Runtime.evaluate threw: ${msg}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Injects (or updates) the "Debugger Connected"/"Debugger Disconnected"
|
|
47
|
-
* on-phone indicator via `Runtime.evaluate` (#730).
|
|
48
|
-
*
|
|
49
|
-
* Uses the same CDP mechanism as {@link injectGlobals} — a single
|
|
50
|
-
* `Runtime.evaluate` round-trip with the expression built by
|
|
51
|
-
* {@link buildIndicatorExpression}. The indicator is a LIVE badge rendered at
|
|
52
|
-
* the bottom-left of the page (position:fixed, safe-area-aware): the badge's
|
|
53
|
-
* controller is idempotent, so calling this again (e.g. right before
|
|
54
|
-
* `close()` with `{ state: 'disconnected' }`) UPDATES the existing badge in
|
|
55
|
-
* place instead of injecting a duplicate.
|
|
56
|
-
*
|
|
57
|
-
* **Isolation**: unlike {@link injectGlobals}, this function NEVER throws to
|
|
58
|
-
* its caller. Injection failure (e.g. page detached during inject, CSS not
|
|
59
|
-
* supported) is swallowed and logged as `console.debug` — the badge is
|
|
60
|
-
* informational UI and must never block attach success or test execution.
|
|
61
|
-
* This is the same fire-and-forget spirit as the in-page console mount in
|
|
62
|
-
* `src/in-app/attach.ts`.
|
|
63
|
-
*
|
|
64
|
-
* Call this ONLY on the manual debug paths (start_attach MCP, devtools-test
|
|
65
|
-
* CLI). Do NOT call on the `run_tests` auto-attach path — the badge
|
|
66
|
-
* would contaminate screenshots, measure_safe_area probes, and DOM snapshots
|
|
67
|
-
* taken during automated measurement runs.
|
|
68
|
-
*
|
|
69
|
-
* SECRET-HANDLING: the injected expression contains no secrets, relay URLs,
|
|
70
|
-
* wss addresses, or TOTP codes — it is pure DOM UI text + enum state built by
|
|
71
|
-
* {@link buildIndicatorExpression}.
|
|
72
|
-
*
|
|
73
|
-
* @param conn - The live CDP connection (relay-attached page).
|
|
74
|
-
* @param opts - Optional overrides forwarded to {@link buildIndicatorExpression}.
|
|
75
|
-
*/
|
|
76
|
-
async function injectDebugIndicator(conn, opts) {
|
|
77
|
-
try {
|
|
78
|
-
await conn.send("Runtime.evaluate", {
|
|
79
|
-
expression: buildIndicatorExpression(opts),
|
|
80
|
-
returnByValue: true
|
|
81
|
-
});
|
|
82
|
-
} catch (err) {
|
|
83
|
-
console.debug("[@ait-co/devtools] debug indicator inject skipped:", err);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//#endregion
|
|
87
|
-
export { injectDebugIndicator, injectGlobals };
|
|
88
|
-
|
|
89
|
-
//# sourceMappingURL=cell-rr6gL9AT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell-rr6gL9AT.js","names":[],"sources":["../src/test-runner/cell.ts"],"sourcesContent":["/**\n * Cell injection utility for the `devtools-test` CLI (issue #684 §4.1).\n *\n * Injects arbitrary globals into the page via `Runtime.evaluate` BEFORE the\n * first test bundle is injected. The injected values are session-global — one\n * call covers all files in the run.\n *\n * The primary use-case is injecting `__AIT_CELL__` (sdkLine/platform) so\n * sdk-example's `aitCapture.ts` picks up the correct test-axis values instead\n * of falling back to `'2.x'`/`'mock'`.\n *\n * devtools does NOT know the shape of `__AIT_CELL__` — it only provides the\n * general injection mechanism. The caller (CLI or MCP auto-attach path) is\n * responsible for constructing the cell object.\n *\n * SECRET-HANDLING: cell values (sdkLine/platform) are not secrets and may be\n * logged at the caller's discretion. This module does NOT log them itself.\n *\n * Node-only. react-free. CdpConnection only.\n */\n\nimport { buildIndicatorExpression } from '../mcp/attach-orchestrator.js';\nimport type { CdpConnection } from '../mcp/cdp-connection.js';\n\n/**\n * Injects each key of `globals` into `globalThis` in the page via a single\n * `Runtime.evaluate` call. Must be called BEFORE the first `bundleTestFile`\n * inject — the cell is session-global and applies to all subsequent files.\n *\n * Throws if the CDP evaluate returns an exception.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param globals - Plain-JSON-serialisable key→value map to assign onto `globalThis`.\n */\nexport async function injectGlobals(\n conn: CdpConnection,\n globals: Record<string, unknown>,\n): Promise<void> {\n // JSON.stringify is safe here: globals values are plain data (sdkLine/platform\n // strings or simple objects). If a value is not JSON-serialisable this throws\n // at call time, which surfaces the error early and clearly.\n const expr = `(() => { Object.assign(globalThis, ${JSON.stringify(globals)}); return true; })()`;\n const result = await conn.send('Runtime.evaluate', { expression: expr, returnByValue: true });\n if (result.exceptionDetails) {\n const msg =\n result.exceptionDetails.exception?.description ??\n result.exceptionDetails.text ??\n 'unknown error';\n throw new Error(`injectGlobals: Runtime.evaluate threw: ${msg}`);\n }\n}\n\n/**\n * Injects (or updates) the \"Debugger Connected\"/\"Debugger Disconnected\"\n * on-phone indicator via `Runtime.evaluate` (#730).\n *\n * Uses the same CDP mechanism as {@link injectGlobals} — a single\n * `Runtime.evaluate` round-trip with the expression built by\n * {@link buildIndicatorExpression}. The indicator is a LIVE badge rendered at\n * the bottom-left of the page (position:fixed, safe-area-aware): the badge's\n * controller is idempotent, so calling this again (e.g. right before\n * `close()` with `{ state: 'disconnected' }`) UPDATES the existing badge in\n * place instead of injecting a duplicate.\n *\n * **Isolation**: unlike {@link injectGlobals}, this function NEVER throws to\n * its caller. Injection failure (e.g. page detached during inject, CSS not\n * supported) is swallowed and logged as `console.debug` — the badge is\n * informational UI and must never block attach success or test execution.\n * This is the same fire-and-forget spirit as the in-page console mount in\n * `src/in-app/attach.ts`.\n *\n * Call this ONLY on the manual debug paths (start_attach MCP, devtools-test\n * CLI). Do NOT call on the `run_tests` auto-attach path — the badge\n * would contaminate screenshots, measure_safe_area probes, and DOM snapshots\n * taken during automated measurement runs.\n *\n * SECRET-HANDLING: the injected expression contains no secrets, relay URLs,\n * wss addresses, or TOTP codes — it is pure DOM UI text + enum state built by\n * {@link buildIndicatorExpression}.\n *\n * @param conn - The live CDP connection (relay-attached page).\n * @param opts - Optional overrides forwarded to {@link buildIndicatorExpression}.\n */\nexport async function injectDebugIndicator(\n conn: CdpConnection,\n opts?: { label?: string; disconnectedLabel?: string; state?: 'attached' | 'disconnected' },\n): Promise<void> {\n try {\n await conn.send('Runtime.evaluate', {\n expression: buildIndicatorExpression(opts),\n returnByValue: true,\n });\n } catch (err) {\n // Badge injection is informational UI — swallow and log; never propagate.\n console.debug('[@ait-co/devtools] debug indicator inject skipped:', err);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAsB,cACpB,MACA,SACe;CAIf,MAAM,OAAO,sCAAsC,KAAK,UAAU,QAAQ,CAAC;CAC3E,MAAM,SAAS,MAAM,KAAK,KAAK,oBAAoB;EAAE,YAAY;EAAM,eAAe;EAAM,CAAC;AAC7F,KAAI,OAAO,kBAAkB;EAC3B,MAAM,MACJ,OAAO,iBAAiB,WAAW,eACnC,OAAO,iBAAiB,QACxB;AACF,QAAM,IAAI,MAAM,0CAA0C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCpE,eAAsB,qBACpB,MACA,MACe;AACf,KAAI;AACF,QAAM,KAAK,KAAK,oBAAoB;GAClC,YAAY,yBAAyB,KAAK;GAC1C,eAAe;GAChB,CAAC;UACK,KAAK;AAEZ,UAAQ,MAAM,sDAAsD,IAAI"}
|
package/dist/log-CUik_tHp.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
//#region src/mcp/log.ts
|
|
2
|
-
/**
|
|
3
|
-
* Allowed field keys that may pass through to a log line.
|
|
4
|
-
* Unknown keys are dropped. Values are still redact-scanned.
|
|
5
|
-
*/
|
|
6
|
-
const ALLOWED_KEYS = new Set([
|
|
7
|
-
"ts",
|
|
8
|
-
"level",
|
|
9
|
-
"event",
|
|
10
|
-
"msg",
|
|
11
|
-
"port",
|
|
12
|
-
"totpEnabled",
|
|
13
|
-
"env",
|
|
14
|
-
"tool",
|
|
15
|
-
"deploymentId",
|
|
16
|
-
"errorKind",
|
|
17
|
-
"reason",
|
|
18
|
-
"prevTargetId",
|
|
19
|
-
"mode",
|
|
20
|
-
"fileCount",
|
|
21
|
-
"passed",
|
|
22
|
-
"failed",
|
|
23
|
-
"skipped"
|
|
24
|
-
]);
|
|
25
|
-
/**
|
|
26
|
-
* Patterns that match secret values.
|
|
27
|
-
* Match order matters — more-specific patterns first.
|
|
28
|
-
*
|
|
29
|
-
* #268 redact script covers: relay=wss://…, at=<TOTP>, _deploymentId=<uuid>.
|
|
30
|
-
* Here we extend to in-process value-level patterns used in server logs.
|
|
31
|
-
*/
|
|
32
|
-
const SECRET_PATTERNS = [
|
|
33
|
-
/^\d{6}$/,
|
|
34
|
-
/^(aitcc_|AITCC_)/i,
|
|
35
|
-
/^[A-Za-z0-9_-]+=.{4,}/,
|
|
36
|
-
/^wss:\/\//,
|
|
37
|
-
/(?:^|[?&])at=[A-Z0-9]{6}/i
|
|
38
|
-
];
|
|
39
|
-
/**
|
|
40
|
-
* Returns `true` when the string value matches any known-secret pattern.
|
|
41
|
-
* Only string values are tested — numbers/booleans are always safe.
|
|
42
|
-
*/
|
|
43
|
-
function isSecretValue(value) {
|
|
44
|
-
return SECRET_PATTERNS.some((re) => re.test(value));
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Redacts a single scalar value.
|
|
48
|
-
* - strings: return "***" if the value matches a secret pattern.
|
|
49
|
-
* - other: return as-is.
|
|
50
|
-
*/
|
|
51
|
-
function redactValue(value) {
|
|
52
|
-
if (typeof value === "string" && isSecretValue(value)) return "***";
|
|
53
|
-
return value;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Builds a safe log payload from raw fields.
|
|
57
|
-
*
|
|
58
|
-
* - Only keys in `ALLOWED_KEYS` are included.
|
|
59
|
-
* - String values are scanned for secret patterns and replaced with "***".
|
|
60
|
-
* - `ts` and `level` and `event` are always included (they are injected by the
|
|
61
|
-
* logger functions below, not by callers).
|
|
62
|
-
*/
|
|
63
|
-
function buildPayload(level, event, fields) {
|
|
64
|
-
const out = {
|
|
65
|
-
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
66
|
-
level,
|
|
67
|
-
event
|
|
68
|
-
};
|
|
69
|
-
for (const [key, value] of Object.entries(fields)) {
|
|
70
|
-
if (!ALLOWED_KEYS.has(key)) continue;
|
|
71
|
-
if (key === "ts" || key === "level" || key === "event") continue;
|
|
72
|
-
out[key] = redactValue(value);
|
|
73
|
-
}
|
|
74
|
-
return out;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Writes a single JSON log line to stderr.
|
|
78
|
-
* MCP stdio transport uses stdout; all diagnostics go to stderr.
|
|
79
|
-
*/
|
|
80
|
-
function writeLog(level, event, fields = {}) {
|
|
81
|
-
const payload = buildPayload(level, event, fields);
|
|
82
|
-
process.stderr.write(`${JSON.stringify(payload)}\n`);
|
|
83
|
-
}
|
|
84
|
-
/** Log an informational structured event. */
|
|
85
|
-
function logInfo(event, fields = {}) {
|
|
86
|
-
writeLog("info", event, fields);
|
|
87
|
-
}
|
|
88
|
-
/** Log an error structured event. */
|
|
89
|
-
function logError(event, fields = {}) {
|
|
90
|
-
writeLog("error", event, fields);
|
|
91
|
-
}
|
|
92
|
-
//#endregion
|
|
93
|
-
export { logInfo as n, logError as t };
|
|
94
|
-
|
|
95
|
-
//# sourceMappingURL=log-CUik_tHp.js.map
|
package/dist/log-CUik_tHp.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-CUik_tHp.js","names":[],"sources":["../src/mcp/log.ts"],"sourcesContent":["/**\n * Structured JSON-line server logger + allowlist-based secret redact.\n *\n * Every log line emitted by the debug-mode MCP server is a single JSON object:\n * { \"ts\": \"<ISO-8601>\", \"level\": \"info\"|\"warn\"|\"error\", \"event\": \"<category>\", ...fields }\n *\n * Allowlist approach — only the keys in ALLOWED_KEYS pass through to the output\n * object unchanged. Any value that matches a known-secret pattern is replaced\n * with \"***\" regardless of key name. This provides two complementary layers:\n * 1. Key allowlist — unknown keys (e.g. a future field accidentally containing\n * a credential) are dropped entirely.\n * 2. Value redact — pattern matching catches secrets that slip through under\n * an allowed key name (e.g. a message string that includes a TOTP code).\n *\n * SECRET-HANDLING (MUST NOT appear in stdout/stderr/logs):\n * - TOTP 6-digit codes (pattern: standalone 6-digit run)\n * - AITCC_API_KEY values (pattern: \"aitcc_\" or \"AITCC_\" prefix — Deploy Key format)\n * - cookie header values (pattern: \"cookie:\" header content)\n * - relay WSS URLs (contain the relay host which is semi-sensitive)\n * - \"at=<TOTP>\" query params\n *\n * Canonical event categories:\n * server.start — MCP server started (relay port, TOTP enabled, etc.)\n * tunnel.up — cloudflared tunnel assigned a public URL\n * tunnel.down — tunnel error / shutdown\n * page.attached — first CDP target appeared (deploymentId, env)\n * page.detached — target evicted / session replaced\n * page.crashed — target crash detected\n * tool.call — MCP tool invocation (tool name only — no args/results)\n * tool.error — MCP tool error (tool name + safe error category)\n */\n\n/** Structured log levels. */\nexport type LogLevel = 'info' | 'warn' | 'error';\n\n/** Every valid event category. */\nexport type LogEvent =\n | 'server.start'\n | 'tunnel.up'\n | 'tunnel.down'\n | 'page.attached'\n | 'page.detached'\n | 'page.crashed'\n | 'tool.call'\n | 'tool.error'\n // run_tests progress (#646) — operator-visible in the daemon log, never in\n // the agent response. Carries only counts (secret-free, redact-safe numbers).\n | 'run_tests.start'\n | 'run_tests.done';\n\n/**\n * Allowed field keys that may pass through to a log line.\n * Unknown keys are dropped. Values are still redact-scanned.\n */\nconst ALLOWED_KEYS = new Set([\n 'ts',\n 'level',\n 'event',\n 'msg',\n 'port',\n 'totpEnabled',\n 'env',\n 'tool',\n 'deploymentId',\n 'errorKind',\n 'reason',\n 'prevTargetId',\n 'mode',\n // run_tests progress counts (#646) — numbers, redact-safe.\n 'fileCount',\n 'passed',\n 'failed',\n 'skipped',\n]);\n\n/**\n * Patterns that match secret values.\n * Match order matters — more-specific patterns first.\n *\n * #268 redact script covers: relay=wss://…, at=<TOTP>, _deploymentId=<uuid>.\n * Here we extend to in-process value-level patterns used in server logs.\n */\nconst SECRET_PATTERNS: RegExp[] = [\n // TOTP 6-digit code as a standalone value (whole string is exactly 6 digits).\n /^\\d{6}$/,\n // Deploy Key — AITCC_API_KEY value prefix formats.\n /^(aitcc_|AITCC_)/i,\n // Cookie header value (whole string starts with a cookie-like name=value pair).\n /^[A-Za-z0-9_-]+=.{4,}/,\n // WSS relay URL value.\n /^wss:\\/\\//,\n // TOTP \"at=\" query param embedded in a string.\n /(?:^|[?&])at=[A-Z0-9]{6}/i,\n];\n\n/**\n * Returns `true` when the string value matches any known-secret pattern.\n * Only string values are tested — numbers/booleans are always safe.\n */\nfunction isSecretValue(value: string): boolean {\n return SECRET_PATTERNS.some((re) => re.test(value));\n}\n\n/**\n * Redacts a single scalar value.\n * - strings: return \"***\" if the value matches a secret pattern.\n * - other: return as-is.\n */\nfunction redactValue(value: unknown): unknown {\n if (typeof value === 'string' && isSecretValue(value)) {\n return '***';\n }\n return value;\n}\n\n/**\n * Builds a safe log payload from raw fields.\n *\n * - Only keys in `ALLOWED_KEYS` are included.\n * - String values are scanned for secret patterns and replaced with \"***\".\n * - `ts` and `level` and `event` are always included (they are injected by the\n * logger functions below, not by callers).\n */\nfunction buildPayload(\n level: LogLevel,\n event: LogEvent,\n fields: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {\n ts: new Date().toISOString(),\n level,\n event,\n };\n\n for (const [key, value] of Object.entries(fields)) {\n if (!ALLOWED_KEYS.has(key)) continue;\n // ts/level/event are controlled above.\n if (key === 'ts' || key === 'level' || key === 'event') continue;\n out[key] = redactValue(value);\n }\n\n return out;\n}\n\n/**\n * Writes a single JSON log line to stderr.\n * MCP stdio transport uses stdout; all diagnostics go to stderr.\n */\nfunction writeLog(level: LogLevel, event: LogEvent, fields: Record<string, unknown> = {}): void {\n const payload = buildPayload(level, event, fields);\n process.stderr.write(`${JSON.stringify(payload)}\\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Public logger functions — one per level.\n// ---------------------------------------------------------------------------\n\n/** Log an informational structured event. */\nexport function logInfo(event: LogEvent, fields: Record<string, unknown> = {}): void {\n writeLog('info', event, fields);\n}\n\n/** Log a warning structured event. */\nexport function logWarn(event: LogEvent, fields: Record<string, unknown> = {}): void {\n writeLog('warn', event, fields);\n}\n\n/** Log an error structured event. */\nexport function logError(event: LogEvent, fields: Record<string, unknown> = {}): void {\n writeLog('error', event, fields);\n}\n\n// ---------------------------------------------------------------------------\n// Exported redact helper for use in tests and callers that need to sanitise\n// before passing to the logger (e.g. error message strings).\n// ---------------------------------------------------------------------------\n\n/**\n * Returns a redacted copy of `value`:\n * - string: \"***\" if it matches a secret pattern, otherwise the original.\n * - other types: returned as-is.\n *\n * Exposed for unit tests and for callers that build dynamic `msg` strings.\n */\nexport function redact(value: unknown): unknown {\n return redactValue(value);\n}\n"],"mappings":";;;;;AAsDA,MAAM,eAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAM,kBAA4B;CAEhC;CAEA;CAEA;CAEA;CAEA;CACD;;;;;AAMD,SAAS,cAAc,OAAwB;AAC7C,QAAO,gBAAgB,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC;;;;;;;AAQrD,SAAS,YAAY,OAAyB;AAC5C,KAAI,OAAO,UAAU,YAAY,cAAc,MAAM,CACnD,QAAO;AAET,QAAO;;;;;;;;;;AAWT,SAAS,aACP,OACA,OACA,QACyB;CACzB,MAAM,MAA+B;EACnC,qBAAI,IAAI,MAAM,EAAC,aAAa;EAC5B;EACA;EACD;AAED,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;AACjD,MAAI,CAAC,aAAa,IAAI,IAAI,CAAE;AAE5B,MAAI,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,QAAS;AACxD,MAAI,OAAO,YAAY,MAAM;;AAG/B,QAAO;;;;;;AAOT,SAAS,SAAS,OAAiB,OAAiB,SAAkC,EAAE,EAAQ;CAC9F,MAAM,UAAU,aAAa,OAAO,OAAO,OAAO;AAClD,SAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC,IAAI;;;AAQtD,SAAgB,QAAQ,OAAiB,SAAkC,EAAE,EAAQ;AACnF,UAAS,QAAQ,OAAO,OAAO;;;AASjC,SAAgB,SAAS,OAAiB,SAAkC,EAAE,EAAQ;AACpF,UAAS,SAAS,OAAO,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay-worker-BMSnlyls.d.ts","names":[],"sources":["../src/test-runner/relay-worker.ts"],"mappings":";;;;;;;;AAgDA;;;;cAlBa,sBAAA;;UAGI,UAAA;EAqBR;EAnBP,IAAA;EAsBE;EApBF,MAAA,EAAQ,SAAA;IAAc,KAAA;EAAA;EAmCtB;;;;AAIF;;EAhCE,IAAA;AAAA;;UAIe,cAAA;EAqCf;EAnCA,SAAA;EA+DA;EA7DA,QAAA;EAoEA;EAlEA,KAAA,EAAO,UAAA;EAkEuB;EAhE9B,MAAA;IACE,MAAA;IACA,MAAA;IACA,OAAA;IACA,KAAA;EAAA;EAsEgC;;AAuBpC;;;;;;;;EAjFE,QAAA,EAAU,cAAA;AAAA;;UAIK,eAAA;EAgFR;;;EA5EP,aAAA,GAAgB,aAAA;EA6EO;;AA0SzB;;EAlXE,SAAA;EAkXqC;;;;;;;;;;;EAtWrC,eAAA;;;;;;;;;;;;;;;;EAgBA,WAAA,GAAc,WAAA;;;;;;;EAOd,YAAA,IAAgB,IAAA,UAAc,KAAA,UAAe,KAAA;AAAA;;;;;;;;cAUlC,uBAAA;;;;;;;;;;;;;;;;;;;;;;iBAuBS,qBAAA,CACpB,UAAA,EAAY,aAAA,EACZ,KAAA,YACA,IAAA,GAAO,eAAA,GACN,OAAA,CAAQ,cAAA;;;;;iBA0SK,cAAA,CAAe,MAAA,EAAQ,cAAA,GAAiB,KAAA,CAAM,UAAA;EAAe,IAAA;AAAA"}
|