@jshookmcp/jshook 0.2.9 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -50
- package/README.zh.md +25 -48
- package/dist/AntiCheatDetector-CGVGNfy5.mjs +1 -0
- package/dist/CacheAdapters-CdAxBmVW.mjs +1 -0
- package/dist/CodeInjector-BlgyqTOk.mjs +1 -0
- package/dist/ConsoleMonitor-Dkqc0HNi.mjs +490 -0
- package/dist/DOMInspector-BYY_EJ0C.mjs +95 -0
- package/dist/DarwinAPI-DC4HGGLl.mjs +1 -0
- package/dist/DetailedDataManager-BniBJlVv.mjs +1 -0
- package/dist/EventBus-DgciURGg.mjs +1 -0
- package/dist/EvidenceGraphBridge-BIfgB7HP.mjs +1 -0
- package/dist/ExtensionManager-erMpqcLk.mjs +1 -0
- package/dist/FingerprintManager-N7BZqjxP.mjs +1 -0
- package/dist/HardwareBreakpoint-OcJqNFVc.mjs +1 -0
- package/dist/HeapAnalyzer-CqAxZzeS.mjs +1 -0
- package/dist/{HookGeneratorBuilders.core.generators.storage-CtcdK78Q.mjs → HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs} +66 -174
- package/dist/InstrumentationSession-DxXs0sCp.mjs +1 -0
- package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +1 -0
- package/dist/MemoryController-BaqstM5w.mjs +2 -0
- package/dist/MemoryScanSession-CaxAjZJf.mjs +1 -0
- package/dist/MemoryScanner-BLYnMJy6.mjs +1 -0
- package/dist/NativeMemoryManager.impl-CI554XbY.mjs +1 -0
- package/dist/NativeMemoryManager.utils-DM4NC3FE.mjs +1 -0
- package/dist/PEAnalyzer-DJyaJTQJ.mjs +1 -0
- package/dist/PageController-D9jVkH0i.mjs +1 -0
- package/dist/PointerChainEngine-5nF9eNlu.mjs +1 -0
- package/dist/PrerequisiteError-Bl3dK8XA.mjs +1 -0
- package/dist/ProcessRegistry-Hf12LlR9.mjs +1 -0
- package/dist/ResponseBuilder-B2lu4KEl.mjs +1 -0
- package/dist/ReverseEvidenceGraph-B931HeoW.mjs +2 -0
- package/dist/ScriptManager-fgqiALgj.mjs +7 -0
- package/dist/Speedhack-l6s8L2Qw.mjs +1 -0
- package/dist/StealthVerifier-Dhbj4B4P.mjs +1 -0
- package/dist/StructureAnalyzer-A-WamfYE.mjs +2 -0
- package/dist/ToolCatalog-D_IKl1Hu.mjs +1 -0
- package/dist/ToolError-DWU_z7gp.mjs +1 -0
- package/dist/ToolProbe-xsfALmN3.mjs +1 -0
- package/dist/ToolRegistry-B0Zs-phN.mjs +1 -0
- package/dist/ToolRouter.policy-CFHoN_Lw.mjs +4 -0
- package/dist/TraceRecorder-Dd8jLXpi.mjs +272 -0
- package/dist/VersionDetector-DMoUWyNm.mjs +9 -0
- package/dist/Win32API-Bhi5xFBe.mjs +1 -0
- package/dist/Win32Debug-CQteFL4F.mjs +1 -0
- package/dist/WorkflowEngine-CxEp2WXH.mjs +1 -0
- package/dist/analysis-BuR-NgX8.mjs +5 -0
- package/dist/{antidebug-CqDTB_uk.mjs → antidebug-BOTZH6-0.mjs} +8 -259
- package/dist/artifactRetention-NBdncOEW.mjs +1 -0
- package/dist/artifacts-B5xQuEa_.mjs +1 -0
- package/dist/authorization-schema-B40obG1A.mjs +1 -0
- package/dist/betterSqlite3-CGaxz4AX.mjs +1 -0
- package/dist/binary-instrument-Cf9qqLlM.mjs +7 -0
- package/dist/bind-helpers-BlAOQrFQ.mjs +1 -0
- package/dist/boringssl-inspector-BST5vtKx.mjs +2 -0
- package/dist/browser-C4Le3xqA.mjs +11 -0
- package/dist/capabilities-DbYCv-HF.mjs +1 -0
- package/dist/chunk-C_pMuVsO.mjs +1 -0
- package/dist/collector-CKO8RPK8.mjs +1 -0
- package/dist/concurrency-CcK46d0h.mjs +1 -0
- package/dist/constants-Cp6hBrrx.mjs +1 -0
- package/dist/coordination-BbijHEHH.mjs +1 -0
- package/dist/debugger-CRJq_krh.mjs +1 -0
- package/dist/definitions-BGobEDQa.mjs +1 -0
- package/dist/definitions-BGwNSkVm.mjs +1 -0
- package/dist/definitions-BbxOUiP-.mjs +1 -0
- package/dist/definitions-CCP9gphV.mjs +1 -0
- package/dist/definitions-CIO9O-Sw.mjs +1 -0
- package/dist/definitions-CYFbewnd.mjs +1 -0
- package/dist/definitions-CdWEuIkI.mjs +1 -0
- package/dist/definitions-CoQFbggH.mjs +1 -0
- package/dist/definitions-CuJRsJ6N.mjs +1 -0
- package/dist/definitions-DI9YXsJk.mjs +1 -0
- package/dist/definitions-DJklW2sS.mjs +1 -0
- package/dist/definitions-DZ8uKusP.mjs +1 -0
- package/dist/definitions-Dds_zrWx.mjs +1 -0
- package/dist/definitions-Dgrg7f3D.mjs +1 -0
- package/dist/definitions-DtE0XLrT.mjs +1 -0
- package/dist/definitions-LaYTuwQd.mjs +26 -0
- package/dist/definitions-NoVp_9Pm.mjs +1 -0
- package/dist/definitions-OvGsfxdt.mjs +1 -0
- package/dist/definitions-jXPaVy4P.mjs +1 -0
- package/dist/encoding-DGcr6Aj_.mjs +2 -0
- package/dist/ensure-browser-core-Buls24LQ.mjs +1 -0
- package/dist/evidence-graph-bridge-B0yhGPcs.mjs +1 -0
- package/dist/factory-Cx_1LorX.mjs +1 -0
- package/dist/flat-target-session-CO5g78k3.mjs +1 -0
- package/dist/formatAddress-C7j2fDlM.mjs +1 -0
- package/dist/graphql-HLf3MS8H.mjs +62 -0
- package/dist/handlers-BLMa4X7l.mjs +54 -0
- package/dist/handlers-BP12ZsWc.mjs +4 -0
- package/dist/handlers-BZoPla6E.mjs +1 -0
- package/dist/handlers-BggKiVx9.mjs +2 -0
- package/dist/handlers-D3iev8g1.mjs +1 -0
- package/dist/handlers-D49r1-1P.mjs +1 -0
- package/dist/handlers-DCE45Ww8.mjs +2 -0
- package/dist/handlers-DW5AbYs5.mjs +5 -0
- package/dist/handlers-De5u62Ga2.mjs +1 -0
- package/dist/handlers-DmQzIc44.mjs +31 -0
- package/dist/handlers-DnJRGp7t.mjs +302 -0
- package/dist/handlers-Dv_runVv.mjs +2 -0
- package/dist/handlers-S9Ws0IGy.mjs +2 -0
- package/dist/{handlers-Bl8zkwz1.mjs → handlers-pVNpaw4A.mjs} +144 -841
- package/dist/handlers.impl-CD2_kOcC.mjs +1 -0
- package/dist/hooks-DDKppogd.mjs +600 -0
- package/dist/index.mjs +12 -5225
- package/dist/logger-sBC6IdRT.mjs +1 -0
- package/dist/maintenance-CutEO84j.mjs +1 -0
- package/dist/manifest-BFGxlDRh.mjs +123 -0
- package/dist/manifest-BPuE6oH2.mjs +1 -0
- package/dist/manifest-BXry5N09.mjs +1 -0
- package/dist/manifest-BeP_zJGb2.mjs +1 -0
- package/dist/manifest-C0g67k6U.mjs +1 -0
- package/dist/manifest-C1nZkTkO.mjs +1 -0
- package/dist/manifest-C7qV1z7F.mjs +1 -0
- package/dist/manifest-CDeUZGUZ.mjs +1 -0
- package/dist/manifest-CDiCtaQT.mjs +1 -0
- package/dist/manifest-CFn0359q2.mjs +1 -0
- package/dist/manifest-CGq4NpqH2.mjs +1 -0
- package/dist/manifest-CJMGt7Qy.mjs +1 -0
- package/dist/manifest-CRIJq4Hs.mjs +1 -0
- package/dist/manifest-C_hEIjSx.mjs +1 -0
- package/dist/manifest-CeQmtQOY.mjs +1 -0
- package/dist/manifest-Cq0j7GZt.mjs +1 -0
- package/dist/manifest-CtPmHAdn.mjs +1 -0
- package/dist/manifest-Cx2IVMUY.mjs +1 -0
- package/dist/manifest-D16xPXro.mjs +1 -0
- package/dist/manifest-D44TaRJU.mjs +1 -0
- package/dist/manifest-D610kxZr.mjs +2 -0
- package/dist/manifest-DC-SMF6b.mjs +1 -0
- package/dist/manifest-DD3rtxvV.mjs +1 -0
- package/dist/manifest-DKUorv5M.mjs +1 -0
- package/dist/manifest-DMJlcsTR.mjs +1 -0
- package/dist/manifest-DWUUWBz0.mjs +1 -0
- package/dist/manifest-De-6Wf2R.mjs +1 -0
- package/dist/manifest-Dgh0uDW-.mjs +1 -0
- package/dist/manifest-Dm0o3i2U.mjs +1 -0
- package/dist/manifest-DsVh7Y4U.mjs +1 -0
- package/dist/manifest-DtEFSRaq.mjs +1 -0
- package/dist/manifest-H-EpAyZQ.mjs +1 -0
- package/dist/manifest-ais9Afrw.mjs +1 -0
- package/dist/manifest-tmb54wmA.mjs +1 -0
- package/dist/manifest-yu2xiQqe.mjs +1 -0
- package/dist/manifest-zrbrpKCC.mjs +1 -0
- package/dist/matchesWildcardPattern-BGqLSmEs.mjs +1 -0
- package/dist/modules-p-PUNv9r.mjs +332 -0
- package/dist/mojo-ipc-VGlv3Qyp.mjs +9 -0
- package/dist/network-BjZ1Y-GB.mjs +7 -0
- package/dist/outputPaths-BonGThuc.mjs +2 -0
- package/dist/parse-args-Cuk7-xUt.mjs +1 -0
- package/dist/platform-C446Lf97.mjs +93 -0
- package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +1 -0
- package/dist/process-C9f2A5zk.mjs +962 -0
- package/dist/proxy-CvRepxgV.mjs +1 -0
- package/dist/registry-DUHIPE-v.mjs +1 -0
- package/dist/response-C7rKQst4.mjs +1 -0
- package/dist/search-defaults-D2bY-rzH.mjs +1 -0
- package/dist/server/plugin-api.mjs +1 -293
- package/dist/shared-state-board-Cyg-xh_k.mjs +1 -0
- package/dist/sourcemap-D6Q1UuAp.mjs +1 -0
- package/dist/ssrf-policy-T96MR3r6.mjs +1 -0
- package/dist/streaming-CTX58tbb.mjs +1 -0
- package/dist/tool-builder-CI9914Tf.mjs +1 -0
- package/dist/transform-Cv9P2vVD.mjs +103 -0
- package/dist/types-CuyefmGT.mjs +1 -0
- package/dist/types-DtThH00r.mjs +1 -0
- package/dist/wasm-DaJa8J0V.mjs +174 -0
- package/dist/webcrack-CsLLJIs9.mjs +46 -0
- package/dist/workflow-CYIXtrWD.mjs +101 -0
- package/package.json +12 -7
- package/dist/AntiCheatDetector-BNk-EoBt.mjs +0 -244
- package/dist/CacheAdapters-CDe5WPSV.mjs +0 -80
- package/dist/CodeInjector-Cq8q01kp.mjs +0 -150
- package/dist/ConsoleMonitor-CPVQW1Y-.mjs +0 -2201
- package/dist/DarwinAPI-BNPxu0RH.mjs +0 -363
- package/dist/DetailedDataManager-BQQcxh64.mjs +0 -217
- package/dist/EventBus-DgPmwpeu.mjs +0 -141
- package/dist/EvidenceGraphBridge-SFesNera.mjs +0 -153
- package/dist/ExtensionManager-CWYgw0YW.mjs +0 -714
- package/dist/FingerprintManager-gzWtkKuf.mjs +0 -96
- package/dist/HardwareBreakpoint-B9gZCdFP.mjs +0 -239
- package/dist/HeapAnalyzer-BLDH0dCv.mjs +0 -284
- package/dist/InstrumentationSession-CvPC7Jwy.mjs +0 -244
- package/dist/MemoryController-CbVdCIJF.mjs +0 -167
- package/dist/MemoryScanSession-BsDZbLYm.mjs +0 -278
- package/dist/MemoryScanner-Bcpml6II.mjs +0 -425
- package/dist/NativeMemoryManager.impl-dZtA1ZGn.mjs +0 -482
- package/dist/NativeMemoryManager.utils-B-FjA2mJ.mjs +0 -165
- package/dist/PEAnalyzer-D1lzJ_VG.mjs +0 -385
- package/dist/PageController-Bqm2kZ_X.mjs +0 -417
- package/dist/PointerChainEngine-BOhyVsjx.mjs +0 -322
- package/dist/PrerequisiteError-Dl33Svkz.mjs +0 -20
- package/dist/ResponseBuilder-D3iFYx2N.mjs +0 -143
- package/dist/ReverseEvidenceGraph-Dlsk94LC.mjs +0 -269
- package/dist/ScriptManager-aHHq0X7U.mjs +0 -3000
- package/dist/Speedhack-CqdIFlQl.mjs +0 -156
- package/dist/StealthVerifier-Bo4T3bz8.mjs +0 -135
- package/dist/StructureAnalyzer-DhFaPvRO.mjs +0 -426
- package/dist/ToolCatalog-C0JGZoOm.mjs +0 -582
- package/dist/ToolError-jh9whhMd.mjs +0 -15
- package/dist/ToolProbe-oC7aPrkv.mjs +0 -45
- package/dist/ToolRegistry-BjaF4oNz.mjs +0 -131
- package/dist/ToolRouter.policy-BWV67ZK-.mjs +0 -304
- package/dist/TraceRecorder-DgxyVbdQ.mjs +0 -519
- package/dist/VersionDetector-CwVLVdDM.mjs +0 -104
- package/dist/Win32API-CePkipZY.mjs +0 -340
- package/dist/Win32Debug-BvKs-gxc.mjs +0 -274
- package/dist/WorkflowEngine-CuvkZtWu.mjs +0 -598
- package/dist/analysis-CL9uACt9.mjs +0 -463
- package/dist/artifactRetention-CFEprwPw.mjs +0 -591
- package/dist/artifacts-Bk2-_uPq.mjs +0 -59
- package/dist/betterSqlite3-0pqusHHH.mjs +0 -74
- package/dist/binary-instrument-CXfpx6fT.mjs +0 -979
- package/dist/bind-helpers-xFfRF-qm.mjs +0 -22
- package/dist/boringssl-inspector-BH2D3VKc.mjs +0 -180
- package/dist/browser-BpOr5PEx.mjs +0 -4082
- package/dist/chunk-CjcI7cDX.mjs +0 -15
- package/dist/concurrency-Bt0yv1kJ.mjs +0 -41
- package/dist/constants-B0OANIBL.mjs +0 -519
- package/dist/coordination-qUbyF8KU.mjs +0 -259
- package/dist/debugger-gnKxRSN0.mjs +0 -1271
- package/dist/definitions-6M-eejaT.mjs +0 -53
- package/dist/definitions-B18eyf0B.mjs +0 -18
- package/dist/definitions-B3QdlrHv.mjs +0 -34
- package/dist/definitions-B4rAvHNZ.mjs +0 -63
- package/dist/definitions-BB_4jnmy.mjs +0 -37
- package/dist/definitions-BMfYXoNC.mjs +0 -43
- package/dist/definitions-Beid2EB3.mjs +0 -27
- package/dist/definitions-C1UvM5Iy.mjs +0 -126
- 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-Cke7zEb8.mjs +0 -94
- package/dist/definitions-ClJLzsJQ.mjs +0 -25
- package/dist/definitions-Cq-zroAU.mjs +0 -28
- package/dist/definitions-Cy3Sl6gV.mjs +0 -34
- package/dist/definitions-D3VsGcvz.mjs +0 -47
- package/dist/definitions-DVGfrn7y.mjs +0 -96
- package/dist/definitions-LKpC3-nL.mjs +0 -9
- package/dist/definitions-bAhHQJq9.mjs +0 -359
- package/dist/encoding-Bvz5jLRv.mjs +0 -1065
- package/dist/evidence-graph-bridge-C_fv9PuC.mjs +0 -135
- package/dist/factory-DxlGh9Xf.mjs +0 -575
- package/dist/formatAddress-DVkj9kpI.mjs +0 -17
- package/dist/graphql-DYWzJ29s.mjs +0 -1026
- package/dist/handlers-9sAbfIg-.mjs +0 -2552
- package/dist/handlers-C67ktuRN.mjs +0 -710
- package/dist/handlers-C87g8oCe.mjs +0 -276
- package/dist/handlers-CTsDAO6p.mjs +0 -681
- package/dist/handlers-Cgyg6c0U.mjs +0 -645
- package/dist/handlers-D6j6yka7.mjs +0 -2124
- package/dist/handlers-DdFzXLvF.mjs +0 -446
- package/dist/handlers-DeLOCd5m.mjs +0 -799
- package/dist/handlers-DlCJN4Td.mjs +0 -757
- package/dist/handlers-DxGIq15_2.mjs +0 -917
- package/dist/handlers-U6L4xhuF.mjs +0 -585
- package/dist/handlers-tB9Mp9ZK.mjs +0 -84
- package/dist/handlers-tiy7EIBp.mjs +0 -572
- package/dist/handlers.impl-DS0d9fUw.mjs +0 -761
- package/dist/hooks-CzCWByww.mjs +0 -898
- package/dist/logger-Dh_xb7_2.mjs +0 -93
- package/dist/maintenance-P7ePRXQC.mjs +0 -830
- package/dist/manifest-2ToTpjv8.mjs +0 -106
- package/dist/manifest-3g71z6Bg.mjs +0 -79
- package/dist/manifest-82baTv4U.mjs +0 -45
- package/dist/manifest-B3QVVeBS.mjs +0 -82
- package/dist/manifest-BB2J8IMJ.mjs +0 -149
- package/dist/manifest-BKbgbSiY.mjs +0 -60
- package/dist/manifest-Bcf-TJzH.mjs +0 -848
- package/dist/manifest-BmtZzQiQ2.mjs +0 -45
- package/dist/manifest-Bnd7kqEY.mjs +0 -55
- package/dist/manifest-BqQX6OQC2.mjs +0 -65
- package/dist/manifest-BqrQ4Tpj.mjs +0 -81
- package/dist/manifest-Br4RPFt5.mjs +0 -370
- package/dist/manifest-C5qDjysN.mjs +0 -107
- package/dist/manifest-C9RT5nk32.mjs +0 -34
- package/dist/manifest-CAhOuvSl.mjs +0 -204
- package/dist/manifest-CBYWCUBJ.mjs +0 -51
- package/dist/manifest-CFADCRa1.mjs +0 -37
- package/dist/manifest-CQVhavRF.mjs +0 -114
- package/dist/manifest-CT7zZBV1.mjs +0 -48
- package/dist/manifest-CV12bcrF.mjs +0 -121
- package/dist/manifest-CXsRWjjI.mjs +0 -224
- package/dist/manifest-CZLUCfG02.mjs +0 -95
- package/dist/manifest-D6phHKFd.mjs +0 -131
- package/dist/manifest-DCyjf4n2.mjs +0 -294
- package/dist/manifest-DHsnKgP6.mjs +0 -60
- package/dist/manifest-Df_dliIe.mjs +0 -55
- package/dist/manifest-Dh8WBmEW.mjs +0 -129
- package/dist/manifest-DhKRAT8_.mjs +0 -92
- package/dist/manifest-DlpTj4ic2.mjs +0 -193
- package/dist/manifest-DrbmZcFl2.mjs +0 -253
- package/dist/manifest-DuwHjUa5.mjs +0 -70
- package/dist/manifest-DzwvxPJX.mjs +0 -38
- package/dist/manifest-NXctwWQq.mjs +0 -68
- package/dist/manifest-Sc_0JQ13.mjs +0 -418
- package/dist/manifest-gZ4s_UtG.mjs +0 -96
- package/dist/manifest-qSleDqdO.mjs +0 -1023
- package/dist/modules-C184v-S9.mjs +0 -11365
- package/dist/mojo-ipc-B_H61Afw.mjs +0 -525
- package/dist/network-671Cw6hV.mjs +0 -3346
- package/dist/outputPaths-B1uGmrWZ.mjs +0 -1145
- package/dist/parse-args-BlRjqlkL.mjs +0 -39
- package/dist/platform-WmNn8Sxb.mjs +0 -2070
- package/dist/process-QcbIy5Zq.mjs +0 -1401
- package/dist/proxy-DqNs0bAd.mjs +0 -170
- package/dist/registry-D-6e18lB.mjs +0 -34
- package/dist/response-BQVP-xUn.mjs +0 -28
- package/dist/shared-state-board-DV-dpHFJ.mjs +0 -586
- package/dist/sourcemap-Dq8ez8vS.mjs +0 -650
- package/dist/ssrf-policy-ZaUfvhq7.mjs +0 -166
- package/dist/streaming-BUQ0VJsg.mjs +0 -725
- package/dist/tool-builder-DCbIC5Eo.mjs +0 -186
- package/dist/transform-CiYJfNX0.mjs +0 -1007
- package/dist/types-Bx92KJfT.mjs +0 -4
- package/dist/types-CPhOReNX.mjs +0 -37
- package/dist/wasm-DQTnHDs4.mjs +0 -531
- package/dist/workflow-f3xJOcjx.mjs +0 -725
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
import { Jt as POINTER_CHAIN_MAX_DEPTH, Xt as POINTER_CHAIN_MAX_RESULTS, Yt as POINTER_CHAIN_MAX_OFFSET, Zt as POINTER_CHAIN_SCAN_CHUNK_SIZE } from "./constants-B0OANIBL.mjs";
|
|
2
|
-
import { t as createPlatformProvider } from "./factory-DxlGh9Xf.mjs";
|
|
3
|
-
import { t as nativeMemoryManager } from "./NativeMemoryManager.impl-dZtA1ZGn.mjs";
|
|
4
|
-
import { n as parseAddress, t as formatAddress } from "./formatAddress-DVkj9kpI.mjs";
|
|
5
|
-
import { randomUUID } from "node:crypto";
|
|
6
|
-
//#region src/native/PointerChainEngine.ts
|
|
7
|
-
/**
|
|
8
|
-
* Pointer Chain Engine — multi-level BFS pointer scanning.
|
|
9
|
-
*
|
|
10
|
-
* Finds stable pointer chains: [base_module+offset] → [+off1] → [+off2] → ... → target
|
|
11
|
-
* Supports chain validation, resolution, and persistence.
|
|
12
|
-
*
|
|
13
|
-
* Uses PlatformMemoryAPI for cross-platform memory operations.
|
|
14
|
-
*
|
|
15
|
-
* @module PointerChainEngine
|
|
16
|
-
*/
|
|
17
|
-
var PointerChainEngine = class {
|
|
18
|
-
_provider = null;
|
|
19
|
-
get provider() {
|
|
20
|
-
if (!this._provider) this._provider = createPlatformProvider();
|
|
21
|
-
return this._provider;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Multi-level BFS pointer scan.
|
|
25
|
-
*
|
|
26
|
-
* Algorithm:
|
|
27
|
-
* Level 0: Find pointers P where *P ∈ [target - maxOffset, target + maxOffset]
|
|
28
|
-
* Level 1: Find pointers Q where *Q ∈ [P - maxOffset, P + maxOffset] for each P
|
|
29
|
-
* ... repeat up to maxDepth
|
|
30
|
-
* Construct chains backward from target to base.
|
|
31
|
-
*/
|
|
32
|
-
async scan(pid, targetAddress, options) {
|
|
33
|
-
const start = performance.now();
|
|
34
|
-
const maxDepth = Math.min(options?.maxDepth ?? 4, POINTER_CHAIN_MAX_DEPTH);
|
|
35
|
-
const maxOffset = options?.maxOffset ?? POINTER_CHAIN_MAX_OFFSET;
|
|
36
|
-
const maxResults = options?.maxResults ?? POINTER_CHAIN_MAX_RESULTS;
|
|
37
|
-
const alignment = options?.alignment ?? 8;
|
|
38
|
-
const staticOnly = options?.staticOnly ?? false;
|
|
39
|
-
const targetAddr = parseAddress(targetAddress);
|
|
40
|
-
const handle = this.provider.openProcess(pid, false);
|
|
41
|
-
try {
|
|
42
|
-
const modules = await this.getModuleMap(pid);
|
|
43
|
-
const levelResults = [];
|
|
44
|
-
let currentTargets = new Set([targetAddr]);
|
|
45
|
-
for (let depth = 0; depth < maxDepth; depth++) {
|
|
46
|
-
if (currentTargets.size === 0) break;
|
|
47
|
-
const matches = this.scanLevel(handle, currentTargets, maxOffset, alignment, options?.modules ? { modules: options.modules } : void 0);
|
|
48
|
-
if (matches.length === 0) break;
|
|
49
|
-
levelResults.push(matches);
|
|
50
|
-
currentTargets = /* @__PURE__ */ new Set();
|
|
51
|
-
for (const m of matches) {
|
|
52
|
-
currentTargets.add(m.pointerAddress);
|
|
53
|
-
if (currentTargets.size > 5e4) break;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const chains = this.buildChains(levelResults, targetAddr, modules, maxResults, staticOnly);
|
|
57
|
-
const elapsed = `${(performance.now() - start).toFixed(1)}ms`;
|
|
58
|
-
return {
|
|
59
|
-
pid,
|
|
60
|
-
targetAddress: formatAddress(targetAddr),
|
|
61
|
-
chains,
|
|
62
|
-
totalFound: chains.length,
|
|
63
|
-
maxDepth,
|
|
64
|
-
elapsed
|
|
65
|
-
};
|
|
66
|
-
} finally {
|
|
67
|
-
this.provider.closeProcess(handle);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Validate a pointer chain by re-dereferencing each link.
|
|
72
|
-
*/
|
|
73
|
-
async validateChain(pid, chain) {
|
|
74
|
-
const handle = this.provider.openProcess(pid, false);
|
|
75
|
-
try {
|
|
76
|
-
let currentAddr = parseAddress(chain.baseAddress);
|
|
77
|
-
for (let i = 0; i < chain.links.length; i++) {
|
|
78
|
-
const link = chain.links[i];
|
|
79
|
-
let ptrValue;
|
|
80
|
-
try {
|
|
81
|
-
ptrValue = this.provider.readMemory(handle, currentAddr, 8).data.readBigUInt64LE(0);
|
|
82
|
-
} catch {
|
|
83
|
-
return {
|
|
84
|
-
chainId: chain.id,
|
|
85
|
-
isValid: false,
|
|
86
|
-
resolvedAddress: null,
|
|
87
|
-
expectedAddress: chain.targetAddress,
|
|
88
|
-
brokenAt: i
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
currentAddr = ptrValue + BigInt(link.offset);
|
|
92
|
-
}
|
|
93
|
-
const resolvedStr = formatAddress(currentAddr);
|
|
94
|
-
const expectedAddr = parseAddress(chain.targetAddress);
|
|
95
|
-
const isValid = currentAddr === expectedAddr;
|
|
96
|
-
return {
|
|
97
|
-
chainId: chain.id,
|
|
98
|
-
isValid,
|
|
99
|
-
resolvedAddress: resolvedStr,
|
|
100
|
-
expectedAddress: chain.targetAddress,
|
|
101
|
-
brokenAt: isValid ? void 0 : chain.links.length - 1
|
|
102
|
-
};
|
|
103
|
-
} finally {
|
|
104
|
-
this.provider.closeProcess(handle);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Validate multiple chains in batch.
|
|
109
|
-
*/
|
|
110
|
-
async validateChains(pid, chains) {
|
|
111
|
-
const results = [];
|
|
112
|
-
for (const chain of chains) results.push(await this.validateChain(pid, chain));
|
|
113
|
-
return results;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Resolve a pointer chain to its current target address.
|
|
117
|
-
*/
|
|
118
|
-
async resolveChain(pid, chain) {
|
|
119
|
-
const handle = this.provider.openProcess(pid, false);
|
|
120
|
-
try {
|
|
121
|
-
let currentAddr = parseAddress(chain.baseAddress);
|
|
122
|
-
for (const link of chain.links) {
|
|
123
|
-
let ptrValue;
|
|
124
|
-
try {
|
|
125
|
-
ptrValue = this.provider.readMemory(handle, currentAddr, 8).data.readBigUInt64LE(0);
|
|
126
|
-
} catch {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
currentAddr = ptrValue + BigInt(link.offset);
|
|
130
|
-
}
|
|
131
|
-
return formatAddress(currentAddr);
|
|
132
|
-
} finally {
|
|
133
|
-
this.provider.closeProcess(handle);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Export chains to JSON for persistence.
|
|
138
|
-
*/
|
|
139
|
-
exportChains(chains) {
|
|
140
|
-
return JSON.stringify(chains, null, 2);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Import chains from JSON.
|
|
144
|
-
*/
|
|
145
|
-
importChains(data) {
|
|
146
|
-
const parsed = JSON.parse(data);
|
|
147
|
-
if (!Array.isArray(parsed)) throw new Error("Invalid chain data: expected array");
|
|
148
|
-
return parsed;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Get module info map for resolving module-relative addresses.
|
|
152
|
-
*/
|
|
153
|
-
async getModuleMap(pid) {
|
|
154
|
-
const modules = /* @__PURE__ */ new Map();
|
|
155
|
-
try {
|
|
156
|
-
const result = await nativeMemoryManager.enumerateModules(pid);
|
|
157
|
-
if (result.success && result.modules) for (const mod of result.modules) {
|
|
158
|
-
const base = parseAddress(mod.baseAddress);
|
|
159
|
-
modules.set(mod.name.toLowerCase(), {
|
|
160
|
-
name: mod.name,
|
|
161
|
-
base,
|
|
162
|
-
size: mod.size
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
} catch {}
|
|
166
|
-
return modules;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Resolve an address to module+offset notation.
|
|
170
|
-
*/
|
|
171
|
-
resolveToModule(address, moduleMap) {
|
|
172
|
-
for (const entry of moduleMap.values()) if (address >= entry.base && address < entry.base + BigInt(entry.size)) return {
|
|
173
|
-
module: entry.name,
|
|
174
|
-
offset: Number(address - entry.base)
|
|
175
|
-
};
|
|
176
|
-
return null;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* BFS scan for one level: find all addresses whose pointer-sized value
|
|
180
|
-
* points within ±maxOffset of any target address.
|
|
181
|
-
*/
|
|
182
|
-
scanLevel(handle, targetAddresses, maxOffset, alignment, _filter) {
|
|
183
|
-
const matches = [];
|
|
184
|
-
const chunkSize = POINTER_CHAIN_SCAN_CHUNK_SIZE;
|
|
185
|
-
const targets = Array.from(targetAddresses).toSorted((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
186
|
-
if (targets.length === 0) return matches;
|
|
187
|
-
const maxOffsetBig = BigInt(maxOffset);
|
|
188
|
-
const globalMin = targets[0] - maxOffsetBig;
|
|
189
|
-
const globalMax = targets[targets.length - 1] + maxOffsetBig;
|
|
190
|
-
let address = 0n;
|
|
191
|
-
const maxAddress = BigInt("0x7FFFFFFF0000");
|
|
192
|
-
while (address < maxAddress) {
|
|
193
|
-
const regionInfo = this.provider.queryRegion(handle, address);
|
|
194
|
-
if (!regionInfo) break;
|
|
195
|
-
const regionSize = regionInfo.size;
|
|
196
|
-
if (regionInfo.isReadable && regionSize > 0 && regionSize <= Number.MAX_SAFE_INTEGER) {
|
|
197
|
-
const regionBase = regionInfo.baseAddress;
|
|
198
|
-
for (let offset = 0; offset < regionSize && matches.length < 1e5; offset += chunkSize) {
|
|
199
|
-
const readSize = Math.min(chunkSize, regionSize - offset);
|
|
200
|
-
const chunkAddr = regionBase + BigInt(offset);
|
|
201
|
-
let chunk;
|
|
202
|
-
try {
|
|
203
|
-
chunk = this.provider.readMemory(handle, chunkAddr, readSize).data;
|
|
204
|
-
} catch {
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
for (let i = 0; i <= chunk.length - 8; i += alignment) {
|
|
208
|
-
const ptrValue = chunk.readBigUInt64LE(i);
|
|
209
|
-
if (ptrValue < globalMin || ptrValue > globalMax) continue;
|
|
210
|
-
const searchMin = ptrValue - maxOffsetBig;
|
|
211
|
-
const searchMax = ptrValue + maxOffsetBig;
|
|
212
|
-
let lo = 0;
|
|
213
|
-
let hi = targets.length;
|
|
214
|
-
while (lo < hi) {
|
|
215
|
-
const mid = lo + hi >>> 1;
|
|
216
|
-
if (targets[mid] < searchMin) lo = mid + 1;
|
|
217
|
-
else hi = mid;
|
|
218
|
-
}
|
|
219
|
-
for (let t = lo; t < targets.length && targets[t] <= searchMax; t++) {
|
|
220
|
-
const target = targets[t];
|
|
221
|
-
if ((ptrValue > target ? Number(ptrValue - target) : Number(target - ptrValue)) <= maxOffset) {
|
|
222
|
-
const pointerAddr = chunkAddr + BigInt(i);
|
|
223
|
-
const matchOffset = Number(target - ptrValue);
|
|
224
|
-
matches.push({
|
|
225
|
-
pointerAddress: pointerAddr,
|
|
226
|
-
pointsTo: ptrValue,
|
|
227
|
-
offset: matchOffset
|
|
228
|
-
});
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
address = regionInfo.baseAddress + BigInt(regionInfo.size);
|
|
236
|
-
}
|
|
237
|
-
return matches;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Build pointer chains from level results (backward: deepest level = base).
|
|
241
|
-
*/
|
|
242
|
-
buildChains(levelResults, targetAddr, modules, maxResults, staticOnly) {
|
|
243
|
-
if (levelResults.length === 0) return [];
|
|
244
|
-
const chains = [];
|
|
245
|
-
const targetAddrStr = formatAddress(targetAddr);
|
|
246
|
-
for (let depth = 0; depth < levelResults.length && chains.length < maxResults; depth++) {
|
|
247
|
-
const level = levelResults[depth];
|
|
248
|
-
if (depth === 0) for (const match of level) {
|
|
249
|
-
if (chains.length >= maxResults) break;
|
|
250
|
-
const baseAddrStr = formatAddress(match.pointerAddress);
|
|
251
|
-
const modInfo = this.resolveToModule(match.pointerAddress, modules);
|
|
252
|
-
const isStatic = modInfo !== null;
|
|
253
|
-
if (staticOnly && !isStatic) continue;
|
|
254
|
-
const link = {
|
|
255
|
-
address: baseAddrStr,
|
|
256
|
-
module: modInfo?.module,
|
|
257
|
-
moduleOffset: modInfo?.offset,
|
|
258
|
-
offset: match.offset
|
|
259
|
-
};
|
|
260
|
-
chains.push({
|
|
261
|
-
id: randomUUID(),
|
|
262
|
-
links: [link],
|
|
263
|
-
targetAddress: targetAddrStr,
|
|
264
|
-
baseAddress: baseAddrStr,
|
|
265
|
-
isStatic,
|
|
266
|
-
depth: 1,
|
|
267
|
-
lastValidated: Date.now(),
|
|
268
|
-
isValid: true
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
const prevLevel = levelResults[depth - 1];
|
|
273
|
-
const prevByAddr = /* @__PURE__ */ new Map();
|
|
274
|
-
for (const pm of prevLevel) prevByAddr.set(pm.pointerAddress, pm);
|
|
275
|
-
const maxOff = BigInt(POINTER_CHAIN_MAX_OFFSET);
|
|
276
|
-
for (const match of level) {
|
|
277
|
-
if (chains.length >= maxResults) break;
|
|
278
|
-
let prevMatch;
|
|
279
|
-
prevMatch = prevByAddr.get(match.pointsTo);
|
|
280
|
-
if (!prevMatch) {
|
|
281
|
-
for (const pm of prevLevel) if ((match.pointsTo > pm.pointerAddress ? match.pointsTo - pm.pointerAddress : pm.pointerAddress - match.pointsTo) <= maxOff) {
|
|
282
|
-
prevMatch = pm;
|
|
283
|
-
break;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (!prevMatch) continue;
|
|
287
|
-
const baseAddrStr = formatAddress(match.pointerAddress);
|
|
288
|
-
const modInfo = this.resolveToModule(match.pointerAddress, modules);
|
|
289
|
-
const isStatic = modInfo !== null;
|
|
290
|
-
if (staticOnly && !isStatic) continue;
|
|
291
|
-
const links = [{
|
|
292
|
-
address: baseAddrStr,
|
|
293
|
-
module: modInfo?.module,
|
|
294
|
-
moduleOffset: modInfo?.offset,
|
|
295
|
-
offset: Number(prevMatch.pointerAddress - match.pointsTo)
|
|
296
|
-
}, {
|
|
297
|
-
address: formatAddress(prevMatch.pointerAddress),
|
|
298
|
-
offset: prevMatch.offset
|
|
299
|
-
}];
|
|
300
|
-
chains.push({
|
|
301
|
-
id: randomUUID(),
|
|
302
|
-
links,
|
|
303
|
-
targetAddress: targetAddrStr,
|
|
304
|
-
baseAddress: baseAddrStr,
|
|
305
|
-
isStatic,
|
|
306
|
-
depth: links.length,
|
|
307
|
-
lastValidated: Date.now(),
|
|
308
|
-
isValid: true
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
chains.sort((a, b) => {
|
|
314
|
-
if (a.isStatic !== b.isStatic) return a.isStatic ? -1 : 1;
|
|
315
|
-
return a.depth - b.depth;
|
|
316
|
-
});
|
|
317
|
-
return chains.slice(0, maxResults);
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
const pointerChainEngine = new PointerChainEngine();
|
|
321
|
-
//#endregion
|
|
322
|
-
export { PointerChainEngine, pointerChainEngine };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { t as ToolError } from "./ToolError-jh9whhMd.mjs";
|
|
2
|
-
//#region src/errors/PrerequisiteError.ts
|
|
3
|
-
/**
|
|
4
|
-
* Thrown when a tool's prerequisite is not met (e.g. debugger not enabled,
|
|
5
|
-
* browser not connected, profiling not started).
|
|
6
|
-
*
|
|
7
|
-
* The MCP server catches this and returns a graceful
|
|
8
|
-
* `{ success: false, message }` response instead of `isError: true`.
|
|
9
|
-
*
|
|
10
|
-
* Extends ToolError with code 'PREREQUISITE' for unified error classification.
|
|
11
|
-
* Constructor signature unchanged — backward-compatible with all existing callers.
|
|
12
|
-
*/
|
|
13
|
-
var PrerequisiteError = class extends ToolError {
|
|
14
|
-
constructor(message) {
|
|
15
|
-
super("PREREQUISITE", message);
|
|
16
|
-
this.name = "PrerequisiteError";
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
//#endregion
|
|
20
|
-
export { PrerequisiteError as t };
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
//#region src/server/domains/shared/ResponseBuilder.ts
|
|
2
|
-
/**
|
|
3
|
-
* Fluent builder for MCP tool responses.
|
|
4
|
-
*
|
|
5
|
-
* Replaces the verbose 14-line deep-nesting pattern:
|
|
6
|
-
* ```
|
|
7
|
-
* return { content: [{ type: 'text', text: JSON.stringify({...}, null, 2) }] };
|
|
8
|
-
* ```
|
|
9
|
-
*
|
|
10
|
-
* With a chainable API:
|
|
11
|
-
* ```
|
|
12
|
-
* return R.ok().set('driver', 'chrome').json();
|
|
13
|
-
* ```
|
|
14
|
-
*/
|
|
15
|
-
var ResponseBuilder = class {
|
|
16
|
-
payload = {};
|
|
17
|
-
_isError = false;
|
|
18
|
-
_additionalContent = [];
|
|
19
|
-
_useStructured = false;
|
|
20
|
-
/** Mark as success (sets `success: true`). */
|
|
21
|
-
ok() {
|
|
22
|
-
this.payload.success = true;
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
/** Mark as failure (sets `success: false, error: <message>, message: <message>`). */
|
|
26
|
-
fail(error) {
|
|
27
|
-
this.payload.success = false;
|
|
28
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
29
|
-
this.payload.error = msg;
|
|
30
|
-
this.payload.message = msg;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
/** Set a single key-value pair. */
|
|
34
|
-
set(key, value) {
|
|
35
|
-
this.payload[key] = value;
|
|
36
|
-
return this;
|
|
37
|
-
}
|
|
38
|
-
/** Merge multiple fields at once. */
|
|
39
|
-
merge(fields) {
|
|
40
|
-
Object.assign(this.payload, fields);
|
|
41
|
-
return this;
|
|
42
|
-
}
|
|
43
|
-
/** Set MCP-level `isError: true` on the response envelope. */
|
|
44
|
-
mcpError() {
|
|
45
|
-
this._isError = true;
|
|
46
|
-
return this;
|
|
47
|
-
}
|
|
48
|
-
/** Push an image block to the final response. */
|
|
49
|
-
image(base64, mimeType) {
|
|
50
|
-
this._additionalContent.push({
|
|
51
|
-
type: "image",
|
|
52
|
-
data: base64,
|
|
53
|
-
mimeType
|
|
54
|
-
});
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
/** Push an embedded resource block to the final response. */
|
|
58
|
-
embeddedResource(uri, text, mimeType = "text/plain") {
|
|
59
|
-
this._additionalContent.push({
|
|
60
|
-
type: "resource",
|
|
61
|
-
resource: {
|
|
62
|
-
uri,
|
|
63
|
-
text,
|
|
64
|
-
mimeType
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
return this;
|
|
68
|
-
}
|
|
69
|
-
/** Send output payload natively as `structuredContent` in the MCP envelope instead of stringifying inside text block. */
|
|
70
|
-
structured() {
|
|
71
|
-
this._useStructured = true;
|
|
72
|
-
return this;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Build the ToolResponse. Handles text vs structured plus extra blocks.
|
|
76
|
-
* Optionally merges extra fields before building.
|
|
77
|
-
*/
|
|
78
|
-
json(fields) {
|
|
79
|
-
if (fields) this.merge(fields);
|
|
80
|
-
return {
|
|
81
|
-
content: [{
|
|
82
|
-
type: "text",
|
|
83
|
-
text: JSON.stringify(this.payload, null, 2)
|
|
84
|
-
}, ...this._additionalContent],
|
|
85
|
-
...this._isError ? { isError: true } : {},
|
|
86
|
-
...this._useStructured ? { structuredContent: this.payload } : {}
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
/** Alias for json(). */
|
|
90
|
-
build(fields) {
|
|
91
|
-
return this.json(fields);
|
|
92
|
-
}
|
|
93
|
-
/** Build a ToolResponse from an arbitrary value (no success/error wrapper). */
|
|
94
|
-
static raw(data) {
|
|
95
|
-
return { content: [{
|
|
96
|
-
type: "text",
|
|
97
|
-
text: JSON.stringify(data, null, 2)
|
|
98
|
-
}] };
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Build a ToolResponse from a plain text string.
|
|
102
|
-
* Setting `isError = true` returns a soft error for macro compatibility
|
|
103
|
-
* without triggering a JSON-RPC ErrorCode.
|
|
104
|
-
*/
|
|
105
|
-
static text(text, isError = false) {
|
|
106
|
-
return {
|
|
107
|
-
content: [{
|
|
108
|
-
type: "text",
|
|
109
|
-
text
|
|
110
|
-
}],
|
|
111
|
-
...isError ? { isError: true } : {}
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Safely extract and parse JSON from an MCP ToolResponse.
|
|
116
|
-
* Useful for consuming tool results in workflow/orchestration logic.
|
|
117
|
-
*/
|
|
118
|
-
static parse(response) {
|
|
119
|
-
if (!response.content || response.content.length === 0) throw new Error("ToolResponse has no content");
|
|
120
|
-
const textBlock = response.content.find((c) => c.type === "text");
|
|
121
|
-
if (!textBlock || !("text" in textBlock)) throw new Error("ToolResponse has no text content block");
|
|
122
|
-
try {
|
|
123
|
-
return JSON.parse(textBlock.text);
|
|
124
|
-
} catch (e) {
|
|
125
|
-
throw new Error(`Failed to parse tool result as JSON: ${String(e)}\nRaw text: ${textBlock.text.substring(0, 500)}`, { cause: e });
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
/** Shorthand factory — the primary entry point for building responses. */
|
|
130
|
-
const R = {
|
|
131
|
-
/** Start a success response (`{ success: true, ... }`). */
|
|
132
|
-
ok: () => new ResponseBuilder().ok(),
|
|
133
|
-
/** Start a failure response (`{ success: false, error: "..." }`). */
|
|
134
|
-
fail: (error) => new ResponseBuilder().fail(error),
|
|
135
|
-
/** Wrap an existing object as-is (no success/error wrapper). */
|
|
136
|
-
raw: (data) => ResponseBuilder.raw(data),
|
|
137
|
-
/** Wrap a plain text string. */
|
|
138
|
-
text: (text, isError = false) => ResponseBuilder.text(text, isError),
|
|
139
|
-
/** Parse a response back into an object. */
|
|
140
|
-
parse: (response) => ResponseBuilder.parse(response)
|
|
141
|
-
};
|
|
142
|
-
//#endregion
|
|
143
|
-
export { R as t };
|