@jshookmcp/jshook 0.2.8 → 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 +36 -5
- package/README.zh.md +36 -5
- package/dist/{AntiCheatDetector-S8VRj-dD.mjs → AntiCheatDetector-CqGDXmfc.mjs} +160 -54
- package/dist/{CodeInjector-4Z3ngPoX.mjs → CodeInjector-BdjRfNx7.mjs} +5 -5
- package/dist/ConsoleMonitor-DykL3IAw.mjs +2269 -0
- package/dist/{DarwinAPI-B8hg_yhz.mjs → DarwinAPI-ETyy0xyo.mjs} +1 -1
- package/dist/DetailedDataManager-HT49OrvF.mjs +217 -0
- package/dist/EventBus-DFKvADm3.mjs +141 -0
- package/dist/EvidenceGraphBridge-318Oi0Lf.mjs +153 -0
- package/dist/{ExtensionManager-D5-bO9D8.mjs → ExtensionManager-BDMsY2Dz.mjs} +27 -13
- package/dist/{FingerprintManager-BVxFJL2-.mjs → FingerprintManager-BN4UQWnX.mjs} +1 -1
- package/dist/{HardwareBreakpoint-DK1yjWkV.mjs → HardwareBreakpoint-Cc2AFq1Y.mjs} +3 -3
- package/dist/{HeapAnalyzer-CEbo10xU.mjs → HeapAnalyzer-DruMgsgj.mjs} +21 -21
- package/dist/HookGeneratorBuilders.core.generators.storage-CTbB4Lcx.mjs +566 -0
- package/dist/InstrumentationSession-DLH0vd-z.mjs +244 -0
- package/dist/{MemoryController-DdtnBdD4.mjs → MemoryController-CMtviNW_.mjs} +3 -3
- package/dist/{MemoryScanSession-RMixN3bX.mjs → MemoryScanSession-ITgb_NMi.mjs} +81 -78
- package/dist/{MemoryScanner-QjK4ld0B.mjs → MemoryScanner-CiL7Z3ey.mjs} +50 -21
- package/dist/{NativeMemoryManager.impl-CB6gJ0NM.mjs → NativeMemoryManager.impl-D9Lkovvn.mjs} +20 -56
- package/dist/{NativeMemoryManager.utils-BML4q1ry.mjs → NativeMemoryManager.utils-BBlAixF5.mjs} +1 -1
- package/dist/{PEAnalyzer-CK0xe0Fs.mjs → PEAnalyzer-DMQ44gen.mjs} +16 -16
- package/dist/PageController-BPJNqqBN.mjs +431 -0
- package/dist/{PointerChainEngine-Cd73qu5b.mjs → PointerChainEngine-K7wN8Z-w.mjs} +10 -7
- package/dist/PrerequisiteError-TuyZIs6n.mjs +20 -0
- package/dist/ProcessRegistry-zGg12QbE.mjs +74 -0
- package/dist/ResponseBuilder-CJXWmWNw.mjs +143 -0
- package/dist/ReverseEvidenceGraph-C02-gXOh.mjs +269 -0
- package/dist/ScriptManager-ZuWD-0Jg.mjs +3003 -0
- package/dist/{Speedhack-CeF0XmEz.mjs → Speedhack-D-z0umeT.mjs} +2 -2
- package/dist/{StructureAnalyzer-D4GkMduU.mjs → StructureAnalyzer-Cav5AVSL.mjs} +9 -6
- package/dist/ToolCatalog-5OJdMiF0.mjs +582 -0
- package/dist/ToolError-jh9whhMd.mjs +15 -0
- package/dist/ToolProbe-DbCFGyrg.mjs +45 -0
- package/dist/ToolRegistry-B9krbTtI.mjs +180 -0
- package/dist/ToolRouter.policy-BGDAGyeH.mjs +344 -0
- package/dist/TraceRecorder-B41Z5XBj.mjs +1286 -0
- package/dist/{Win32API-Bc0QnQsN.mjs → Win32API-C2kjj0ze.mjs} +19 -13
- package/dist/{Win32Debug-DUHt9XUn.mjs → Win32Debug-CKrGOTpo.mjs} +3 -3
- package/dist/WorkflowEngine-DJ6M4opp.mjs +569 -0
- package/dist/analysis-BHeJW2Nb.mjs +1234 -0
- package/dist/antidebug-BRKeyt27.mjs +1081 -0
- package/dist/artifactRetention-CPXkUJXp.mjs +598 -0
- package/dist/artifacts-DkfosXH3.mjs +59 -0
- package/dist/authorization-schema-DRqyJMSk.mjs +31 -0
- package/dist/betterSqlite3-DLSBZodi.mjs +74 -0
- package/dist/binary-instrument--V3MAhJ4.mjs +971 -0
- package/dist/bind-helpers-ClV34xdn.mjs +42 -0
- package/dist/boringssl-inspector-Bo_LOLaS.mjs +180 -0
- package/dist/browser-Dx3_S2cG.mjs +4369 -0
- package/dist/capabilities-CcHlvWgK.mjs +33 -0
- package/dist/concurrency-Drev_Vz9.mjs +41 -0
- package/dist/{constants-CCvsN80K.mjs → constants-CDZLOoVv.mjs} +105 -48
- package/dist/coordination-DgItD9DL.mjs +259 -0
- package/dist/debugger-RS3RSAqs.mjs +1288 -0
- package/dist/definitions-BEoYofW5.mjs +47 -0
- package/dist/definitions-BRaefg3u.mjs +365 -0
- package/dist/definitions-BbkvZkiv.mjs +96 -0
- package/dist/definitions-BtWSHJ3o.mjs +17 -0
- package/dist/definitions-C1gCHO0i.mjs +43 -0
- package/dist/definitions-CDOg_b-l.mjs +138 -0
- package/dist/definitions-CVPD9hzZ.mjs +54 -0
- package/dist/definitions-Cea8Lgl7.mjs +94 -0
- package/dist/definitions-DAgIyjxM.mjs +10 -0
- package/dist/definitions-DJA27nsL.mjs +66 -0
- package/dist/definitions-DKPFU3LW.mjs +25 -0
- package/dist/definitions-DPRpZQ96.mjs +47 -0
- package/dist/definitions-DUE5gmdn.mjs +18 -0
- package/dist/definitions-DYVjOtxa.mjs +26 -0
- package/dist/definitions-DcYLVLCo.mjs +37 -0
- package/dist/definitions-Pp5LI2H4.mjs +27 -0
- package/dist/definitions-j9KdHVNR.mjs +14 -0
- package/dist/definitions-uzkjBwa7.mjs +258 -0
- package/dist/definitions-va-AnLuQ.mjs +28 -0
- package/dist/encoding-DJeqHmpd.mjs +1079 -0
- package/dist/evidence-graph-bridge-DcYizFk2.mjs +136 -0
- package/dist/{factory-CibqTNC8.mjs → factory-C90tBff6.mjs} +41 -56
- package/dist/flat-target-session-Dgax2Cy3.mjs +29 -0
- package/dist/graphql-CoHrhweh.mjs +1197 -0
- package/dist/handlers-4jmR0nMs.mjs +898 -0
- package/dist/handlers-BAHPxcch.mjs +789 -0
- package/dist/handlers-BOs9b907.mjs +2600 -0
- package/dist/handlers-BWXEy6ef.mjs +917 -0
- package/dist/handlers-Bndn6QvE.mjs +111 -0
- package/dist/handlers-BqC4bD4s.mjs +681 -0
- package/dist/handlers-BtYq60bM2.mjs +276 -0
- package/dist/handlers-BzgcB4iv.mjs +799 -0
- package/dist/handlers-CRyRWj2b.mjs +859 -0
- package/dist/handlers-CVv2H1uq.mjs +592 -0
- package/dist/handlers-Dl5a7JS4.mjs +572 -0
- package/dist/handlers-Dx2d7jt7.mjs +2537 -0
- package/dist/handlers-Dz9PYsCa.mjs +2805 -0
- package/dist/handlers-HujRKC3b.mjs +661 -0
- package/dist/handlers.impl-XWXkQfyi.mjs +807 -0
- package/dist/hooks-B1B8NRHL.mjs +898 -0
- package/dist/index.mjs +491 -259
- package/dist/{logger-BmWzC2lM.mjs → logger-Dh_xb7_2.mjs} +14 -6
- package/dist/maintenance-PRMkLVRW.mjs +835 -0
- package/dist/manifest-67Bok-Si.mjs +58 -0
- package/dist/manifest-6lNTMZAB2.mjs +87 -0
- package/dist/manifest-B2duEHiH.mjs +90 -0
- package/dist/manifest-B6EY9Vm8.mjs +57 -0
- package/dist/manifest-B6nKSbyY.mjs +95 -0
- package/dist/manifest-BL8AQNPF.mjs +106 -0
- package/dist/manifest-BSZvJJmV.mjs +47 -0
- package/dist/manifest-BU7qzUyX.mjs +418 -0
- package/dist/manifest-Bl62e8WK.mjs +49 -0
- 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-C-xtsjS3.mjs +81 -0
- package/dist/manifest-CDYl7OhA.mjs +66 -0
- 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-D7YZM_2e.mjs +194 -0
- package/dist/manifest-DE_VrAeQ.mjs +314 -0
- package/dist/manifest-DGsXSCpT.mjs +39 -0
- package/dist/manifest-DJ2vfEuW.mjs +156 -0
- package/dist/manifest-DPXDYhEu.mjs +80 -0
- package/dist/manifest-Dd4fQb0a.mjs +322 -0
- package/dist/manifest-Deq6opGg.mjs +223 -0
- package/dist/manifest-DfJTafJK.mjs +37 -0
- package/dist/manifest-DgOdgN_j.mjs +50 -0
- package/dist/manifest-DlbMW4v4.mjs +47 -0
- package/dist/manifest-DmVfbH0w.mjs +374 -0
- 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-cEJU1v0Z.mjs +129 -0
- package/dist/manifest-wOl5XLB12.mjs +112 -0
- package/dist/modules-tZozf0LQ.mjs +10635 -0
- package/dist/mojo-ipc-DXNEXEqb.mjs +640 -0
- package/dist/network-CPVvwvFg.mjs +3852 -0
- package/dist/{artifacts-BbdOMET5.mjs → outputPaths-um7lCRY3.mjs} +219 -216
- package/dist/parse-args-B4cY5Vx5.mjs +39 -0
- package/dist/platform-CYeFoTWp.mjs +2161 -0
- package/dist/process-BTbgcVc6.mjs +1306 -0
- package/dist/proxy-r8YN6nP1.mjs +192 -0
- package/dist/registry-Bl8ZQW61.mjs +34 -0
- package/dist/response-CWhh2aLo.mjs +34 -0
- package/dist/server/plugin-api.mjs +2 -2
- package/dist/shared-state-board-BoZnSoj-.mjs +586 -0
- package/dist/sourcemap-BIDHUVXy.mjs +934 -0
- package/dist/ssrf-policy-Dsqd-DTX.mjs +166 -0
- package/dist/streaming-Dal6utPp.mjs +725 -0
- package/dist/tool-builder-BHJp32mV.mjs +186 -0
- package/dist/transform-DRVgGG90.mjs +1011 -0
- package/dist/types-Bx92KJfT.mjs +4 -0
- package/dist/wasm-BYx5UOeG.mjs +1044 -0
- package/dist/webcrack-Be0_FccV.mjs +747 -0
- package/dist/workflow-BpuKEtvn.mjs +725 -0
- package/package.json +82 -49
- package/dist/ExtensionManager-CPTJhHFg.mjs +0 -2
- package/dist/ToolCatalog-Bq4V2sbJ.mjs +0 -67201
- package/dist/{CacheAdapters-CzFNpD9a.mjs → CacheAdapters-jJFy20G-.mjs} +0 -0
- package/dist/{StealthVerifier-BzBCFiwx.mjs → StealthVerifier-BWmPgQsv.mjs} +0 -0
- package/dist/{VersionDetector-CNXcvD46.mjs → VersionDetector-K3V4vGsw.mjs} +0 -0
- package/dist/{formatAddress-ChCSIRWT.mjs → formatAddress-nnMvEohD.mjs} +0 -0
- package/dist/{types-BBjOqye-.mjs → types-DDBWs9UP.mjs} +1 -1
|
@@ -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 };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//#region src/utils/concurrency.ts
|
|
2
|
+
function pLimit(concurrency) {
|
|
3
|
+
if (concurrency < 1) throw new RangeError("concurrency must be >= 1");
|
|
4
|
+
let activeCount = 0;
|
|
5
|
+
const queue = [];
|
|
6
|
+
function next() {
|
|
7
|
+
if (queue.length > 0 && activeCount < concurrency) {
|
|
8
|
+
activeCount++;
|
|
9
|
+
queue.shift()();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function run(fn) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const execute = async () => {
|
|
15
|
+
try {
|
|
16
|
+
resolve(await fn());
|
|
17
|
+
} catch (err) {
|
|
18
|
+
reject(err);
|
|
19
|
+
} finally {
|
|
20
|
+
activeCount--;
|
|
21
|
+
next();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
if (activeCount < concurrency) {
|
|
25
|
+
activeCount++;
|
|
26
|
+
execute();
|
|
27
|
+
} else queue.push(() => {
|
|
28
|
+
execute();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return run;
|
|
33
|
+
}
|
|
34
|
+
/** External CLI calls, HAR export, large file I/O */
|
|
35
|
+
const ioLimit = pLimit(parseInt(process.env.jshook_IO_CONCURRENCY || "4", 10));
|
|
36
|
+
/** CPU-heavy: AST parsing, deobfuscation, binary decoding */
|
|
37
|
+
const cpuLimit = pLimit(parseInt(process.env.jshook_CPU_CONCURRENCY || "2", 10));
|
|
38
|
+
/** CDP-heavy: heap snapshots, traces, profiling */
|
|
39
|
+
const cdpLimit = pLimit(parseInt(process.env.jshook_CDP_CONCURRENCY || "2", 10));
|
|
40
|
+
//#endregion
|
|
41
|
+
export { cpuLimit as n, ioLimit as r, cdpLimit as t };
|
|
@@ -105,8 +105,8 @@ const TRANSFORM_WORKER_TIMEOUT_MS = int("TRANSFORM_WORKER_TIMEOUT_MS", 15e3);
|
|
|
105
105
|
int("TRANSFORM_VM_SCRIPT_TIMEOUT_MS", 5e3);
|
|
106
106
|
const TRANSFORM_CRYPTO_POOL_MAX_WORKERS = int("TRANSFORM_CRYPTO_POOL_MAX_WORKERS", 4);
|
|
107
107
|
const TRANSFORM_CRYPTO_POOL_IDLE_TIMEOUT_MS = int("TRANSFORM_CRYPTO_POOL_IDLE_TIMEOUT_MS", 3e4);
|
|
108
|
-
const TRANSFORM_CRYPTO_POOL_MAX_OLD_GEN_MB = int("TRANSFORM_CRYPTO_POOL_MAX_OLD_GEN_MB",
|
|
109
|
-
const TRANSFORM_CRYPTO_POOL_MAX_YOUNG_GEN_MB = int("TRANSFORM_CRYPTO_POOL_MAX_YOUNG_GEN_MB",
|
|
108
|
+
const TRANSFORM_CRYPTO_POOL_MAX_OLD_GEN_MB = int("TRANSFORM_CRYPTO_POOL_MAX_OLD_GEN_MB", 64);
|
|
109
|
+
const TRANSFORM_CRYPTO_POOL_MAX_YOUNG_GEN_MB = int("TRANSFORM_CRYPTO_POOL_MAX_YOUNG_GEN_MB", 16);
|
|
110
110
|
int("EMULATOR_FETCH_GOTO_TIMEOUT_MS", 3e4);
|
|
111
111
|
const WASM_TOOL_TIMEOUT_MS = int("WASM_TOOL_TIMEOUT_MS", 6e4);
|
|
112
112
|
int("WASM_OFFLINE_RUN_TIMEOUT_MS", 1e4);
|
|
@@ -125,17 +125,17 @@ int("NETWORK_REPLAY_TIMEOUT_MS", 3e4);
|
|
|
125
125
|
int("NETWORK_REPLAY_MAX_BODY_BYTES", 512e3);
|
|
126
126
|
const NETWORK_REPLAY_MAX_REDIRECTS = int("NETWORK_REPLAY_MAX_REDIRECTS", 5);
|
|
127
127
|
const NETWORK_HAR_BODY_CONCURRENCY = int("NETWORK_HAR_BODY_CONCURRENCY", 4);
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
int("WORKFLOW_BATCH_MAX_ACCOUNTS", 50);
|
|
129
|
+
int("WORKFLOW_BATCH_MAX_CONCURRENCY", 1);
|
|
130
130
|
int("WORKFLOW_REGISTER_ACCOUNT_TIMEOUT_MS", 6e4);
|
|
131
131
|
int("WORKFLOW_ACTION_DELAY_MS", 1e3);
|
|
132
132
|
int("WORKFLOW_SETTLE_DELAY_MS", 2e3);
|
|
133
133
|
int("WORKFLOW_INPUT_DELAY_MS", 1500);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
int("WORKFLOW_BATCH_MAX_RETRIES", 3);
|
|
135
|
+
int("WORKFLOW_BATCH_MAX_BACKOFF_MS", 3e4);
|
|
136
|
+
int("WORKFLOW_BATCH_MAX_TIMEOUT_MS", 3e5);
|
|
137
|
+
int("WORKFLOW_BATCH_RETRY_BACKOFF_MS", 2e3);
|
|
138
|
+
int("WORKFLOW_BATCH_TIMEOUT_PER_ACCOUNT_MS", 9e4);
|
|
139
139
|
const WORKFLOW_JS_BUNDLE_MAX_SIZE_BYTES = int("WORKFLOW_JS_BUNDLE_MAX_SIZE_BYTES", 20 * 1024 * 1024);
|
|
140
140
|
const WORKFLOW_JS_BUNDLE_MAX_REDIRECTS = int("WORKFLOW_JS_BUNDLE_MAX_REDIRECTS", 5);
|
|
141
141
|
const WORKFLOW_JS_BUNDLE_FETCH_TIMEOUT_MS = int("WORKFLOW_JS_BUNDLE_FETCH_TIMEOUT_MS", 3e4);
|
|
@@ -200,9 +200,6 @@ const COMPOUND_LONG_WINDOW_MS = int("COMPOUND_LONG_WINDOW_MS", 3e5);
|
|
|
200
200
|
/**
|
|
201
201
|
* GraphBoost-inspired search enhancements (see GraphBoost paper §4).
|
|
202
202
|
*
|
|
203
|
-
* SEARCH_TFIDF_COSINE_WEIGHT: weight of TF-IDF cosine similarity in hybrid
|
|
204
|
-
* scoring (0 = BM25 only, 1 = cosine only). Mirrors §4.1.3 hybrid retrieval.
|
|
205
|
-
*
|
|
206
203
|
* SEARCH_AFFINITY_BOOST_FACTOR: bonus applied to prefix-group neighbors of
|
|
207
204
|
* top search results. Mirrors §4.1.4 dependency hull expansion.
|
|
208
205
|
*
|
|
@@ -215,10 +212,9 @@ const COMPOUND_LONG_WINDOW_MS = int("COMPOUND_LONG_WINDOW_MS", 3e5);
|
|
|
215
212
|
* Mirrors §4.3 CSAPC cross-session caching. Raised to 500 to match the
|
|
216
213
|
* 431+ tool catalog size and reduce warm-cache miss rate.
|
|
217
214
|
*/
|
|
218
|
-
const
|
|
219
|
-
const
|
|
220
|
-
const
|
|
221
|
-
const SEARCH_DOMAIN_HUB_THRESHOLD = int("SEARCH_DOMAIN_HUB_THRESHOLD", 3);
|
|
215
|
+
const SEARCH_AFFINITY_BOOST_FACTOR = float("SEARCH_AFFINITY_BOOST_FACTOR", .36);
|
|
216
|
+
const SEARCH_AFFINITY_TOP_N = int("SEARCH_AFFINITY_TOP_N", 7);
|
|
217
|
+
const SEARCH_DOMAIN_HUB_THRESHOLD = int("SEARCH_DOMAIN_HUB_THRESHOLD", 6);
|
|
222
218
|
const SEARCH_QUERY_CACHE_CAPACITY = int("SEARCH_QUERY_CACHE_CAPACITY", 500);
|
|
223
219
|
/**
|
|
224
220
|
* Cache invalidation tolerance: cached entries are reusable while the
|
|
@@ -240,13 +236,13 @@ const SEARCH_CACHE_VECTOR_WEIGHT_TOLERANCE = float("SEARCH_CACHE_VECTOR_WEIGHT_T
|
|
|
240
236
|
* SEARCH_SYNONYM_EXPANSION_LIMIT: max synonym tokens added per original query term.
|
|
241
237
|
* SEARCH_PARAM_TOKEN_WEIGHT: weight for tool parameter name tokens in the index.
|
|
242
238
|
*/
|
|
243
|
-
const SEARCH_TRIGRAM_WEIGHT = float("SEARCH_TRIGRAM_WEIGHT", .
|
|
244
|
-
const SEARCH_TRIGRAM_THRESHOLD = float("SEARCH_TRIGRAM_THRESHOLD", .
|
|
245
|
-
const SEARCH_RRF_K = int("SEARCH_RRF_K",
|
|
246
|
-
const SEARCH_RRF_RESCALE_FACTOR = float("SEARCH_RRF_RESCALE_FACTOR",
|
|
247
|
-
const SEARCH_RRF_BM25_BLEND = float("SEARCH_RRF_BM25_BLEND", .
|
|
248
|
-
const SEARCH_SYNONYM_EXPANSION_LIMIT = int("SEARCH_SYNONYM_EXPANSION_LIMIT",
|
|
249
|
-
const SEARCH_PARAM_TOKEN_WEIGHT = float("SEARCH_PARAM_TOKEN_WEIGHT",
|
|
239
|
+
const SEARCH_TRIGRAM_WEIGHT = float("SEARCH_TRIGRAM_WEIGHT", .03);
|
|
240
|
+
const SEARCH_TRIGRAM_THRESHOLD = float("SEARCH_TRIGRAM_THRESHOLD", .15);
|
|
241
|
+
const SEARCH_RRF_K = int("SEARCH_RRF_K", 102);
|
|
242
|
+
const SEARCH_RRF_RESCALE_FACTOR = float("SEARCH_RRF_RESCALE_FACTOR", 2200);
|
|
243
|
+
const SEARCH_RRF_BM25_BLEND = float("SEARCH_RRF_BM25_BLEND", .76);
|
|
244
|
+
const SEARCH_SYNONYM_EXPANSION_LIMIT = int("SEARCH_SYNONYM_EXPANSION_LIMIT", 1);
|
|
245
|
+
const SEARCH_PARAM_TOKEN_WEIGHT = float("SEARCH_PARAM_TOKEN_WEIGHT", 3.4);
|
|
250
246
|
/**
|
|
251
247
|
* BM25 scoring parameters.
|
|
252
248
|
*
|
|
@@ -255,8 +251,8 @@ const SEARCH_PARAM_TOKEN_WEIGHT = float("SEARCH_PARAM_TOKEN_WEIGHT", 1.5);
|
|
|
255
251
|
* The previous hardcoded value of 0.3 under-penalized long descriptions,
|
|
256
252
|
* allowing verbose tools to crowd the top results.
|
|
257
253
|
*/
|
|
258
|
-
const SEARCH_BM25_K1 = float("SEARCH_BM25_K1",
|
|
259
|
-
const SEARCH_BM25_B = float("SEARCH_BM25_B", .
|
|
254
|
+
const SEARCH_BM25_K1 = float("SEARCH_BM25_K1", .8);
|
|
255
|
+
const SEARCH_BM25_B = float("SEARCH_BM25_B", .65);
|
|
260
256
|
/**
|
|
261
257
|
* Dense vector search (Phase 8 — Hybrid Semantic Routing).
|
|
262
258
|
*
|
|
@@ -271,17 +267,28 @@ const SEARCH_BM25_B = float("SEARCH_BM25_B", .75);
|
|
|
271
267
|
*/
|
|
272
268
|
const SEARCH_VECTOR_ENABLED = bool("SEARCH_VECTOR_ENABLED", true);
|
|
273
269
|
const SEARCH_VECTOR_MODEL_ID = str("SEARCH_VECTOR_MODEL_ID", "Xenova/bge-micro-v2");
|
|
274
|
-
const SEARCH_VECTOR_COSINE_WEIGHT = float("SEARCH_VECTOR_COSINE_WEIGHT", .
|
|
270
|
+
const SEARCH_VECTOR_COSINE_WEIGHT = float("SEARCH_VECTOR_COSINE_WEIGHT", .69);
|
|
275
271
|
const SEARCH_VECTOR_DYNAMIC_WEIGHT = bool("SEARCH_VECTOR_DYNAMIC_WEIGHT", true);
|
|
276
|
-
const SEARCH_VECTOR_LEARN_UP = float("SEARCH_VECTOR_LEARN_UP", .
|
|
277
|
-
const SEARCH_VECTOR_LEARN_DOWN = float("SEARCH_VECTOR_LEARN_DOWN", .
|
|
278
|
-
const SEARCH_VECTOR_LEARN_TOP_N = int("SEARCH_VECTOR_LEARN_TOP_N",
|
|
272
|
+
const SEARCH_VECTOR_LEARN_UP = float("SEARCH_VECTOR_LEARN_UP", .07);
|
|
273
|
+
const SEARCH_VECTOR_LEARN_DOWN = float("SEARCH_VECTOR_LEARN_DOWN", .02);
|
|
274
|
+
const SEARCH_VECTOR_LEARN_TOP_N = int("SEARCH_VECTOR_LEARN_TOP_N", 6);
|
|
275
|
+
/**
|
|
276
|
+
* SEARCH_VECTOR_BM25_SKIP_THRESHOLD: when the top BM25 score meets or exceeds
|
|
277
|
+
* this value, dense vector scoring is skipped — the text signal is already
|
|
278
|
+
* strong enough that embeddings rarely change the ranking.
|
|
279
|
+
* Set to 0 to always run vector scoring (original behavior).
|
|
280
|
+
*/
|
|
281
|
+
const SEARCH_VECTOR_BM25_SKIP_THRESHOLD = float("SEARCH_VECTOR_BM25_SKIP_THRESHOLD", 5);
|
|
279
282
|
/**
|
|
280
283
|
* Profile tier-aware ranking: tools whose domain is not visible under the
|
|
281
284
|
* caller's active tier (search ⊂ workflow ⊂ full) are not filtered out but
|
|
282
285
|
* downweighted by this multiplier (0..1). Setting to 1 disables the penalty.
|
|
283
286
|
*/
|
|
284
|
-
const SEARCH_TIER_PENALTY = float("SEARCH_TIER_PENALTY", .
|
|
287
|
+
const SEARCH_TIER_PENALTY = float("SEARCH_TIER_PENALTY", .35);
|
|
288
|
+
/** Per-profile tier penalty overrides. When set, these take precedence over SEARCH_TIER_PENALTY. */
|
|
289
|
+
const SEARCH_TIER_PENALTY_SEARCH = float("SEARCH_TIER_PENALTY_SEARCH", .88);
|
|
290
|
+
const SEARCH_TIER_PENALTY_WORKFLOW = float("SEARCH_TIER_PENALTY_WORKFLOW", .52);
|
|
291
|
+
const SEARCH_TIER_PENALTY_FULL = float("SEARCH_TIER_PENALTY_FULL", .64);
|
|
285
292
|
/**
|
|
286
293
|
* Recency / frequency boost: tools invoked within SEARCH_RECENCY_WINDOW_MS
|
|
287
294
|
* receive a log-scaled boost up to SEARCH_RECENCY_MAX_BOOST. Helps user-
|
|
@@ -291,7 +298,7 @@ const SEARCH_TIER_PENALTY = float("SEARCH_TIER_PENALTY", .7);
|
|
|
291
298
|
* long sessions; evicted entries are the oldest insertions (LRU).
|
|
292
299
|
*/
|
|
293
300
|
const SEARCH_RECENCY_WINDOW_MS = int("SEARCH_RECENCY_WINDOW_MS", 30 * 6e4);
|
|
294
|
-
const SEARCH_RECENCY_MAX_BOOST = float("SEARCH_RECENCY_MAX_BOOST", .
|
|
301
|
+
const SEARCH_RECENCY_MAX_BOOST = float("SEARCH_RECENCY_MAX_BOOST", .75);
|
|
295
302
|
const SEARCH_RECENCY_TRACKER_MAX = int("SEARCH_RECENCY_TRACKER_MAX", 200);
|
|
296
303
|
/**
|
|
297
304
|
* Additional fine-grained scoring knobs. These used to be hardcoded; moving
|
|
@@ -312,11 +319,11 @@ const SEARCH_RECENCY_TRACKER_MAX = int("SEARCH_RECENCY_TRACKER_MAX", 200);
|
|
|
312
319
|
* PREDICTIVE_MAX_SECOND_ORDER_KEYS — upper bound on the second-order
|
|
313
320
|
* Markov table to keep memory usage predictable.
|
|
314
321
|
*/
|
|
315
|
-
const SEARCH_EXACT_NAME_MATCH_MULTIPLIER = float("SEARCH_EXACT_NAME_MATCH_MULTIPLIER",
|
|
316
|
-
const SEARCH_DOMAIN_HUB_BOOST_MULTIPLIER = float("SEARCH_DOMAIN_HUB_BOOST_MULTIPLIER", 1.
|
|
317
|
-
const SEARCH_AFFINITY_BASE_WEIGHT = float("SEARCH_AFFINITY_BASE_WEIGHT", .
|
|
322
|
+
const SEARCH_EXACT_NAME_MATCH_MULTIPLIER = float("SEARCH_EXACT_NAME_MATCH_MULTIPLIER", 5.8);
|
|
323
|
+
const SEARCH_DOMAIN_HUB_BOOST_MULTIPLIER = float("SEARCH_DOMAIN_HUB_BOOST_MULTIPLIER", 1.11);
|
|
324
|
+
const SEARCH_AFFINITY_BASE_WEIGHT = float("SEARCH_AFFINITY_BASE_WEIGHT", .1);
|
|
318
325
|
const SEARCH_COVERAGE_PRECISION_FACTOR = float("SEARCH_COVERAGE_PRECISION_FACTOR", .5);
|
|
319
|
-
const SEARCH_PREFIX_MATCH_MULTIPLIER = float("SEARCH_PREFIX_MATCH_MULTIPLIER", .
|
|
326
|
+
const SEARCH_PREFIX_MATCH_MULTIPLIER = float("SEARCH_PREFIX_MATCH_MULTIPLIER", .32);
|
|
320
327
|
const PREDICTIVE_MAX_SECOND_ORDER_KEYS = int("PREDICTIVE_MAX_SECOND_ORDER_KEYS", 1e3);
|
|
321
328
|
const EXTENSION_GIT_CLONE_TIMEOUT_MS = int("EXTENSION_GIT_CLONE_TIMEOUT_MS", 6e4);
|
|
322
329
|
const EXTENSION_GIT_CHECKOUT_TIMEOUT_MS = int("EXTENSION_GIT_CHECKOUT_TIMEOUT_MS", 3e4);
|
|
@@ -361,23 +368,23 @@ int("ADV_DEOBF_LLM_MAX_TOKENS", 3e3);
|
|
|
361
368
|
int("VM_DEOBF_LLM_MAX_TOKENS", 4e3);
|
|
362
369
|
int("DEOBF_LLM_MAX_TOKENS", 2e3);
|
|
363
370
|
int("CRYPTO_DETECT_LLM_MAX_TOKENS", 2e3);
|
|
364
|
-
int("MEMORY_READ_TIMEOUT_MS", 1e4);
|
|
371
|
+
const MEMORY_READ_TIMEOUT_MS = int("MEMORY_READ_TIMEOUT_MS", 1e4);
|
|
365
372
|
const MEMORY_MAX_READ_BYTES = int("MEMORY_MAX_READ_BYTES", 16 * 1024 * 1024);
|
|
366
|
-
int("MEMORY_WRITE_TIMEOUT_MS", 1e4);
|
|
373
|
+
const MEMORY_WRITE_TIMEOUT_MS = int("MEMORY_WRITE_TIMEOUT_MS", 1e4);
|
|
367
374
|
const MEMORY_MAX_WRITE_BYTES = int("MEMORY_MAX_WRITE_BYTES", 16 * 1024);
|
|
368
|
-
int("MEMORY_DUMP_TIMEOUT_MS", 6e4);
|
|
369
|
-
int("MEMORY_SCAN_TIMEOUT_MS", 12e4);
|
|
370
|
-
int("MEMORY_SCAN_MAX_BUFFER_BYTES", 1024 * 1024 * 50);
|
|
375
|
+
const MEMORY_DUMP_TIMEOUT_MS = int("MEMORY_DUMP_TIMEOUT_MS", 6e4);
|
|
376
|
+
const MEMORY_SCAN_TIMEOUT_MS = int("MEMORY_SCAN_TIMEOUT_MS", 12e4);
|
|
377
|
+
const MEMORY_SCAN_MAX_BUFFER_BYTES = int("MEMORY_SCAN_MAX_BUFFER_BYTES", 1024 * 1024 * 50);
|
|
371
378
|
const MEMORY_SCAN_MAX_RESULTS = int("MEMORY_SCAN_MAX_RESULTS", 1e4);
|
|
372
379
|
int("MEMORY_SCAN_MAX_REGIONS", 5e4);
|
|
373
380
|
int("MEMORY_SCAN_REGION_MAX_BYTES", 16777216);
|
|
374
|
-
int("MEMORY_INJECT_TIMEOUT_MS", 3e4);
|
|
381
|
+
const MEMORY_INJECT_TIMEOUT_MS = int("MEMORY_INJECT_TIMEOUT_MS", 3e4);
|
|
375
382
|
const ENABLE_INJECTION_TOOLS = bool("ENABLE_INJECTION_TOOLS", true);
|
|
376
383
|
int("MEMORY_MONITOR_INTERVAL_MS", 1e3);
|
|
377
|
-
int("MEMORY_VMMAP_TIMEOUT_MS", 15e3);
|
|
378
|
-
int("MEMORY_PROTECTION_QUERY_TIMEOUT_MS", 15e3);
|
|
379
|
-
int("MEMORY_PROTECTION_PWSH_TIMEOUT_MS", 3e4);
|
|
380
|
-
int("NATIVE_ADMIN_CHECK_TIMEOUT_MS", 5e3);
|
|
384
|
+
const MEMORY_VMMAP_TIMEOUT_MS = int("MEMORY_VMMAP_TIMEOUT_MS", 15e3);
|
|
385
|
+
const MEMORY_PROTECTION_QUERY_TIMEOUT_MS = int("MEMORY_PROTECTION_QUERY_TIMEOUT_MS", 15e3);
|
|
386
|
+
const MEMORY_PROTECTION_PWSH_TIMEOUT_MS = int("MEMORY_PROTECTION_PWSH_TIMEOUT_MS", 3e4);
|
|
387
|
+
const NATIVE_ADMIN_CHECK_TIMEOUT_MS = int("NATIVE_ADMIN_CHECK_TIMEOUT_MS", 5e3);
|
|
381
388
|
int("NATIVE_SCAN_MAX_RESULTS", 1e4);
|
|
382
389
|
/** Launch wait after spawning a debug process (Linux/Mac). */
|
|
383
390
|
const PROCESS_LAUNCH_WAIT_MS = int("PROCESS_LAUNCH_WAIT_MS", 2e3);
|
|
@@ -459,13 +466,34 @@ const HTTP_RATE_LIMIT_MAX_IPS = int("HTTP_RATE_LIMIT_MAX_IPS", 1e4);
|
|
|
459
466
|
/** Frequency of the HTTP transport's rate-limit + session cleanup sweep. */
|
|
460
467
|
const HTTP_CLEANUP_INTERVAL_MS = int("HTTP_CLEANUP_INTERVAL_MS", 5 * 6e4);
|
|
461
468
|
int("SSE_HEARTBEAT_MS", 3e4);
|
|
469
|
+
/**
|
|
470
|
+
* When true, strip parameter descriptions from registered tool schemas
|
|
471
|
+
* to reduce the tools/list payload. Full schemas remain available via
|
|
472
|
+
* the describe_tool meta-tool. Default: true for full profile.
|
|
473
|
+
*/
|
|
474
|
+
const MCP_COMPACT_SCHEMA = bool("MCP_COMPACT_SCHEMA", true);
|
|
462
475
|
/** Hard ceiling applied to user-supplied sandbox exec timeouts. */
|
|
463
476
|
const SANDBOX_MAX_TIMEOUT_MS = int("SANDBOX_MAX_TIMEOUT_MS", 3e4);
|
|
464
477
|
int("NATIVE_BRIDGE_TIMEOUT_MS", 15e3);
|
|
465
|
-
|
|
466
|
-
const SOURCEMAP_EXT_TIMEOUT_MS = int("SOURCEMAP_EXT_TIMEOUT_MS", 15e3);
|
|
478
|
+
int("SOURCEMAP_EXT_TIMEOUT_MS", 15e3);
|
|
467
479
|
/** Timeout for the V8 bytecode extraction subprocess helper. */
|
|
468
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);
|
|
469
497
|
/** Default per-command processing timeout inside the webhook command queue. */
|
|
470
498
|
const WEBHOOK_PROCESS_TIMEOUT_MS = int("WEBHOOK_PROCESS_TIMEOUT_MS", 1e4);
|
|
471
499
|
int("ORCHESTRATOR_STEP_TIMEOUT_MS", 1e4);
|
|
@@ -473,5 +501,34 @@ int("ORCHESTRATOR_STEP_TIMEOUT_MS", 1e4);
|
|
|
473
501
|
const MACRO_DEFAULT_TIMEOUT_MS = int("MACRO_DEFAULT_TIMEOUT_MS", 12e4);
|
|
474
502
|
/** Default per-invocation timeout for built-in macro definitions. */
|
|
475
503
|
const MACRO_BUILTIN_TIMEOUT_MS = int("MACRO_BUILTIN_TIMEOUT_MS", 6e4);
|
|
504
|
+
/** Timeout for waiting on an iframe selector during frame resolution. */
|
|
505
|
+
const PAGE_FRAME_SELECTOR_TIMEOUT_MS = int("PAGE_FRAME_SELECTOR_TIMEOUT_MS", 1e4);
|
|
506
|
+
/** Timeout for waitForNetworkIdle in PageController. */
|
|
507
|
+
const PAGE_NETWORK_IDLE_TIMEOUT_MS = int("PAGE_NETWORK_IDLE_TIMEOUT_MS", 3e4);
|
|
508
|
+
/** Default limit for querySelectorAll results in DOMInspector. */
|
|
509
|
+
const DOM_QUERY_DEFAULT_LIMIT = int("DOM_QUERY_DEFAULT_LIMIT", 50);
|
|
510
|
+
/** Timeout for waitForElement (waitForSelector) in DOMInspector. */
|
|
511
|
+
const DOM_WAIT_ELEMENT_TIMEOUT_MS = int("DOM_WAIT_ELEMENT_TIMEOUT_MS", 3e4);
|
|
512
|
+
int("BROWSER_POOL_IDLE_TIMEOUT_MS", 3e5);
|
|
513
|
+
int("BROWSER_POOL_MAX_TABS", 10);
|
|
514
|
+
/** Default timeout for a single ICMP ping probe. */
|
|
515
|
+
const ICMP_PROBE_TIMEOUT_MS = int("ICMP_PROBE_TIMEOUT_MS", 5e3);
|
|
516
|
+
/** Default max hops for traceroute. */
|
|
517
|
+
const ICMP_TRACEROUTE_MAX_HOPS = int("ICMP_TRACEROUTE_MAX_HOPS", 30);
|
|
518
|
+
/** Default ICMP packet payload size in bytes. */
|
|
519
|
+
const ICMP_DEFAULT_PACKET_SIZE = int("ICMP_DEFAULT_PACKET_SIZE", 32);
|
|
520
|
+
int("ADB_VERSION_CHECK_TIMEOUT_MS", 5e3);
|
|
521
|
+
/** Timeout for page.goto when restoring a page snapshot. */
|
|
522
|
+
const COORDINATION_GOTO_TIMEOUT_MS = int("COORDINATION_GOTO_TIMEOUT_MS", 3e4);
|
|
523
|
+
/** Capacity of the ring-buffer audit trail for memory operations. */
|
|
524
|
+
const MEMORY_AUDIT_TRAIL_CAPACITY = int("MEMORY_AUDIT_TRAIL_CAPACITY", 5e3);
|
|
525
|
+
/** Timeout for process stop/continue signals during memory scan. */
|
|
526
|
+
const MEMORY_PROCESS_SIGNAL_TIMEOUT_MS = int("MEMORY_PROCESS_SIGNAL_TIMEOUT_MS", 2e3);
|
|
527
|
+
/** Timeout for shell probes during memory availability detection. */
|
|
528
|
+
const MEMORY_PROBE_CMD_TIMEOUT_MS = int("MEMORY_PROBE_CMD_TIMEOUT_MS", 5e3);
|
|
529
|
+
/** Timeout for vmmap and similar region enumeration subprocesses. */
|
|
530
|
+
const MEMORY_VMMAP_ENUM_TIMEOUT_MS = int("MEMORY_VMMAP_ENUM_TIMEOUT_MS", 15e3);
|
|
531
|
+
/** Timeout for PowerShell-based module listing subprocesses. */
|
|
532
|
+
const MEMORY_MODULES_TIMEOUT_MS = int("MEMORY_MODULES_TIMEOUT_MS", 3e4);
|
|
476
533
|
//#endregion
|
|
477
|
-
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 };
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { N as COORDINATION_GOTO_TIMEOUT_MS } from "./constants-CDZLOoVv.mjs";
|
|
2
|
+
import "./definitions-BtWSHJ3o.mjs";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
//#region src/server/domains/coordination/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Coordination domain handler — manages Planner/Specialist Agent handoffs
|
|
7
|
+
* and session-level insight accumulation.
|
|
8
|
+
*
|
|
9
|
+
* All state is in-memory for the lifetime of the MCP session.
|
|
10
|
+
* No persistence — handoffs and insights are ephemeral by design
|
|
11
|
+
* (use the knowledge-base plugin repository for cross-session persistence).
|
|
12
|
+
*/
|
|
13
|
+
var CoordinationHandlers = class {
|
|
14
|
+
handoffs = /* @__PURE__ */ new Map();
|
|
15
|
+
insights = [];
|
|
16
|
+
ctx;
|
|
17
|
+
constructor(ctx) {
|
|
18
|
+
this.ctx = ctx;
|
|
19
|
+
}
|
|
20
|
+
async handleCreateTaskHandoff(args) {
|
|
21
|
+
const description = args.description;
|
|
22
|
+
const constraints = args.constraints;
|
|
23
|
+
const targetDomain = args.targetDomain;
|
|
24
|
+
let pageUrl;
|
|
25
|
+
try {
|
|
26
|
+
const pc = this.ctx.pageController;
|
|
27
|
+
if (pc) {
|
|
28
|
+
const resolvedPage = await pc.getPage?.();
|
|
29
|
+
if (resolvedPage && typeof resolvedPage.url === "function") pageUrl = resolvedPage.url();
|
|
30
|
+
}
|
|
31
|
+
} catch {}
|
|
32
|
+
const handoff = {
|
|
33
|
+
id: randomUUID().slice(0, 8),
|
|
34
|
+
status: "pending",
|
|
35
|
+
description,
|
|
36
|
+
constraints,
|
|
37
|
+
targetDomain,
|
|
38
|
+
pageUrl,
|
|
39
|
+
createdAt: Date.now()
|
|
40
|
+
};
|
|
41
|
+
this.handoffs.set(handoff.id, handoff);
|
|
42
|
+
return {
|
|
43
|
+
taskId: handoff.id,
|
|
44
|
+
status: handoff.status,
|
|
45
|
+
description: handoff.description,
|
|
46
|
+
constraints: handoff.constraints,
|
|
47
|
+
targetDomain: handoff.targetDomain,
|
|
48
|
+
pageUrl: handoff.pageUrl,
|
|
49
|
+
createdAt: new Date(handoff.createdAt).toISOString(),
|
|
50
|
+
totalActiveHandoffs: this.handoffs.size
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async handleCompleteTaskHandoff(args) {
|
|
54
|
+
const taskId = args.taskId;
|
|
55
|
+
const summary = args.summary;
|
|
56
|
+
const keyFindings = args.keyFindings;
|
|
57
|
+
const artifacts = args.artifacts;
|
|
58
|
+
const handoff = this.handoffs.get(taskId);
|
|
59
|
+
if (!handoff) throw new Error(`Task handoff "${taskId}" not found. Active IDs: ${[...this.handoffs.keys()].join(", ") || "(none)"}`);
|
|
60
|
+
if (handoff.status === "completed") throw new Error(`Task handoff "${taskId}" is already completed`);
|
|
61
|
+
handoff.status = "completed";
|
|
62
|
+
handoff.completedAt = Date.now();
|
|
63
|
+
handoff.summary = summary;
|
|
64
|
+
handoff.keyFindings = keyFindings;
|
|
65
|
+
handoff.artifacts = artifacts;
|
|
66
|
+
return {
|
|
67
|
+
taskId: handoff.id,
|
|
68
|
+
status: "completed",
|
|
69
|
+
summary: handoff.summary,
|
|
70
|
+
keyFindings: handoff.keyFindings,
|
|
71
|
+
artifacts: handoff.artifacts,
|
|
72
|
+
durationMs: handoff.completedAt - handoff.createdAt
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async handleGetTaskContext(args) {
|
|
76
|
+
const taskId = args.taskId;
|
|
77
|
+
if (taskId) {
|
|
78
|
+
const handoff = this.handoffs.get(taskId);
|
|
79
|
+
if (!handoff) throw new Error(`Task handoff "${taskId}" not found`);
|
|
80
|
+
return { handoff: this.serializeHandoff(handoff) };
|
|
81
|
+
}
|
|
82
|
+
const handoffs = [...this.handoffs.values()].map((h) => this.serializeHandoff(h));
|
|
83
|
+
const active = handoffs.filter((h) => h.status !== "completed");
|
|
84
|
+
const completed = handoffs.filter((h) => h.status === "completed");
|
|
85
|
+
return {
|
|
86
|
+
active,
|
|
87
|
+
completed,
|
|
88
|
+
sessionInsights: this.insights.map((i) => ({
|
|
89
|
+
id: i.id,
|
|
90
|
+
category: i.category,
|
|
91
|
+
content: i.content,
|
|
92
|
+
confidence: i.confidence,
|
|
93
|
+
timestamp: new Date(i.timestamp).toISOString(),
|
|
94
|
+
sourceTaskId: i.sourceTaskId
|
|
95
|
+
})),
|
|
96
|
+
summary: {
|
|
97
|
+
totalActive: active.length,
|
|
98
|
+
totalCompleted: completed.length,
|
|
99
|
+
totalInsights: this.insights.length
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async handleAppendSessionInsight(args) {
|
|
104
|
+
const category = args.category;
|
|
105
|
+
const content = args.content;
|
|
106
|
+
const confidence = args.confidence ?? 1;
|
|
107
|
+
const activeHandoff = [...this.handoffs.values()].find((h) => h.status === "in_progress" || h.status === "pending");
|
|
108
|
+
const insight = {
|
|
109
|
+
id: randomUUID().slice(0, 8),
|
|
110
|
+
category,
|
|
111
|
+
content,
|
|
112
|
+
confidence,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
sourceTaskId: activeHandoff?.id
|
|
115
|
+
};
|
|
116
|
+
this.insights.push(insight);
|
|
117
|
+
return {
|
|
118
|
+
insightId: insight.id,
|
|
119
|
+
category: insight.category,
|
|
120
|
+
totalInsights: this.insights.length,
|
|
121
|
+
totalByCategory: this.getInsightCountByCategory()
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
serializeHandoff(h) {
|
|
125
|
+
return {
|
|
126
|
+
taskId: h.id,
|
|
127
|
+
status: h.status,
|
|
128
|
+
description: h.description,
|
|
129
|
+
constraints: h.constraints,
|
|
130
|
+
targetDomain: h.targetDomain,
|
|
131
|
+
pageUrl: h.pageUrl,
|
|
132
|
+
createdAt: new Date(h.createdAt).toISOString(),
|
|
133
|
+
completedAt: h.completedAt ? new Date(h.completedAt).toISOString() : void 0,
|
|
134
|
+
summary: h.summary,
|
|
135
|
+
keyFindings: h.keyFindings,
|
|
136
|
+
artifacts: h.artifacts
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
getInsightCountByCategory() {
|
|
140
|
+
const counts = {};
|
|
141
|
+
for (const insight of this.insights) counts[insight.category] = (counts[insight.category] ?? 0) + 1;
|
|
142
|
+
return counts;
|
|
143
|
+
}
|
|
144
|
+
snapshots = /* @__PURE__ */ new Map();
|
|
145
|
+
async handleSavePageSnapshot(args) {
|
|
146
|
+
const label = args.label;
|
|
147
|
+
const pc = this.ctx.pageController;
|
|
148
|
+
if (!pc) throw new Error("No page controller available");
|
|
149
|
+
const page = await pc.getPage();
|
|
150
|
+
if (!page) throw new Error("No active page to snapshot");
|
|
151
|
+
const url = page.url();
|
|
152
|
+
let cookies = [];
|
|
153
|
+
try {
|
|
154
|
+
const cdp = await page.createCDPSession();
|
|
155
|
+
cookies = (await cdp.send("Network.getAllCookies")).cookies.map((c) => ({
|
|
156
|
+
name: c.name,
|
|
157
|
+
value: c.value,
|
|
158
|
+
domain: c.domain,
|
|
159
|
+
path: c.path
|
|
160
|
+
}));
|
|
161
|
+
await cdp.detach();
|
|
162
|
+
} catch {}
|
|
163
|
+
let localStorage = {};
|
|
164
|
+
let sessionStorage = {};
|
|
165
|
+
try {
|
|
166
|
+
localStorage = await page.evaluate(() => {
|
|
167
|
+
const ls = {};
|
|
168
|
+
for (let i = 0; i < window.localStorage.length; i++) {
|
|
169
|
+
const key = window.localStorage.key(i);
|
|
170
|
+
if (key) ls[key] = window.localStorage.getItem(key) ?? "";
|
|
171
|
+
}
|
|
172
|
+
return ls;
|
|
173
|
+
});
|
|
174
|
+
sessionStorage = await page.evaluate(() => {
|
|
175
|
+
const ss = {};
|
|
176
|
+
for (let i = 0; i < window.sessionStorage.length; i++) {
|
|
177
|
+
const key = window.sessionStorage.key(i);
|
|
178
|
+
if (key) ss[key] = window.sessionStorage.getItem(key) ?? "";
|
|
179
|
+
}
|
|
180
|
+
return ss;
|
|
181
|
+
});
|
|
182
|
+
} catch {}
|
|
183
|
+
const snapshot = {
|
|
184
|
+
id: randomUUID().slice(0, 8),
|
|
185
|
+
url,
|
|
186
|
+
cookies,
|
|
187
|
+
localStorage,
|
|
188
|
+
sessionStorage,
|
|
189
|
+
timestamp: Date.now(),
|
|
190
|
+
label
|
|
191
|
+
};
|
|
192
|
+
this.snapshots.set(snapshot.id, snapshot);
|
|
193
|
+
return {
|
|
194
|
+
snapshotId: snapshot.id,
|
|
195
|
+
url: snapshot.url,
|
|
196
|
+
cookieCount: snapshot.cookies.length,
|
|
197
|
+
localStorageKeys: Object.keys(snapshot.localStorage).length,
|
|
198
|
+
sessionStorageKeys: Object.keys(snapshot.sessionStorage).length,
|
|
199
|
+
label: snapshot.label
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
async handleRestorePageSnapshot(args) {
|
|
203
|
+
const snapshotId = args.snapshotId;
|
|
204
|
+
if (!snapshotId) throw new Error("snapshotId is required");
|
|
205
|
+
const snapshot = this.snapshots.get(snapshotId);
|
|
206
|
+
if (!snapshot) throw new Error(`Snapshot "${snapshotId}" not found`);
|
|
207
|
+
const pc = this.ctx.pageController;
|
|
208
|
+
if (!pc) throw new Error("No page controller available");
|
|
209
|
+
const page = await pc.getPage();
|
|
210
|
+
if (!page) throw new Error("No active page for restoration");
|
|
211
|
+
await page.goto(snapshot.url, {
|
|
212
|
+
waitUntil: "domcontentloaded",
|
|
213
|
+
timeout: COORDINATION_GOTO_TIMEOUT_MS
|
|
214
|
+
});
|
|
215
|
+
if (snapshot.cookies.length > 0) try {
|
|
216
|
+
const cdp = await page.createCDPSession();
|
|
217
|
+
await cdp.send("Network.setCookies", { cookies: snapshot.cookies.map((c) => ({
|
|
218
|
+
name: c.name,
|
|
219
|
+
value: c.value,
|
|
220
|
+
domain: c.domain,
|
|
221
|
+
path: c.path
|
|
222
|
+
})) });
|
|
223
|
+
await cdp.detach();
|
|
224
|
+
} catch {}
|
|
225
|
+
try {
|
|
226
|
+
await page.evaluate((ls, ss) => {
|
|
227
|
+
window.localStorage.clear();
|
|
228
|
+
for (const [k, v] of Object.entries(ls)) window.localStorage.setItem(k, v);
|
|
229
|
+
window.sessionStorage.clear();
|
|
230
|
+
for (const [k, v] of Object.entries(ss)) window.sessionStorage.setItem(k, v);
|
|
231
|
+
}, snapshot.localStorage, snapshot.sessionStorage);
|
|
232
|
+
} catch {}
|
|
233
|
+
return {
|
|
234
|
+
restored: true,
|
|
235
|
+
snapshotId: snapshot.id,
|
|
236
|
+
url: snapshot.url,
|
|
237
|
+
cookiesRestored: snapshot.cookies.length,
|
|
238
|
+
localStorageKeysRestored: Object.keys(snapshot.localStorage).length,
|
|
239
|
+
sessionStorageKeysRestored: Object.keys(snapshot.sessionStorage).length
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
async handleListPageSnapshots() {
|
|
243
|
+
const list = [...this.snapshots.values()].map((s) => ({
|
|
244
|
+
id: s.id,
|
|
245
|
+
url: s.url,
|
|
246
|
+
label: s.label,
|
|
247
|
+
cookieCount: s.cookies.length,
|
|
248
|
+
localStorageKeys: Object.keys(s.localStorage).length,
|
|
249
|
+
sessionStorageKeys: Object.keys(s.sessionStorage).length,
|
|
250
|
+
createdAt: new Date(s.timestamp).toISOString()
|
|
251
|
+
}));
|
|
252
|
+
return {
|
|
253
|
+
snapshots: list,
|
|
254
|
+
total: list.length
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
//#endregion
|
|
259
|
+
export { CoordinationHandlers };
|