@jshookmcp/jshook 0.2.8 → 0.2.9

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.
Files changed (157) hide show
  1. package/README.md +36 -5
  2. package/README.zh.md +36 -5
  3. package/dist/{AntiCheatDetector-S8VRj-dD.mjs → AntiCheatDetector-BNk-EoBt.mjs} +3 -3
  4. package/dist/{CodeInjector-4Z3ngPoX.mjs → CodeInjector-Cq8q01kp.mjs} +5 -5
  5. package/dist/ConsoleMonitor-CPVQW1Y-.mjs +2201 -0
  6. package/dist/{DarwinAPI-B8hg_yhz.mjs → DarwinAPI-BNPxu0RH.mjs} +1 -1
  7. package/dist/DetailedDataManager-BQQcxh64.mjs +217 -0
  8. package/dist/EventBus-DgPmwpeu.mjs +141 -0
  9. package/dist/EvidenceGraphBridge-SFesNera.mjs +153 -0
  10. package/dist/{ExtensionManager-D5-bO9D8.mjs → ExtensionManager-CWYgw0YW.mjs} +13 -6
  11. package/dist/{FingerprintManager-BVxFJL2-.mjs → FingerprintManager-gzWtkKuf.mjs} +1 -1
  12. package/dist/{HardwareBreakpoint-DK1yjWkV.mjs → HardwareBreakpoint-B9gZCdFP.mjs} +3 -3
  13. package/dist/{HeapAnalyzer-CEbo10xU.mjs → HeapAnalyzer-BLDH0dCv.mjs} +4 -4
  14. package/dist/HookGeneratorBuilders.core.generators.storage-CtcdK78Q.mjs +639 -0
  15. package/dist/InstrumentationSession-CvPC7Jwy.mjs +244 -0
  16. package/dist/{MemoryController-DdtnBdD4.mjs → MemoryController-CbVdCIJF.mjs} +3 -3
  17. package/dist/{MemoryScanSession-RMixN3bX.mjs → MemoryScanSession-BsDZbLYm.mjs} +81 -78
  18. package/dist/{MemoryScanner-QjK4ld0B.mjs → MemoryScanner-Bcpml6II.mjs} +44 -18
  19. package/dist/{NativeMemoryManager.impl-CB6gJ0NM.mjs → NativeMemoryManager.impl-dZtA1ZGn.mjs} +14 -53
  20. package/dist/{NativeMemoryManager.utils-BML4q1ry.mjs → NativeMemoryManager.utils-B-FjA2mJ.mjs} +1 -1
  21. package/dist/{PEAnalyzer-CK0xe0Fs.mjs → PEAnalyzer-D1lzJ_VG.mjs} +2 -2
  22. package/dist/PageController-Bqm2kZ_X.mjs +417 -0
  23. package/dist/{PointerChainEngine-Cd73qu5b.mjs → PointerChainEngine-BOhyVsjx.mjs} +4 -4
  24. package/dist/PrerequisiteError-Dl33Svkz.mjs +20 -0
  25. package/dist/ResponseBuilder-D3iFYx2N.mjs +143 -0
  26. package/dist/ReverseEvidenceGraph-Dlsk94LC.mjs +269 -0
  27. package/dist/ScriptManager-aHHq0X7U.mjs +3000 -0
  28. package/dist/{Speedhack-CeF0XmEz.mjs → Speedhack-CqdIFlQl.mjs} +2 -2
  29. package/dist/{StructureAnalyzer-D4GkMduU.mjs → StructureAnalyzer-DhFaPvRO.mjs} +3 -3
  30. package/dist/ToolCatalog-C0JGZoOm.mjs +582 -0
  31. package/dist/ToolError-jh9whhMd.mjs +15 -0
  32. package/dist/ToolProbe-oC7aPrkv.mjs +45 -0
  33. package/dist/ToolRegistry-BjaF4oNz.mjs +131 -0
  34. package/dist/ToolRouter.policy-BWV67ZK-.mjs +304 -0
  35. package/dist/TraceRecorder-DgxyVbdQ.mjs +519 -0
  36. package/dist/{Win32API-Bc0QnQsN.mjs → Win32API-CePkipZY.mjs} +1 -1
  37. package/dist/{Win32Debug-DUHt9XUn.mjs → Win32Debug-BvKs-gxc.mjs} +2 -2
  38. package/dist/WorkflowEngine-CuvkZtWu.mjs +598 -0
  39. package/dist/analysis-CL9uACt9.mjs +463 -0
  40. package/dist/antidebug-CqDTB_uk.mjs +1081 -0
  41. package/dist/artifactRetention-CFEprwPw.mjs +591 -0
  42. package/dist/artifacts-Bk2-_uPq.mjs +59 -0
  43. package/dist/betterSqlite3-0pqusHHH.mjs +74 -0
  44. package/dist/binary-instrument-CXfpx6fT.mjs +979 -0
  45. package/dist/bind-helpers-xFfRF-qm.mjs +22 -0
  46. package/dist/boringssl-inspector-BH2D3VKc.mjs +180 -0
  47. package/dist/browser-BpOr5PEx.mjs +4082 -0
  48. package/dist/concurrency-Bt0yv1kJ.mjs +41 -0
  49. package/dist/{constants-CCvsN80K.mjs → constants-B0OANIBL.mjs} +88 -46
  50. package/dist/coordination-qUbyF8KU.mjs +259 -0
  51. package/dist/debugger-gnKxRSN0.mjs +1271 -0
  52. package/dist/definitions-6M-eejaT.mjs +53 -0
  53. package/dist/definitions-B18eyf0B.mjs +18 -0
  54. package/dist/definitions-B3QdlrHv.mjs +34 -0
  55. package/dist/definitions-B4rAvHNZ.mjs +63 -0
  56. package/dist/definitions-BB_4jnmy.mjs +37 -0
  57. package/dist/definitions-BMfYXoNC.mjs +43 -0
  58. package/dist/definitions-Beid2EB3.mjs +27 -0
  59. package/dist/definitions-C1UvM5Iy.mjs +126 -0
  60. package/dist/definitions-CXEI7QC72.mjs +216 -0
  61. package/dist/definitions-C_4r7Fo-2.mjs +14 -0
  62. package/dist/definitions-CkFDALoa.mjs +26 -0
  63. package/dist/definitions-Cke7zEb8.mjs +94 -0
  64. package/dist/definitions-ClJLzsJQ.mjs +25 -0
  65. package/dist/definitions-Cq-zroAU.mjs +28 -0
  66. package/dist/definitions-Cy3Sl6gV.mjs +34 -0
  67. package/dist/definitions-D3VsGcvz.mjs +47 -0
  68. package/dist/definitions-DVGfrn7y.mjs +96 -0
  69. package/dist/definitions-LKpC3-nL.mjs +9 -0
  70. package/dist/definitions-bAhHQJq9.mjs +359 -0
  71. package/dist/encoding-Bvz5jLRv.mjs +1065 -0
  72. package/dist/evidence-graph-bridge-C_fv9PuC.mjs +135 -0
  73. package/dist/{factory-CibqTNC8.mjs → factory-DxlGh9Xf.mjs} +37 -52
  74. package/dist/graphql-DYWzJ29s.mjs +1026 -0
  75. package/dist/handlers-9sAbfIg-.mjs +2552 -0
  76. package/dist/handlers-Bl8zkwz1.mjs +2716 -0
  77. package/dist/handlers-C67ktuRN.mjs +710 -0
  78. package/dist/handlers-C87g8oCe.mjs +276 -0
  79. package/dist/handlers-CTsDAO6p.mjs +681 -0
  80. package/dist/handlers-Cgyg6c0U.mjs +645 -0
  81. package/dist/handlers-D6j6yka7.mjs +2124 -0
  82. package/dist/handlers-DdFzXLvF.mjs +446 -0
  83. package/dist/handlers-DeLOCd5m.mjs +799 -0
  84. package/dist/handlers-DlCJN4Td.mjs +757 -0
  85. package/dist/handlers-DxGIq15_2.mjs +917 -0
  86. package/dist/handlers-U6L4xhuF.mjs +585 -0
  87. package/dist/handlers-tB9Mp9ZK.mjs +84 -0
  88. package/dist/handlers-tiy7EIBp.mjs +572 -0
  89. package/dist/handlers.impl-DS0d9fUw.mjs +761 -0
  90. package/dist/hooks-CzCWByww.mjs +898 -0
  91. package/dist/index.mjs +377 -155
  92. package/dist/{logger-BmWzC2lM.mjs → logger-Dh_xb7_2.mjs} +14 -6
  93. package/dist/maintenance-P7ePRXQC.mjs +830 -0
  94. package/dist/manifest-2ToTpjv8.mjs +106 -0
  95. package/dist/manifest-3g71z6Bg.mjs +79 -0
  96. package/dist/manifest-82baTv4U.mjs +45 -0
  97. package/dist/manifest-B3QVVeBS.mjs +82 -0
  98. package/dist/manifest-BB2J8IMJ.mjs +149 -0
  99. package/dist/manifest-BKbgbSiY.mjs +60 -0
  100. package/dist/manifest-Bcf-TJzH.mjs +848 -0
  101. package/dist/manifest-BmtZzQiQ2.mjs +45 -0
  102. package/dist/manifest-Bnd7kqEY.mjs +55 -0
  103. package/dist/manifest-BqQX6OQC2.mjs +65 -0
  104. package/dist/manifest-BqrQ4Tpj.mjs +81 -0
  105. package/dist/manifest-Br4RPFt5.mjs +370 -0
  106. package/dist/manifest-C5qDjysN.mjs +107 -0
  107. package/dist/manifest-C9RT5nk32.mjs +34 -0
  108. package/dist/manifest-CAhOuvSl.mjs +204 -0
  109. package/dist/manifest-CBYWCUBJ.mjs +51 -0
  110. package/dist/manifest-CFADCRa1.mjs +37 -0
  111. package/dist/manifest-CQVhavRF.mjs +114 -0
  112. package/dist/manifest-CT7zZBV1.mjs +48 -0
  113. package/dist/manifest-CV12bcrF.mjs +121 -0
  114. package/dist/manifest-CXsRWjjI.mjs +224 -0
  115. package/dist/manifest-CZLUCfG02.mjs +95 -0
  116. package/dist/manifest-D6phHKFd.mjs +131 -0
  117. package/dist/manifest-DCyjf4n2.mjs +294 -0
  118. package/dist/manifest-DHsnKgP6.mjs +60 -0
  119. package/dist/manifest-Df_dliIe.mjs +55 -0
  120. package/dist/manifest-Dh8WBmEW.mjs +129 -0
  121. package/dist/manifest-DhKRAT8_.mjs +92 -0
  122. package/dist/manifest-DlpTj4ic2.mjs +193 -0
  123. package/dist/manifest-DrbmZcFl2.mjs +253 -0
  124. package/dist/manifest-DuwHjUa5.mjs +70 -0
  125. package/dist/manifest-DzwvxPJX.mjs +38 -0
  126. package/dist/manifest-NXctwWQq.mjs +68 -0
  127. package/dist/manifest-Sc_0JQ13.mjs +418 -0
  128. package/dist/manifest-gZ4s_UtG.mjs +96 -0
  129. package/dist/manifest-qSleDqdO.mjs +1023 -0
  130. package/dist/modules-C184v-S9.mjs +11365 -0
  131. package/dist/mojo-ipc-B_H61Afw.mjs +525 -0
  132. package/dist/network-671Cw6hV.mjs +3346 -0
  133. package/dist/{artifacts-BbdOMET5.mjs → outputPaths-B1uGmrWZ.mjs} +219 -212
  134. package/dist/parse-args-BlRjqlkL.mjs +39 -0
  135. package/dist/platform-WmNn8Sxb.mjs +2070 -0
  136. package/dist/process-QcbIy5Zq.mjs +1401 -0
  137. package/dist/proxy-DqNs0bAd.mjs +170 -0
  138. package/dist/registry-D-6e18lB.mjs +34 -0
  139. package/dist/response-BQVP-xUn.mjs +28 -0
  140. package/dist/server/plugin-api.mjs +2 -2
  141. package/dist/shared-state-board-DV-dpHFJ.mjs +586 -0
  142. package/dist/sourcemap-Dq8ez8vS.mjs +650 -0
  143. package/dist/ssrf-policy-ZaUfvhq7.mjs +166 -0
  144. package/dist/streaming-BUQ0VJsg.mjs +725 -0
  145. package/dist/tool-builder-DCbIC5Eo.mjs +186 -0
  146. package/dist/transform-CiYJfNX0.mjs +1007 -0
  147. package/dist/types-Bx92KJfT.mjs +4 -0
  148. package/dist/wasm-DQTnHDs4.mjs +531 -0
  149. package/dist/workflow-f3xJOcjx.mjs +725 -0
  150. package/package.json +16 -16
  151. package/dist/ExtensionManager-CPTJhHFg.mjs +0 -2
  152. package/dist/ToolCatalog-Bq4V2sbJ.mjs +0 -67201
  153. package/dist/{CacheAdapters-CzFNpD9a.mjs → CacheAdapters-CDe5WPSV.mjs} +0 -0
  154. package/dist/{StealthVerifier-BzBCFiwx.mjs → StealthVerifier-Bo4T3bz8.mjs} +0 -0
  155. package/dist/{VersionDetector-CNXcvD46.mjs → VersionDetector-CwVLVdDM.mjs} +0 -0
  156. package/dist/{formatAddress-ChCSIRWT.mjs → formatAddress-DVkj9kpI.mjs} +0 -0
  157. package/dist/{types-BBjOqye-.mjs → types-CPhOReNX.mjs} +1 -1
