@jshookmcp/jshook 0.2.9 → 0.3.0
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.md +2 -2
- package/README.zh.md +2 -2
- package/dist/{AntiCheatDetector-BNk-EoBt.mjs → AntiCheatDetector-CqGDXmfc.mjs} +159 -53
- package/dist/{CodeInjector-Cq8q01kp.mjs → CodeInjector-BdjRfNx7.mjs} +5 -5
- package/dist/{ConsoleMonitor-CPVQW1Y-.mjs → ConsoleMonitor-DykL3IAw.mjs} +85 -17
- package/dist/{DetailedDataManager-BQQcxh64.mjs → DetailedDataManager-HT49OrvF.mjs} +1 -1
- package/dist/{ExtensionManager-CWYgw0YW.mjs → ExtensionManager-BDMsY2Dz.mjs} +15 -8
- package/dist/{HardwareBreakpoint-B9gZCdFP.mjs → HardwareBreakpoint-Cc2AFq1Y.mjs} +3 -3
- package/dist/{HeapAnalyzer-BLDH0dCv.mjs → HeapAnalyzer-DruMgsgj.mjs} +20 -20
- package/dist/{HookGeneratorBuilders.core.generators.storage-CtcdK78Q.mjs → HookGeneratorBuilders.core.generators.storage-CTbB4Lcx.mjs} +1 -74
- package/dist/{InstrumentationSession-CvPC7Jwy.mjs → InstrumentationSession-DLH0vd-z.mjs} +2 -2
- package/dist/{MemoryController-CbVdCIJF.mjs → MemoryController-CMtviNW_.mjs} +3 -3
- package/dist/{MemoryScanSession-BsDZbLYm.mjs → MemoryScanSession-ITgb_NMi.mjs} +2 -2
- package/dist/{MemoryScanner-Bcpml6II.mjs → MemoryScanner-CiL7Z3ey.mjs} +12 -9
- package/dist/{NativeMemoryManager.impl-dZtA1ZGn.mjs → NativeMemoryManager.impl-D9Lkovvn.mjs} +13 -10
- package/dist/{NativeMemoryManager.utils-B-FjA2mJ.mjs → NativeMemoryManager.utils-BBlAixF5.mjs} +1 -1
- package/dist/{PEAnalyzer-D1lzJ_VG.mjs → PEAnalyzer-DMQ44gen.mjs} +15 -15
- package/dist/{PageController-Bqm2kZ_X.mjs → PageController-BPJNqqBN.mjs} +18 -4
- package/dist/{PointerChainEngine-BOhyVsjx.mjs → PointerChainEngine-K7wN8Z-w.mjs} +10 -7
- package/dist/ProcessRegistry-zGg12QbE.mjs +74 -0
- package/dist/{ResponseBuilder-D3iFYx2N.mjs → ResponseBuilder-CJXWmWNw.mjs} +10 -10
- package/dist/{ScriptManager-aHHq0X7U.mjs → ScriptManager-ZuWD-0Jg.mjs} +195 -192
- package/dist/{Speedhack-CqdIFlQl.mjs → Speedhack-D-z0umeT.mjs} +2 -2
- package/dist/{StructureAnalyzer-DhFaPvRO.mjs → StructureAnalyzer-Cav5AVSL.mjs} +9 -6
- package/dist/{ToolCatalog-C0JGZoOm.mjs → ToolCatalog-5OJdMiF0.mjs} +81 -81
- package/dist/{ToolProbe-oC7aPrkv.mjs → ToolProbe-DbCFGyrg.mjs} +1 -1
- package/dist/{ToolRegistry-BjaF4oNz.mjs → ToolRegistry-B9krbTtI.mjs} +51 -2
- package/dist/{ToolRouter.policy-BWV67ZK-.mjs → ToolRouter.policy-BGDAGyeH.mjs} +60 -20
- package/dist/TraceRecorder-B41Z5XBj.mjs +1286 -0
- package/dist/{Win32API-CePkipZY.mjs → Win32API-C2kjj0ze.mjs} +18 -12
- package/dist/{Win32Debug-BvKs-gxc.mjs → Win32Debug-CKrGOTpo.mjs} +2 -2
- package/dist/{WorkflowEngine-CuvkZtWu.mjs → WorkflowEngine-DJ6M4opp.mjs} +226 -255
- package/dist/analysis-BHeJW2Nb.mjs +1234 -0
- package/dist/{antidebug-CqDTB_uk.mjs → antidebug-BRKeyt27.mjs} +3 -3
- package/dist/{artifactRetention-CFEprwPw.mjs → artifactRetention-CPXkUJXp.mjs} +13 -6
- package/dist/{artifacts-Bk2-_uPq.mjs → artifacts-DkfosXH3.mjs} +1 -1
- package/dist/authorization-schema-DRqyJMSk.mjs +31 -0
- package/dist/{binary-instrument-CXfpx6fT.mjs → binary-instrument--V3MAhJ4.mjs} +19 -27
- package/dist/bind-helpers-ClV34xdn.mjs +42 -0
- package/dist/{boringssl-inspector-BH2D3VKc.mjs → boringssl-inspector-Bo_LOLaS.mjs} +1 -1
- package/dist/{browser-BpOr5PEx.mjs → browser-Dx3_S2cG.mjs} +324 -37
- package/dist/capabilities-CcHlvWgK.mjs +33 -0
- package/dist/{constants-B0OANIBL.mjs → constants-CDZLOoVv.mjs} +18 -3
- package/dist/{coordination-qUbyF8KU.mjs → coordination-DgItD9DL.mjs} +2 -2
- package/dist/{debugger-gnKxRSN0.mjs → debugger-RS3RSAqs.mjs} +30 -13
- package/dist/definitions-BEoYofW5.mjs +47 -0
- package/dist/{definitions-bAhHQJq9.mjs → definitions-BRaefg3u.mjs} +11 -5
- package/dist/{definitions-DVGfrn7y.mjs → definitions-BbkvZkiv.mjs} +2 -2
- package/dist/definitions-BtWSHJ3o.mjs +17 -0
- package/dist/{definitions-BMfYXoNC.mjs → definitions-C1gCHO0i.mjs} +1 -1
- package/dist/{definitions-C1UvM5Iy.mjs → definitions-CDOg_b-l.mjs} +14 -2
- package/dist/definitions-CVPD9hzZ.mjs +54 -0
- package/dist/{definitions-Cke7zEb8.mjs → definitions-Cea8Lgl7.mjs} +1 -1
- package/dist/definitions-DAgIyjxM.mjs +10 -0
- package/dist/{definitions-B4rAvHNZ.mjs → definitions-DJA27nsL.mjs} +12 -9
- package/dist/{definitions-ClJLzsJQ.mjs → definitions-DKPFU3LW.mjs} +1 -1
- package/dist/{definitions-D3VsGcvz.mjs → definitions-DPRpZQ96.mjs} +7 -7
- package/dist/{definitions-B18eyf0B.mjs → definitions-DUE5gmdn.mjs} +1 -1
- package/dist/definitions-DYVjOtxa.mjs +26 -0
- package/dist/{definitions-BB_4jnmy.mjs → definitions-DcYLVLCo.mjs} +1 -1
- package/dist/{definitions-Beid2EB3.mjs → definitions-Pp5LI2H4.mjs} +1 -1
- package/dist/definitions-j9KdHVNR.mjs +14 -0
- package/dist/definitions-uzkjBwa7.mjs +258 -0
- package/dist/{definitions-Cq-zroAU.mjs → definitions-va-AnLuQ.mjs} +4 -4
- package/dist/{encoding-Bvz5jLRv.mjs → encoding-DJeqHmpd.mjs} +18 -4
- package/dist/{evidence-graph-bridge-C_fv9PuC.mjs → evidence-graph-bridge-DcYizFk2.mjs} +1 -0
- package/dist/{factory-DxlGh9Xf.mjs → factory-C90tBff6.mjs} +6 -6
- package/dist/flat-target-session-Dgax2Cy3.mjs +29 -0
- package/dist/{graphql-DYWzJ29s.mjs → graphql-CoHrhweh.mjs} +205 -34
- package/dist/{handlers-C67ktuRN.mjs → handlers-4jmR0nMs.mjs} +220 -32
- package/dist/{handlers-DlCJN4Td.mjs → handlers-BAHPxcch.mjs} +122 -90
- package/dist/{handlers-9sAbfIg-.mjs → handlers-BOs9b907.mjs} +849 -801
- package/dist/{handlers-DxGIq15_2.mjs → handlers-BWXEy6ef.mjs} +16 -16
- package/dist/{handlers-tB9Mp9ZK.mjs → handlers-Bndn6QvE.mjs} +31 -4
- package/dist/{handlers-CTsDAO6p.mjs → handlers-BqC4bD4s.mjs} +1 -1
- package/dist/{handlers-C87g8oCe.mjs → handlers-BtYq60bM2.mjs} +1 -1
- package/dist/{handlers-DeLOCd5m.mjs → handlers-BzgcB4iv.mjs} +17 -17
- package/dist/{handlers-Cgyg6c0U.mjs → handlers-CRyRWj2b.mjs} +237 -23
- package/dist/{handlers-U6L4xhuF.mjs → handlers-CVv2H1uq.mjs} +24 -17
- package/dist/{handlers-tiy7EIBp.mjs → handlers-Dl5a7JS4.mjs} +3 -3
- package/dist/{handlers-D6j6yka7.mjs → handlers-Dx2d7jt7.mjs} +1893 -1480
- package/dist/{handlers-Bl8zkwz1.mjs → handlers-Dz9PYsCa.mjs} +95 -6
- package/dist/handlers-HujRKC3b.mjs +661 -0
- package/dist/{handlers.impl-DS0d9fUw.mjs → handlers.impl-XWXkQfyi.mjs} +70 -24
- package/dist/{hooks-CzCWByww.mjs → hooks-B1B8NRHL.mjs} +3 -3
- package/dist/index.mjs +154 -144
- package/dist/{maintenance-P7ePRXQC.mjs → maintenance-PRMkLVRW.mjs} +35 -30
- package/dist/manifest-67Bok-Si.mjs +58 -0
- package/dist/{manifest-B3QVVeBS.mjs → manifest-6lNTMZAB2.mjs} +33 -28
- package/dist/manifest-B2duEHiH.mjs +90 -0
- package/dist/manifest-B6EY9Vm8.mjs +57 -0
- package/dist/{manifest-gZ4s_UtG.mjs → manifest-B6nKSbyY.mjs} +32 -33
- package/dist/{manifest-2ToTpjv8.mjs → manifest-BL8AQNPF.mjs} +31 -31
- package/dist/{manifest-DzwvxPJX.mjs → manifest-BSZvJJmV.mjs} +23 -14
- package/dist/{manifest-Sc_0JQ13.mjs → manifest-BU7qzUyX.mjs} +23 -23
- package/dist/{manifest-CT7zZBV1.mjs → manifest-Bl62e8WK.mjs} +24 -23
- package/dist/manifest-Bo5cXjdt.mjs +82 -0
- package/dist/manifest-BpS4gtUK.mjs +1347 -0
- package/dist/manifest-Bv65_e2W.mjs +101 -0
- package/dist/manifest-BytNIF4Z.mjs +117 -0
- package/dist/{manifest-BqrQ4Tpj.mjs → manifest-C-xtsjS3.mjs} +23 -23
- package/dist/{manifest-NXctwWQq.mjs → manifest-CDYl7OhA.mjs} +36 -38
- package/dist/manifest-CRZ3xmkD.mjs +61 -0
- package/dist/manifest-CoW6u4Tp.mjs +132 -0
- package/dist/manifest-Cq5zN_8A.mjs +50 -0
- package/dist/{manifest-CAhOuvSl.mjs → manifest-D7YZM_2e.mjs} +75 -85
- package/dist/{manifest-DCyjf4n2.mjs → manifest-DE_VrAeQ.mjs} +27 -7
- package/dist/manifest-DGsXSCpT.mjs +39 -0
- package/dist/{manifest-BB2J8IMJ.mjs → manifest-DJ2vfEuW.mjs} +48 -41
- package/dist/{manifest-3g71z6Bg.mjs → manifest-DPXDYhEu.mjs} +26 -25
- package/dist/manifest-Dd4fQb0a.mjs +322 -0
- package/dist/{manifest-CXsRWjjI.mjs → manifest-Deq6opGg.mjs} +95 -96
- package/dist/{manifest-C9RT5nk32.mjs → manifest-DfJTafJK.mjs} +14 -11
- package/dist/manifest-DgOdgN_j.mjs +50 -0
- package/dist/{manifest-BmtZzQiQ2.mjs → manifest-DlbMW4v4.mjs} +17 -15
- package/dist/{manifest-DrbmZcFl2.mjs → manifest-DmVfbH0w.mjs} +212 -91
- package/dist/manifest-Dog6Ddjr.mjs +109 -0
- package/dist/manifest-DvgU5FWb.mjs +58 -0
- package/dist/manifest-HsfDBs7j.mjs +50 -0
- package/dist/manifest-I8oQHvCG.mjs +186 -0
- package/dist/manifest-NvH_a-av.mjs +786 -0
- package/dist/{manifest-Dh8WBmEW.mjs → manifest-cEJU1v0Z.mjs} +24 -24
- package/dist/manifest-wOl5XLB12.mjs +112 -0
- package/dist/{modules-C184v-S9.mjs → modules-tZozf0LQ.mjs} +130 -860
- package/dist/{mojo-ipc-B_H61Afw.mjs → mojo-ipc-DXNEXEqb.mjs} +141 -26
- package/dist/{network-671Cw6hV.mjs → network-CPVvwvFg.mjs} +1329 -823
- package/dist/{outputPaths-B1uGmrWZ.mjs → outputPaths-um7lCRY3.mjs} +4 -8
- package/dist/{platform-WmNn8Sxb.mjs → platform-CYeFoTWp.mjs} +101 -10
- package/dist/{process-QcbIy5Zq.mjs → process-BTbgcVc6.mjs} +251 -346
- package/dist/{proxy-DqNs0bAd.mjs → proxy-r8YN6nP1.mjs} +30 -8
- package/dist/{registry-D-6e18lB.mjs → registry-Bl8ZQW61.mjs} +3 -3
- package/dist/{response-BQVP-xUn.mjs → response-CWhh2aLo.mjs} +7 -1
- package/dist/{shared-state-board-DV-dpHFJ.mjs → shared-state-board-BoZnSoj-.mjs} +2 -2
- package/dist/{sourcemap-Dq8ez8vS.mjs → sourcemap-BIDHUVXy.mjs} +350 -66
- package/dist/{streaming-BUQ0VJsg.mjs → streaming-Dal6utPp.mjs} +13 -13
- package/dist/{tool-builder-DCbIC5Eo.mjs → tool-builder-BHJp32mV.mjs} +1 -1
- package/dist/{transform-CiYJfNX0.mjs → transform-DRVgGG90.mjs} +18 -14
- package/dist/wasm-BYx5UOeG.mjs +1044 -0
- package/dist/webcrack-Be0_FccV.mjs +747 -0
- package/dist/{workflow-f3xJOcjx.mjs → workflow-BpuKEtvn.mjs} +8 -8
- package/package.json +76 -43
- package/dist/TraceRecorder-DgxyVbdQ.mjs +0 -519
- package/dist/analysis-CL9uACt9.mjs +0 -463
- package/dist/bind-helpers-xFfRF-qm.mjs +0 -22
- package/dist/definitions-6M-eejaT.mjs +0 -53
- package/dist/definitions-B3QdlrHv.mjs +0 -34
- package/dist/definitions-CXEI7QC72.mjs +0 -216
- package/dist/definitions-C_4r7Fo-2.mjs +0 -14
- package/dist/definitions-CkFDALoa.mjs +0 -26
- package/dist/definitions-Cy3Sl6gV.mjs +0 -34
- package/dist/definitions-LKpC3-nL.mjs +0 -9
- package/dist/handlers-DdFzXLvF.mjs +0 -446
- package/dist/manifest-82baTv4U.mjs +0 -45
- package/dist/manifest-BKbgbSiY.mjs +0 -60
- package/dist/manifest-Bcf-TJzH.mjs +0 -848
- package/dist/manifest-Bnd7kqEY.mjs +0 -55
- package/dist/manifest-BqQX6OQC2.mjs +0 -65
- package/dist/manifest-Br4RPFt5.mjs +0 -370
- package/dist/manifest-C5qDjysN.mjs +0 -107
- package/dist/manifest-CBYWCUBJ.mjs +0 -51
- package/dist/manifest-CFADCRa1.mjs +0 -37
- package/dist/manifest-CQVhavRF.mjs +0 -114
- package/dist/manifest-CV12bcrF.mjs +0 -121
- package/dist/manifest-CZLUCfG02.mjs +0 -95
- package/dist/manifest-D6phHKFd.mjs +0 -131
- package/dist/manifest-DHsnKgP6.mjs +0 -60
- package/dist/manifest-Df_dliIe.mjs +0 -55
- package/dist/manifest-DhKRAT8_.mjs +0 -92
- package/dist/manifest-DlpTj4ic2.mjs +0 -193
- package/dist/manifest-DuwHjUa5.mjs +0 -70
- package/dist/manifest-qSleDqdO.mjs +0 -1023
- package/dist/wasm-DQTnHDs4.mjs +0 -531
- /package/dist/{CacheAdapters-CDe5WPSV.mjs → CacheAdapters-jJFy20G-.mjs} +0 -0
- /package/dist/{DarwinAPI-BNPxu0RH.mjs → DarwinAPI-ETyy0xyo.mjs} +0 -0
- /package/dist/{EventBus-DgPmwpeu.mjs → EventBus-DFKvADm3.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-SFesNera.mjs → EvidenceGraphBridge-318Oi0Lf.mjs} +0 -0
- /package/dist/{FingerprintManager-gzWtkKuf.mjs → FingerprintManager-BN4UQWnX.mjs} +0 -0
- /package/dist/{PrerequisiteError-Dl33Svkz.mjs → PrerequisiteError-TuyZIs6n.mjs} +0 -0
- /package/dist/{ReverseEvidenceGraph-Dlsk94LC.mjs → ReverseEvidenceGraph-C02-gXOh.mjs} +0 -0
- /package/dist/{StealthVerifier-Bo4T3bz8.mjs → StealthVerifier-BWmPgQsv.mjs} +0 -0
- /package/dist/{VersionDetector-CwVLVdDM.mjs → VersionDetector-K3V4vGsw.mjs} +0 -0
- /package/dist/{betterSqlite3-0pqusHHH.mjs → betterSqlite3-DLSBZodi.mjs} +0 -0
- /package/dist/{concurrency-Bt0yv1kJ.mjs → concurrency-Drev_Vz9.mjs} +0 -0
- /package/dist/{formatAddress-DVkj9kpI.mjs → formatAddress-nnMvEohD.mjs} +0 -0
- /package/dist/{parse-args-BlRjqlkL.mjs → parse-args-B4cY5Vx5.mjs} +0 -0
- /package/dist/{ssrf-policy-ZaUfvhq7.mjs → ssrf-policy-Dsqd-DTX.mjs} +0 -0
- /package/dist/{types-CPhOReNX.mjs → types-DDBWs9UP.mjs} +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { t as logger } from "./logger-Dh_xb7_2.mjs";
|
|
2
|
-
import { C as
|
|
3
|
-
import { t as DetailedDataManager } from "./DetailedDataManager-
|
|
4
|
-
import { c as getConfig, l as projectRoot, o as resolveOutputDirectory, s as resolveScreenshotOutputPath } from "./outputPaths-
|
|
5
|
-
import { c as
|
|
6
|
-
import { t as PrerequisiteError } from "./PrerequisiteError-
|
|
7
|
-
import { n as isBetterSqlite3RelatedError, t as formatBetterSqlite3Error } from "./betterSqlite3-
|
|
8
|
-
import { t as cdpLimit } from "./concurrency-
|
|
9
|
-
import { a as argString, i as argObject, n as argEnum, o as argStringArray, r as argNumber, s as argStringRequired, t as argBool } from "./parse-args-
|
|
10
|
-
import "./
|
|
11
|
-
import
|
|
2
|
+
import { C as CAPTCHA_MAX_RETRIES, D as CAPTCHA_RESULT_TIMEOUT_MS, E as CAPTCHA_POLL_INTERVAL_MS, O as CAPTCHA_SOLVER_BASE_URL, S as CAPTCHA_DEFAULT_TIMEOUT_MS, T as CAPTCHA_MIN_TIMEOUT_MS, k as CAPTCHA_SUBMIT_TIMEOUT_MS, w as CAPTCHA_MAX_TIMEOUT_MS, wn as SCRIPTS_MAX_CAP, x as CAPTCHA_DEFAULT_RETRIES } from "./constants-CDZLOoVv.mjs";
|
|
3
|
+
import { t as DetailedDataManager } from "./DetailedDataManager-HT49OrvF.mjs";
|
|
4
|
+
import { c as getConfig, l as projectRoot, o as resolveOutputDirectory, s as resolveScreenshotOutputPath } from "./outputPaths-um7lCRY3.mjs";
|
|
5
|
+
import { c as CamoufoxBrowserManager, n as StealthScripts, s as AICaptchaDetector } from "./modules-tZozf0LQ.mjs";
|
|
6
|
+
import { t as PrerequisiteError } from "./PrerequisiteError-TuyZIs6n.mjs";
|
|
7
|
+
import { n as isBetterSqlite3RelatedError, t as formatBetterSqlite3Error } from "./betterSqlite3-DLSBZodi.mjs";
|
|
8
|
+
import { t as cdpLimit } from "./concurrency-Drev_Vz9.mjs";
|
|
9
|
+
import { a as argString, i as argObject, n as argEnum, o as argStringArray, r as argNumber, s as argStringRequired, t as argBool } from "./parse-args-B4cY5Vx5.mjs";
|
|
10
|
+
import { n as capabilityReport } from "./capabilities-CcHlvWgK.mjs";
|
|
11
|
+
import "./definitions-BRaefg3u.mjs";
|
|
12
|
+
import { t as R } from "./ResponseBuilder-CJXWmWNw.mjs";
|
|
12
13
|
import { join } from "path";
|
|
13
14
|
import { randomUUID } from "node:crypto";
|
|
14
15
|
import { readFile, writeFile } from "fs/promises";
|
|
@@ -73,6 +74,13 @@ var BrowserControlHandlers = class {
|
|
|
73
74
|
channel: channelValue
|
|
74
75
|
};
|
|
75
76
|
}
|
|
77
|
+
parseChromeLaunchRequest(args) {
|
|
78
|
+
return {
|
|
79
|
+
headless: this.parseHeadlessArg(args.headless),
|
|
80
|
+
args: argStringArray(args, "args"),
|
|
81
|
+
enableV8NativesSyntax: argBool(args, "enableV8NativesSyntax")
|
|
82
|
+
};
|
|
83
|
+
}
|
|
76
84
|
hasChromeConnectRequest(request) {
|
|
77
85
|
return Boolean(request.browserURL || request.wsEndpoint || request.autoConnect || request.userDataDir || request.channel);
|
|
78
86
|
}
|
|
@@ -115,7 +123,7 @@ var BrowserControlHandlers = class {
|
|
|
115
123
|
if (argString(args, "driver", "chrome") === "camoufox") {
|
|
116
124
|
if (argString(args, "mode", "launch") === "connect") {
|
|
117
125
|
const wsEndpoint = argString(args, "wsEndpoint");
|
|
118
|
-
if (!wsEndpoint) return R.fail("wsEndpoint is required for connect mode. Use
|
|
126
|
+
if (!wsEndpoint) return R.fail("wsEndpoint is required for connect mode. Use camoufox_server({ action: \"launch\" }) first to get a wsEndpoint.").json();
|
|
119
127
|
return R.ok().merge({
|
|
120
128
|
driver: "camoufox",
|
|
121
129
|
mode: "connect",
|
|
@@ -148,20 +156,38 @@ var BrowserControlHandlers = class {
|
|
|
148
156
|
status
|
|
149
157
|
}).json();
|
|
150
158
|
}
|
|
151
|
-
const
|
|
159
|
+
const launchRequest = this.parseChromeLaunchRequest(args);
|
|
152
160
|
try {
|
|
153
|
-
await this.deps.collector.
|
|
161
|
+
const launch = await this.deps.collector.launch(launchRequest);
|
|
162
|
+
if (launch.action === "relaunched") this.markMonitoringContextChanged("browser_launch_relaunch");
|
|
163
|
+
const status = await this.deps.collector.getStatus();
|
|
164
|
+
return R.ok().merge({
|
|
165
|
+
driver: "chrome",
|
|
166
|
+
message: launch.action === "relaunched" ? "Browser relaunched successfully" : "Browser launched successfully",
|
|
167
|
+
launchAction: launch.action,
|
|
168
|
+
relaunchReason: launch.reason ?? null,
|
|
169
|
+
v8NativeSyntaxEnabled: launch.launchOptions.v8NativeSyntaxEnabled,
|
|
170
|
+
launchArgs: launch.launchOptions.args,
|
|
171
|
+
status
|
|
172
|
+
}).json();
|
|
154
173
|
} catch (error) {
|
|
155
|
-
if (!this.shouldAttemptLinuxHeadfulFallback(
|
|
174
|
+
if (!this.shouldAttemptLinuxHeadfulFallback(launchRequest.headless, error)) throw error;
|
|
156
175
|
const reason = error instanceof Error ? error.message : String(error);
|
|
157
176
|
logger.warn(`Headful launch failed on Linux, fallback to headless=true: ${reason}`);
|
|
158
177
|
process.env.PUPPETEER_HEADLESS = "true";
|
|
159
178
|
await this.persistHeadlessEnv("true");
|
|
160
|
-
await this.deps.collector.
|
|
179
|
+
const launch = await this.deps.collector.launch({
|
|
180
|
+
...launchRequest,
|
|
181
|
+
headless: true
|
|
182
|
+
});
|
|
161
183
|
const fallbackStatus = await this.deps.collector.getStatus();
|
|
162
184
|
return R.ok().merge({
|
|
163
185
|
driver: "chrome",
|
|
164
186
|
message: "Browser launched with Linux fallback (headless=true)",
|
|
187
|
+
launchAction: launch.action,
|
|
188
|
+
relaunchReason: launch.reason ?? null,
|
|
189
|
+
v8NativeSyntaxEnabled: launch.launchOptions.v8NativeSyntaxEnabled,
|
|
190
|
+
launchArgs: launch.launchOptions.args,
|
|
165
191
|
status: fallbackStatus,
|
|
166
192
|
fallback: {
|
|
167
193
|
applied: true,
|
|
@@ -170,12 +196,6 @@ var BrowserControlHandlers = class {
|
|
|
170
196
|
}
|
|
171
197
|
}).json();
|
|
172
198
|
}
|
|
173
|
-
const status = await this.deps.collector.getStatus();
|
|
174
|
-
return R.ok().merge({
|
|
175
|
-
driver: "chrome",
|
|
176
|
-
message: "Browser launched successfully",
|
|
177
|
-
status
|
|
178
|
-
}).json();
|
|
179
199
|
} catch (error) {
|
|
180
200
|
return R.fail(error).json();
|
|
181
201
|
}
|
|
@@ -613,6 +633,12 @@ var PageInteractionHandlers = class {
|
|
|
613
633
|
max: 6e4,
|
|
614
634
|
integer: true
|
|
615
635
|
});
|
|
636
|
+
const timeout = this.parseNumberArg(args.timeout, {
|
|
637
|
+
defaultValue: 1e4,
|
|
638
|
+
min: 1e3,
|
|
639
|
+
max: 12e4,
|
|
640
|
+
integer: true
|
|
641
|
+
});
|
|
616
642
|
const frameUrl = argString(args, "frameUrl");
|
|
617
643
|
const frameSelector = argString(args, "frameSelector");
|
|
618
644
|
const frameOptions = frameUrl || frameSelector ? {
|
|
@@ -636,12 +662,14 @@ var PageInteractionHandlers = class {
|
|
|
636
662
|
if (frameOptions) await this.deps.pageController.click(selector, {
|
|
637
663
|
button,
|
|
638
664
|
clickCount,
|
|
639
|
-
delay
|
|
665
|
+
delay,
|
|
666
|
+
timeout
|
|
640
667
|
}, frameOptions);
|
|
641
668
|
else await this.deps.pageController.click(selector, {
|
|
642
669
|
button,
|
|
643
670
|
clickCount,
|
|
644
|
-
delay
|
|
671
|
+
delay,
|
|
672
|
+
timeout
|
|
645
673
|
});
|
|
646
674
|
} catch (error) {
|
|
647
675
|
const msg = this.toErrorMessage(error);
|
|
@@ -894,7 +922,7 @@ var PageEvaluationHandlers = class {
|
|
|
894
922
|
const trimmed = rawSelector.trim();
|
|
895
923
|
if (trimmed.length > 0 && trimmed.toLowerCase() !== "all") selectors.push(trimmed);
|
|
896
924
|
}
|
|
897
|
-
if (selectors.length > 1) return this.
|
|
925
|
+
if (selectors.length > 1) return this.screenshotBatch(selectors, requestedPath, type, quality);
|
|
898
926
|
const selector = selectors[0] ?? "";
|
|
899
927
|
const { absolutePath, displayPath, pathRewritten } = await resolveScreenshotOutputPath({
|
|
900
928
|
requestedPath,
|
|
@@ -958,7 +986,7 @@ var PageEvaluationHandlers = class {
|
|
|
958
986
|
}
|
|
959
987
|
}
|
|
960
988
|
/** Take one screenshot per selector and return all results. */
|
|
961
|
-
async
|
|
989
|
+
async screenshotBatch(selectors, requestedPath, type, quality) {
|
|
962
990
|
const isCamoufox = this.deps.getActiveDriver() === "camoufox";
|
|
963
991
|
const results = [];
|
|
964
992
|
for (const selector of selectors) {
|
|
@@ -1374,19 +1402,125 @@ var CaptchaHandlers = class {
|
|
|
1374
1402
|
}
|
|
1375
1403
|
};
|
|
1376
1404
|
//#endregion
|
|
1377
|
-
//#region src/
|
|
1378
|
-
|
|
1379
|
-
const jitterOptions = {
|
|
1405
|
+
//#region src/modules/stealth/CDPTimingProxy.types.ts
|
|
1406
|
+
const DEFAULT_TIMING_OPTIONS = {
|
|
1380
1407
|
enabled: true,
|
|
1381
1408
|
minDelayMs: 20,
|
|
1382
1409
|
maxDelayMs: 80,
|
|
1383
1410
|
burstMode: false
|
|
1384
1411
|
};
|
|
1412
|
+
//#endregion
|
|
1413
|
+
//#region src/modules/stealth/SessionProfileManager.ts
|
|
1414
|
+
var SessionProfileManager = class SessionProfileManager {
|
|
1415
|
+
static instance = null;
|
|
1416
|
+
cachedProfile = null;
|
|
1417
|
+
static DEFAULT_TTL_SEC = 1800;
|
|
1418
|
+
static getInstance() {
|
|
1419
|
+
if (!SessionProfileManager.instance) SessionProfileManager.instance = new SessionProfileManager();
|
|
1420
|
+
return SessionProfileManager.instance;
|
|
1421
|
+
}
|
|
1422
|
+
async exportFromPage(page, options = {}) {
|
|
1423
|
+
const cookies = await page.cookies();
|
|
1424
|
+
const pageMeta = await page.evaluate(() => {
|
|
1425
|
+
const nav = navigator;
|
|
1426
|
+
const uaData = nav.userAgentData;
|
|
1427
|
+
const clientHints = {
|
|
1428
|
+
secChUa: Array.isArray(uaData?.brands) ? uaData.brands.map((b) => `"${b.brand}";v="${b.version}"`).join(", ") : void 0,
|
|
1429
|
+
secChUaMobile: typeof uaData?.mobile === "boolean" ? uaData.mobile ? "?1" : "?0" : void 0,
|
|
1430
|
+
secChUaPlatform: uaData?.platform ? `"${uaData.platform}"` : void 0
|
|
1431
|
+
};
|
|
1432
|
+
return {
|
|
1433
|
+
userAgent: nav.userAgent,
|
|
1434
|
+
platform: nav.platform,
|
|
1435
|
+
acceptLanguage: nav.language,
|
|
1436
|
+
referer: document.referrer || void 0,
|
|
1437
|
+
clientHints
|
|
1438
|
+
};
|
|
1439
|
+
});
|
|
1440
|
+
const origin = options.origin ?? this.safeOrigin(page.url());
|
|
1441
|
+
const ttlSec = options.ttlSec ?? SessionProfileManager.DEFAULT_TTL_SEC;
|
|
1442
|
+
const profile = {
|
|
1443
|
+
cookies: cookies.map((c) => ({
|
|
1444
|
+
name: c.name,
|
|
1445
|
+
value: c.value,
|
|
1446
|
+
domain: c.domain,
|
|
1447
|
+
path: c.path,
|
|
1448
|
+
expires: c.expires,
|
|
1449
|
+
size: c.size,
|
|
1450
|
+
httpOnly: c.httpOnly,
|
|
1451
|
+
secure: c.secure,
|
|
1452
|
+
session: c.session,
|
|
1453
|
+
sameSite: c.sameSite,
|
|
1454
|
+
sourceScheme: c.sourceScheme
|
|
1455
|
+
})),
|
|
1456
|
+
userAgent: pageMeta.userAgent,
|
|
1457
|
+
acceptLanguage: pageMeta.acceptLanguage,
|
|
1458
|
+
referer: options.referer ?? pageMeta.referer,
|
|
1459
|
+
clientHints: pageMeta.clientHints,
|
|
1460
|
+
platform: pageMeta.platform,
|
|
1461
|
+
origin,
|
|
1462
|
+
collectedAt: Date.now(),
|
|
1463
|
+
ttlSec
|
|
1464
|
+
};
|
|
1465
|
+
this.cachedProfile = profile;
|
|
1466
|
+
logger.info(`Session profile exported: cookies=${profile.cookies.length}, origin=${profile.origin ?? "unknown"}, ttlSec=${profile.ttlSec}`);
|
|
1467
|
+
return profile;
|
|
1468
|
+
}
|
|
1469
|
+
serialize(profile) {
|
|
1470
|
+
return JSON.stringify(profile);
|
|
1471
|
+
}
|
|
1472
|
+
deserialize(raw) {
|
|
1473
|
+
const parsed = JSON.parse(raw);
|
|
1474
|
+
return {
|
|
1475
|
+
cookies: Array.isArray(parsed.cookies) ? parsed.cookies : [],
|
|
1476
|
+
userAgent: parsed.userAgent,
|
|
1477
|
+
acceptLanguage: parsed.acceptLanguage,
|
|
1478
|
+
referer: parsed.referer,
|
|
1479
|
+
clientHints: parsed.clientHints,
|
|
1480
|
+
platform: parsed.platform,
|
|
1481
|
+
origin: parsed.origin,
|
|
1482
|
+
collectedAt: typeof parsed.collectedAt === "number" ? parsed.collectedAt : Date.now(),
|
|
1483
|
+
ttlSec: typeof parsed.ttlSec === "number" && parsed.ttlSec > 0 ? parsed.ttlSec : SessionProfileManager.DEFAULT_TTL_SEC
|
|
1484
|
+
};
|
|
1485
|
+
}
|
|
1486
|
+
setProfile(profile) {
|
|
1487
|
+
this.cachedProfile = profile;
|
|
1488
|
+
}
|
|
1489
|
+
getProfile() {
|
|
1490
|
+
return this.cachedProfile;
|
|
1491
|
+
}
|
|
1492
|
+
getValidProfile(now = Date.now()) {
|
|
1493
|
+
if (!this.cachedProfile || this.isExpired(this.cachedProfile, now)) return null;
|
|
1494
|
+
return this.cachedProfile;
|
|
1495
|
+
}
|
|
1496
|
+
isExpired(profile, now = Date.now()) {
|
|
1497
|
+
return profile.collectedAt + profile.ttlSec * 1e3 <= now;
|
|
1498
|
+
}
|
|
1499
|
+
clearProfile() {
|
|
1500
|
+
this.cachedProfile = null;
|
|
1501
|
+
}
|
|
1502
|
+
static resetInstance() {
|
|
1503
|
+
SessionProfileManager.instance = null;
|
|
1504
|
+
}
|
|
1505
|
+
safeOrigin(url) {
|
|
1506
|
+
if (!url || url === "about:blank") return void 0;
|
|
1507
|
+
try {
|
|
1508
|
+
return new URL(url).origin;
|
|
1509
|
+
} catch {
|
|
1510
|
+
return;
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
};
|
|
1514
|
+
//#endregion
|
|
1515
|
+
//#region src/server/domains/browser/handlers/stealth-injection.ts
|
|
1516
|
+
/** Module-level jitter configuration shared across handler calls. */
|
|
1517
|
+
const jitterOptions = { ...DEFAULT_TIMING_OPTIONS };
|
|
1385
1518
|
let fingerprintManagerInstance = null;
|
|
1519
|
+
const sessionProfileManager = SessionProfileManager.getInstance();
|
|
1386
1520
|
async function getFingerprintManager() {
|
|
1387
1521
|
if (fingerprintManagerInstance) return fingerprintManagerInstance;
|
|
1388
1522
|
try {
|
|
1389
|
-
fingerprintManagerInstance = (await import("./FingerprintManager-
|
|
1523
|
+
fingerprintManagerInstance = (await import("./FingerprintManager-BN4UQWnX.mjs")).FingerprintManager.getInstance();
|
|
1390
1524
|
return fingerprintManagerInstance;
|
|
1391
1525
|
} catch {
|
|
1392
1526
|
return null;
|
|
@@ -1416,6 +1550,22 @@ var StealthInjectionHandlers = class {
|
|
|
1416
1550
|
logger.warn("Fingerprint injection failed, falling back to StealthScripts:", err);
|
|
1417
1551
|
}
|
|
1418
1552
|
await StealthScripts.injectAll(page);
|
|
1553
|
+
if (fingerprintApplied && fm) {
|
|
1554
|
+
const activeProfile = fm.getActiveProfile();
|
|
1555
|
+
const cached = sessionProfileManager.getValidProfile();
|
|
1556
|
+
const mergedProfile = {
|
|
1557
|
+
cookies: cached?.cookies ?? [],
|
|
1558
|
+
userAgent: activeProfile?.headers?.["User-Agent"] ?? cached?.userAgent,
|
|
1559
|
+
acceptLanguage: activeProfile?.headers?.["Accept-Language"] ?? cached?.acceptLanguage,
|
|
1560
|
+
referer: cached?.referer,
|
|
1561
|
+
clientHints: cached?.clientHints,
|
|
1562
|
+
platform: activeProfile?.os ?? cached?.platform,
|
|
1563
|
+
origin: cached?.origin,
|
|
1564
|
+
collectedAt: cached?.collectedAt ?? Date.now(),
|
|
1565
|
+
ttlSec: cached?.ttlSec ?? 1800
|
|
1566
|
+
};
|
|
1567
|
+
sessionProfileManager.setProfile(mergedProfile);
|
|
1568
|
+
}
|
|
1419
1569
|
return R.ok().build({
|
|
1420
1570
|
message: "Stealth scripts injected successfully",
|
|
1421
1571
|
fingerprintApplied,
|
|
@@ -1468,7 +1618,12 @@ var StealthInjectionHandlers = class {
|
|
|
1468
1618
|
return R.fail(`Camoufox fingerprint generation failed: ${err instanceof Error ? err.message : String(err)}`).build();
|
|
1469
1619
|
}
|
|
1470
1620
|
const fm = await getFingerprintManager();
|
|
1471
|
-
if (!fm?.isAvailable()) return R.fail("fingerprint-generator/fingerprint-injector packages are not installed. Install them with: pnpm add fingerprint-generator fingerprint-injector").
|
|
1621
|
+
if (!fm?.isAvailable()) return R.fail("fingerprint-generator/fingerprint-injector packages are not installed. Install them with: pnpm add fingerprint-generator fingerprint-injector").merge({
|
|
1622
|
+
available: false,
|
|
1623
|
+
capability: "fingerprint_generator",
|
|
1624
|
+
status: "unavailable",
|
|
1625
|
+
fix: "Install fingerprint-generator and fingerprint-injector: pnpm add fingerprint-generator fingerprint-injector"
|
|
1626
|
+
}).build();
|
|
1472
1627
|
const profile = await fm.generateFingerprint({
|
|
1473
1628
|
os: args.os,
|
|
1474
1629
|
browser: args.browser ?? "chrome",
|
|
@@ -1485,7 +1640,7 @@ var StealthInjectionHandlers = class {
|
|
|
1485
1640
|
async handleStealthVerify(_args) {
|
|
1486
1641
|
try {
|
|
1487
1642
|
const page = await this.deps.pageController.getPage();
|
|
1488
|
-
const result = await new (await (import("./StealthVerifier-
|
|
1643
|
+
const result = await new (await (import("./StealthVerifier-BWmPgQsv.mjs"))).StealthVerifier().verify(page);
|
|
1489
1644
|
return R.ok().merge(result).build();
|
|
1490
1645
|
} catch (err) {
|
|
1491
1646
|
return R.fail(`Stealth verification failed: ${err instanceof Error ? err.message : String(err)}`).build();
|
|
@@ -1499,7 +1654,12 @@ var StealthInjectionHandlers = class {
|
|
|
1499
1654
|
try {
|
|
1500
1655
|
geo = await (await import("camoufox-js/locale")).getGeolocation(locale);
|
|
1501
1656
|
} catch (err) {
|
|
1502
|
-
return R.fail(`Camoufox locale module unavailable: ${err instanceof Error ? err.message : String(err)}. Ensure camoufox-js is installed.`).
|
|
1657
|
+
return R.fail(`Camoufox locale module unavailable: ${err instanceof Error ? err.message : String(err)}. Ensure camoufox-js is installed.`).merge({
|
|
1658
|
+
available: false,
|
|
1659
|
+
capability: "camoufox_locale",
|
|
1660
|
+
status: "unavailable",
|
|
1661
|
+
fix: "Install camoufox-js and fetch its browser assets: pnpm add camoufox-js && npx camoufox-js fetch"
|
|
1662
|
+
}).build();
|
|
1503
1663
|
}
|
|
1504
1664
|
let publicIp = null;
|
|
1505
1665
|
const proxy = argString(args, "proxy");
|
|
@@ -2120,7 +2280,7 @@ var JSHeapSearchHandlers = class {
|
|
|
2120
2280
|
this.detailedDataManager = DetailedDataManager.getInstance();
|
|
2121
2281
|
}
|
|
2122
2282
|
async handleJSHeapSearch(args) {
|
|
2123
|
-
const pattern = argString(args, "pattern", "");
|
|
2283
|
+
const pattern = argString(args, "pattern", "") || argString(args, "query", "");
|
|
2124
2284
|
const maxResults = argNumber(args, "maxResults", 50);
|
|
2125
2285
|
const caseSensitive = argBool(args, "caseSensitive", false);
|
|
2126
2286
|
if (!pattern) return R.fail("pattern is required").build();
|
|
@@ -3260,8 +3420,9 @@ async function handleHumanScroll(args, collector) {
|
|
|
3260
3420
|
if (!page) return R.fail("No active page.").build();
|
|
3261
3421
|
const distance = Math.max(1, Math.min(argNumber(args, "distance", 500), 1e4));
|
|
3262
3422
|
const direction = argString(args, "direction", "down");
|
|
3423
|
+
const durationMs = Math.max(10, Math.min(argNumber(args, "durationMs", 1500), 3e4));
|
|
3263
3424
|
const segments = Math.max(1, Math.min(argNumber(args, "segments", 8), 200));
|
|
3264
|
-
const pauseMs = Math.max(0, Math.min(argNumber(args, "pauseMs", 80), 5e3));
|
|
3425
|
+
const pauseMs = typeof args["pauseMs"] === "number" && Number.isFinite(args["pauseMs"]) ? Math.max(0, Math.min(argNumber(args, "pauseMs", 80), 5e3)) : Math.max(0, Math.min(Math.round(durationMs / segments), 5e3));
|
|
3265
3426
|
const jitter = Math.max(0, Math.min(argNumber(args, "jitter", .3), 1));
|
|
3266
3427
|
const selector = argString(args, "selector");
|
|
3267
3428
|
const isVertical = direction === "up" || direction === "down";
|
|
@@ -3294,6 +3455,8 @@ async function handleHumanScroll(args, collector) {
|
|
|
3294
3455
|
direction,
|
|
3295
3456
|
requestedDistance: distance,
|
|
3296
3457
|
actualScrolled: Math.round(scrolled),
|
|
3458
|
+
durationMs,
|
|
3459
|
+
pauseMs,
|
|
3297
3460
|
segments
|
|
3298
3461
|
});
|
|
3299
3462
|
} catch (e) {
|
|
@@ -3588,6 +3751,127 @@ async function handleWidgetChallengeSolve(args, collector) {
|
|
|
3588
3751
|
}
|
|
3589
3752
|
}
|
|
3590
3753
|
//#endregion
|
|
3754
|
+
//#region src/server/domains/browser/handlers/captcha-capabilities.ts
|
|
3755
|
+
function getConfiguredProvider() {
|
|
3756
|
+
return (process.env.CAPTCHA_PROVIDER || "").trim().toLowerCase() || "manual";
|
|
3757
|
+
}
|
|
3758
|
+
function getConfiguredBaseUrl() {
|
|
3759
|
+
return process.env.CAPTCHA_SOLVER_BASE_URL?.trim() || process.env.CAPTCHA_2CAPTCHA_BASE_URL?.trim() || "";
|
|
3760
|
+
}
|
|
3761
|
+
function getTwoCaptchaCapability() {
|
|
3762
|
+
const configuredProvider = getConfiguredProvider();
|
|
3763
|
+
const baseUrl = getConfiguredBaseUrl();
|
|
3764
|
+
const apiKeyConfigured = Boolean(process.env.CAPTCHA_API_KEY?.trim());
|
|
3765
|
+
const baseUrlConfigured = baseUrl.length > 0;
|
|
3766
|
+
const available = apiKeyConfigured && baseUrlConfigured;
|
|
3767
|
+
return {
|
|
3768
|
+
capability: "captcha_external_service_2captcha",
|
|
3769
|
+
status: available ? "available" : "unavailable",
|
|
3770
|
+
reason: available ? void 0 : "The 2captcha-compatible external path needs both CAPTCHA_API_KEY and CAPTCHA_SOLVER_BASE_URL.",
|
|
3771
|
+
fix: available ? void 0 : "Set CAPTCHA_API_KEY and CAPTCHA_SOLVER_BASE_URL to enable external_service mode.",
|
|
3772
|
+
details: {
|
|
3773
|
+
tools: ["captcha_vision_solve", "widget_challenge_solve"],
|
|
3774
|
+
configuredProvider,
|
|
3775
|
+
defaultExternalProviderSupported: configuredProvider === "2captcha",
|
|
3776
|
+
apiKeyConfigured,
|
|
3777
|
+
baseUrlConfigured,
|
|
3778
|
+
...baseUrlConfigured ? { baseUrl } : {}
|
|
3779
|
+
}
|
|
3780
|
+
};
|
|
3781
|
+
}
|
|
3782
|
+
async function getWidgetHookCapability(collector) {
|
|
3783
|
+
let page;
|
|
3784
|
+
try {
|
|
3785
|
+
page = await collector.getActivePage();
|
|
3786
|
+
} catch (error) {
|
|
3787
|
+
return {
|
|
3788
|
+
capability: "captcha_widget_hook_current_page",
|
|
3789
|
+
status: "unknown",
|
|
3790
|
+
reason: `Current page probe failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
3791
|
+
fix: "Attach or launch a browser page before using hook mode.",
|
|
3792
|
+
details: {
|
|
3793
|
+
tools: ["widget_challenge_solve"],
|
|
3794
|
+
pageAttached: false
|
|
3795
|
+
}
|
|
3796
|
+
};
|
|
3797
|
+
}
|
|
3798
|
+
if (!page) return {
|
|
3799
|
+
capability: "captcha_widget_hook_current_page",
|
|
3800
|
+
status: "unknown",
|
|
3801
|
+
reason: "No active page is attached.",
|
|
3802
|
+
fix: "Attach or launch a browser page before using hook mode.",
|
|
3803
|
+
details: {
|
|
3804
|
+
tools: ["widget_challenge_solve"],
|
|
3805
|
+
pageAttached: false
|
|
3806
|
+
}
|
|
3807
|
+
};
|
|
3808
|
+
try {
|
|
3809
|
+
const probe = await page.evaluate(() => {
|
|
3810
|
+
const callbacksRaw = window.__turnstile_callbacks;
|
|
3811
|
+
const callbackCount = callbacksRaw && typeof callbacksRaw === "object" && !Array.isArray(callbacksRaw) ? Object.keys(callbacksRaw).length : 0;
|
|
3812
|
+
return {
|
|
3813
|
+
url: location.href,
|
|
3814
|
+
callbackCount
|
|
3815
|
+
};
|
|
3816
|
+
});
|
|
3817
|
+
return {
|
|
3818
|
+
capability: "captcha_widget_hook_current_page",
|
|
3819
|
+
status: probe.callbackCount > 0 ? "available" : "unavailable",
|
|
3820
|
+
reason: probe.callbackCount > 0 ? void 0 : "The current page does not expose window.__turnstile_callbacks for hook mode.",
|
|
3821
|
+
fix: probe.callbackCount > 0 ? void 0 : "Use manual mode, or configure the external 2captcha-compatible service for widget solving.",
|
|
3822
|
+
details: {
|
|
3823
|
+
tools: ["widget_challenge_solve"],
|
|
3824
|
+
pageAttached: true,
|
|
3825
|
+
...probe
|
|
3826
|
+
}
|
|
3827
|
+
};
|
|
3828
|
+
} catch (error) {
|
|
3829
|
+
return {
|
|
3830
|
+
capability: "captcha_widget_hook_current_page",
|
|
3831
|
+
status: "unknown",
|
|
3832
|
+
reason: `Current page probe failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
3833
|
+
fix: "Ensure the attached page is reachable before using hook mode.",
|
|
3834
|
+
details: {
|
|
3835
|
+
tools: ["widget_challenge_solve"],
|
|
3836
|
+
pageAttached: true
|
|
3837
|
+
}
|
|
3838
|
+
};
|
|
3839
|
+
}
|
|
3840
|
+
}
|
|
3841
|
+
async function handleCaptchaSolverCapabilities(collector) {
|
|
3842
|
+
const configuredProvider = getConfiguredProvider();
|
|
3843
|
+
const widgetHookCapability = await getWidgetHookCapability(collector);
|
|
3844
|
+
return R.raw(capabilityReport("captcha_solver_capabilities", [
|
|
3845
|
+
{
|
|
3846
|
+
capability: "captcha_manual",
|
|
3847
|
+
status: "available",
|
|
3848
|
+
details: { tools: ["captcha_vision_solve", "widget_challenge_solve"] }
|
|
3849
|
+
},
|
|
3850
|
+
getTwoCaptchaCapability(),
|
|
3851
|
+
{
|
|
3852
|
+
capability: "captcha_external_service_anticaptcha",
|
|
3853
|
+
status: "unavailable",
|
|
3854
|
+
reason: "AntiCaptcha integration is not implemented in this build.",
|
|
3855
|
+
fix: "Use manual mode or the configured 2captcha-compatible service instead.",
|
|
3856
|
+
details: {
|
|
3857
|
+
tools: ["captcha_vision_solve", "widget_challenge_solve"],
|
|
3858
|
+
configuredProvider
|
|
3859
|
+
}
|
|
3860
|
+
},
|
|
3861
|
+
{
|
|
3862
|
+
capability: "captcha_external_service_capsolver",
|
|
3863
|
+
status: "unavailable",
|
|
3864
|
+
reason: "CapSolver integration is not implemented in this build.",
|
|
3865
|
+
fix: "Use manual mode or the configured 2captcha-compatible service instead.",
|
|
3866
|
+
details: {
|
|
3867
|
+
tools: ["captcha_vision_solve", "widget_challenge_solve"],
|
|
3868
|
+
configuredProvider
|
|
3869
|
+
}
|
|
3870
|
+
},
|
|
3871
|
+
widgetHookCapability
|
|
3872
|
+
], { configuredProvider }));
|
|
3873
|
+
}
|
|
3874
|
+
//#endregion
|
|
3591
3875
|
//#region src/server/domains/browser/handlers/camoufox-flow.ts
|
|
3592
3876
|
function extractCamoufoxConfig(args) {
|
|
3593
3877
|
const addons = argStringArray(args, "addons");
|
|
@@ -3718,7 +4002,7 @@ var BrowserToolHandlers = class {
|
|
|
3718
4002
|
tabWorkflow;
|
|
3719
4003
|
detailedData;
|
|
3720
4004
|
jsdomHandlers;
|
|
3721
|
-
|
|
4005
|
+
tabRegistry;
|
|
3722
4006
|
constructor(collector, pageController, scriptManager, consoleMonitor, eventBus) {
|
|
3723
4007
|
this.collector = collector;
|
|
3724
4008
|
this.pageController = pageController;
|
|
@@ -3773,11 +4057,11 @@ var BrowserToolHandlers = class {
|
|
|
3773
4057
|
this.tabWorkflow = modules.tabWorkflow;
|
|
3774
4058
|
this.detailedData = modules.detailedData;
|
|
3775
4059
|
this.jsdomHandlers = modules.jsdomHandlers;
|
|
3776
|
-
this.
|
|
4060
|
+
this.tabRegistry = modules.tabRegistry;
|
|
3777
4061
|
}
|
|
3778
4062
|
/** Get the shared TabRegistry for context enrichment. */
|
|
3779
4063
|
getTabRegistry() {
|
|
3780
|
-
return this.
|
|
4064
|
+
return this.tabRegistry;
|
|
3781
4065
|
}
|
|
3782
4066
|
/** Get or create camoufox page (Playwright Page). */
|
|
3783
4067
|
async getCamoufoxPage() {
|
|
@@ -4062,6 +4346,9 @@ var BrowserToolHandlers = class {
|
|
|
4062
4346
|
async handleWidgetChallengeSolve(args) {
|
|
4063
4347
|
return handleWidgetChallengeSolve(args, this.collector);
|
|
4064
4348
|
}
|
|
4349
|
+
async handleCaptchaSolverCapabilities() {
|
|
4350
|
+
return handleCaptchaSolverCapabilities(this.collector);
|
|
4351
|
+
}
|
|
4065
4352
|
async handleJsdomParse(args) {
|
|
4066
4353
|
return this.jsdomHandlers.handleJsdomParse(args);
|
|
4067
4354
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/server/domains/shared/capabilities.ts
|
|
2
|
+
function capabilityEntry(options) {
|
|
3
|
+
return {
|
|
4
|
+
capability: options.capability,
|
|
5
|
+
status: options.status,
|
|
6
|
+
available: options.status === "available",
|
|
7
|
+
...options.reason ? { reason: options.reason } : {},
|
|
8
|
+
...options.fix ? { fix: options.fix } : {},
|
|
9
|
+
...options.details
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function capabilityReport(tool, capabilities, extra = {}) {
|
|
13
|
+
return {
|
|
14
|
+
success: true,
|
|
15
|
+
tool,
|
|
16
|
+
capabilities: capabilities.map(capabilityEntry),
|
|
17
|
+
...extra
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function capabilityFailure(tool, capability, reason, fix, extra = {}) {
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
tool,
|
|
24
|
+
capability,
|
|
25
|
+
status: "unavailable",
|
|
26
|
+
available: false,
|
|
27
|
+
reason,
|
|
28
|
+
...fix ? { fix } : {},
|
|
29
|
+
...extra
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { capabilityReport as n, capabilityFailure as t };
|
|
@@ -475,10 +475,25 @@ const MCP_COMPACT_SCHEMA = bool("MCP_COMPACT_SCHEMA", true);
|
|
|
475
475
|
/** Hard ceiling applied to user-supplied sandbox exec timeouts. */
|
|
476
476
|
const SANDBOX_MAX_TIMEOUT_MS = int("SANDBOX_MAX_TIMEOUT_MS", 3e4);
|
|
477
477
|
int("NATIVE_BRIDGE_TIMEOUT_MS", 15e3);
|
|
478
|
-
|
|
479
|
-
const SOURCEMAP_EXT_TIMEOUT_MS = int("SOURCEMAP_EXT_TIMEOUT_MS", 15e3);
|
|
478
|
+
int("SOURCEMAP_EXT_TIMEOUT_MS", 15e3);
|
|
480
479
|
/** Timeout for the V8 bytecode extraction subprocess helper. */
|
|
481
480
|
const V8_BYTECODE_SUBPROC_TIMEOUT_MS = int("V8_BYTECODE_SUBPROC_TIMEOUT_MS", 6e4);
|
|
481
|
+
const SYSCALL_TRACE_DURATION_DEFAULT_SEC = int("SYSCALL_TRACE_DURATION_DEFAULT_SEC", 10);
|
|
482
|
+
const SYSCALL_TRACE_DURATION_MIN_SEC = int("SYSCALL_TRACE_DURATION_MIN_SEC", 1);
|
|
483
|
+
const SYSCALL_TRACE_DURATION_MAX_SEC = int("SYSCALL_TRACE_DURATION_MAX_SEC", 300);
|
|
484
|
+
const SOURCEMAP_V4_RAW_FIELD_MAX_LEN = int("SOURCEMAP_V4_RAW_FIELD_MAX_LEN", 200);
|
|
485
|
+
const SOURCEMAP_V4_RETRY_DELAY_MS = int("SOURCEMAP_V4_RETRY_DELAY_MS", 250);
|
|
486
|
+
const WASM_DEAD_CODE_MIN_MATCHES = int("WASM_DEAD_CODE_MIN_MATCHES", 10);
|
|
487
|
+
const WASM_BITWISE_OPS_THRESHOLD = int("WASM_BITWISE_OPS_THRESHOLD", 20);
|
|
488
|
+
const WASM_VM_DISPATCH_MIN_LOOPS = int("WASM_VM_DISPATCH_MIN_LOOPS", 3);
|
|
489
|
+
const PROTO_TLS_MIN_RECORD_LEN = int("PROTO_TLS_MIN_RECORD_LEN", 4);
|
|
490
|
+
const PROTO_TLS_CONFIDENCE = float("PROTO_TLS_CONFIDENCE", .95);
|
|
491
|
+
const PROTO_WS_CONFIDENCE = float("PROTO_WS_CONFIDENCE", .85);
|
|
492
|
+
const PROTO_HTTP_CONFIDENCE = float("PROTO_HTTP_CONFIDENCE", .95);
|
|
493
|
+
const PROTO_SSH_CONFIDENCE = float("PROTO_SSH_CONFIDENCE", .95);
|
|
494
|
+
const BOT_DETECT_LIMIT_DEFAULT = int("BOT_DETECT_LIMIT_DEFAULT", 50);
|
|
495
|
+
int("BOT_DETECT_LIMIT_MIN", 1);
|
|
496
|
+
int("BOT_DETECT_LIMIT_MAX", 500);
|
|
482
497
|
/** Default per-command processing timeout inside the webhook command queue. */
|
|
483
498
|
const WEBHOOK_PROCESS_TIMEOUT_MS = int("WEBHOOK_PROCESS_TIMEOUT_MS", 1e4);
|
|
484
499
|
int("ORCHESTRATOR_STEP_TIMEOUT_MS", 1e4);
|
|
@@ -516,4 +531,4 @@ const MEMORY_VMMAP_ENUM_TIMEOUT_MS = int("MEMORY_VMMAP_ENUM_TIMEOUT_MS", 15e3);
|
|
|
516
531
|
/** Timeout for PowerShell-based module listing subprocesses. */
|
|
517
532
|
const MEMORY_MODULES_TIMEOUT_MS = int("MEMORY_MODULES_TIMEOUT_MS", 3e4);
|
|
518
533
|
//#endregion
|
|
519
|
-
export {
|
|
534
|
+
export { GHIDRA_BRIDGE_ENDPOINT as $, SEARCH_VECTOR_DYNAMIC_WEIGHT as $n, PREDICTIVE_CONFIDENCE_THRESHOLD as $t, CODE_CAVE_MIN_SIZE as A, SEARCH_CACHE_VECTOR_WEIGHT_TOLERANCE as An, WIN_DEBUG_PORT_POLL_ATTEMPTS as Ar, MEMORY_MAX_WRITE_BYTES as At, DOM_QUERY_DEFAULT_LIMIT as B, SEARCH_RECENCY_WINDOW_MS as Bn, WORKFLOW_JS_BUNDLE_MAX_SIZE_BYTES as Br, MEMORY_VMMAP_ENUM_TIMEOUT_MS as Bt, CAPTCHA_MAX_RETRIES as C, SCAN_UNKNOWN_INITIAL_MAX_ADDRESSES as Cn, WASM_BITWISE_OPS_THRESHOLD as Cr, MCP_HTTP_KEEPALIVE_TIMEOUT_MS as Ct, CAPTCHA_RESULT_TIMEOUT_MS as D, SEARCH_AFFINITY_TOP_N as Dn, WASM_VM_DISPATCH_MIN_LOOPS as Dr, MEMORY_DUMP_TIMEOUT_MS as Dt, CAPTCHA_POLL_INTERVAL_MS as E, SEARCH_AFFINITY_BOOST_FACTOR as En, WASM_TOOL_TIMEOUT_MS as Er, MEMORY_AVAILABILITY_CACHE_TTL_MS as Et, DEBUG_PORT_CANDIDATES as F, SEARCH_PARAM_TOKEN_WEIGHT as Fn, WORKER_POOL_MIN_WORKERS as Fr, MEMORY_PROTECTION_QUERY_TIMEOUT_MS as Ft, EXTERNAL_TOOL_FORCE_KILL_GRACE_MS as G, SEARCH_TIER_PENALTY as Gn, NETWORK_HAR_BODY_CONCURRENCY as Gt, ENABLE_INJECTION_TOOLS as H, SEARCH_RRF_K as Hn, WS_PAYLOAD_PREVIEW_LIMIT as Hr, MEMORY_WRITE_TIMEOUT_MS as Ht, DEFAULT_DEBUG_PORT as I, SEARCH_PREFIX_MATCH_MULTIPLIER as In, WORKFLOW_BUNDLE_CACHE_MAX_BYTES as Ir, MEMORY_READ_TIMEOUT_MS as It, EXTERNAL_TOOL_PROBE_CACHE_TTL_MS as J, SEARCH_TIER_PENALTY_WORKFLOW as Jn, PAGE_NETWORK_IDLE_TIMEOUT_MS as Jt, EXTERNAL_TOOL_MAX_STDERR_BYTES as K, SEARCH_TIER_PENALTY_FULL as Kn, NETWORK_REPLAY_MAX_REDIRECTS as Kt, DETAILED_DATA_DEFAULT_TTL_MS as L, SEARCH_QUERY_CACHE_CAPACITY as Ln, WORKFLOW_BUNDLE_CACHE_TTL_MS as Lr, MEMORY_SCAN_MAX_BUFFER_BYTES as Lt, COMPOUND_LONG_WINDOW_MS as M, SEARCH_DOMAIN_HUB_BOOST_MULTIPLIER as Mn, WORKER_POOL_IDLE_TIMEOUT_MS as Mr, MEMORY_PROBE_CMD_TIMEOUT_MS as Mt, COORDINATION_GOTO_TIMEOUT_MS as N, SEARCH_DOMAIN_HUB_THRESHOLD as Nn, WORKER_POOL_JOB_TIMEOUT_MS as Nr, MEMORY_PROCESS_SIGNAL_TIMEOUT_MS as Nt, CAPTCHA_SOLVER_BASE_URL as O, SEARCH_BM25_B as On, WATCH_EVAL_TIMEOUT_MS as Or, MEMORY_INJECT_TIMEOUT_MS as Ot, DEBUGGER_WAIT_FOR_PAUSED_TIMEOUT_MS as P, SEARCH_EXACT_NAME_MATCH_MULTIPLIER as Pn, WORKER_POOL_MAX_WORKERS as Pr, MEMORY_PROTECTION_PWSH_TIMEOUT_MS as Pt, FRIDA_TIMEOUT_MS as Q, SEARCH_VECTOR_COSINE_WEIGHT as Qn, POINTER_CHAIN_SCAN_CHUNK_SIZE as Qt, DETAILED_DATA_MAX_TTL_MS as R, SEARCH_RECENCY_MAX_BOOST as Rn, WORKFLOW_JS_BUNDLE_FETCH_TIMEOUT_MS as Rr, MEMORY_SCAN_MAX_RESULTS as Rt, CAPTCHA_DEFAULT_TIMEOUT_MS as S, SCAN_SESSION_TTL_MS as Sn, V8_BYTECODE_SUBPROC_TIMEOUT_MS as Sr, MCP_HTTP_HEADERS_TIMEOUT_MS as St, CAPTCHA_MIN_TIMEOUT_MS as T, SEARCH_AFFINITY_BASE_WEIGHT as Tn, WASM_OPTIMIZE_TIMEOUT_MS as Tr, MEMORY_AUDIT_TRAIL_CAPACITY as Tt, EXTENSION_GIT_CHECKOUT_TIMEOUT_MS as U, SEARCH_RRF_RESCALE_FACTOR as Un, WS_PAYLOAD_SAMPLE_LIMIT as Ur, MOJO_MONITOR_TIMEOUT_MS as Ut, DOM_WAIT_ELEMENT_TIMEOUT_MS as V, SEARCH_RRF_BM25_BLEND as Vn, WRITE_HISTORY_MAX as Vr, MEMORY_VMMAP_TIMEOUT_MS as Vt, EXTENSION_GIT_CLONE_TIMEOUT_MS as W, SEARCH_SYNONYM_EXPANSION_LIMIT as Wn, NATIVE_ADMIN_CHECK_TIMEOUT_MS as Wt, EXTERNAL_TOOL_TIMEOUT_MS as X, SEARCH_TRIGRAM_WEIGHT as Xn, POINTER_CHAIN_MAX_OFFSET as Xt, EXTERNAL_TOOL_PROBE_TIMEOUT_MS as Y, SEARCH_TRIGRAM_THRESHOLD as Yn, POINTER_CHAIN_MAX_DEPTH as Yt, FREEZE_DEFAULT_INTERVAL_MS as Z, SEARCH_VECTOR_BM25_SKIP_THRESHOLD as Zn, POINTER_CHAIN_MAX_RESULTS as Zt, BREAKPOINT_HIT_TIMEOUT_MS as _, SCAN_DISPLAY_RESULTS_LIMIT as _n, TRANSFORM_CRYPTO_POOL_MAX_OLD_GEN_MB as _r, JSVMP_MAX_ITERATIONS as _t, ACTIVATION_TTL_MINUTES as a, PROTO_HTTP_CONFIDENCE as an, SEARCH_WORKFLOW_DOMAIN_BOOST_MULTIPLIER as ar, GRAPHQL_MAX_SCHEMA_CHARS as at, CACHE_LOW_HIT_RATE_THRESHOLD as b, SCAN_POINTER_MAX_RESULTS as bn, TRANSFORM_WORKER_TIMEOUT_MS as br, MCP_COMPACT_SCHEMA as bt, ADB_WEBVIEW_HTTP_TIMEOUT_MS as c, PROTO_TLS_MIN_RECORD_LEN as cn, SOURCEMAP_V4_RETRY_DELAY_MS as cr, HEAP_SPRAY_THRESHOLD as ct, ANALYSIS_MAX_SAFE_RESPONSE_BYTES as d, RUNTIME_ERROR_WINDOW_MS as dn, STRUCT_VTABLE_MAX_FUNCTIONS as dr, HTTP_RATE_LIMIT_MAX_IPS as dt, PREDICTIVE_DECAY_FACTOR as en, SEARCH_VECTOR_ENABLED as er, GHIDRA_TIMEOUT_MS as et, ANALYSIS_MAX_SUMMARY_FILES as f, SANDBOX_EXEC_TIMEOUT_MS as fn, SYSCALL_TRACE_DURATION_DEFAULT_SEC as fr, ICMP_DEFAULT_PACKET_SIZE as ft, BOT_DETECT_LIMIT_DEFAULT as g, SANDBOX_TERMINATE_GRACE_MS as gn, TRANSFORM_CRYPTO_POOL_IDLE_TIMEOUT_MS as gr, JSVMP_DEOBFUSCATE_TIMEOUT_MS as gt, AUTOPRUNE_MANUAL_INACTIVITY_MS as h, SANDBOX_STACK_SIZE_MB as hn, TOKEN_BUDGET_MAX_TOKENS as hr, IDA_BRIDGE_ENDPOINT as ht, ACTIVATION_EVENT_HISTORY_MAX as i, PROCESS_LIST_MAX_BUFFER_BYTES as in, SEARCH_VECTOR_MODEL_ID as ir, GRAPHQL_MAX_QUERY_CHARS as it, COMPOUND_EVENT_WINDOW_MS as j, SEARCH_COVERAGE_PRECISION_FACTOR as jn, WIN_DEBUG_PORT_POLL_INTERVAL_MS as jr, MEMORY_MODULES_TIMEOUT_MS as jt, CAPTCHA_SUBMIT_TIMEOUT_MS as k, SEARCH_BM25_K1 as kn, WEBHOOK_PROCESS_TIMEOUT_MS as kr, MEMORY_MAX_READ_BYTES as kt, ADB_WEBVIEW_WS_TIMEOUT_MS as l, PROTO_WS_CONFIDENCE as ln, STRUCT_ANALYZE_DEFAULT_SIZE as lr, HEAP_SUSPICIOUS_BLOCK_SIZE as lt, AUTOPRUNE_CHECK_INTERVAL_MS as m, SANDBOX_MEMORY_LIMIT_MB as mn, SYSCALL_TRACE_DURATION_MIN_SEC as mr, ICMP_TRACEROUTE_MAX_HOPS as mt, ACTIVATION_COMPOUND_EVAL_EVERY as n, PREDICTIVE_MAX_SECOND_ORDER_KEYS as nn, SEARCH_VECTOR_LEARN_TOP_N as nr, GRAPHQL_MAX_GRAPH_NODES as nt, ADB_DEFAULT_TIMEOUT_MS as o, PROTO_SSH_CONFIDENCE as on, SHUTDOWN_TIMEOUT_MS as or, HEAP_ENUMERATE_MAX_BLOCKS as ot, AUTOPRUNE_AUTO_INACTIVITY_MS as p, SANDBOX_MAX_TIMEOUT_MS as pn, SYSCALL_TRACE_DURATION_MAX_SEC as pr, ICMP_PROBE_TIMEOUT_MS as pt, EXTERNAL_TOOL_MAX_STDOUT_BYTES as q, SEARCH_TIER_PENALTY_SEARCH as qn, PAGE_FRAME_SELECTOR_TIMEOUT_MS as qt, ACTIVATION_COOLDOWN_MS as r, PROCESS_LAUNCH_WAIT_MS as rn, SEARCH_VECTOR_LEARN_UP as rr, GRAPHQL_MAX_PREVIEW_CHARS as rt, ADB_SHELL_TIMEOUT_MS as s, PROTO_TLS_CONFIDENCE as sn, SOURCEMAP_V4_RAW_FIELD_MAX_LEN as sr, HEAP_SPRAY_SIZE_TOLERANCE as st, ACTIVATION_BOOST_WINDOW_MS as t, PREDICTIVE_MAX_HISTORY as tn, SEARCH_VECTOR_LEARN_DOWN as tr, GRAPHQL_MAX_GRAPH_EDGES as tt, ANALYSIS_MAX_SAFE_COLLECTED_BYTES as u, RUNTIME_ERROR_THRESHOLD as un, STRUCT_RTTI_MAX_STRING_LEN as ur, HTTP_CLEANUP_INTERVAL_MS as ut, BREAKPOINT_TRACE_MAX_HITS as v, SCAN_GROUP_MAX_PATTERN_SIZE as vn, TRANSFORM_CRYPTO_POOL_MAX_WORKERS as vr, MACRO_BUILTIN_TIMEOUT_MS as vt, CAPTCHA_MAX_TIMEOUT_MS as w, SCRIPTS_MAX_CAP as wn, WASM_DEAD_CODE_MIN_MATCHES as wr, MCP_HTTP_REQUEST_TIMEOUT_MS as wt, CAPTCHA_DEFAULT_RETRIES as x, SCAN_SESSION_MAX_COUNT as xn, UNIDBG_TIMEOUT_MS as xr, MCP_HTTP_FORCE_CLOSE_TIMEOUT_MS as xt, CACHE_GLOBAL_MAX_SIZE_BYTES as y, SCAN_MAX_RESULTS_PER_SCAN as yn, TRANSFORM_CRYPTO_POOL_MAX_YOUNG_GEN_MB as yr, MACRO_DEFAULT_TIMEOUT_MS as yt, DETAILED_DATA_SMART_THRESHOLD_BYTES as z, SEARCH_RECENCY_TRACKER_MAX as zn, WORKFLOW_JS_BUNDLE_MAX_REDIRECTS as zr, MEMORY_SCAN_TIMEOUT_MS as zt };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "./definitions-
|
|
1
|
+
import { N as COORDINATION_GOTO_TIMEOUT_MS } from "./constants-CDZLOoVv.mjs";
|
|
2
|
+
import "./definitions-BtWSHJ3o.mjs";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
//#region src/server/domains/coordination/index.ts
|
|
5
5
|
/**
|