@riddledc/riddle-proof 0.7.206 → 0.7.208
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/cli.cjs +74 -2
- package/dist/cli.js +74 -2
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -16791,6 +16791,12 @@ function profileSetupScreenshotCount(viewports) {
|
|
|
16791
16791
|
function profileSetupReceiptTotal(viewports, key) {
|
|
16792
16792
|
return viewports.reduce((sum, viewport) => sum + setupReceiptArray(viewport, key).filter((receipt) => receipt.ok !== false).length, 0);
|
|
16793
16793
|
}
|
|
16794
|
+
function profileSetupActionCount(viewports, action) {
|
|
16795
|
+
return viewports.reduce((sum, viewport) => {
|
|
16796
|
+
const actionCounts = cliRecord(viewport.action_counts);
|
|
16797
|
+
return sum + (cliFiniteNumber(actionCounts?.[action]) || 0);
|
|
16798
|
+
}, 0);
|
|
16799
|
+
}
|
|
16794
16800
|
function profileSetupFailureCount(viewports) {
|
|
16795
16801
|
return viewports.reduce((sum, viewport) => {
|
|
16796
16802
|
const failed = Array.isArray(viewport.failed) ? viewport.failed : [];
|
|
@@ -17041,6 +17047,23 @@ function profileHasTerminalLossReceipt(receipts) {
|
|
|
17041
17047
|
return lastFlightLost || outOfBounds || ["over", "lost", "loss", "failed", "failure", "game_over", "gameover"].includes(status) || ["lost", "loss", "failed", "failure", "game_over", "gameover"].includes(outcome);
|
|
17042
17048
|
});
|
|
17043
17049
|
}
|
|
17050
|
+
function profileHasTerminalGameOverReceipt(receipts) {
|
|
17051
|
+
return receipts.some((receipt) => {
|
|
17052
|
+
const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
|
|
17053
|
+
const outcome = profileLowerSummaryValue(receipt, ["lastOutcome", "outcome", "terminalOutcome", "terminal", "result"]);
|
|
17054
|
+
const gameOver = setupReturnSummaryValue(receipt, ["gameOver", "game_over", "isGameOver"]) === true;
|
|
17055
|
+
const caught = setupReturnSummaryValue(receipt, ["caught", "playerCaught", "wasCaught"]) === true;
|
|
17056
|
+
const storedTo = cliString(receipt.return_stored_to) || "";
|
|
17057
|
+
const label = cliString(receipt.label) || "";
|
|
17058
|
+
const path7 = cliString(receipt.path) || cliString(receipt.function_name) || "";
|
|
17059
|
+
const slot = cliString(setupReturnSummaryValue(receipt, ["slot"])) || "";
|
|
17060
|
+
const haystack = `${storedTo} ${label} ${path7} ${slot}`.toLowerCase();
|
|
17061
|
+
const labelsTerminal = haystack.includes("gameover") || haystack.includes("game_over") || haystack.includes("game-over") || haystack.includes("game over") || haystack.includes("terminal") || haystack.includes("caught") || haystack.includes("catch");
|
|
17062
|
+
const terminalStatus = ["over", "game_over", "gameover"].includes(status) || ["game_over", "gameover"].includes(outcome);
|
|
17063
|
+
if (!labelsTerminal && !caught && !gameOver && !terminalStatus) return false;
|
|
17064
|
+
return gameOver || caught || terminalStatus;
|
|
17065
|
+
});
|
|
17066
|
+
}
|
|
17044
17067
|
function profileHasTerminalSuccessReceipt(receipts) {
|
|
17045
17068
|
return receipts.some((receipt) => {
|
|
17046
17069
|
const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
|
|
@@ -17174,7 +17197,19 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
17174
17197
|
const visibleCleanupActionCount = profileVisibleCleanupActionCount(setupViewports);
|
|
17175
17198
|
const setupFailureCount = profileSetupFailureCount(setupViewports);
|
|
17176
17199
|
const setupObstructionCount = profileSetupObstructionCount(setupViewports);
|
|
17177
|
-
const
|
|
17200
|
+
const keyboardReceipts = setupViewports.flatMap((viewport) => setupReceiptArray(viewport, "keyboard")).filter((item) => item.ok !== false);
|
|
17201
|
+
const keyboardReceiptDispatchCount = keyboardReceipts.length;
|
|
17202
|
+
const keyboardActionDispatchCount = ["press", "key_down", "key_up", "keyboard_sequence"].reduce((sum, action) => sum + profileSetupActionCount(setupViewports, action), 0);
|
|
17203
|
+
const keyboardDispatchCount = keyboardReceiptDispatchCount > 0 ? keyboardReceiptDispatchCount : keyboardActionDispatchCount;
|
|
17204
|
+
const keyboardKeyMatches = (item, expected) => {
|
|
17205
|
+
const key = (cliString(item.key) || cliString(item.code) || "").toLowerCase();
|
|
17206
|
+
return key === expected || key.includes(expected);
|
|
17207
|
+
};
|
|
17208
|
+
const hasKeyboardKeyDownReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_down") || profileSetupActionCount(setupViewports, "key_down") > 0;
|
|
17209
|
+
const hasKeyboardKeyUpReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_up") || profileSetupActionCount(setupViewports, "key_up") > 0;
|
|
17210
|
+
const hasShiftKeyDownReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_down" && keyboardKeyMatches(item, "shift"));
|
|
17211
|
+
const hasShiftKeyUpReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_up" && keyboardKeyMatches(item, "shift"));
|
|
17212
|
+
const inputDispatchCount = profileSetupReceiptTotal(setupViewports, "drag") + profileSetupReceiptTotal(setupViewports, "tap") + tapUntilCount + profileSetupReceiptTotal(setupViewports, "press") + profileSetupReceiptTotal(setupViewports, "keyboard_sequence") + keyboardDispatchCount;
|
|
17178
17213
|
const canvasReceipts = setupViewports.flatMap((viewport) => setupReceiptArray(viewport, "canvas_signature"));
|
|
17179
17214
|
const hasCanvasChange = canvasReceipts.some((item) => item.ok !== false && item.changed === true);
|
|
17180
17215
|
const canvasSignatureHashes = canvasReceipts.filter((item) => item.ok !== false).map((item) => cliString(item.hash)).filter(Boolean);
|
|
@@ -17205,7 +17240,28 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
17205
17240
|
const hasSetupReceipts = setupResultCount > 0 || Boolean(setupSummary);
|
|
17206
17241
|
const hasTextVisibility = profileHasPassedCheck(result, ["text_visible", "selector_text_visible", "selector_visible"]);
|
|
17207
17242
|
const hasTextAbsence = profileHasPassedCheck(result, ["text_absent", "selector_text_absent"]);
|
|
17208
|
-
const
|
|
17243
|
+
const measuredStateMetricNames = [
|
|
17244
|
+
"delta",
|
|
17245
|
+
"stateDelta",
|
|
17246
|
+
"positionDelta",
|
|
17247
|
+
"movementDelta",
|
|
17248
|
+
"speedDelta",
|
|
17249
|
+
"velocityDelta",
|
|
17250
|
+
"distanceDelta",
|
|
17251
|
+
"distanceGain",
|
|
17252
|
+
"scoreDelta",
|
|
17253
|
+
"scoreGain",
|
|
17254
|
+
"energyDelta",
|
|
17255
|
+
"energyDrop",
|
|
17256
|
+
"energyRecovered",
|
|
17257
|
+
"progressDelta",
|
|
17258
|
+
"progressGain"
|
|
17259
|
+
];
|
|
17260
|
+
const hasMeasuredStateMetric = valueReceipts.some((item) => measuredStateMetricNames.some((name) => {
|
|
17261
|
+
const value = cliFiniteNumber(setupReturnSummaryValue(item, [name]));
|
|
17262
|
+
return value !== void 0 && Math.abs(value) > 0;
|
|
17263
|
+
}));
|
|
17264
|
+
const hasMeasuredStateChange = hasNaturalInput || hasCanvasChange || valueReceipts.some((item) => setupReturnSummaryValue(item, ["changed"]) === true || setupReturnSummaryValue(item, ["nonWhiteDelta", "darkDelta", "pixelDelta", "movementDelta"]) !== void 0) || hasMeasuredStateMetric;
|
|
17209
17265
|
const hasMovingPlayabilityReceipt = valueReceipts.some((item) => {
|
|
17210
17266
|
const started = setupReturnSummaryValue(item, ["started", "runStarted", "playStarted"]) === true;
|
|
17211
17267
|
const distance = cliFiniteNumber(setupReturnSummaryValue(item, ["distance", "distanceMeters", "travelDistance"]));
|
|
@@ -17225,6 +17281,7 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
17225
17281
|
const hasOfflineAudioMetricsReceipt = profileHasOfflineAudioMetricsReceipt(valueReceipts);
|
|
17226
17282
|
const hasActiveRouteLocalProofReceipt = profileHasActiveRouteLocalProofReceipt(valueReceipts);
|
|
17227
17283
|
const hasTerminalLossReceipt = profileHasTerminalLossReceipt(valueReceipts);
|
|
17284
|
+
const hasTerminalGameOverReceipt = profileHasTerminalGameOverReceipt(valueReceipts);
|
|
17228
17285
|
const hasTerminalSuccessReceipt = profileHasTerminalSuccessReceipt(valueReceipts);
|
|
17229
17286
|
const hasControlledFailureLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "failure");
|
|
17230
17287
|
const hasControlledSuccessLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "success");
|
|
@@ -17313,6 +17370,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
17313
17370
|
"terminal loss receipt missing"
|
|
17314
17371
|
);
|
|
17315
17372
|
}
|
|
17373
|
+
if (text.includes("terminal") && (text.includes("game-over") || text.includes("game over") || text.includes("gameover") || text.includes("caught") || text.includes("catch"))) {
|
|
17374
|
+
return profileReceiptSignalStatus(
|
|
17375
|
+
hasTerminalGameOverReceipt,
|
|
17376
|
+
"terminal game-over receipt present",
|
|
17377
|
+
"terminal game-over receipt missing"
|
|
17378
|
+
);
|
|
17379
|
+
}
|
|
17316
17380
|
if (text.includes("success") && text.includes("terminal")) {
|
|
17317
17381
|
return profileReceiptSignalStatus(
|
|
17318
17382
|
hasTerminalSuccessReceipt,
|
|
@@ -17443,6 +17507,14 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
17443
17507
|
);
|
|
17444
17508
|
}
|
|
17445
17509
|
if (text.includes("input dispatch") || text.includes("pointer") || text.includes("touch") || text.includes("key event") || text.includes("trusted-event")) {
|
|
17510
|
+
if (text.includes("key_down") || text.includes("key down") || text.includes("key-up") || text.includes("key_up")) {
|
|
17511
|
+
const hasSpecificKeyboardDispatch = text.includes("shift") ? hasShiftKeyDownReceipt && hasShiftKeyUpReceipt : hasKeyboardKeyDownReceipt && hasKeyboardKeyUpReceipt;
|
|
17512
|
+
return profileReceiptSignalStatus(
|
|
17513
|
+
hasSpecificKeyboardDispatch,
|
|
17514
|
+
"keyboard key_down/key_up dispatch evidence present",
|
|
17515
|
+
"keyboard key_down/key_up dispatch evidence missing"
|
|
17516
|
+
);
|
|
17517
|
+
}
|
|
17446
17518
|
return profileReceiptSignalStatus(inputDispatchCount > 0 || hasNaturalInput, "input dispatch evidence present", "input dispatch evidence missing");
|
|
17447
17519
|
}
|
|
17448
17520
|
if (text.includes("offline audio") || text.includes("audio") && text.includes("metric")) {
|
package/dist/cli.js
CHANGED
|
@@ -616,6 +616,12 @@ function profileSetupScreenshotCount(viewports) {
|
|
|
616
616
|
function profileSetupReceiptTotal(viewports, key) {
|
|
617
617
|
return viewports.reduce((sum, viewport) => sum + setupReceiptArray(viewport, key).filter((receipt) => receipt.ok !== false).length, 0);
|
|
618
618
|
}
|
|
619
|
+
function profileSetupActionCount(viewports, action) {
|
|
620
|
+
return viewports.reduce((sum, viewport) => {
|
|
621
|
+
const actionCounts = cliRecord(viewport.action_counts);
|
|
622
|
+
return sum + (cliFiniteNumber(actionCounts?.[action]) || 0);
|
|
623
|
+
}, 0);
|
|
624
|
+
}
|
|
619
625
|
function profileSetupFailureCount(viewports) {
|
|
620
626
|
return viewports.reduce((sum, viewport) => {
|
|
621
627
|
const failed = Array.isArray(viewport.failed) ? viewport.failed : [];
|
|
@@ -866,6 +872,23 @@ function profileHasTerminalLossReceipt(receipts) {
|
|
|
866
872
|
return lastFlightLost || outOfBounds || ["over", "lost", "loss", "failed", "failure", "game_over", "gameover"].includes(status) || ["lost", "loss", "failed", "failure", "game_over", "gameover"].includes(outcome);
|
|
867
873
|
});
|
|
868
874
|
}
|
|
875
|
+
function profileHasTerminalGameOverReceipt(receipts) {
|
|
876
|
+
return receipts.some((receipt) => {
|
|
877
|
+
const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
|
|
878
|
+
const outcome = profileLowerSummaryValue(receipt, ["lastOutcome", "outcome", "terminalOutcome", "terminal", "result"]);
|
|
879
|
+
const gameOver = setupReturnSummaryValue(receipt, ["gameOver", "game_over", "isGameOver"]) === true;
|
|
880
|
+
const caught = setupReturnSummaryValue(receipt, ["caught", "playerCaught", "wasCaught"]) === true;
|
|
881
|
+
const storedTo = cliString(receipt.return_stored_to) || "";
|
|
882
|
+
const label = cliString(receipt.label) || "";
|
|
883
|
+
const path2 = cliString(receipt.path) || cliString(receipt.function_name) || "";
|
|
884
|
+
const slot = cliString(setupReturnSummaryValue(receipt, ["slot"])) || "";
|
|
885
|
+
const haystack = `${storedTo} ${label} ${path2} ${slot}`.toLowerCase();
|
|
886
|
+
const labelsTerminal = haystack.includes("gameover") || haystack.includes("game_over") || haystack.includes("game-over") || haystack.includes("game over") || haystack.includes("terminal") || haystack.includes("caught") || haystack.includes("catch");
|
|
887
|
+
const terminalStatus = ["over", "game_over", "gameover"].includes(status) || ["game_over", "gameover"].includes(outcome);
|
|
888
|
+
if (!labelsTerminal && !caught && !gameOver && !terminalStatus) return false;
|
|
889
|
+
return gameOver || caught || terminalStatus;
|
|
890
|
+
});
|
|
891
|
+
}
|
|
869
892
|
function profileHasTerminalSuccessReceipt(receipts) {
|
|
870
893
|
return receipts.some((receipt) => {
|
|
871
894
|
const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
|
|
@@ -999,7 +1022,19 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
999
1022
|
const visibleCleanupActionCount = profileVisibleCleanupActionCount(setupViewports);
|
|
1000
1023
|
const setupFailureCount = profileSetupFailureCount(setupViewports);
|
|
1001
1024
|
const setupObstructionCount = profileSetupObstructionCount(setupViewports);
|
|
1002
|
-
const
|
|
1025
|
+
const keyboardReceipts = setupViewports.flatMap((viewport) => setupReceiptArray(viewport, "keyboard")).filter((item) => item.ok !== false);
|
|
1026
|
+
const keyboardReceiptDispatchCount = keyboardReceipts.length;
|
|
1027
|
+
const keyboardActionDispatchCount = ["press", "key_down", "key_up", "keyboard_sequence"].reduce((sum, action) => sum + profileSetupActionCount(setupViewports, action), 0);
|
|
1028
|
+
const keyboardDispatchCount = keyboardReceiptDispatchCount > 0 ? keyboardReceiptDispatchCount : keyboardActionDispatchCount;
|
|
1029
|
+
const keyboardKeyMatches = (item, expected) => {
|
|
1030
|
+
const key = (cliString(item.key) || cliString(item.code) || "").toLowerCase();
|
|
1031
|
+
return key === expected || key.includes(expected);
|
|
1032
|
+
};
|
|
1033
|
+
const hasKeyboardKeyDownReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_down") || profileSetupActionCount(setupViewports, "key_down") > 0;
|
|
1034
|
+
const hasKeyboardKeyUpReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_up") || profileSetupActionCount(setupViewports, "key_up") > 0;
|
|
1035
|
+
const hasShiftKeyDownReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_down" && keyboardKeyMatches(item, "shift"));
|
|
1036
|
+
const hasShiftKeyUpReceipt = keyboardReceipts.some((item) => cliString(item.action) === "key_up" && keyboardKeyMatches(item, "shift"));
|
|
1037
|
+
const inputDispatchCount = profileSetupReceiptTotal(setupViewports, "drag") + profileSetupReceiptTotal(setupViewports, "tap") + tapUntilCount + profileSetupReceiptTotal(setupViewports, "press") + profileSetupReceiptTotal(setupViewports, "keyboard_sequence") + keyboardDispatchCount;
|
|
1003
1038
|
const canvasReceipts = setupViewports.flatMap((viewport) => setupReceiptArray(viewport, "canvas_signature"));
|
|
1004
1039
|
const hasCanvasChange = canvasReceipts.some((item) => item.ok !== false && item.changed === true);
|
|
1005
1040
|
const canvasSignatureHashes = canvasReceipts.filter((item) => item.ok !== false).map((item) => cliString(item.hash)).filter(Boolean);
|
|
@@ -1030,7 +1065,28 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
1030
1065
|
const hasSetupReceipts = setupResultCount > 0 || Boolean(setupSummary);
|
|
1031
1066
|
const hasTextVisibility = profileHasPassedCheck(result, ["text_visible", "selector_text_visible", "selector_visible"]);
|
|
1032
1067
|
const hasTextAbsence = profileHasPassedCheck(result, ["text_absent", "selector_text_absent"]);
|
|
1033
|
-
const
|
|
1068
|
+
const measuredStateMetricNames = [
|
|
1069
|
+
"delta",
|
|
1070
|
+
"stateDelta",
|
|
1071
|
+
"positionDelta",
|
|
1072
|
+
"movementDelta",
|
|
1073
|
+
"speedDelta",
|
|
1074
|
+
"velocityDelta",
|
|
1075
|
+
"distanceDelta",
|
|
1076
|
+
"distanceGain",
|
|
1077
|
+
"scoreDelta",
|
|
1078
|
+
"scoreGain",
|
|
1079
|
+
"energyDelta",
|
|
1080
|
+
"energyDrop",
|
|
1081
|
+
"energyRecovered",
|
|
1082
|
+
"progressDelta",
|
|
1083
|
+
"progressGain"
|
|
1084
|
+
];
|
|
1085
|
+
const hasMeasuredStateMetric = valueReceipts.some((item) => measuredStateMetricNames.some((name) => {
|
|
1086
|
+
const value = cliFiniteNumber(setupReturnSummaryValue(item, [name]));
|
|
1087
|
+
return value !== void 0 && Math.abs(value) > 0;
|
|
1088
|
+
}));
|
|
1089
|
+
const hasMeasuredStateChange = hasNaturalInput || hasCanvasChange || valueReceipts.some((item) => setupReturnSummaryValue(item, ["changed"]) === true || setupReturnSummaryValue(item, ["nonWhiteDelta", "darkDelta", "pixelDelta", "movementDelta"]) !== void 0) || hasMeasuredStateMetric;
|
|
1034
1090
|
const hasMovingPlayabilityReceipt = valueReceipts.some((item) => {
|
|
1035
1091
|
const started = setupReturnSummaryValue(item, ["started", "runStarted", "playStarted"]) === true;
|
|
1036
1092
|
const distance = cliFiniteNumber(setupReturnSummaryValue(item, ["distance", "distanceMeters", "travelDistance"]));
|
|
@@ -1050,6 +1106,7 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
1050
1106
|
const hasOfflineAudioMetricsReceipt = profileHasOfflineAudioMetricsReceipt(valueReceipts);
|
|
1051
1107
|
const hasActiveRouteLocalProofReceipt = profileHasActiveRouteLocalProofReceipt(valueReceipts);
|
|
1052
1108
|
const hasTerminalLossReceipt = profileHasTerminalLossReceipt(valueReceipts);
|
|
1109
|
+
const hasTerminalGameOverReceipt = profileHasTerminalGameOverReceipt(valueReceipts);
|
|
1053
1110
|
const hasTerminalSuccessReceipt = profileHasTerminalSuccessReceipt(valueReceipts);
|
|
1054
1111
|
const hasControlledFailureLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "failure");
|
|
1055
1112
|
const hasControlledSuccessLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "success");
|
|
@@ -1138,6 +1195,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
1138
1195
|
"terminal loss receipt missing"
|
|
1139
1196
|
);
|
|
1140
1197
|
}
|
|
1198
|
+
if (text.includes("terminal") && (text.includes("game-over") || text.includes("game over") || text.includes("gameover") || text.includes("caught") || text.includes("catch"))) {
|
|
1199
|
+
return profileReceiptSignalStatus(
|
|
1200
|
+
hasTerminalGameOverReceipt,
|
|
1201
|
+
"terminal game-over receipt present",
|
|
1202
|
+
"terminal game-over receipt missing"
|
|
1203
|
+
);
|
|
1204
|
+
}
|
|
1141
1205
|
if (text.includes("success") && text.includes("terminal")) {
|
|
1142
1206
|
return profileReceiptSignalStatus(
|
|
1143
1207
|
hasTerminalSuccessReceipt,
|
|
@@ -1268,6 +1332,14 @@ function profilePackReceiptStatus(result, metadata, receipt) {
|
|
|
1268
1332
|
);
|
|
1269
1333
|
}
|
|
1270
1334
|
if (text.includes("input dispatch") || text.includes("pointer") || text.includes("touch") || text.includes("key event") || text.includes("trusted-event")) {
|
|
1335
|
+
if (text.includes("key_down") || text.includes("key down") || text.includes("key-up") || text.includes("key_up")) {
|
|
1336
|
+
const hasSpecificKeyboardDispatch = text.includes("shift") ? hasShiftKeyDownReceipt && hasShiftKeyUpReceipt : hasKeyboardKeyDownReceipt && hasKeyboardKeyUpReceipt;
|
|
1337
|
+
return profileReceiptSignalStatus(
|
|
1338
|
+
hasSpecificKeyboardDispatch,
|
|
1339
|
+
"keyboard key_down/key_up dispatch evidence present",
|
|
1340
|
+
"keyboard key_down/key_up dispatch evidence missing"
|
|
1341
|
+
);
|
|
1342
|
+
}
|
|
1271
1343
|
return profileReceiptSignalStatus(inputDispatchCount > 0 || hasNaturalInput, "input dispatch evidence present", "input dispatch evidence missing");
|
|
1272
1344
|
}
|
|
1273
1345
|
if (text.includes("offline audio") || text.includes("audio") && text.includes("metric")) {
|