@@ -0,0 +1,1065 @@
1
+ import { a as argString, n as argEnum, r as argNumber } from "./parse-args-BlRjqlkL.mjs";
2
+ import "./definitions-D3VsGcvz.mjs";
3
+ import { homedir, tmpdir } from "node:os";
4
+ import { isAbsolute, resolve } from "node:path";
5
+ import { readFile, realpath } from "node:fs/promises";
6
+ //#region src/server/domains/encoding/encoding-protobuf.ts
7
+ function parseProtobufMessage(buffer, depth, maxDepth) {
8
+ const fields = [];
9
+ let offset = 0;
10
+ let fieldIndex = 0;
11
+ while (offset < buffer.length) {
12
+ const keyInfo = tryParseVarint(buffer, offset);
13
+ if (keyInfo.error) return {
14
+ fields,
15
+ bytesConsumed: offset,
16
+ error: keyInfo.error
17
+ };
18
+ const keyValue = keyInfo.value;
19
+ offset = keyInfo.offset;
20
+ const fieldNumber = Number(keyValue >> 3n);
21
+ const wireType = Number(keyValue & 7n);
22
+ if (fieldNumber <= 0) return {
23
+ fields,
24
+ bytesConsumed: offset,
25
+ error: `Invalid field number ${fieldNumber} at offset ${offset}`
26
+ };
27
+ if (wireType === 0) {
28
+ const varintInfo = tryParseVarint(buffer, offset);
29
+ if (varintInfo.error) return {
30
+ fields,
31
+ bytesConsumed: offset,
32
+ error: varintInfo.error
33
+ };
34
+ offset = varintInfo.offset;
35
+ fields.push({
36
+ index: fieldIndex,
37
+ fieldNumber,
38
+ wireType,
39
+ wireTypeName: protobufWireTypeName(wireType),
40
+ value: bigIntToSafeValue(varintInfo.value)
41
+ });
42
+ } else if (wireType === 1) {
43
+ if (offset + 8 > buffer.length) return {
44
+ fields,
45
+ bytesConsumed: offset,
46
+ error: `Unexpected EOF for fixed64 at offset ${offset}`
47
+ };
48
+ const raw = buffer.subarray(offset, offset + 8);
49
+ const fixed64 = raw.readBigUInt64LE(0);
50
+ offset += 8;
51
+ fields.push({
52
+ index: fieldIndex,
53
+ fieldNumber,
54
+ wireType,
55
+ wireTypeName: protobufWireTypeName(wireType),
56
+ value: {
57
+ uint64: bigIntToSafeValue(fixed64),
58
+ hex: raw.toString("hex")
59
+ }
60
+ });
61
+ } else if (wireType === 2) {
62
+ const lengthInfo = tryParseVarint(buffer, offset);
63
+ if (lengthInfo.error) return {
64
+ fields,
65
+ bytesConsumed: offset,
66
+ error: lengthInfo.error
67
+ };
68
+ offset = lengthInfo.offset;
69
+ const lengthBigInt = lengthInfo.value;
70
+ if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) return {
71
+ fields,
72
+ bytesConsumed: offset,
73
+ error: `Length-delimited field is too large at offset ${offset}`
74
+ };
75
+ const length = Number(lengthBigInt);
76
+ if (length < 0 || offset + length > buffer.length) return {
77
+ fields,
78
+ bytesConsumed: offset,
79
+ error: `Invalid length-delimited field length=${length} at offset ${offset}`
80
+ };
81
+ const payload = buffer.subarray(offset, offset + length);
82
+ offset += length;
83
+ fields.push({
84
+ index: fieldIndex,
85
+ fieldNumber,
86
+ wireType,
87
+ wireTypeName: protobufWireTypeName(wireType),
88
+ value: decodeLengthDelimited(payload, depth, maxDepth)
89
+ });
90
+ } else if (wireType === 5) {
91
+ if (offset + 4 > buffer.length) return {
92
+ fields,
93
+ bytesConsumed: offset,
94
+ error: `Unexpected EOF for fixed32 at offset ${offset}`
95
+ };
96
+ const raw = buffer.subarray(offset, offset + 4);
97
+ const fixed32 = raw.readUInt32LE(0);
98
+ offset += 4;
99
+ fields.push({
100
+ index: fieldIndex,
101
+ fieldNumber,
102
+ wireType,
103
+ wireTypeName: protobufWireTypeName(wireType),
104
+ value: {
105
+ uint32: fixed32,
106
+ hex: raw.toString("hex")
107
+ }
108
+ });
109
+ } else return {
110
+ fields,
111
+ bytesConsumed: offset,
112
+ error: `Unsupported wire type ${wireType} at offset ${offset}`
113
+ };
114
+ fieldIndex += 1;
115
+ }
116
+ return {
117
+ fields,
118
+ bytesConsumed: offset
119
+ };
120
+ }
121
+ function decodeLengthDelimited(payload, depth, maxDepth) {
122
+ if (payload.length === 0) return {
123
+ kind: "empty",
124
+ length: 0
125
+ };
126
+ if (depth < maxDepth) {
127
+ const nested = parseProtobufMessage(payload, depth + 1, maxDepth);
128
+ if (!nested.error && nested.bytesConsumed === payload.length && nested.fields.length > 0) return {
129
+ kind: "message",
130
+ fields: nested.fields
131
+ };
132
+ }
133
+ const text = toSafeUtf8$1(payload);
134
+ if (text !== null && isMostlyPrintableText(text)) return {
135
+ kind: "string",
136
+ value: text
137
+ };
138
+ return {
139
+ kind: "bytes",
140
+ length: payload.length,
141
+ hex: payload.toString("hex"),
142
+ base64: payload.toString("base64")
143
+ };
144
+ }
145
+ function tryParseVarint(buffer, startOffset) {
146
+ let result = 0n;
147
+ let shift = 0n;
148
+ let offset = startOffset;
149
+ for (let index = 0; index < 10; index += 1) {
150
+ const current = buffer[offset];
151
+ if (current === void 0) return { error: `Unexpected EOF while parsing varint at offset ${offset}` };
152
+ const byte = BigInt(current);
153
+ result |= (byte & 127n) << shift;
154
+ offset += 1;
155
+ if ((byte & 128n) === 0n) return {
156
+ value: result,
157
+ offset
158
+ };
159
+ shift += 7n;
160
+ }
161
+ return { error: `Varint exceeds 10 bytes at offset ${startOffset}` };
162
+ }
163
+ function protobufWireTypeName(wireType) {
164
+ if (wireType === 0) return "varint";
165
+ if (wireType === 1) return "fixed64";
166
+ if (wireType === 2) return "length-delimited";
167
+ if (wireType === 5) return "fixed32";
168
+ return "unknown";
169
+ }
170
+ function bigIntToSafeValue(value) {
171
+ const max = BigInt(Number.MAX_SAFE_INTEGER);
172
+ const min = BigInt(Number.MIN_SAFE_INTEGER);
173
+ if (value <= max && value >= min) return Number(value);
174
+ return value.toString();
175
+ }
176
+ function toSafeUtf8$1(buffer) {
177
+ const text = buffer.toString("utf8");
178
+ if ((text.match(/\uFFFD/g) ?? []).length > 0) return null;
179
+ return text;
180
+ }
181
+ function isMostlyPrintableText(text) {
182
+ if (text.length === 0) return true;
183
+ let printable = 0;
184
+ for (const ch of text) {
185
+ const code = ch.charCodeAt(0);
186
+ if (code >= 32 && code <= 126 || code === 9 || code === 10 || code === 13) printable += 1;
187
+ }
188
+ return printable / text.length >= .85;
189
+ }
190
+ //#endregion
191
+ //#region src/server/domains/encoding/encoding-msgpack.ts
192
+ function decodeMsgPack(buffer) {
193
+ const decoded = decodeMsgPackValue(buffer, 0, 0);
194
+ if (decoded.offset !== buffer.length) throw new Error(`MessagePack decode ended early: consumed ${decoded.offset} of ${buffer.length} bytes`);
195
+ return decoded.value;
196
+ }
197
+ function decodeMsgPackValue(buffer, startOffset, depth) {
198
+ if (depth > 64) throw new Error("MessagePack decode depth exceeds safety limit");
199
+ const prefix = buffer[startOffset];
200
+ if (prefix === void 0) throw new Error(`Unexpected EOF at offset ${startOffset}`);
201
+ let offset = startOffset + 1;
202
+ if (prefix <= 127) return {
203
+ value: prefix,
204
+ offset
205
+ };
206
+ if (prefix >= 224) return {
207
+ value: prefix - 256,
208
+ offset
209
+ };
210
+ if (prefix >= 160 && prefix <= 191) {
211
+ const length = prefix & 31;
212
+ ensureRange(buffer, offset, length);
213
+ return {
214
+ value: buffer.subarray(offset, offset + length).toString("utf8"),
215
+ offset: offset + length
216
+ };
217
+ }
218
+ if (prefix >= 144 && prefix <= 159) {
219
+ const length = prefix & 15;
220
+ return decodeMsgPackArray(buffer, offset, length, depth + 1);
221
+ }
222
+ if (prefix >= 128 && prefix <= 143) {
223
+ const length = prefix & 15;
224
+ return decodeMsgPackMap(buffer, offset, length, depth + 1);
225
+ }
226
+ if (prefix === 192) return {
227
+ value: null,
228
+ offset
229
+ };
230
+ if (prefix === 194) return {
231
+ value: false,
232
+ offset
233
+ };
234
+ if (prefix === 195) return {
235
+ value: true,
236
+ offset
237
+ };
238
+ if (prefix === 204) {
239
+ ensureRange(buffer, offset, 1);
240
+ return {
241
+ value: buffer.readUInt8(offset),
242
+ offset: offset + 1
243
+ };
244
+ }
245
+ if (prefix === 205) {
246
+ ensureRange(buffer, offset, 2);
247
+ return {
248
+ value: buffer.readUInt16BE(offset),
249
+ offset: offset + 2
250
+ };
251
+ }
252
+ if (prefix === 206) {
253
+ ensureRange(buffer, offset, 4);
254
+ return {
255
+ value: buffer.readUInt32BE(offset),
256
+ offset: offset + 4
257
+ };
258
+ }
259
+ if (prefix === 207) {
260
+ ensureRange(buffer, offset, 8);
261
+ return {
262
+ value: bigIntToSafeValue(buffer.readBigUInt64BE(offset)),
263
+ offset: offset + 8
264
+ };
265
+ }
266
+ if (prefix === 208) {
267
+ ensureRange(buffer, offset, 1);
268
+ return {
269
+ value: buffer.readInt8(offset),
270
+ offset: offset + 1
271
+ };
272
+ }
273
+ if (prefix === 209) {
274
+ ensureRange(buffer, offset, 2);
275
+ return {
276
+ value: buffer.readInt16BE(offset),
277
+ offset: offset + 2
278
+ };
279
+ }
280
+ if (prefix === 210) {
281
+ ensureRange(buffer, offset, 4);
282
+ return {
283
+ value: buffer.readInt32BE(offset),
284
+ offset: offset + 4
285
+ };
286
+ }
287
+ if (prefix === 211) {
288
+ ensureRange(buffer, offset, 8);
289
+ return {
290
+ value: bigIntToSafeValue(buffer.readBigInt64BE(offset)),
291
+ offset: offset + 8
292
+ };
293
+ }
294
+ if (prefix === 202) {
295
+ ensureRange(buffer, offset, 4);
296
+ return {
297
+ value: buffer.readFloatBE(offset),
298
+ offset: offset + 4
299
+ };
300
+ }
301
+ if (prefix === 203) {
302
+ ensureRange(buffer, offset, 8);
303
+ return {
304
+ value: buffer.readDoubleBE(offset),
305
+ offset: offset + 8
306
+ };
307
+ }
308
+ if (prefix === 217) {
309
+ ensureRange(buffer, offset, 1);
310
+ const length = buffer.readUInt8(offset);
311
+ offset += 1;
312
+ ensureRange(buffer, offset, length);
313
+ return {
314
+ value: buffer.subarray(offset, offset + length).toString("utf8"),
315
+ offset: offset + length
316
+ };
317
+ }
318
+ if (prefix === 218) {
319
+ ensureRange(buffer, offset, 2);
320
+ const length = buffer.readUInt16BE(offset);
321
+ offset += 2;
322
+ ensureRange(buffer, offset, length);
323
+ return {
324
+ value: buffer.subarray(offset, offset + length).toString("utf8"),
325
+ offset: offset + length
326
+ };
327
+ }
328
+ if (prefix === 219) {
329
+ ensureRange(buffer, offset, 4);
330
+ const length = buffer.readUInt32BE(offset);
331
+ offset += 4;
332
+ ensureRange(buffer, offset, length);
333
+ return {
334
+ value: buffer.subarray(offset, offset + length).toString("utf8"),
335
+ offset: offset + length
336
+ };
337
+ }
338
+ if (prefix === 196) {
339
+ ensureRange(buffer, offset, 1);
340
+ const length = buffer.readUInt8(offset);
341
+ offset += 1;
342
+ ensureRange(buffer, offset, length);
343
+ const payload = buffer.subarray(offset, offset + length);
344
+ return {
345
+ value: {
346
+ type: "bytes",
347
+ base64: payload.toString("base64"),
348
+ hex: payload.toString("hex")
349
+ },
350
+ offset: offset + length
351
+ };
352
+ }
353
+ if (prefix === 197) {
354
+ ensureRange(buffer, offset, 2);
355
+ const length = buffer.readUInt16BE(offset);
356
+ offset += 2;
357
+ ensureRange(buffer, offset, length);
358
+ const payload = buffer.subarray(offset, offset + length);
359
+ return {
360
+ value: {
361
+ type: "bytes",
362
+ base64: payload.toString("base64"),
363
+ hex: payload.toString("hex")
364
+ },
365
+ offset: offset + length
366
+ };
367
+ }
368
+ if (prefix === 198) {
369
+ ensureRange(buffer, offset, 4);
370
+ const length = buffer.readUInt32BE(offset);
371
+ offset += 4;
372
+ ensureRange(buffer, offset, length);
373
+ const payload = buffer.subarray(offset, offset + length);
374
+ return {
375
+ value: {
376
+ type: "bytes",
377
+ base64: payload.toString("base64"),
378
+ hex: payload.toString("hex")
379
+ },
380
+ offset: offset + length
381
+ };
382
+ }
383
+ if (prefix === 220) {
384
+ ensureRange(buffer, offset, 2);
385
+ const length = buffer.readUInt16BE(offset);
386
+ offset += 2;
387
+ return decodeMsgPackArray(buffer, offset, length, depth + 1);
388
+ }
389
+ if (prefix === 221) {
390
+ ensureRange(buffer, offset, 4);
391
+ const length = buffer.readUInt32BE(offset);
392
+ offset += 4;
393
+ return decodeMsgPackArray(buffer, offset, length, depth + 1);
394
+ }
395
+ if (prefix === 222) {
396
+ ensureRange(buffer, offset, 2);
397
+ const length = buffer.readUInt16BE(offset);
398
+ offset += 2;
399
+ return decodeMsgPackMap(buffer, offset, length, depth + 1);
400
+ }
401
+ if (prefix === 223) {
402
+ ensureRange(buffer, offset, 4);
403
+ const length = buffer.readUInt32BE(offset);
404
+ offset += 4;
405
+ return decodeMsgPackMap(buffer, offset, length, depth + 1);
406
+ }
407
+ if (prefix >= 212 && prefix <= 216) {
408
+ const size = {
409
+ 212: 1,
410
+ 213: 2,
411
+ 214: 4,
412
+ 215: 8,
413
+ 216: 16
414
+ }[prefix];
415
+ ensureRange(buffer, offset, 1 + size);
416
+ const extType = buffer.readInt8(offset);
417
+ const payload = buffer.subarray(offset + 1, offset + 1 + size);
418
+ return {
419
+ value: {
420
+ type: "ext",
421
+ extType,
422
+ base64: payload.toString("base64"),
423
+ hex: payload.toString("hex")
424
+ },
425
+ offset: offset + 1 + size
426
+ };
427
+ }
428
+ if (prefix === 199 || prefix === 200 || prefix === 201) {
429
+ const lengthBytes = prefix === 199 ? 1 : prefix === 200 ? 2 : 4;
430
+ ensureRange(buffer, offset, lengthBytes);
431
+ const length = lengthBytes === 1 ? buffer.readUInt8(offset) : lengthBytes === 2 ? buffer.readUInt16BE(offset) : buffer.readUInt32BE(offset);
432
+ offset += lengthBytes;
433
+ ensureRange(buffer, offset, 1 + length);
434
+ const extType = buffer.readInt8(offset);
435
+ const payload = buffer.subarray(offset + 1, offset + 1 + length);
436
+ return {
437
+ value: {
438
+ type: "ext",
439
+ extType,
440
+ base64: payload.toString("base64"),
441
+ hex: payload.toString("hex")
442
+ },
443
+ offset: offset + 1 + length
444
+ };
445
+ }
446
+ throw new Error(`Unsupported MessagePack prefix 0x${prefix.toString(16)} at offset ${startOffset}`);
447
+ }
448
+ function decodeMsgPackArray(buffer, startOffset, length, depth) {
449
+ let offset = startOffset;
450
+ const values = [];
451
+ for (let index = 0; index < length; index += 1) {
452
+ const decoded = decodeMsgPackValue(buffer, offset, depth);
453
+ values.push(decoded.value);
454
+ offset = decoded.offset;
455
+ }
456
+ return {
457
+ value: values,
458
+ offset
459
+ };
460
+ }
461
+ function decodeMsgPackMap(buffer, startOffset, length, depth) {
462
+ let offset = startOffset;
463
+ const mapValue = {};
464
+ for (let index = 0; index < length; index += 1) {
465
+ const keyDecoded = decodeMsgPackValue(buffer, offset, depth);
466
+ offset = keyDecoded.offset;
467
+ const valueDecoded = decodeMsgPackValue(buffer, offset, depth);
468
+ offset = valueDecoded.offset;
469
+ const key = msgPackMapKey(keyDecoded.value);
470
+ mapValue[key] = valueDecoded.value;
471
+ }
472
+ return {
473
+ value: mapValue,
474
+ offset
475
+ };
476
+ }
477
+ function msgPackMapKey(value) {
478
+ if (typeof value === "string") return value;
479
+ if (typeof value === "number") return String(value);
480
+ if (typeof value === "boolean") return String(value);
481
+ if (typeof value === "bigint") return value.toString();
482
+ if (value === null) return "null";
483
+ try {
484
+ return JSON.stringify(value);
485
+ } catch {
486
+ return String(value);
487
+ }
488
+ }
489
+ function ensureRange(buffer, offset, length) {
490
+ if (offset < 0 || length < 0 || offset + length > buffer.length) throw new Error(`Unexpected EOF while reading ${length} bytes at offset ${offset}`);
491
+ }
492
+ //#endregion
493
+ //#region src/server/domains/encoding/handlers/shared.ts
494
+ /**
495
+ * Encoding domain shared types, constants, and utility functions.
496
+ * Extracted from EncodingHandlersBase.
497
+ */
498
+ const MAGIC_SIGNATURES = [
499
+ {
500
+ format: "png",
501
+ bytes: [
502
+ 137,
503
+ 80,
504
+ 78,
505
+ 71
506
+ ]
507
+ },
508
+ {
509
+ format: "jpeg",
510
+ bytes: [
511
+ 255,
512
+ 216,
513
+ 255
514
+ ]
515
+ },
516
+ {
517
+ format: "gif",
518
+ bytes: [
519
+ 71,
520
+ 73,
521
+ 70
522
+ ]
523
+ },
524
+ {
525
+ format: "wasm",
526
+ bytes: [
527
+ 0,
528
+ 97,
529
+ 115,
530
+ 109
531
+ ]
532
+ },
533
+ {
534
+ format: "zip/apk",
535
+ bytes: [
536
+ 80,
537
+ 75,
538
+ 3,
539
+ 4
540
+ ]
541
+ },
542
+ {
543
+ format: "pdf",
544
+ bytes: [
545
+ 37,
546
+ 80,
547
+ 68,
548
+ 70
549
+ ]
550
+ }
551
+ ];
552
+ const DETECT_SOURCE_SET = new Set([
553
+ "base64",
554
+ "hex",
555
+ "file",
556
+ "raw"
557
+ ]);
558
+ const ENTROPY_SOURCE_SET = new Set([
559
+ "base64",
560
+ "hex",
561
+ "raw",
562
+ "file"
563
+ ]);
564
+ const DECODE_ENCODING_SET = new Set([
565
+ "base64",
566
+ "hex",
567
+ "url",
568
+ "protobuf",
569
+ "msgpack"
570
+ ]);
571
+ const OUTPUT_FORMAT_SET = new Set([
572
+ "hex",
573
+ "utf8",
574
+ "json"
575
+ ]);
576
+ const INPUT_FORMAT_SET = new Set([
577
+ "utf8",
578
+ "hex",
579
+ "json"
580
+ ]);
581
+ const OUTPUT_ENCODING_SET = new Set([
582
+ "base64",
583
+ "hex",
584
+ "url"
585
+ ]);
586
+ function ok(payload) {
587
+ return { content: [{
588
+ type: "text",
589
+ text: JSON.stringify(payload, null, 2)
590
+ }] };
591
+ }
592
+ function fail(tool, error) {
593
+ return ok({
594
+ success: false,
595
+ tool,
596
+ error: error instanceof Error ? error.message : String(error)
597
+ });
598
+ }
599
+ function decodeHexString(value) {
600
+ const cleaned = value.trim().replace(/^0x/i, "").replace(/[\s:,-]/g, "");
601
+ if (cleaned.length === 0) return Buffer.alloc(0);
602
+ if (cleaned.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(cleaned)) throw new Error("Invalid hex string");
603
+ return Buffer.from(cleaned, "hex");
604
+ }
605
+ function decodeBase64String(value) {
606
+ const cleaned = value.trim().replace(/\s+/g, "");
607
+ if (cleaned.length === 0) return Buffer.alloc(0);
608
+ if (!looksLikeBase64(cleaned)) throw new Error("Invalid base64 string");
609
+ return Buffer.from(cleaned, "base64");
610
+ }
611
+ function decodeBinaryAuto(value) {
612
+ const trimmed = value.trim();
613
+ if (trimmed.length === 0) return Buffer.alloc(0);
614
+ if (looksLikeHex(trimmed)) return decodeHexString(trimmed);
615
+ if (looksLikeBase64(trimmed)) return decodeBase64String(trimmed);
616
+ return Buffer.from(trimmed, "utf8");
617
+ }
618
+ function looksLikeHex(value) {
619
+ const cleaned = value.trim().replace(/^0x/i, "").replace(/[\s:,-]/g, "");
620
+ return cleaned.length > 0 && cleaned.length % 2 === 0 && /^[0-9a-fA-F]+$/.test(cleaned);
621
+ }
622
+ function looksLikeBase64(value) {
623
+ const cleaned = value.trim().replace(/\s+/g, "");
624
+ if (cleaned.length === 0 || cleaned.length % 4 !== 0) return false;
625
+ if (!/^[A-Za-z0-9+/]*={0,2}$/.test(cleaned)) return false;
626
+ try {
627
+ const decoded = Buffer.from(cleaned, "base64");
628
+ return cleaned.replace(/=+$/, "") === decoded.toString("base64").replace(/=+$/, "");
629
+ } catch {
630
+ return false;
631
+ }
632
+ }
633
+ function looksLikeUrlEncoded(value) {
634
+ return /%[0-9a-fA-F]{2}/.test(value) || /\+/.test(value);
635
+ }
636
+ function decodeUrl(value) {
637
+ return decodeURIComponent(value.replace(/\+/g, "%20"));
638
+ }
639
+ function encodeUrlBytes(buffer) {
640
+ let encoded = "";
641
+ for (const value of buffer.values()) encoded += value >= 48 && value <= 57 || value >= 65 && value <= 90 || value >= 97 && value <= 122 || value === 45 || value === 46 || value === 95 || value === 126 ? String.fromCharCode(value) : `%${value.toString(16).toUpperCase().padStart(2, "0")}`;
642
+ return encoded;
643
+ }
644
+ function toSafeUtf8(buffer) {
645
+ const text = buffer.toString("utf8");
646
+ if ((text.match(/\uFFFD/g) ?? []).length > 0) return null;
647
+ return text;
648
+ }
649
+ function tryParseJson(text) {
650
+ try {
651
+ return JSON.parse(text);
652
+ } catch {
653
+ return null;
654
+ }
655
+ }
656
+ function previewHex(buffer, maxBytes) {
657
+ return Array.from(buffer.subarray(0, maxBytes).values()).map((v) => v.toString(16).padStart(2, "0")).join(" ");
658
+ }
659
+ function hexDump(buffer, bytesPerRow = 16) {
660
+ const lines = [];
661
+ for (let offset = 0; offset < buffer.length; offset += bytesPerRow) {
662
+ const row = buffer.subarray(offset, offset + bytesPerRow);
663
+ const hex = Array.from(row.values()).map((v) => v.toString(16).padStart(2, "0")).join(" ");
664
+ const ascii = Array.from(row.values()).map((v) => v >= 32 && v <= 126 ? String.fromCharCode(v) : ".").join("");
665
+ lines.push(`${offset.toString(16).padStart(8, "0")} ${hex.padEnd(47)} |${ascii}|`);
666
+ }
667
+ return lines.join("\n");
668
+ }
669
+ function renderDecodedOutput(params) {
670
+ const { encoding, outputFormat, buffer, jsonValue } = params;
671
+ if (outputFormat === "hex") return ok({
672
+ success: true,
673
+ encoding,
674
+ outputFormat,
675
+ byteLength: buffer.length,
676
+ result: buffer.toString("hex"),
677
+ hexDump: hexDump(buffer)
678
+ });
679
+ if (outputFormat === "utf8") return ok({
680
+ success: true,
681
+ encoding,
682
+ outputFormat,
683
+ byteLength: buffer.length,
684
+ result: buffer.toString("utf8")
685
+ });
686
+ const utf8 = toSafeUtf8(buffer);
687
+ const maybeJson = utf8 === null ? null : tryParseJson(utf8);
688
+ return ok({
689
+ success: true,
690
+ encoding,
691
+ outputFormat,
692
+ byteLength: buffer.length,
693
+ result: jsonValue ?? {
694
+ parsedJson: maybeJson,
695
+ utf8,
696
+ hex: buffer.toString("hex")
697
+ }
698
+ });
699
+ }
700
+ async function resolveBufferBySource(options) {
701
+ const { source, data, filePath, maxBytes } = options;
702
+ if (source === "file") {
703
+ if (!filePath) throw new Error("filePath is required when source=file");
704
+ const real = await realpath(resolve(filePath));
705
+ if (!(await Promise.all([
706
+ tmpdir(),
707
+ homedir(),
708
+ process.cwd()
709
+ ].map(async (p) => {
710
+ const absolute = isAbsolute(p) ? p : resolve(p);
711
+ try {
712
+ return await realpath(absolute);
713
+ } catch {
714
+ return absolute;
715
+ }
716
+ }))).some((root) => real.startsWith(root))) throw new Error(`File access denied: path "${filePath}" is outside allowed directories`);
717
+ const fileBuffer = await readFile(real);
718
+ return typeof maxBytes === "number" ? fileBuffer.subarray(0, maxBytes) : fileBuffer;
719
+ }
720
+ if (source === "base64") {
721
+ if (!data) throw new Error("data is required for base64 source");
722
+ return decodeBase64String(data);
723
+ }
724
+ if (source === "hex") {
725
+ if (!data) throw new Error("data is required for hex source");
726
+ return decodeHexString(data);
727
+ }
728
+ return Buffer.from(data ?? "", "utf8");
729
+ }
730
+ async function resolveRequestBodyFromActivePage(collector, requestId) {
731
+ try {
732
+ const result = await (await collector.getActivePage()).evaluate((targetRequestId) => {
733
+ const pickBody = (entry) => {
734
+ if (!entry || typeof entry !== "object") return null;
735
+ const record = entry;
736
+ if (record.requestId !== targetRequestId) return null;
737
+ if (typeof record.responseBody === "string") return {
738
+ body: record.responseBody,
739
+ base64Encoded: Boolean(record.base64Encoded)
740
+ };
741
+ if (typeof record.body === "string") return {
742
+ body: record.body,
743
+ base64Encoded: Boolean(record.base64Encoded)
744
+ };
745
+ const response = record.response;
746
+ if (response && typeof response === "object") {
747
+ const rr = response;
748
+ if (typeof rr.body === "string") return {
749
+ body: rr.body,
750
+ base64Encoded: Boolean(rr.base64Encoded)
751
+ };
752
+ }
753
+ return null;
754
+ };
755
+ const searchArray = (payload) => {
756
+ if (!Array.isArray(payload)) return null;
757
+ for (const item of payload) {
758
+ const found = pickBody(item);
759
+ if (found) return found;
760
+ }
761
+ return null;
762
+ };
763
+ const fromMemory = searchArray(window.__capturedAPIs);
764
+ if (fromMemory) return fromMemory;
765
+ try {
766
+ const raw = window.localStorage.getItem("__capturedAPIs");
767
+ if (!raw) return null;
768
+ return searchArray(JSON.parse(raw));
769
+ } catch {
770
+ return null;
771
+ }
772
+ }, requestId);
773
+ if (!result || typeof result !== "object") return null;
774
+ const payload = result;
775
+ if (typeof payload.body !== "string") return null;
776
+ if (payload.base64Encoded) return Buffer.from(payload.body, "base64");
777
+ const maybeBase64 = payload.body.trim();
778
+ if (looksLikeBase64(maybeBase64)) return Buffer.from(maybeBase64, "base64");
779
+ return Buffer.from(payload.body, "utf8");
780
+ } catch {
781
+ return null;
782
+ }
783
+ }
784
+ function detectMagicFormats(buffer) {
785
+ const matches = [];
786
+ for (const signature of MAGIC_SIGNATURES) {
787
+ if (buffer.length < signature.bytes.length) continue;
788
+ let matched = true;
789
+ for (let i = 0; i < signature.bytes.length; i += 1) if (buffer[i] !== signature.bytes[i]) {
790
+ matched = false;
791
+ break;
792
+ }
793
+ if (matched) matches.push(signature.format);
794
+ }
795
+ return matches;
796
+ }
797
+ function detectStructuredFormats(buffer) {
798
+ const firstByte = buffer[0];
799
+ if (firstByte === void 0) return [];
800
+ const formats = /* @__PURE__ */ new Set();
801
+ if ([
802
+ 8,
803
+ 16,
804
+ 24,
805
+ 32
806
+ ].includes(firstByte)) formats.add("protobuf");
807
+ if (firstByte >= 128 && firstByte <= 143 || firstByte >= 144 && firstByte <= 159 || firstByte >= 160 && firstByte <= 191) formats.add("messagepack");
808
+ if (firstByte >= 160 && firstByte <= 191 || firstByte >= 128 && firstByte <= 159) formats.add("cbor");
809
+ return Array.from(formats);
810
+ }
811
+ function detectEncodingSignals(source, data, buffer) {
812
+ const encodings = /* @__PURE__ */ new Set();
813
+ if (source === "base64" || data && looksLikeBase64(data.trim())) encodings.add("base64");
814
+ if (source === "hex" || data && looksLikeHex(data)) encodings.add("hex");
815
+ if (data && looksLikeUrlEncoded(data)) encodings.add("url-encoded");
816
+ if (buffer.length >= 3) {
817
+ const [a, b, c] = buffer;
818
+ if (a === 239 && b === 187 && c === 191) encodings.add("utf8-bom");
819
+ }
820
+ return Array.from(encodings);
821
+ }
822
+ function calculateShannonEntropy(buffer) {
823
+ if (buffer.length === 0) return 0;
824
+ const freq = Array.from({ length: 256 }, () => 0);
825
+ for (const value of buffer.values()) freq[value] += 1;
826
+ let entropy = 0;
827
+ for (const count of freq) {
828
+ if (count === 0) continue;
829
+ const p = count / buffer.length;
830
+ entropy -= p * Math.log2(p);
831
+ }
832
+ return Number(entropy.toFixed(6));
833
+ }
834
+ function calculateByteFrequency(buffer) {
835
+ if (buffer.length === 0) return [];
836
+ const freq = Array.from({ length: 256 }, () => 0);
837
+ for (const value of buffer.values()) freq[value] += 1;
838
+ const entries = [];
839
+ for (let v = 0; v < 256; v += 1) {
840
+ const count = freq[v];
841
+ if (count === 0) continue;
842
+ entries.push({
843
+ byte: `0x${v.toString(16).padStart(2, "0")}`,
844
+ count,
845
+ ratio: Number((count / buffer.length).toFixed(6))
846
+ });
847
+ }
848
+ entries.sort((a, b) => b.count - a.count);
849
+ return entries;
850
+ }
851
+ function calculateBlockEntropies(buffer, blockSize) {
852
+ if (buffer.length === 0) return [];
853
+ const blocks = [];
854
+ let index = 0;
855
+ for (let start = 0; start < buffer.length; start += blockSize) {
856
+ const end = Math.min(start + blockSize, buffer.length);
857
+ blocks.push({
858
+ index,
859
+ start,
860
+ end,
861
+ entropy: calculateShannonEntropy(buffer.subarray(start, end))
862
+ });
863
+ index += 1;
864
+ }
865
+ return blocks;
866
+ }
867
+ function assessEntropy(entropy, buffer) {
868
+ const ratio = printableRatio(buffer);
869
+ if (entropy < 3.8 && ratio > .85) return "plaintext";
870
+ if (entropy < 5.8) return "encoded";
871
+ if (entropy < 7.2) return "compressed";
872
+ if (entropy < 7.8) return "encrypted";
873
+ return "random";
874
+ }
875
+ function printableRatio(buffer) {
876
+ if (buffer.length === 0) return 1;
877
+ let printable = 0;
878
+ for (const value of buffer.values()) if (value >= 32 && value <= 126 || value === 9 || value === 10 || value === 13) printable += 1;
879
+ return printable / buffer.length;
880
+ }
881
+ //#endregion
882
+ //#region src/server/domains/encoding/handlers.impl.core.runtime.ts
883
+ var EncodingToolHandlers = class {
884
+ collector;
885
+ constructor(collector) {
886
+ this.collector = collector;
887
+ }
888
+ async handleBinaryDetectFormat(args) {
889
+ try {
890
+ const source = argEnum(args, "source", DETECT_SOURCE_SET, "raw");
891
+ const data = argString(args, "data");
892
+ const filePath = argString(args, "filePath");
893
+ const requestId = argString(args, "requestId");
894
+ let buffer = null;
895
+ let requestBodyUsed = false;
896
+ if (source === "raw" && requestId) {
897
+ buffer = await resolveRequestBodyFromActivePage(this.collector, requestId);
898
+ requestBodyUsed = buffer !== null;
899
+ }
900
+ if (!buffer) {
901
+ if (source !== "file" && !data) throw new Error("data is required for non-file source when requestId payload is unavailable");
902
+ buffer = await resolveBufferBySource({
903
+ source,
904
+ data,
905
+ filePath,
906
+ maxBytes: source === "file" ? 512 : void 0
907
+ });
908
+ }
909
+ const entropy = calculateShannonEntropy(buffer);
910
+ return ok({
911
+ success: true,
912
+ source,
913
+ requestId: requestId ?? null,
914
+ requestBodyUsed,
915
+ byteLength: buffer.length,
916
+ previewHex: previewHex(buffer, 64),
917
+ magicFormats: detectMagicFormats(buffer),
918
+ structuredFormats: detectStructuredFormats(buffer),
919
+ encodingSignals: detectEncodingSignals(source, data, buffer),
920
+ entropy,
921
+ assessment: assessEntropy(entropy, buffer),
922
+ topBytes: calculateByteFrequency(buffer).slice(0, 8)
923
+ });
924
+ } catch (error) {
925
+ return fail("binary_detect_format", error);
926
+ }
927
+ }
928
+ async handleBinaryDecode(args) {
929
+ try {
930
+ const data = argString(args, "data", "");
931
+ const encoding = argEnum(args, "encoding", DECODE_ENCODING_SET);
932
+ const outputFormat = argEnum(args, "outputFormat", OUTPUT_FORMAT_SET, "hex");
933
+ if (!data) throw new Error("data is required");
934
+ if (!encoding) throw new Error("encoding is required");
935
+ if (encoding === "url") {
936
+ const decoded = decodeUrl(data);
937
+ if (outputFormat === "hex") {
938
+ const raw = Buffer.from(decoded, "utf8");
939
+ return ok({
940
+ success: true,
941
+ encoding,
942
+ outputFormat,
943
+ byteLength: raw.length,
944
+ result: raw.toString("hex"),
945
+ hexDump: hexDump(raw)
946
+ });
947
+ }
948
+ if (outputFormat === "utf8") return ok({
949
+ success: true,
950
+ encoding,
951
+ outputFormat,
952
+ result: decoded
953
+ });
954
+ return ok({
955
+ success: true,
956
+ encoding,
957
+ outputFormat,
958
+ result: tryParseJson(decoded) ?? { text: decoded }
959
+ });
960
+ }
961
+ const rawBuffer = encoding === "base64" ? decodeBase64String(data) : encoding === "hex" ? decodeHexString(data) : decodeBinaryAuto(data);
962
+ if (encoding === "protobuf") {
963
+ const parsed = parseProtobufMessage(rawBuffer, 0, 5);
964
+ return renderDecodedOutput({
965
+ encoding,
966
+ outputFormat,
967
+ buffer: rawBuffer,
968
+ jsonValue: {
969
+ fields: parsed.fields,
970
+ bytesConsumed: parsed.bytesConsumed,
971
+ error: parsed.error ?? null
972
+ }
973
+ });
974
+ }
975
+ if (encoding === "msgpack") return renderDecodedOutput({
976
+ encoding,
977
+ outputFormat,
978
+ buffer: rawBuffer,
979
+ jsonValue: decodeMsgPack(rawBuffer)
980
+ });
981
+ return renderDecodedOutput({
982
+ encoding,
983
+ outputFormat,
984
+ buffer: rawBuffer
985
+ });
986
+ } catch (error) {
987
+ return fail("binary_decode", error);
988
+ }
989
+ }
990
+ async handleBinaryEncode(args) {
991
+ try {
992
+ const data = argString(args, "data", "");
993
+ const inputFormat = argEnum(args, "inputFormat", INPUT_FORMAT_SET, "utf8");
994
+ const outputEncoding = argEnum(args, "outputEncoding", OUTPUT_ENCODING_SET, "base64");
995
+ if (!data) throw new Error("data is required");
996
+ let buffer;
997
+ if (inputFormat === "utf8") buffer = Buffer.from(data, "utf8");
998
+ else if (inputFormat === "hex") buffer = decodeHexString(data);
999
+ else {
1000
+ const parsed = JSON.parse(data);
1001
+ buffer = Buffer.from(JSON.stringify(parsed), "utf8");
1002
+ }
1003
+ const output = outputEncoding === "base64" ? buffer.toString("base64") : outputEncoding === "hex" ? buffer.toString("hex") : encodeUrlBytes(buffer);
1004
+ return ok({
1005
+ success: true,
1006
+ inputFormat,
1007
+ outputEncoding,
1008
+ byteLength: buffer.length,
1009
+ output
1010
+ });
1011
+ } catch (error) {
1012
+ return fail("binary_encode", error);
1013
+ }
1014
+ }
1015
+ async handleBinaryEntropyAnalysis(args) {
1016
+ try {
1017
+ const source = argEnum(args, "source", ENTROPY_SOURCE_SET, "raw");
1018
+ const data = argString(args, "data");
1019
+ const filePath = argString(args, "filePath");
1020
+ if (source !== "file" && !data) throw new Error("data is required for non-file source");
1021
+ const blockSizeRaw = argNumber(args, "blockSize", 256);
1022
+ const blockSize = Math.max(16, Math.min(8192, Math.trunc(blockSizeRaw || 256)));
1023
+ const buffer = await resolveBufferBySource({
1024
+ source,
1025
+ data,
1026
+ filePath
1027
+ });
1028
+ const overallEntropy = calculateShannonEntropy(buffer);
1029
+ return ok({
1030
+ success: true,
1031
+ source,
1032
+ byteLength: buffer.length,
1033
+ blockSize,
1034
+ overallEntropy,
1035
+ blockEntropies: calculateBlockEntropies(buffer, blockSize),
1036
+ byteFrequency: calculateByteFrequency(buffer).slice(0, 20),
1037
+ assessment: assessEntropy(overallEntropy, buffer)
1038
+ });
1039
+ } catch (error) {
1040
+ return fail("binary_entropy_analysis", error);
1041
+ }
1042
+ }
1043
+ async handleProtobufDecodeRaw(args) {
1044
+ try {
1045
+ const data = argString(args, "data", "");
1046
+ if (!data) throw new Error("data is required");
1047
+ const maxDepthRaw = argNumber(args, "maxDepth", 5);
1048
+ const maxDepth = Math.max(1, Math.min(20, Math.trunc(maxDepthRaw || 5)));
1049
+ const buffer = decodeBase64String(data);
1050
+ const parsed = parseProtobufMessage(buffer, 0, maxDepth);
1051
+ return ok({
1052
+ success: parsed.error === void 0,
1053
+ byteLength: buffer.length,
1054
+ maxDepth,
1055
+ parsedBytes: parsed.bytesConsumed,
1056
+ fields: parsed.fields,
1057
+ error: parsed.error ?? null
1058
+ });
1059
+ } catch (error) {
1060
+ return fail("protobuf_decode_raw", error);
1061
+ }
1062
+ }
1063
+ };
1064
+ //#endregion
1065
+ export { EncodingToolHandlers };