@jshookmcp/jshook 0.3.1 → 0.3.3
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/LICENSE +661 -661
- package/README.md +11 -3
- package/README.zh.md +11 -3
- package/dist/{AntiCheatDetector-CGVGNfy5.mjs → AntiCheatDetector-CUpZBh5O.mjs} +1 -1
- package/dist/BrowserSessionCoordinator-QIt3tetp.mjs +1 -0
- package/dist/CodeInjector-Btj9upnf.mjs +1 -0
- package/dist/ConsoleMonitor-DIjN5Afa.mjs +306 -0
- package/dist/{DarwinAPI-DC4HGGLl.mjs → DarwinAPI-BuMPGzHm.mjs} +1 -1
- package/dist/DetailedDataManager-Z77fDl9Z.mjs +5 -0
- package/dist/ExtensionManager.tools-CIGOWViz.mjs +1 -0
- package/dist/{FingerprintManager-N7BZqjxP.mjs → FingerprintManager-BkDSsjjP.mjs} +1 -1
- package/dist/{HardwareBreakpoint-OcJqNFVc.mjs → HardwareBreakpoint-DMAMcPyB.mjs} +1 -1
- package/dist/{HeapAnalyzer-CqAxZzeS.mjs → HeapAnalyzer-Yj348FYt.mjs} +1 -1
- package/dist/MCPServer.activation.ttl-CEGNBycZ.mjs +1 -0
- package/dist/MCPServer.search.helpers-Cs1JpKbu.mjs +1 -0
- package/dist/MCPServer.search.validation-DnifPCCv.mjs +1 -0
- package/dist/MemoryController-DjtgiING.mjs +2 -0
- package/dist/{MemoryScanSession-CaxAjZJf.mjs → MemoryScanSession-zfoVZJB0.mjs} +1 -1
- package/dist/MemoryScanner-Dxd657li.mjs +1 -0
- package/dist/{NativeMemoryManager.utils-DM4NC3FE.mjs → NativeMemoryManager.utils-Bu8srMEF.mjs} +1 -1
- package/dist/{PEAnalyzer-DJyaJTQJ.mjs → PEAnalyzer-CMu9Ua9T.mjs} +1 -1
- package/dist/PointerChainEngine-CaSC1Mry.mjs +1 -0
- package/dist/ProcessRegistry-D5y1yuP2.mjs +1 -0
- package/dist/{ResponseBuilder-B2lu4KEl.mjs → ResponseBuilder-nPXl_khE.mjs} +1 -1
- package/dist/{ReverseEvidenceGraph-B931HeoW.mjs → ReverseEvidenceGraph-BksOpsPs.mjs} +1 -1
- package/dist/RingBuffer-B6RTHmij.mjs +1 -0
- package/dist/ServerRuntimeState-CgqBBwfd.mjs +1 -0
- package/dist/{Speedhack-l6s8L2Qw.mjs → Speedhack-pwXTHxOY.mjs} +1 -1
- package/dist/{StructureAnalyzer-A-WamfYE.mjs → StructureAnalyzer-BseGzsSl.mjs} +2 -2
- package/dist/ToolCatalog-DgmQXdsm.mjs +1 -0
- package/dist/ToolHandlerMap-7HWoIgQO.mjs +1 -0
- package/dist/ToolProbe-DQiREmNp.mjs +1 -0
- package/dist/ToolRegistry-eMZEBiR1.mjs +1 -0
- package/dist/ToolRouter.policy-UKBlFlbh.mjs +4 -0
- package/dist/{TraceRecorder-Dd8jLXpi.mjs → TraceRecorder-B5ktv3nP.mjs} +2 -2
- package/dist/VersionDetector-CmPJmaJg.mjs +1 -0
- package/dist/{Win32API-Bhi5xFBe.mjs → Win32API-DoP3MMHS.mjs} +1 -1
- package/dist/{Win32Debug-CQteFL4F.mjs → Win32Debug-DwF8mQGm.mjs} +1 -1
- package/dist/{WorkflowEngine-CxEp2WXH.mjs → WorkflowEngine-CldHG5b4.mjs} +1 -1
- package/dist/analysis-C-ln0Brh.mjs +6 -0
- package/dist/antidebug-CsnpOR9z.mjs +1 -0
- package/dist/{artifactRetention-NBdncOEW.mjs → artifactRetention-DkYKLOvi.mjs} +1 -1
- package/dist/{artifacts-B5xQuEa_.mjs → artifacts-D-4pSS_N.mjs} +1 -1
- package/dist/betterSqlite3-Bdo_ifuJ.mjs +1 -0
- package/dist/binary-instrument-BeZ224mZ.mjs +9 -0
- package/dist/{boringssl-inspector-BST5vtKx.mjs → boringssl-inspector-ZOCkaipa.mjs} +2 -2
- package/dist/browser-BUaB25bk.mjs +11 -0
- package/dist/{handlers-pVNpaw4A.mjs → canvas-396ieNv5.mjs} +22 -22
- package/dist/collector-CB2syQEg.mjs +1 -0
- package/dist/constants-DMv3svps.mjs +2 -0
- package/dist/coordination-Dbohmj6D.mjs +1 -0
- package/dist/dart-inspector-LhEqRITQ.mjs +0 -0
- package/dist/debugger-CLzkObIO.mjs +1 -0
- package/dist/{definitions-CCP9gphV.mjs → definitions-0hxnrDU72.mjs} +1 -1
- package/dist/definitions-B3a9QC2t.mjs +1 -0
- package/dist/{definitions-DtE0XLrT.mjs → definitions-BOvju5t2.mjs} +1 -1
- package/dist/definitions-CXj_cEVt.mjs +1 -0
- package/dist/definitions-Co6AvTjH.mjs +1 -0
- package/dist/{definitions-Dds_zrWx.mjs → definitions-Cv5r8xwq.mjs} +1 -1
- package/dist/definitions-DBYSxChX.mjs +1 -0
- package/dist/{definitions-DI9YXsJk.mjs → definitions-D_dTDX9B.mjs} +1 -1
- package/dist/{definitions-Dgrg7f3D.mjs → definitions-Db9t2ddh.mjs} +1 -1
- package/dist/{definitions-DZ8uKusP.mjs → definitions-DbN2CjI2.mjs} +1 -1
- package/dist/{definitions-jXPaVy4P.mjs → definitions-DlmmHmZc.mjs} +1 -1
- package/dist/definitions-DnYpoGig.mjs +1 -0
- package/dist/{definitions-CYFbewnd.mjs → definitions-DtZ6Ktx2.mjs} +1 -1
- package/dist/{definitions-CuJRsJ6N.mjs → definitions-DuIPS8gq.mjs} +1 -1
- package/dist/{definitions-BbxOUiP-.mjs → definitions-DywfwPMb.mjs} +1 -1
- package/dist/definitions-EGmqr85H.mjs +1 -0
- package/dist/{definitions-LaYTuwQd.mjs → definitions-Fetw_Cge.mjs} +3 -3
- package/dist/{definitions-NoVp_9Pm.mjs → definitions-LdkeuOeA.mjs} +1 -1
- package/dist/{definitions-DJklW2sS.mjs → definitions-Ym8niHDb.mjs} +1 -1
- package/dist/{definitions-BGwNSkVm.mjs → definitions-aeRd5DAR.mjs} +1 -1
- package/dist/{definitions-CIO9O-Sw.mjs → definitions-cnG6tj17.mjs} +1 -1
- package/dist/{encoding-DGcr6Aj_.mjs → encoding-B4xZWErf.mjs} +2 -2
- package/dist/ensure-browser-core-JHwDo5ql.mjs +285 -0
- package/dist/{factory-Cx_1LorX.mjs → factory-BxNdBiZa.mjs} +1 -1
- package/dist/{graphql-HLf3MS8H.mjs → graphql-GBWsZ9xC.mjs} +4 -4
- package/dist/{handlers-DW5AbYs5.mjs → handlers-5nzR8B0a.mjs} +3 -3
- package/dist/handlers-6iNsXOVT.mjs +7 -0
- package/dist/{handlers-BZoPla6E.mjs → handlers-BZ8n6Hvf.mjs} +1 -1
- package/dist/{handlers-Dv_runVv.mjs → handlers-BbLxNbbT.mjs} +1 -1
- package/dist/{handlers-BP12ZsWc.mjs → handlers-BbS4hssc.mjs} +2 -2
- package/dist/{handlers-BggKiVx9.mjs → handlers-CIKOP4aI.mjs} +2 -2
- package/dist/handlers-CWKBBjai.mjs +1 -0
- package/dist/handlers-Cmb6SoRC.mjs +1 -0
- package/dist/handlers-CrJsKnEI.mjs +1 -0
- package/dist/{antidebug-BOTZH6-0.mjs → handlers-DB6xVVWq.mjs} +4 -4
- package/dist/{handlers-DmQzIc44.mjs → handlers-DOOCWUNR.mjs} +3 -3
- package/dist/{handlers-BLMa4X7l.mjs → handlers-Z_B5aVaU.mjs} +2 -2
- package/dist/handlers-gVscChvl.mjs +1 -0
- package/dist/handlers-xFvI9P_y.mjs +1 -0
- package/dist/handlers.impl-BsFTW6SD.mjs +1 -0
- package/dist/{hooks-DDKppogd.mjs → hooks-DPouiS7I.mjs} +9 -9
- package/dist/index.mjs +11 -15
- package/dist/macro-p8kuJVcm.mjs +2 -0
- package/dist/maintenance-DAqADb6Z.mjs +302 -0
- package/dist/manifest-4lmM6MZR.mjs +1 -0
- package/dist/{manifest-D610kxZr.mjs → manifest-AxaxRSt6.mjs} +2 -2
- package/dist/{manifest-CDeUZGUZ.mjs → manifest-BIqRE1Qz.mjs} +1 -1
- package/dist/{manifest-Dm0o3i2U.mjs → manifest-Box-jWfr.mjs} +1 -1
- package/dist/manifest-Bp33di0Q.mjs +1 -0
- package/dist/{manifest-CGq4NpqH2.mjs → manifest-BvRX4nRP.mjs} +1 -1
- package/dist/{manifest-yu2xiQqe.mjs → manifest-C6KoB1XE.mjs} +1 -1
- package/dist/manifest-C7TdXCWY.mjs +1 -0
- package/dist/manifest-CM-n64K0.mjs +1 -0
- package/dist/{manifest-DWUUWBz0.mjs → manifest-CUokxCUN.mjs} +1 -1
- package/dist/manifest-CWJS45iO.mjs +1 -0
- package/dist/{manifest-D44TaRJU.mjs → manifest-Cdxdgo-D.mjs} +1 -1
- package/dist/{manifest-DKUorv5M.mjs → manifest-Cf6SmamD.mjs} +1 -1
- package/dist/manifest-Cgxu2qdv.mjs +1 -0
- package/dist/manifest-CowGSURa2.mjs +1 -0
- package/dist/manifest-CsGIrh34.mjs +1 -0
- package/dist/manifest-CvDpVToN.mjs +1 -0
- package/dist/manifest-D8TL9RLE.mjs +1 -0
- package/dist/{manifest-C7qV1z7F.mjs → manifest-DIhtCBe6.mjs} +1 -1
- package/dist/{manifest-CeQmtQOY.mjs → manifest-DJbruNOg.mjs} +1 -1
- package/dist/manifest-DLGtZH-0.mjs +1 -0
- package/dist/manifest-DXHdPt2T.mjs +1 -0
- package/dist/{manifest-DMJlcsTR.mjs → manifest-Dg5ScOyW.mjs} +1 -1
- package/dist/{manifest-C1nZkTkO.mjs → manifest-DzGoTS0R.mjs} +1 -1
- package/dist/manifest-G2H52LKz.mjs +131 -0
- package/dist/manifest-P0Futrgb.mjs +1 -0
- package/dist/{manifest-CDiCtaQT.mjs → manifest-Qw7xgvjv.mjs} +1 -1
- package/dist/{manifest-Dgh0uDW-.mjs → manifest-W3qvVrP2.mjs} +1 -1
- package/dist/manifest-dG6MuR1U.mjs +1 -0
- package/dist/manifest-nWXtgq5Y2.mjs +1 -0
- package/dist/{manifest-BPuE6oH2.mjs → manifest-vp1upSSq.mjs} +1 -1
- package/dist/modules-DO3jXCgj.mjs +333 -0
- package/dist/{mojo-ipc-VGlv3Qyp.mjs → mojo-ipc-Be-ccWrc.mjs} +1 -1
- package/dist/native/scripts/linux/enum-windows.sh +12 -12
- package/dist/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/native-g095qhpK.mjs +961 -0
- package/dist/network-Dvxm7eEI.mjs +7 -0
- package/dist/outputPaths-D2ddHrOJ.mjs +2 -0
- package/dist/{parse-args-Cuk7-xUt.mjs → parse-args-ngRrvF9e.mjs} +1 -1
- package/dist/platform-DjWbuiF8.mjs +93 -0
- package/dist/process-Dq5I-KZW.mjs +2 -0
- package/dist/proxy-DPNgM7TE.mjs +2 -0
- package/dist/{registry-DUHIPE-v.mjs → registry-xB8Wgmyj.mjs} +1 -1
- package/dist/renderer-pid-7jbTR8f5.mjs +1 -0
- package/dist/search-defaults-CJik67or.mjs +1 -0
- package/dist/server/plugin-api.d.mts +19 -36
- package/dist/server/plugin-api.mjs +1 -1
- package/dist/sourcemap-DqEW15Ao.mjs +1 -0
- package/dist/streaming-Dbk4eStJ.mjs +1 -0
- package/dist/transform-D-peM3aO.mjs +103 -0
- package/dist/wasm-CZajRaad.mjs +174 -0
- package/dist/{webcrack-CsLLJIs9.mjs → webcrack-phEfVt5y.mjs} +3 -3
- package/dist/{workflow-CYIXtrWD.mjs → workflow-wkXb3x-U.mjs} +4 -4
- package/package.json +16 -15
- package/src/native/scripts/linux/enum-windows.sh +12 -12
- package/src/native/scripts/macos/enum-windows.applescript +22 -22
- package/dist/CodeInjector-BlgyqTOk.mjs +0 -1
- package/dist/ConsoleMonitor-Dkqc0HNi.mjs +0 -490
- package/dist/DOMInspector-BYY_EJ0C.mjs +0 -95
- package/dist/DetailedDataManager-BniBJlVv.mjs +0 -1
- package/dist/ExtensionManager-erMpqcLk.mjs +0 -1
- package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +0 -1
- package/dist/MemoryController-BaqstM5w.mjs +0 -2
- package/dist/MemoryScanner-BLYnMJy6.mjs +0 -1
- package/dist/NativeMemoryManager.impl-CI554XbY.mjs +0 -1
- package/dist/PageController-D9jVkH0i.mjs +0 -1
- package/dist/PointerChainEngine-5nF9eNlu.mjs +0 -1
- package/dist/PrerequisiteError-Bl3dK8XA.mjs +0 -1
- package/dist/ProcessRegistry-Hf12LlR9.mjs +0 -1
- package/dist/ScriptManager-fgqiALgj.mjs +0 -7
- package/dist/ToolCatalog-D_IKl1Hu.mjs +0 -1
- package/dist/ToolProbe-xsfALmN3.mjs +0 -1
- package/dist/ToolRegistry-B0Zs-phN.mjs +0 -1
- package/dist/ToolRouter.policy-CFHoN_Lw.mjs +0 -4
- package/dist/VersionDetector-DMoUWyNm.mjs +0 -9
- package/dist/analysis-BuR-NgX8.mjs +0 -5
- package/dist/betterSqlite3-CGaxz4AX.mjs +0 -1
- package/dist/binary-instrument-Cf9qqLlM.mjs +0 -7
- package/dist/browser-C4Le3xqA.mjs +0 -11
- package/dist/collector-CKO8RPK8.mjs +0 -1
- package/dist/constants-Cp6hBrrx.mjs +0 -1
- package/dist/coordination-BbijHEHH.mjs +0 -1
- package/dist/debugger-CRJq_krh.mjs +0 -1
- package/dist/definitions-BGobEDQa.mjs +0 -1
- package/dist/definitions-CdWEuIkI.mjs +0 -1
- package/dist/definitions-CoQFbggH.mjs +0 -1
- package/dist/definitions-OvGsfxdt.mjs +0 -1
- package/dist/ensure-browser-core-Buls24LQ.mjs +0 -1
- package/dist/flat-target-session-CO5g78k3.mjs +0 -1
- package/dist/handlers-D3iev8g1.mjs +0 -1
- package/dist/handlers-D49r1-1P.mjs +0 -1
- package/dist/handlers-DCE45Ww8.mjs +0 -2
- package/dist/handlers-De5u62Ga2.mjs +0 -1
- package/dist/handlers-DnJRGp7t.mjs +0 -302
- package/dist/handlers-S9Ws0IGy.mjs +0 -2
- package/dist/handlers.impl-CD2_kOcC.mjs +0 -1
- package/dist/maintenance-CutEO84j.mjs +0 -1
- package/dist/manifest-BFGxlDRh.mjs +0 -123
- package/dist/manifest-BXry5N09.mjs +0 -1
- package/dist/manifest-BeP_zJGb2.mjs +0 -1
- package/dist/manifest-C0g67k6U.mjs +0 -1
- package/dist/manifest-CFn0359q2.mjs +0 -1
- package/dist/manifest-CJMGt7Qy.mjs +0 -1
- package/dist/manifest-CRIJq4Hs.mjs +0 -1
- package/dist/manifest-C_hEIjSx.mjs +0 -1
- package/dist/manifest-Cq0j7GZt.mjs +0 -1
- package/dist/manifest-CtPmHAdn.mjs +0 -1
- package/dist/manifest-Cx2IVMUY.mjs +0 -1
- package/dist/manifest-D16xPXro.mjs +0 -1
- package/dist/manifest-DC-SMF6b.mjs +0 -1
- package/dist/manifest-DD3rtxvV.mjs +0 -1
- package/dist/manifest-De-6Wf2R.mjs +0 -1
- package/dist/manifest-DsVh7Y4U.mjs +0 -1
- package/dist/manifest-DtEFSRaq.mjs +0 -1
- package/dist/manifest-H-EpAyZQ.mjs +0 -1
- package/dist/manifest-ais9Afrw.mjs +0 -1
- package/dist/manifest-tmb54wmA.mjs +0 -1
- package/dist/manifest-zrbrpKCC.mjs +0 -1
- package/dist/matchesWildcardPattern-BGqLSmEs.mjs +0 -1
- package/dist/modules-p-PUNv9r.mjs +0 -332
- package/dist/network-BjZ1Y-GB.mjs +0 -7
- package/dist/outputPaths-BonGThuc.mjs +0 -2
- package/dist/platform-C446Lf97.mjs +0 -93
- package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +0 -1
- package/dist/process-C9f2A5zk.mjs +0 -962
- package/dist/proxy-CvRepxgV.mjs +0 -1
- package/dist/search-defaults-D2bY-rzH.mjs +0 -1
- package/dist/shared-state-board-Cyg-xh_k.mjs +0 -1
- package/dist/sourcemap-D6Q1UuAp.mjs +0 -1
- package/dist/streaming-CTX58tbb.mjs +0 -1
- package/dist/transform-Cv9P2vVD.mjs +0 -103
- package/dist/types-DtThH00r.mjs +0 -1
- package/dist/wasm-DaJa8J0V.mjs +0 -174
- /package/dist/{CacheAdapters-CdAxBmVW.mjs → CacheAdapters-BlDrQg8f.mjs} +0 -0
- /package/dist/{EventBus-DgciURGg.mjs → EventBus-Cm-t-B65.mjs} +0 -0
- /package/dist/{EvidenceGraphBridge-BIfgB7HP.mjs → EvidenceGraphBridge-DBDc0wUA.mjs} +0 -0
- /package/dist/{HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs → HookGeneratorBuilders.core.generators.storage-CWaWpOHa.mjs} +0 -0
- /package/dist/{InstrumentationSession-DxXs0sCp.mjs → InstrumentationSession-c5qZyp7d.mjs} +0 -0
- /package/dist/{StealthVerifier-Dhbj4B4P.mjs → StealthVerifier-DMBrtkhN.mjs} +0 -0
- /package/dist/{ToolError-DWU_z7gp.mjs → ToolError-g3rjWzhx.mjs} +0 -0
- /package/dist/{authorization-schema-B40obG1A.mjs → authorization-schema-Jtikc5Yt.mjs} +0 -0
- /package/dist/{bind-helpers-BlAOQrFQ.mjs → bind-helpers-D0mGAOof.mjs} +0 -0
- /package/dist/{capabilities-DbYCv-HF.mjs → capabilities-L1ax5EHS.mjs} +0 -0
- /package/dist/{chunk-C_pMuVsO.mjs → chunk-88NL7fhV.mjs} +0 -0
- /package/dist/{concurrency-CcK46d0h.mjs → concurrency-Dehnw4JC.mjs} +0 -0
- /package/dist/{evidence-graph-bridge-B0yhGPcs.mjs → evidence-graph-bridge-eT9icP6a.mjs} +0 -0
- /package/dist/{formatAddress-C7j2fDlM.mjs → formatAddress-DAcw4Ckg.mjs} +0 -0
- /package/dist/{logger-sBC6IdRT.mjs → logger-CCikqqvj.mjs} +0 -0
- /package/dist/{response-C7rKQst4.mjs → response-B1RuVVfD.mjs} +0 -0
- /package/dist/{ssrf-policy-T96MR3r6.mjs → ssrf-policy-B72vdy23.mjs} +0 -0
- /package/dist/{tool-builder-CI9914Tf.mjs → tool-builder-CpLh-UQd.mjs} +0 -0
- /package/dist/{types-CuyefmGT.mjs → types-BzPBzmVB.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{zr as e}from"./constants-Cp6hBrrx.mjs";import{n as t}from"./response-C7rKQst4.mjs";import{i as n,r}from"./outputPaths-BonGThuc.mjs";import{a as i,i as a,s as o}from"./parse-args-Cuk7-xUt.mjs";import s from"node:http";import{createHash as c}from"node:crypto";import{existsSync as l,mkdirSync as u,readFileSync as d,readdirSync as f}from"node:fs";import p from"node:path";import{fileURLToPath as m,pathToFileURL as h}from"node:url";import{mkdir as g,readFile as _,writeFile as v}from"node:fs/promises";import{EventEmitter as y}from"node:events";function b(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function x(e){let t=e.trim().toLowerCase().replace(/\//g,`-`).replace(/(?!^@)[^a-z0-9@_-]+/g,`-`);return t.length>0?t:`plugin-${Date.now()}`}function S(e){if(!b(e))return null;let{id:t,name:n,version:r,entry:i,permissions:a,status:o}=e;return typeof t!=`string`||typeof n!=`string`||typeof r!=`string`||typeof i!=`string`||o!==`loaded`&&o!==`unloaded`?null:{id:t,name:n,version:r,entry:i,permissions:Array.isArray(a)?a.filter(e=>typeof e==`string`):[],status:o}}var C=class{rootDir;legacyPluginRoots;useLegacyScanApi;registryFile;moduleCacheDir;installedPlugins=new Map;loadedPlugins=new Map;constructor(e=r(),t=[]){let n=typeof e==`string`?e:r();this.useLegacyScanApi=typeof e!=`string`,this.rootDir=n,this.registryFile=p.join(n,`plugins.json`),this.moduleCacheDir=p.join(n,`modules`),this.legacyPluginRoots=t.length>0?t:process.env.JSHOOKMCP_PLUGIN_ROOT?[process.env.JSHOOKMCP_PLUGIN_ROOT]:[],!this.useLegacyScanApi&&this.initializeFromDisk()}async register(e){let t=x(e.id||e.name),n={id:t,name:e.name,version:e.version,entry:e.entry,permissions:e.permissions?[...e.permissions]:[],status:this.loadedPlugins.has(t)?`loaded`:`unloaded`};return this.installedPlugins.set(t,n),await this.persist(),t}async unregister(e){await this.unloadPlugin(e),this.installedPlugins.delete(e),await this.persist()}listInstalled(){return[...this.installedPlugins.values()].map(e=>({id:e.id,name:e.name,version:e.version,status:e.status,permissions:[...e.permissions]})).toSorted((e,t)=>e.name.localeCompare(t.name))}async loadPlugin(e){let t=this.installedPlugins.get(e);if(!t)throw Error(`Plugin not found: ${e}`);let n=this.loadedPlugins.get(e);if(n)return{manifest:this.toPublicManifest(n.manifest),exports:n.exports};let r=h(await this.resolveEntryPath(t));r.searchParams.set(`ts`,String(Date.now()));let i=await import(r.href),a=b(i)?i:{};return t.status=`loaded`,this.loadedPlugins.set(e,{manifest:t,exports:a}),await this.persist(),{manifest:this.toPublicManifest(t),exports:a}}async unloadPlugin(e){let t=this.installedPlugins.get(e);t&&(this.loadedPlugins.delete(e),t.status=`unloaded`,await this.persist())}initializeFromDisk(){if(l(this.rootDir)||u(this.rootDir,{recursive:!0}),l(this.moduleCacheDir)||u(this.moduleCacheDir,{recursive:!0}),!l(this.registryFile))return;let e=d(this.registryFile,`utf8`);if(!e.trim())return;let t=JSON.parse(e);if(Array.isArray(t))for(let e of t){let t=S(e);t&&this.installedPlugins.set(t.id,t)}}async persist(){await g(this.rootDir,{recursive:!0}),await g(this.moduleCacheDir,{recursive:!0}),await v(this.registryFile,JSON.stringify([...this.installedPlugins.values()],null,2),`utf8`)}async resolveEntryPath(e){return e.entry.startsWith(`http://`)||e.entry.startsWith(`https://`)?this.downloadRemoteModule(e.id,e.entry):e.entry.startsWith(`file://`)?m(new URL(e.entry)):p.isAbsolute(e.entry)?e.entry:p.resolve(n(),e.entry)}async downloadRemoteModule(e,t){let n=await fetch(t);if(!n.ok)throw Error(`Failed to download plugin module: ${n.status} ${n.statusText}`);let r=await n.text(),i=p.join(this.moduleCacheDir,`${x(e)}.mjs`),a=c(`sha256`).update(r).digest(`hex`);try{let e=await _(i,`utf8`);if(c(`sha256`).update(e).digest(`hex`)===a)return i}catch{}return await g(this.moduleCacheDir,{recursive:!0}),await v(i,r,`utf8`),i}toPublicManifest(e){return{id:e.id,name:e.name,version:e.version,entry:e.entry,permissions:[...e.permissions]}}listPlugins(){let e=[];for(let t of this.legacyPluginRoots){if(!l(t))continue;let n=f(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(`.`))continue;let n=p.join(t,r.name,`package.json`);if(l(n))try{let t=JSON.parse(d(n,`utf8`)),r=this.toLegacyPluginInfo(t);r&&e.push(r)}catch{continue}}}return e}searchPlugins(e){let t=e.trim().toLowerCase();return t?this.listPlugins().filter(e=>e.name.toLowerCase().includes(t)||(e.description??``).toLowerCase().includes(t)||(e.capabilities??[]).some(e=>e.toLowerCase().includes(t))||(e.dependencies??[]).some(e=>e.toLowerCase().includes(t))):this.listPlugins()}async installPlugin(e){if(/^https:\/\/github\.com\/.+\.git$/u.test(e)||/^git@github\.com:.+\.git$/u.test(e))return{id:`git-plugin`,name:e.split(`/`).pop()?.replace(/\.git$/u,``)??`plugin`,version:`0.0.0`};if(e.includes(`://`)||e.startsWith(`git@`)||e===`invalid-url`)throw Error(`Invalid git URL`);if(e.startsWith(`/`)||e.includes(`\\`)){let t=p.join(e,`package.json`);if(!l(t))throw Error(`No package.json`);let n=JSON.parse(d(t,`utf8`)),r=this.toLegacyPluginInfo(n);if(!r)throw Error(`No package.json`);return r}for(let t of this.legacyPluginRoots){let n=p.join(t,e,`package.json`);if(!l(n))continue;let r=JSON.parse(d(n,`utf8`)),i=this.toLegacyPluginInfo(r);if(i)return i}throw Error(`Plugin not found`)}getPluginInfo(e){return this.listPlugins().find(t=>t.id===e||t.name===e)}getPluginDependencies(e){return this.getPluginInfo(e)?.dependencies??[]}async uninstallPlugin(e){}toLegacyPluginInfo(e){if(typeof e.name!=`string`)return null;let t=b(e.dependencies)?Object.keys(e.dependencies):[];return{id:x(e.name),name:e.name,version:typeof e.version==`string`?e.version:`0.0.0`,description:typeof e.description==`string`?e.description:void 0,capabilities:Array.isArray(e.capabilities)?e.capabilities.filter(e=>typeof e==`string`):void 0,dependencies:t}}};function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e){if(!w(e))return null;let{id:t,url:n,events:r,active:i}=e;return typeof t!=`string`||typeof n!=`string`||!Array.isArray(r)||typeof i!=`boolean`?null:{id:t,url:n,events:r.filter(e=>typeof e==`string`),active:i}}var E=class{rootDir;storageFile;webhooks=new Map;constructor(e=r()){this.rootDir=e,this.storageFile=p.join(e,`webhooks.json`),this.initializeFromDisk()}async registerWebhook(e,t){new URL(e);let n={id:`webhook-${Date.now()}-${this.webhooks.size+1}`,url:e,events:[...new Set(t.filter(e=>e.trim().length>0))],active:!0};return this.webhooks.set(n.id,n),await this.persist(),n.id}async sendEvent(e,t){let n=[...this.webhooks.values()].filter(t=>t.active&&(t.events.includes(e)||t.events.includes(`*`)));for(let r of n){let n=await fetch(r.url,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({event:e,payload:t,timestamp:new Date().toISOString()})});if(!n.ok)throw Error(`Webhook delivery failed for ${r.url}: ${n.status} ${n.statusText}`)}}listWebhooks(){return[...this.webhooks.values()].map(e=>({id:e.id,url:e.url,events:[...e.events],active:e.active}))}registerExternalCallback(e,t){let n=this.webhooks.get(e);if(n){n.url=t;return}this.webhooks.set(e,{id:e,url:t,events:[`*`],active:!0})}initializeFromDisk(){if(l(this.rootDir)||u(this.rootDir,{recursive:!0}),!l(this.storageFile))return;let e=d(this.storageFile,`utf8`);if(!e.trim())return;let t=JSON.parse(e);if(Array.isArray(t))for(let e of t){let t=T(e);t&&this.webhooks.set(t.id,t)}}async persist(){await g(this.rootDir,{recursive:!0}),await v(this.storageFile,JSON.stringify([...this.webhooks.values()],null,2),`utf8`)}};function D(e){return{...e}}function O(){return new Date().toISOString()}var k=class extends y{maxQueueSize;commands=new Map;order=[];maxRetries;retryDelay;processTimeout;nextId=1;constructor(t={}){super(),this.maxQueueSize=typeof t.maxQueueSize==`number`?t.maxQueueSize:1e3,this.maxRetries=typeof t.maxRetries==`number`?t.maxRetries:3,this.retryDelay=typeof t.retryDelay==`number`?t.retryDelay:0,this.processTimeout=typeof t.processTimeout==`number`?t.processTimeout:e}enqueue(e){if(this.order.length>=this.maxQueueSize)throw Error(`Command queue is full (${this.maxQueueSize})`);let t=`cmd-${this.nextId}`;this.nextId+=1;let n=O(),r={id:t,endpointId:e.endpointId,event:e.event,payload:e.payload,status:`pending`,retries:0,createdAt:n,updatedAt:n};return this.commands.set(t,r),this.order.push(t),this.emit(`enqueued`,D(r)),t}dequeue(e){if(!e){let e=this.getCommandsByFilter({status:`pending`})[0];return e?D(e):void 0}return this.getCommandsByFilter(e).map(D)}getStatus(e){let t=this.commands.get(e);return t?t.status===`processed`?`completed`:t.status:`failed`}retry(e){let t=this.commands.get(e);if(!t)throw Error(`Command ${e} not found`);if(t.status!==`failed`)throw Error(`Command ${e} is not in failed state`);t.status=`pending`,t.retries=0,t.lastError=void 0,t.updatedAt=O()}getCommand(e){return this.commands.get(e)}getCommandsByFilter(e){let t=e.status===`completed`?`processed`:e.status,n=[];for(let r of this.order){let i=this.commands.get(r);i&&(t&&i.status!==t||e.endpointId&&i.endpointId!==e.endpointId||n.push(i))}return n}updateStatus(e,t,n){let r=this.commands.get(e);if(!r)throw Error(`Command ${e} not found`);return r.status=t,r.updatedAt=O(),r.lastError=n,r}},A=class extends k{async process(e,t){let n=this.getCommand(e);if(!n)throw Error(`Command ${e} not found`);if(n.status===`processed`)throw Error(`Command ${e} already processed`);if(n.status===`failed`)throw Error(`Command ${e} already processed with failure`);if(n.status===`processing`)throw Error(`Command ${e} is already processing`);this.updateStatus(e,`processing`);let r=`processed`,i;try{await Promise.race([Promise.resolve(t(D(n))),new Promise((e,t)=>{setTimeout(()=>{t(Error(`Process timeout`))},this.processTimeout)})])}catch(e){i=e instanceof Error?e.message:String(e),r=n.retries+1>=this.maxRetries?`failed`:`pending`}if(i!==void 0&&this.retryDelay>0&&setTimeout(()=>{},this.retryDelay),r===`processed`){let t=this.updateStatus(e,`processed`);this.emit(`processed`,D(t))}else if(r===`pending`){n.retries+=1;let t=this.updateStatus(e,`pending`,i);throw this.emit(`retried`,D(t)),Error(i===void 0?`retry`:i)}else{let t=this.updateStatus(e,`failed`,i);throw this.emit(`failed`,D(t)),Error(i===void 0?`failed`:i)}}async retry(e){super.retry(e)}exportState(){let e=[];for(let t of this.order){let n=this.commands.get(t);n&&e.push(D(n))}return e}importState(e){this.commands.clear(),this.order.length=0;let t=0;for(let n of e){let e=D(n);this.commands.set(e.id,e),this.order.push(e.id);let r=/^cmd-(\d+)$/.exec(e.id);if(r&&r[1]){let e=parseInt(r[1],10);e>t&&(t=e)}}t>0&&(this.nextId=t+1)}};function j(e){return e===`tool_called`||e===`domain_activated`||e===`evidence_added`||e===`workflow_completed`}function M(e){if(e.length===0)return{};try{return JSON.parse(e)}catch{return{rawBody:e}}}var N=class extends y{endpoints=new Map;eventHandlers=new Map;port;commandQueue;stats={eventsRegistered:0,webhooksSent:0};server;nextEndpointId=1;constructor(e={}){super(),this.port=typeof e.port==`number`?e.port:18789,this.commandQueue=e.commandQueue}registerEndpoint(e){let t=`ep-${this.nextEndpointId}`;return this.nextEndpointId+=1,this.endpoints.set(t,{id:t,path:e.path,method:e.method??`POST`,secret:e.secret}),this.emit(`endpointRegistered`,t),t}removeEndpoint(e){if(!this.endpoints.delete(e))throw Error(`Endpoint ${e} not found`);this.emit(`endpointRemoved`,e)}listEndpoints(){return[...this.endpoints.values()].map(e=>({...e}))}getPort(){return this.port}isRunning(){return this.server!==void 0}registerEvent(e,t){let n=this.eventHandlers.get(e)??[];n.push(t),this.eventHandlers.set(e,n),this.stats.eventsRegistered+=1}start(){if(this.server)throw Error(`Webhook server already started`);this.server=s.createServer((e,t)=>{this.handleRequest(e,t)}),this.server.listen(this.port),this.emit(`started`,this.port)}async stop(){if(!this.server)return;let e=this.server;this.server=void 0,await new Promise((t,n)=>{e.close(e=>{if(e){n(e);return}t()})}),this.emit(`stopped`)}async sendWebhook(e,t,n){await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({event:t,payload:n})}),this.stats.webhooksSent+=1,this.stats.lastSentAt=new Date().toISOString()}getStats(){return{...this.stats}}async handleRequest(e,t){let n=e.method??`GET`,r=e.url??`/`,i=[...this.endpoints.values()].find(e=>e.path===r&&e.method===n);if(!i){t.statusCode=404,t.end(`not found`);return}if(i.secret&&e.headers[`x-webhook-secret`]!==i.secret){t.statusCode=401,t.end(`unauthorized`);return}let a=[];await new Promise((t,n)=>{e.setEncoding(`utf8`),e.on(`data`,e=>{a.push(e)}),e.on(`end`,()=>{t()}),e.on(`error`,e=>{n(e)})});let o=M(a.join(``));this.commandQueue&&this.commandQueue.enqueue({endpointId:i.id,payload:o}),o&&typeof o==`object`&&`event`in o&&typeof o.event==`string`&&await this.invokeEventHandlers(o.event,o),t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({ok:!0,endpointId:i.id}))}async invokeEventHandlers(e,t){if(!j(e))return;let n=this.eventHandlers.get(e)??[];for(let e of n)await Promise.resolve(e(t))}},P=class extends N{};function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e){return typeof e==`function`}var L=class{registry;webhook;webhookServer;commandQueue;constructor(e,t){this.registry=e,this.webhook=t}async handleListInstalled(){return t({success:!0,plugins:this.getRegistry().listInstalled()})}async handleExecuteInContext(e){let n=o(e,`pluginId`),r=o(e,`contextName`),i=a(e,`args`)??{},{manifest:s,exports:c}=await this.getRegistry().loadPlugin(n),l=this.resolveContext(c,r);if(!l)throw Error(`Context "${r}" was not found in plugin "${n}"`);let u=await Promise.resolve(l(i));return this.emitEvent(`extension.executed`,{pluginId:n,contextName:r}),t({success:!0,manifest:s,contextName:r,result:u})}async handleReload(e){let n=o(e,`pluginId`);await this.getRegistry().unloadPlugin(n);let r=await this.getRegistry().loadPlugin(n);return this.emitEvent(`extension.reloaded`,{pluginId:n}),t({success:!0,pluginId:n,manifest:r.manifest,exportedKeys:Object.keys(r.exports).toSorted()})}async handleUninstall(e){let n=o(e,`pluginId`);return await this.getRegistry().unregister(n),this.emitEvent(`extension.uninstalled`,{pluginId:n}),t({success:!0,pluginId:n})}async handleWebhookCreate(e){let n=o(e,`name`),r=o(e,`path`),a=i(e,`secret`),s=Array.isArray(e.events)?e.events.filter(e=>typeof e==`string`):[],c=this.getWebhookServer();c.isRunning()||c.start();let l=c.registerEndpoint({path:r,method:`POST`,secret:a??void 0}),u=this.getWebhook(),d=`http://localhost:${c.getPort()}${r}`;return u.registerExternalCallback(l,d),t({success:!0,endpointId:l,url:d,name:n,events:s})}async handleWebhookList(){let e=this.getWebhookServer();return t({success:!0,endpoints:e.listEndpoints(),port:e.getPort(),running:e.isRunning()})}async handleWebhookDelete(e){let n=o(e,`endpointId`),r=this.getWebhookServer();try{r.removeEndpoint(n)}catch(e){throw Error(`GRACEFUL: ${e instanceof Error?e.message:String(e)}`,{cause:e})}return t({success:!0,endpointId:n})}async handleWebhookCommands(e){let n=o(e,`endpointId`),r=i(e,`status`),s=a(e,`command`);if(s)return t({success:!0,commandId:this.getCommandQueue().enqueue({endpointId:n,payload:s}),status:`pending`});let c=this.getCommandQueue(),l={endpointId:n};r&&(l.status=r);let u=c.dequeue(l);return t({success:!0,endpointId:n,commands:u,count:Array.isArray(u)?u.length:+!!u})}getWebhookServer(){return this.webhookServer||=(this.commandQueue=new A,new P({commandQueue:this.commandQueue})),this.webhookServer}async startWebhookServer(){let e=this.getWebhookServer();e.isRunning()||e.start()}async stopWebhookServer(){this.webhookServer&&(await this.webhookServer.stop(),this.webhookServer=void 0,this.commandQueue=void 0)}getRegistry(){return this.registry||=new C,this.registry}getWebhook(){return this.webhook||=new E,this.webhook}getCommandQueue(){return this.commandQueue||=new A,this.commandQueue}emitEvent(e,t){this.getWebhook().sendEvent(e,t).catch(()=>void 0)}resolveContext(e,t){let n=e[t];if(I(n))return n;let r=e.default;if(t===`default`&&I(r))return r;if(F(r)){let e=r[t];if(I(e))return e}return null}async handleWebhookDispatch(e){let n=i(e,`action`);switch(n){case`create`:return this.handleWebhookCreate(e);case`list`:return this.handleWebhookList();case`delete`:return this.handleWebhookDelete(e);case`commands`:return this.handleWebhookCommands(e);default:return t({error:`Invalid action: "${n}". Expected one of: create, list, delete, commands`})}}};export{L as ExtensionRegistryHandlers};
|
|
1
|
+
import{ia as e}from"./constants-DMv3svps.mjs";import{i as t,r as n}from"./outputPaths-D2ddHrOJ.mjs";import{n as r}from"./response-B1RuVVfD.mjs";import{a as i,c as a,o}from"./parse-args-ngRrvF9e.mjs";import{existsSync as s,mkdirSync as c,readFileSync as l,readdirSync as u}from"node:fs";import d from"node:path";import{mkdir as f,readFile as p,writeFile as m}from"node:fs/promises";import{fileURLToPath as h,pathToFileURL as g}from"node:url";import _ from"node:http";import{createHash as v}from"node:crypto";import{EventEmitter as y}from"node:events";function b(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function x(e){let t=e.trim().toLowerCase().replace(/\//g,`-`).replace(/(?!^@)[^a-z0-9@_-]+/g,`-`);return t.length>0?t:`plugin-${Date.now()}`}function S(e){if(!b(e))return null;let{id:t,name:n,version:r,entry:i,permissions:a,status:o}=e;return typeof t!=`string`||typeof n!=`string`||typeof r!=`string`||typeof i!=`string`||o!==`loaded`&&o!==`unloaded`?null:{id:t,name:n,version:r,entry:i,permissions:Array.isArray(a)?a.filter(e=>typeof e==`string`):[],status:o}}var C=class{rootDir;legacyPluginRoots;useLegacyScanApi;registryFile;moduleCacheDir;installedPlugins=new Map;loadedPlugins=new Map;constructor(e=n(),t=[]){let r=typeof e==`string`?e:n();this.useLegacyScanApi=typeof e!=`string`,this.rootDir=r,this.registryFile=d.join(r,`plugins.json`),this.moduleCacheDir=d.join(r,`modules`),this.legacyPluginRoots=t.length>0?t:process.env.JSHOOKMCP_PLUGIN_ROOT?[process.env.JSHOOKMCP_PLUGIN_ROOT]:[],!this.useLegacyScanApi&&this.initializeFromDisk()}async register(e){let t=x(e.id||e.name),n={id:t,name:e.name,version:e.version,entry:e.entry,permissions:e.permissions?[...e.permissions]:[],status:this.loadedPlugins.has(t)?`loaded`:`unloaded`};return this.installedPlugins.set(t,n),await this.persist(),t}async unregister(e){await this.unloadPlugin(e),this.installedPlugins.delete(e),await this.persist()}listInstalled(){return[...this.installedPlugins.values()].map(e=>({id:e.id,name:e.name,version:e.version,status:e.status,permissions:[...e.permissions]})).toSorted((e,t)=>e.name.localeCompare(t.name))}async loadPlugin(e){let t=this.installedPlugins.get(e);if(!t)throw Error(`Plugin not found: ${e}`);let n=this.loadedPlugins.get(e);if(n)return{manifest:this.toPublicManifest(n.manifest),exports:n.exports};let r=g(await this.resolveEntryPath(t));r.searchParams.set(`ts`,String(Date.now()));let i=await import(r.href),a=b(i)?i:{};return t.status=`loaded`,this.loadedPlugins.set(e,{manifest:t,exports:a}),await this.persist(),{manifest:this.toPublicManifest(t),exports:a}}async unloadPlugin(e){let t=this.installedPlugins.get(e);t&&(this.loadedPlugins.delete(e),t.status=`unloaded`,await this.persist())}initializeFromDisk(){if(s(this.rootDir)||c(this.rootDir,{recursive:!0}),s(this.moduleCacheDir)||c(this.moduleCacheDir,{recursive:!0}),!s(this.registryFile))return;let e=l(this.registryFile,`utf8`);if(!e.trim())return;let t=JSON.parse(e);if(Array.isArray(t))for(let e of t){let t=S(e);t&&this.installedPlugins.set(t.id,t)}}async persist(){await f(this.rootDir,{recursive:!0}),await f(this.moduleCacheDir,{recursive:!0}),await m(this.registryFile,JSON.stringify([...this.installedPlugins.values()],null,2),`utf8`)}async resolveEntryPath(e){return e.entry.startsWith(`http://`)||e.entry.startsWith(`https://`)?this.downloadRemoteModule(e.id,e.entry):e.entry.startsWith(`file://`)?h(new URL(e.entry)):d.isAbsolute(e.entry)?e.entry:d.resolve(t(),e.entry)}async downloadRemoteModule(e,t){let n=await fetch(t);if(!n.ok)throw Error(`Failed to download plugin module: ${n.status} ${n.statusText}`);let r=await n.text(),i=d.join(this.moduleCacheDir,`${x(e)}.mjs`),a=v(`sha256`).update(r).digest(`hex`);try{let e=await p(i,`utf8`);if(v(`sha256`).update(e).digest(`hex`)===a)return i}catch{}return await f(this.moduleCacheDir,{recursive:!0}),await m(i,r,`utf8`),i}toPublicManifest(e){return{id:e.id,name:e.name,version:e.version,entry:e.entry,permissions:[...e.permissions]}}listPlugins(){let e=[];for(let t of this.legacyPluginRoots){if(!s(t))continue;let n=u(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(`.`))continue;let n=d.join(t,r.name,`package.json`);if(s(n))try{let t=JSON.parse(l(n,`utf8`)),r=this.toLegacyPluginInfo(t);r&&e.push(r)}catch{continue}}}return e}searchPlugins(e){let t=e.trim().toLowerCase();return t?this.listPlugins().filter(e=>e.name.toLowerCase().includes(t)||(e.description??``).toLowerCase().includes(t)||(e.capabilities??[]).some(e=>e.toLowerCase().includes(t))||(e.dependencies??[]).some(e=>e.toLowerCase().includes(t))):this.listPlugins()}async installPlugin(e){if(/^https:\/\/github\.com\/.+\.git$/u.test(e)||/^git@github\.com:.+\.git$/u.test(e))return{id:`git-plugin`,name:e.split(`/`).pop()?.replace(/\.git$/u,``)??`plugin`,version:`0.0.0`};if(e.includes(`://`)||e.startsWith(`git@`)||e===`invalid-url`)throw Error(`Invalid git URL`);if(e.startsWith(`/`)||e.includes(`\\`)){let t=d.join(e,`package.json`);if(!s(t))throw Error(`No package.json`);let n=JSON.parse(l(t,`utf8`)),r=this.toLegacyPluginInfo(n);if(!r)throw Error(`No package.json`);return r}for(let t of this.legacyPluginRoots){let n=d.join(t,e,`package.json`);if(!s(n))continue;let r=JSON.parse(l(n,`utf8`)),i=this.toLegacyPluginInfo(r);if(i)return i}throw Error(`Plugin not found`)}getPluginInfo(e){return this.listPlugins().find(t=>t.id===e||t.name===e)}getPluginDependencies(e){return this.getPluginInfo(e)?.dependencies??[]}async uninstallPlugin(e){}toLegacyPluginInfo(e){if(typeof e.name!=`string`)return null;let t=b(e.dependencies)?Object.keys(e.dependencies):[];return{id:x(e.name),name:e.name,version:typeof e.version==`string`?e.version:`0.0.0`,description:typeof e.description==`string`?e.description:void 0,capabilities:Array.isArray(e.capabilities)?e.capabilities.filter(e=>typeof e==`string`):void 0,dependencies:t}}};function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e){if(!w(e))return null;let{id:t,url:n,events:r,active:i}=e;return typeof t!=`string`||typeof n!=`string`||!Array.isArray(r)||typeof i!=`boolean`?null:{id:t,url:n,events:r.filter(e=>typeof e==`string`),active:i}}var E=class{rootDir;storageFile;webhooks=new Map;constructor(e=n()){this.rootDir=e,this.storageFile=d.join(e,`webhooks.json`),this.initializeFromDisk()}async registerWebhook(e,t){new URL(e);let n={id:`webhook-${Date.now()}-${this.webhooks.size+1}`,url:e,events:[...new Set(t.filter(e=>e.trim().length>0))],active:!0};return this.webhooks.set(n.id,n),await this.persist(),n.id}async sendEvent(e,t){let n=[...this.webhooks.values()].filter(t=>t.active&&(t.events.includes(e)||t.events.includes(`*`)));for(let r of n){let n=await fetch(r.url,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({event:e,payload:t,timestamp:new Date().toISOString()})});if(!n.ok)throw Error(`Webhook delivery failed for ${r.url}: ${n.status} ${n.statusText}`)}}listWebhooks(){return[...this.webhooks.values()].map(e=>({id:e.id,url:e.url,events:[...e.events],active:e.active}))}registerExternalCallback(e,t){let n=this.webhooks.get(e);if(n){n.url=t;return}this.webhooks.set(e,{id:e,url:t,events:[`*`],active:!0})}initializeFromDisk(){if(s(this.rootDir)||c(this.rootDir,{recursive:!0}),!s(this.storageFile))return;let e=l(this.storageFile,`utf8`);if(!e.trim())return;let t=JSON.parse(e);if(Array.isArray(t))for(let e of t){let t=T(e);t&&this.webhooks.set(t.id,t)}}async persist(){await f(this.rootDir,{recursive:!0}),await m(this.storageFile,JSON.stringify([...this.webhooks.values()],null,2),`utf8`)}};function D(e){return{...e}}function O(){return new Date().toISOString()}var k=class extends y{maxQueueSize;commands=new Map;order=[];maxRetries;retryDelay;processTimeout;nextId=1;constructor(t={}){super(),this.maxQueueSize=typeof t.maxQueueSize==`number`?t.maxQueueSize:1e3,this.maxRetries=typeof t.maxRetries==`number`?t.maxRetries:3,this.retryDelay=typeof t.retryDelay==`number`?t.retryDelay:0,this.processTimeout=typeof t.processTimeout==`number`?t.processTimeout:e}enqueue(e){if(this.order.length>=this.maxQueueSize)throw Error(`Command queue is full (${this.maxQueueSize})`);let t=`cmd-${this.nextId}`;this.nextId+=1;let n=O(),r={id:t,endpointId:e.endpointId,event:e.event,payload:e.payload,status:`pending`,retries:0,createdAt:n,updatedAt:n};return this.commands.set(t,r),this.order.push(t),this.emit(`enqueued`,D(r)),t}dequeue(e){if(!e){let e=this.getCommandsByFilter({status:`pending`})[0];return e?D(e):void 0}return this.getCommandsByFilter(e).map(D)}getStatus(e){let t=this.commands.get(e);return t?t.status===`processed`?`completed`:t.status:`failed`}retry(e){let t=this.commands.get(e);if(!t)throw Error(`Command ${e} not found`);if(t.status!==`failed`)throw Error(`Command ${e} is not in failed state`);t.status=`pending`,t.retries=0,t.lastError=void 0,t.updatedAt=O()}getCommand(e){return this.commands.get(e)}getCommandsByFilter(e){let t=e.status===`completed`?`processed`:e.status,n=[];for(let r of this.order){let i=this.commands.get(r);i&&(t&&i.status!==t||e.endpointId&&i.endpointId!==e.endpointId||n.push(i))}return n}updateStatus(e,t,n){let r=this.commands.get(e);if(!r)throw Error(`Command ${e} not found`);return r.status=t,r.updatedAt=O(),r.lastError=n,r}},A=class extends k{async process(e,t){let n=this.getCommand(e);if(!n)throw Error(`Command ${e} not found`);if(n.status===`processed`)throw Error(`Command ${e} already processed`);if(n.status===`failed`)throw Error(`Command ${e} already processed with failure`);if(n.status===`processing`)throw Error(`Command ${e} is already processing`);this.updateStatus(e,`processing`);let r=`processed`,i;try{await Promise.race([Promise.resolve(t(D(n))),new Promise((e,t)=>{setTimeout(()=>{t(Error(`Process timeout`))},this.processTimeout)})])}catch(e){i=e instanceof Error?e.message:String(e),r=n.retries+1>=this.maxRetries?`failed`:`pending`}if(i!==void 0&&this.retryDelay>0&&setTimeout(()=>{},this.retryDelay),r===`processed`){let t=this.updateStatus(e,`processed`);this.emit(`processed`,D(t))}else if(r===`pending`){n.retries+=1;let t=this.updateStatus(e,`pending`,i);throw this.emit(`retried`,D(t)),Error(i===void 0?`retry`:i)}else{let t=this.updateStatus(e,`failed`,i);throw this.emit(`failed`,D(t)),Error(i===void 0?`failed`:i)}}async retry(e){super.retry(e)}exportState(){let e=[];for(let t of this.order){let n=this.commands.get(t);n&&e.push(D(n))}return e}importState(e){this.commands.clear(),this.order.length=0;let t=0;for(let n of e){let e=D(n);this.commands.set(e.id,e),this.order.push(e.id);let r=/^cmd-(\d+)$/.exec(e.id);if(r&&r[1]){let e=parseInt(r[1],10);e>t&&(t=e)}}t>0&&(this.nextId=t+1)}};function j(e){return e===`tool_called`||e===`domain_activated`||e===`evidence_added`||e===`workflow_completed`}function M(e){if(e.length===0)return{};try{return JSON.parse(e)}catch{return{rawBody:e}}}var N=class extends y{endpoints=new Map;eventHandlers=new Map;port;commandQueue;stats={eventsRegistered:0,webhooksSent:0};server;nextEndpointId=1;constructor(e={}){super(),this.port=typeof e.port==`number`?e.port:18789,this.commandQueue=e.commandQueue}registerEndpoint(e){let t=`ep-${this.nextEndpointId}`;return this.nextEndpointId+=1,this.endpoints.set(t,{id:t,path:e.path,method:e.method??`POST`,secret:e.secret}),this.emit(`endpointRegistered`,t),t}removeEndpoint(e){if(!this.endpoints.delete(e))throw Error(`Endpoint ${e} not found`);this.emit(`endpointRemoved`,e)}listEndpoints(){return[...this.endpoints.values()].map(e=>({...e}))}getPort(){return this.port}isRunning(){return this.server!==void 0}registerEvent(e,t){let n=this.eventHandlers.get(e)??[];n.push(t),this.eventHandlers.set(e,n),this.stats.eventsRegistered+=1}start(){if(this.server)throw Error(`Webhook server already started`);this.server=_.createServer((e,t)=>{this.handleRequest(e,t)}),this.server.listen(this.port),this.emit(`started`,this.port)}async stop(){if(!this.server)return;let e=this.server;this.server=void 0,await new Promise((t,n)=>{e.close(e=>{if(e){n(e);return}t()})}),this.emit(`stopped`)}async sendWebhook(e,t,n){await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({event:t,payload:n})}),this.stats.webhooksSent+=1,this.stats.lastSentAt=new Date().toISOString()}getStats(){return{...this.stats}}async handleRequest(e,t){let n=e.method??`GET`,r=e.url??`/`,i=[...this.endpoints.values()].find(e=>e.path===r&&e.method===n);if(!i){t.statusCode=404,t.end(`not found`);return}if(i.secret&&e.headers[`x-webhook-secret`]!==i.secret){t.statusCode=401,t.end(`unauthorized`);return}let a=[];await new Promise((t,n)=>{e.setEncoding(`utf8`),e.on(`data`,e=>{a.push(e)}),e.on(`end`,()=>{t()}),e.on(`error`,e=>{n(e)})});let o=M(a.join(``));this.commandQueue&&this.commandQueue.enqueue({endpointId:i.id,payload:o}),o&&typeof o==`object`&&`event`in o&&typeof o.event==`string`&&await this.invokeEventHandlers(o.event,o),t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({ok:!0,endpointId:i.id}))}async invokeEventHandlers(e,t){if(!j(e))return;let n=this.eventHandlers.get(e)??[];for(let e of n)await Promise.resolve(e(t))}},P=class extends N{};function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e){return typeof e==`function`}var L=class{registry;webhook;webhookServer;commandQueue;constructor(e,t){this.registry=e,this.webhook=t}async handleListInstalled(){return r({success:!0,plugins:this.getRegistry().listInstalled()})}async handleExecuteInContext(e){let t=a(e,`pluginId`),n=a(e,`contextName`),o=i(e,`args`)??{},{manifest:s,exports:c}=await this.getRegistry().loadPlugin(t),l=this.resolveContext(c,n);if(!l)throw Error(`Context "${n}" was not found in plugin "${t}"`);let u=await Promise.resolve(l(o));return this.emitEvent(`extension.executed`,{pluginId:t,contextName:n}),r({success:!0,manifest:s,contextName:n,result:u})}async handleReload(e){let t=a(e,`pluginId`);await this.getRegistry().unloadPlugin(t);let n=await this.getRegistry().loadPlugin(t);return this.emitEvent(`extension.reloaded`,{pluginId:t}),r({success:!0,pluginId:t,manifest:n.manifest,exportedKeys:Object.keys(n.exports).toSorted()})}async handleUninstall(e){let t=a(e,`pluginId`);return await this.getRegistry().unregister(t),this.emitEvent(`extension.uninstalled`,{pluginId:t}),r({success:!0,pluginId:t})}async handleWebhookCreate(e){let t=a(e,`name`),n=a(e,`path`),i=o(e,`secret`),s=Array.isArray(e.events)?e.events.filter(e=>typeof e==`string`):[],c=this.getWebhookServer();c.isRunning()||c.start();let l=c.registerEndpoint({path:n,method:`POST`,secret:i??void 0}),u=this.getWebhook(),d=`http://localhost:${c.getPort()}${n}`;return u.registerExternalCallback(l,d),r({success:!0,endpointId:l,url:d,name:t,events:s})}async handleWebhookList(){let e=this.getWebhookServer();return r({success:!0,endpoints:e.listEndpoints(),port:e.getPort(),running:e.isRunning()})}async handleWebhookDelete(e){let t=a(e,`endpointId`),n=this.getWebhookServer();try{n.removeEndpoint(t)}catch(e){throw Error(`GRACEFUL: ${e instanceof Error?e.message:String(e)}`,{cause:e})}return r({success:!0,endpointId:t})}async handleWebhookCommands(e){let t=a(e,`endpointId`),n=o(e,`status`),s=i(e,`command`);if(s)return r({success:!0,commandId:this.getCommandQueue().enqueue({endpointId:t,payload:s}),status:`pending`});let c=this.getCommandQueue(),l={endpointId:t};n&&(l.status=n);let u=c.dequeue(l);return r({success:!0,endpointId:t,commands:u,count:Array.isArray(u)?u.length:+!!u})}getWebhookServer(){return this.webhookServer||=(this.commandQueue=new A,new P({commandQueue:this.commandQueue})),this.webhookServer}async startWebhookServer(){let e=this.getWebhookServer();e.isRunning()||e.start()}async stopWebhookServer(){this.webhookServer&&(await this.webhookServer.stop(),this.webhookServer=void 0,this.commandQueue=void 0)}getRegistry(){return this.registry||=new C,this.registry}getWebhook(){return this.webhook||=new E,this.webhook}getCommandQueue(){return this.commandQueue||=new A,this.commandQueue}emitEvent(e,t){this.getWebhook().sendEvent(e,t).catch(()=>void 0)}resolveContext(e,t){let n=e[t];if(I(n))return n;let r=e.default;if(t==="default"&&I(r))return r;if(F(r)){let e=r[t];if(I(e))return e}return null}async handleWebhookDispatch(e){let t=o(e,`action`);switch(t){case`create`:return this.handleWebhookCreate(e);case`list`:return this.handleWebhookList();case`delete`:return this.handleWebhookDelete(e);case`commands`:return this.handleWebhookCommands(e);default:return r({error:`Invalid action: "${t}". Expected one of: create, list, delete, commands`})}}};export{L as ExtensionRegistryHandlers};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e,r as t}from"./response-
|
|
1
|
+
import{n as e,r as t}from"./response-B1RuVVfD.mjs";var n=class{graph;constructor(e){this.graph=e}pickStringArg(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}serializeNodes(e){return e.map(e=>({id:e.id,type:e.type,label:e.label,metadata:e.metadata}))}handleQueryDispatch(e){switch(e.by){case`function`:return this.handleQueryFunction({...e,name:this.pickStringArg(e,[`name`,`value`,`query`])});case`script`:return this.handleQueryScript({...e,scriptId:this.pickStringArg(e,[`scriptId`,`value`,`query`])});default:return this.handleQueryUrl({...e,url:this.pickStringArg(e,[`url`,`value`,`query`])})}}handleExportDispatch(e){return e.format===`markdown`?this.handleExportMarkdown():this.handleExportJson()}handleQueryUrl(t){let n=t.url,r=this.graph.queryByUrl(n);return e({query:{type:`url`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryFunction(t){let n=t.name,r=this.graph.queryByFunction(n);return e({query:{type:`function`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleQueryScript(t){let n=t.scriptId,r=this.graph.queryByScriptId(n);return e({query:{type:`scriptId`,value:n},resultCount:r.length,nodes:this.serializeNodes(r)})}handleExportJson(){return e(this.graph.exportJson())}handleExportMarkdown(){let e=this.graph.exportMarkdown(),n=this.graph.exportJson();if(!n||!Array.isArray(n.nodes))return t(e);let r=n.nodes.filter(e=>n.edges.filter(t=>t.target===e.id).length===0),i=n.nodes.filter(e=>n.edges.filter(t=>t.source===e.id).length===0),a=n.edges.filter(e=>e.metadata&&typeof e.metadata.confidence==`number`&&e.metadata.confidence<.3),o=[];return o.push(``),o.push(`## Evidence Gaps`),o.push(``),o.push(`- **Dangling nodes (no inbound edges):** ${r.length}`),r.length>0&&o.push(` ${r.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Dangling nodes (no outbound edges):** ${i.length}`),i.length>0&&o.push(` ${i.slice(0,10).map(e=>`\`${e.type}:${e.label}\``).join(`, `)}`),o.push(`- **Low-confidence edges (<0.3):** ${a.length}`),r.length===0&&i.length===0&&a.length===0&&o.push(`- **Status:** No gaps detected — evidence chain is fully connected.`),o.push(``),t(e+o.join(`
|
|
2
2
|
`))}handleChain(t){let n=t.nodeId,r=t.direction??`forward`,i=this.graph.getEvidenceChain(n,r);return e({startNode:n,direction:r,chainLength:i.length,nodes:this.serializeNodes(i)})}};export{n as EvidenceHandlers};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{an as e,cn as t,ln as n,on as r,sn as i}from"./constants-Cp6hBrrx.mjs";import{n as a}from"./response-C7rKQst4.mjs";import{i as o,o as s,s as c}from"./parse-args-Cuk7-xUt.mjs";import{readFile as l,writeFile as u}from"node:fs/promises";import{isIP as d}from"node:net";const f={20:`ChangeCipherSpec`,21:`Alert`,22:`Handshake`,23:`ApplicationData`},p={"0300":`SSL 3.0`,"0301":`TLS 1.0`,"0302":`TLS 1.1`,"0303":`TLS 1.2`,"0304":`TLS 1.3`},ee={1301:`TLS_AES_128_GCM_SHA256`,1302:`TLS_AES_256_GCM_SHA384`,1303:`TLS_CHACHA20_POLY1305_SHA256`,c02b:`TLS_ECDHE_ECDSA_AES_128_GCM_SHA256`,c02f:`TLS_ECDHE_RSA_AES_128_GCM_SHA256`,c02c:`TLS_ECDHE_ECDSA_AES_256_GCM_SHA384`,c030:`TLS_ECDHE_RSA_AES_256_GCM_SHA384`,cca9:`TLS_ECDHE_ECDSA_CHACHA20_POLY1305`,cca8:`TLS_ECDHE_RSA_CHACHA20_POLY1305`,"009c":`TLS_RSA_AES_128_GCM_SHA256`,"009d":`TLS_RSA_AES_256_GCM_SHA384`,"002f":`TLS_RSA_AES_128_CBC_SHA`,"0035":`TLS_RSA_AES_256_CBC_SHA`,c013:`TLS_ECDHE_RSA_AES_128_CBC_SHA`,c014:`TLS_ECDHE_RSA_AES_256_CBC_SHA`,"00ff":`TLS_EMPTY_RENEGOTIATION_INFO_SCSV`,5600:`TLS_FALLBACK_SCSV`},m={0:`NOERROR`,1:`FORMERR`,2:`SERVFAIL`,3:`NXDOMAIN`,4:`NOTIMP`,5:`REFUSED`},h={0:`QUERY`,1:`IQUERY`,2:`STATUS`,3:`UNASSIGNED`,4:`NOTIFY`,5:`UPDATE`},g={474554:`GET`,"504f5354":`POST`,505554:`PUT`,"44454c45":`DELETE`,48454144:`HEAD`,50415443:`PATCH`,"4f505449":`OPTIONS`,"434f4e4e":`CONNECT`},_={"0000":`server_name`,"000a":`supported_groups`,"000b":`ec_point_formats`,"000d":`signature_algorithms`,"0010":`application_layer_protocol_negotiation`,"0015":`padding`,"0017":`extended_master_secret`,"001b":`compress_certificate`,"0023":`session_ticket`,"0029":`pre_shared_key`,"002b":`supported_versions`,"002d":`psk_key_exchange_modes`,"0033":`key_share`,"0039":`quic_transport_parameters`,4469:`next_protocol_negotiation`,fe0d:`encrypted_client_hello`,ff01:`renegotiation_info`},te={0:`continuation`,1:`text`,2:`binary`,8:`close`,9:`ping`,10:`pong`};function v(e,t){return Number.parseInt(e.substring(t*2,t*2+2),16)}function y(e,t){return Number.parseInt(e.substring(t*2,t*2+4),16)}function b(e,t,n){return e.substring(t*2,(t+n)*2)}function x(e){return e.length>=24&&/^0{24}$/i.test(e.slice(0,24))}function ne(e){if(e.length<44)return null;let t=v(e,0);if(t!==22)return null;let n=b(e,1,2),r=y(e,3);if(e.length/2<5+r||v(e,5)!==1)return null;let i={recordType:f[t]??`0x${t.toString(16)}`,recordVersion:p[n]??n,recordLength:r,handshakeType:`ClientHello`},a=9;if(a+2>e.length/2)return i;let o=b(e,a,2);if(i.clientVersion=p[o]??o,a+=34,a>=e.length/2)return i;let s=v(e,a);if(a+=1+s,a+2>e.length/2)return i;let c=y(e,a);a+=2;let l=[];for(let t=0;t<c/2&&a+2<=e.length/2;t++){let t=b(e,a,2).toLowerCase();l.push({hex:t,name:ee[t]??`Unknown(0x${t})`}),a+=2}if(i.cipherSuites=l,i.cipherSuiteCount=l.length,a>=e.length/2)return i;let u=v(e,a);if(a+=1+u,a+2>e.length/2)return i;let d=y(e,a);a+=2;let m=a+d,h=[];for(;a+4<=m&&a+4<=e.length/2;){let t=b(e,a,2).toLowerCase(),n=y(e,a+2);h.push({type:t,length:n,name:_[t]}),a+=4+n}return i.extensions=h,i.extensionCount=h.length,i}function re(e){if(e.length<24)return null;let t=y(e,0),n=v(e,2),r=v(e,3),i=n>>7&1,a=n>>3&15,o=n>>2&1,s=n>>1&1,c=n&1,l=r>>7&1,u=r>>4&7,d=r&15;return{transactionId:`0x${t.toString(16).padStart(4,`0`)}`,flags:{qr:i===1?`Response`:`Query`,opcode:h[a]??a,authoritativeAnswer:!!o,truncation:!!s,recursionDesired:!!c,recursionAvailable:!!l,reserved:u,responseCode:m[d]??d},questionCount:y(e,4),answerCount:y(e,6),authorityCount:y(e,8),additionalCount:y(e,10)}}function ie(e){if(e.length<24||x(e))return!1;let t=v(e,2),n=v(e,3),r=t>>7&1,i=t>>3&15,a=n&15,o=y(e,4),s=y(e,6);return!(i>2||o+s===0||r===0&&a!==0||r===1&&a>5)}function S(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ae(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.offset,i=e.length,a=e.type;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`fields[${t}].offset must be a non-negative integer`);if(typeof i!=`number`||!Number.isInteger(i)||i<=0)throw Error(`fields[${t}].length must be a positive integer`);if(a!==`int`&&a!==`string`&&a!==`bytes`&&a!==`bool`&&a!==`float`)throw Error(`fields[${t}].type is invalid`);return{name:n,offset:r,length:i,type:a}}function oe(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.offset,i=e.length,a=e.type,o=e.description;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`fields[${t}].offset must be a non-negative integer`);if(typeof i!=`number`||!Number.isInteger(i)||i<=0)throw Error(`fields[${t}].length must be a positive integer`);if(a!==`uint8`&&a!==`uint16`&&a!==`uint32`&&a!==`int64`&&a!==`float`&&a!==`string`&&a!==`bytes`)throw Error(`fields[${t}].type is invalid`);return{name:n,offset:r,length:i,type:a,...typeof o==`string`?{description:o}:{}}}function se(e,t){let n=t.fields;if(!Array.isArray(n))throw Error(`spec.fields must be an array`);let r=typeof t.fieldDelimiter==`string`&&t.fieldDelimiter.length>0?t.fieldDelimiter:void 0,i=t.byteOrder,a=i===`le`||i===`be`?i:void 0;return{name:e,...r?{fieldDelimiter:r}:{},...a?{byteOrder:a}:{},fields:n.map((e,t)=>ae(e,t))}}function ce(e){if(!S(e))return;let t=e.type;if(t!==`aes`&&t!==`xor`&&t!==`rc4`&&t!==`custom`)return;let n=typeof e.key==`string`?e.key:void 0,r=typeof e.iv==`string`?e.iv:void 0,i=typeof e.notes==`string`?e.notes:void 0;return{type:t,...n?{key:n}:{},...r?{iv:r}:{},...i?{notes:i}:{}}}function le(e,t){if(!S(e))throw Error(`messages[${t}] must be an object`);let n=e.direction,r=e.timestamp,i=e.fields,a=e.raw;if(n!==`req`&&n!==`res`)throw Error(`messages[${t}].direction must be "req" or "res"`);if(typeof r!=`number`||!Number.isFinite(r))throw Error(`messages[${t}].timestamp must be a number`);if(!S(i))throw Error(`messages[${t}].fields must be an object`);if(typeof a!=`string`)throw Error(`messages[${t}].raw must be a string`);return{direction:n,timestamp:r,fields:i,raw:a}}const ue=[`utf8`,`ascii`],C=[`utf8`,`ascii`,`hex`,`base64`],de=[`u8`,`u16`,`u32`,`i8`,`i16`,`i32`,`string`,`bytes`],fe=[`set_byte`,`flip_bit`,`overwrite_bytes`,`append_bytes`,`truncate`,`increment_integer`];function w(e,t=`big`){return e===`little`?`little`:t}function T(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<0)throw Error(`${t} must be a non-negative integer`);return e}function E(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(`${t} must be a positive integer`);return e}function D(e,t){if(typeof e!=`number`||!Number.isInteger(e))throw Error(`${t} must be an integer`);return e}function O(e,t){let n=D(e,t);if(n<0||n>255)throw Error(`${t} must be between 0 and 255`);return n}function pe(e,t){return e===void 0?void 0:E(e,t)}function k(e,t,n,r){if(e===void 0)return n;if(typeof e!=`string`||!t.includes(e))throw Error(`${r} is invalid`);return e}function A(e,t){if(typeof e!=`string`)throw Error(`${t} must be a string`);return e}function j(e,t){let n=e.replace(/^0x/i,``).replace(/\s+/g,``);if(n.length===0)return n;if(n.length%2!=0||/[^0-9a-f]/i.test(n))throw Error(`${t} must be a valid even-length hex string`);return n.toLowerCase()}function M(e,t,n){switch(t){case`utf8`:case`ascii`:return Buffer.from(e,t);case`hex`:return Buffer.from(j(e,n),`hex`);case`base64`:return Buffer.from(e,`base64`)}}function me(e,t){let n=e*8;return t?{min:-(2**(n-1)),max:2**(n-1)-1}:{min:0,max:2**n-1}}function N(e){switch(e){case`u8`:return{width:1,signed:!1};case`u16`:return{width:2,signed:!1};case`u32`:return{width:4,signed:!1};case`i8`:return{width:1,signed:!0};case`i16`:return{width:2,signed:!0};case`i32`:return{width:4,signed:!0};default:return null}}function P(e,t,n,r,i){if(r)switch(n){case 1:e.writeInt8(t,0);return;case 2:i===`little`?e.writeInt16LE(t,0):e.writeInt16BE(t,0);return;case 4:i===`little`?e.writeInt32LE(t,0):e.writeInt32BE(t,0);return}switch(n){case 1:e.writeUInt8(t,0);return;case 2:i===`little`?e.writeUInt16LE(t,0):e.writeUInt16BE(t,0);return;case 4:i===`little`?e.writeUInt32LE(t,0):e.writeUInt32BE(t,0);return}}function he(e,t,n,r,i){if(r)switch(n){case 1:return e.readInt8(t);case 2:return i===`little`?e.readInt16LE(t):e.readInt16BE(t);case 4:return i===`little`?e.readInt32LE(t):e.readInt32BE(t)}switch(n){case 1:return e.readUInt8(t);case 2:return i===`little`?e.readUInt16LE(t):e.readUInt16BE(t);case 4:return i===`little`?e.readUInt32LE(t):e.readUInt32BE(t)}}function F(e,t,n){return t===void 0||e.length===t?e:e.length>t?e.subarray(0,t):Buffer.concat([e,Buffer.alloc(t-e.length,n)])}function ge(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.type,i=e.value;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`string`||!de.includes(r))throw Error(`fields[${t}].type is invalid`);let a=r,o=N(a);if(o){let s=D(i,`fields[${t}].value`),c=me(o.width,o.signed);if(s<c.min||s>c.max)throw Error(`fields[${t}].value is out of range for ${r} (${c.min}..${c.max})`);if(e.length!==void 0||e.padByte!==void 0||e.encoding!==void 0)throw Error(`fields[${t}] does not support length, padByte, or encoding`);return{name:n,type:a,value:s}}let s=A(i,`fields[${t}].value`),c=pe(e.length,`fields[${t}].length`),l=e.padByte===void 0?0:O(e.padByte,`fields[${t}].padByte`);return r===`string`?{name:n,type:`string`,value:s,encoding:k(e.encoding,ue,`utf8`,`fields[${t}].encoding`),...c===void 0?{}:{length:c},padByte:l}:{name:n,type:`bytes`,value:s,encoding:k(e.encoding,C,`hex`,`fields[${t}].encoding`),...c===void 0?{}:{length:c},padByte:l}}function _e(e,t){switch(e.type){case`u8`:case`u16`:case`u32`:case`i8`:case`i16`:case`i32`:{let n=N(e.type);if(!n)throw Error(`Unsupported numeric field type: ${e.type}`);let r=Buffer.alloc(n.width);return P(r,e.value,n.width,n.signed,t),r}case`string`:return F(Buffer.from(e.value,e.encoding),e.length,e.padByte);case`bytes`:return F(M(e.value,e.encoding,`field ${e.name}`),e.length,e.padByte)}}function ve(e,t){let n=[],r=[],i=0;for(let a of e){let e=_e(a,t);n.push(e),r.push({name:a.name,offset:i,length:e.length,hex:e.toString(`hex`)}),i+=e.length}return{payload:Buffer.concat(n),segments:r}}function ye(e,t){if(!S(e))throw Error(`mutations[${t}] must be an object`);let n=e.strategy;if(typeof n!=`string`||!fe.includes(n))throw Error(`mutations[${t}].strategy is invalid`);switch(n){case`set_byte`:return{strategy:`set_byte`,offset:T(e.offset,`mutations[${t}].offset`),value:O(e.value,`mutations[${t}].value`)};case`flip_bit`:return{strategy:`flip_bit`,offset:T(e.offset,`mutations[${t}].offset`),bit:(()=>{let n=D(e.bit,`mutations[${t}].bit`);if(n<0||n>7)throw Error(`mutations[${t}].bit must be between 0 and 7`);return n})()};case`overwrite_bytes`:return{strategy:`overwrite_bytes`,offset:T(e.offset,`mutations[${t}].offset`),data:M(A(e.data,`mutations[${t}].data`),k(e.encoding,C,`hex`,`mutations[${t}].encoding`),`mutations[${t}].data`)};case`append_bytes`:return{strategy:`append_bytes`,data:M(A(e.data,`mutations[${t}].data`),k(e.encoding,C,`hex`,`mutations[${t}].encoding`),`mutations[${t}].data`)};case`truncate`:return{strategy:`truncate`,length:T(e.length,`mutations[${t}].length`)};case`increment_integer`:{let n=e.width;if(n!==1&&n!==2&&n!==4)throw Error(`mutations[${t}].width must be 1, 2, or 4`);return{strategy:`increment_integer`,offset:T(e.offset,`mutations[${t}].offset`),width:n,delta:D(e.delta,`mutations[${t}].delta`),endian:w(e.endian),signed:e.signed===!0}}}}function be(e,t,n){let r=Buffer.from(e);switch(t.strategy){case`set_byte`:if(t.offset>=r.length)throw Error(`mutations[${n}] offset is outside the payload`);return r[t.offset]=t.value,{payload:r,summary:{index:n,strategy:t.strategy,detail:`set payload[${t.offset}] to ${t.value}`}};case`flip_bit`:if(t.offset>=r.length)throw Error(`mutations[${n}] offset is outside the payload`);{let e=r[t.offset];r[t.offset]=e^1<<t.bit}return{payload:r,summary:{index:n,strategy:t.strategy,detail:`flipped bit ${t.bit} at offset ${t.offset}`}};case`overwrite_bytes`:if(t.offset+t.data.length>r.length)throw Error(`mutations[${n}] overwrite exceeds payload length`);return t.data.copy(r,t.offset),{payload:r,summary:{index:n,strategy:t.strategy,detail:`overwrote ${t.data.length} bytes at offset ${t.offset}`}};case`append_bytes`:return{payload:Buffer.concat([r,t.data]),summary:{index:n,strategy:t.strategy,detail:`appended ${t.data.length} bytes`}};case`truncate`:if(t.length>r.length)throw Error(`mutations[${n}] length exceeds payload size`);return{payload:r.subarray(0,t.length),summary:{index:n,strategy:t.strategy,detail:`truncated payload to ${t.length} bytes`}};case`increment_integer`:{if(t.offset+t.width>r.length)throw Error(`mutations[${n}] integer range exceeds payload length`);let e=he(r,t.offset,t.width,t.signed,t.endian)+t.delta,i=me(t.width,t.signed);if(e<i.min||e>i.max)throw Error(`mutations[${n}] integer overflow (${i.min}..${i.max})`);return P(r.subarray(t.offset,t.offset+t.width),e,t.width,t.signed,t.endian),{payload:r,summary:{index:n,strategy:t.strategy,detail:`incremented ${t.signed?`signed`:`unsigned`} ${t.width}-byte integer at offset ${t.offset} by ${t.delta}`}}}}}const xe=Object.freeze({arp:2054,ipv4:2048,ipv6:34525,vlan:33024}),Se=Object.freeze({icmp:1,igmp:2,tcp:6,udp:17,gre:47,esp:50,ah:51,icmpv6:58,ospf:89}),Ce=Object.freeze({loopback:0,ethernet:1,raw:101});function I(e,t,n,r){if(typeof e==`number`){if(!Number.isInteger(e)||e<0||e>r)throw Error(`${t} must be an integer between 0 and ${r}`);return e}if(typeof e!=`string`||e.trim().length===0)throw Error(`${t} must be a non-empty string or integer`);let i=e.trim().toLowerCase(),a=n[i];if(a!==void 0)return a;if(/^\d+$/.test(i)){let e=Number.parseInt(i,10);if(e>r)throw Error(`${t} must be less than or equal to ${r}`);return e}let o=j(i,t),s=Number.parseInt(o,16);if(s>r)throw Error(`${t} must be less than or equal to ${r}`);return s}function L(e,t){if(typeof e!=`string`||e.trim().length===0)throw Error(`${t} must be a non-empty MAC address string`);let n=e.trim().toLowerCase().replace(/^0x/,``).replace(/[:\-.\s]/g,``);if(!/^[0-9a-f]{12}$/i.test(n))throw Error(`${t} must be a valid 6-byte MAC address`);let r=n.match(/.{2}/g)?.join(`:`);if(!r)throw Error(`${t} must be a valid 6-byte MAC address`);return{canonical:r,bytes:Buffer.from(n,`hex`)}}function R(e,t){if(typeof e!=`string`||d(e.trim())!==4)throw Error(`${t} must be a valid IPv4 address`);let n=e.trim().split(`.`).map(e=>Number.parseInt(e,10));return Buffer.from(n)}function z(e,t){return e.length===0?[]:e.split(`:`).flatMap(e=>{if(e.length===0)return[];if(e.includes(`.`)){let n=R(e,t);return[n.readUInt16BE(0).toString(16),n.readUInt16BE(2).toString(16)]}if(!/^[0-9a-f]{1,4}$/i.test(e))throw Error(`${t} contains an invalid IPv6 group`);return[e]})}function we(e,t){if(typeof e!=`string`)throw Error(`${t} must be a valid IPv6 address`);let n=e.trim().toLowerCase().split(`%`)[0]??``;if(d(n)!==6)throw Error(`${t} must be a valid IPv6 address`);let r=n.split(`::`);if(r.length>2)throw Error(`${t} must be a valid IPv6 address`);let i=z(r[0]??``,t),a=z(r[1]??``,t),o=r.length===2?[...i,...Array.from({length:8-i.length-a.length},()=>`0`),...a]:i;if(o.length!==8)throw Error(`${t} must expand to exactly 8 IPv6 groups`);let s=Buffer.alloc(16);for(let[e,t]of o.entries())s.writeUInt16BE(Number.parseInt(t,16),e*2);return s}function B(e,t,n){return t===`ipv4`?R(e,n):we(e,n)}function V(e,t){return I(e,t,xe,65535)}function Te(e,t){return I(e,t,Se,255)}function Ee(e,t){return I(e,t,Ce,4294967295)}function De(e){return e===`little`?`little`:`big`}function Oe(e){return e===`big`?`big`:`little`}function ke(e){return e===`nano`?`nano`:`micro`}function H(e,t){if(typeof e!=`string`)throw Error(`${t} must be a hex string`);return Buffer.from(j(e,t),`hex`)}function U(e){let t=0;for(let n=0;n<e.length;n+=2){let r=e[n]??0,i=e[n+1]??0;for(t+=r<<8|i;t>65535;)t=(t&65535)+(t>>>16)}return~t&65535}function Ae(e,t,n,r){let i=Buffer.alloc(14);return e.bytes.copy(i,0),t.bytes.copy(i,6),i.writeUInt16BE(n,12),Buffer.concat([i,r])}function je(e){if(e.hardwareSize!==e.senderMac.bytes.length||e.hardwareSize!==e.targetMac.bytes.length)throw Error(`hardwareSize must match the provided MAC address lengths`);if(e.protocolSize!==e.senderIp.length||e.protocolSize!==e.targetIp.length)throw Error(`protocolSize must match the provided IP address lengths`);let t=Buffer.alloc(8+e.hardwareSize*2+e.protocolSize*2),n=0;return t.writeUInt16BE(e.hardwareType,n),n+=2,t.writeUInt16BE(e.protocolType,n),n+=2,t.writeUInt8(e.hardwareSize,n++),t.writeUInt8(e.protocolSize,n++),t.writeUInt16BE(e.operation===`reply`?2:1,n),n+=2,e.senderMac.bytes.copy(t,n),n+=e.hardwareSize,e.senderIp.copy(t,n),n+=e.protocolSize,e.targetMac.bytes.copy(t,n),n+=e.hardwareSize,e.targetIp.copy(t,n),t}function Me(e){let t=Buffer.alloc(20);t[0]=69,t[1]=(e.dscp&63)<<2|e.ecn&3,t.writeUInt16BE(t.length+e.payload.length,2),t.writeUInt16BE(e.identification,4);let n=!!e.dontFragment<<1|!!e.moreFragments;t.writeUInt16BE((n&7)<<13|e.fragmentOffset&8191,6),t[8]=e.ttl,t[9]=e.protocol,t.writeUInt16BE(0,10),e.sourceIp.copy(t,12),e.destinationIp.copy(t,16);let r=U(t);return t.writeUInt16BE(r,10),{packet:Buffer.concat([t,e.payload]),checksum:r}}function Ne(e){let t=Buffer.alloc(40),n=6<<28|(((e.dscp&63)<<2|e.ecn&3)&255)<<20|e.flowLabel&1048575;return t.writeUInt32BE(n>>>0,0),t.writeUInt16BE(e.payload.length,4),t.writeUInt8(e.protocol,6),t.writeUInt8(e.hopLimit,7),e.sourceIp.copy(t,8),e.destinationIp.copy(t,24),Buffer.concat([t,e.payload])}function Pe(e){let t=Buffer.alloc(8+e.payload.length);t[0]=e.operation===`reply`?0:8,t[1]=0,t.writeUInt16BE(0,2),t.writeUInt16BE(e.identifier,4),t.writeUInt16BE(e.sequenceNumber,6),e.payload.copy(t,8);let n=U(t);return t.writeUInt16BE(n,2),{packet:t,checksum:n}}function W(e,t,n,r){r===`little`?e.writeUInt32LE(n,t):e.writeUInt32BE(n,t)}function G(e,t,n,r){r===`little`?e.writeUInt16LE(n,t):e.writeUInt16BE(n,t)}function K(e,t,n){return n===`little`?e.readUInt32LE(t):e.readUInt32BE(t)}function q(e,t,n){return n===`little`?e.readUInt16LE(t):e.readUInt16BE(t)}function Fe(e,t){let n=e===`little`?t===`nano`?`4d3cb2a1`:`d4c3b2a1`:t===`nano`?`a1b23c4d`:`a1b2c3d4`;return Buffer.from(n,`hex`)}function Ie(e){if(e.length<24)throw Error(`PCAP file is too small to contain a global header`);let t=e.subarray(0,4).toString(`hex`),n,r;switch(t){case`d4c3b2a1`:n=`little`,r=`micro`;break;case`4d3cb2a1`:n=`little`,r=`nano`;break;case`a1b2c3d4`:n=`big`,r=`micro`;break;case`a1b23c4d`:n=`big`,r=`nano`;break;default:throw Error(`Unsupported capture format: only classic PCAP files are supported`)}return{endianness:n,timestampPrecision:r,versionMajor:q(e,4,n),versionMinor:q(e,6,n),snapLength:K(e,16,n),linkType:K(e,20,n)}}function Le(e,t){if(!S(e))throw Error(`packets[${t}] must be an object`);let n=H(e.dataHex,`packets[${t}].dataHex`),r=e.timestampSeconds===void 0?0:T(e.timestampSeconds,`packets[${t}].timestampSeconds`),i=e.timestampFraction===void 0?0:T(e.timestampFraction,`packets[${t}].timestampFraction`),a=e.originalLength===void 0?n.length:E(e.originalLength,`packets[${t}].originalLength`);if(a<n.length)throw Error(`packets[${t}].originalLength must be >= included packet length`);return{data:n,timestampSeconds:r,timestampFraction:i,originalLength:a}}function Re(e){let t=Buffer.alloc(24);Fe(e.endianness,e.timestampPrecision).copy(t,0),G(t,4,2,e.endianness),G(t,6,4,e.endianness),W(t,8,0,e.endianness),W(t,12,0,e.endianness),W(t,16,e.snapLength,e.endianness),W(t,20,e.linkType,e.endianness);let n=e.packets.map(t=>{let n=Buffer.alloc(16);return W(n,0,t.timestampSeconds,e.endianness),W(n,4,t.timestampFraction,e.endianness),W(n,8,t.data.length,e.endianness),W(n,12,t.originalLength,e.endianness),Buffer.concat([n,t.data])});return Buffer.concat([t,...n])}function ze(e,t,n){let r=Ie(e),i=[],a=24;for(;a<e.length&&!(t!==void 0&&i.length>=t);){if(a+16>e.length)throw Error(`PCAP file ends with an incomplete packet header`);let t=K(e,a,r.endianness),o=K(e,a+4,r.endianness),s=K(e,a+8,r.endianness),c=K(e,a+12,r.endianness);if(a+=16,a+s>e.length)throw Error(`PCAP file ends with an incomplete packet payload`);let l=e.subarray(a,a+s);a+=s;let u=n===void 0?l.length:n,d=Math.min(u,l.length);i.push({index:i.length,timestampSeconds:t,timestampFraction:o,includedLength:s,originalLength:c,dataHex:l.subarray(0,d).toString(`hex`),truncated:d<l.length})}return{header:r,packets:i}}const Be=[Buffer.from([44]),Buffer.from([124]),Buffer.from([58]),Buffer.from([59]),Buffer.from([9]),Buffer.from([0]),Buffer.from([13,10])];function J(e){return e.replace(/^0x/i,``).replace(/\s+/g,``).toLowerCase()}function Y(e){let t=J(e);return t.length===0||t.length%2!=0?!1:/^[0-9a-f]+$/i.test(t)}function X(e){return Y(e)?Buffer.from(J(e),`hex`):null}function Z(e){return e>=32&&e<=126}function Q(e){if(e.length===0)return 0;let t=0;for(let n of e.values())Z(n)&&(t+=1);return t/e.length}function Ve(e){return e.length===0?0:e.reduce((e,t)=>e+Q(t),0)/e.length}function He(e,t){if(t.length===0)return[e];let n=[],r=0,i=e.indexOf(t,r);for(;i>=0;)n.push(e.subarray(r,i)),r=i+t.length,i=e.indexOf(t,r);return n.push(e.subarray(r)),n}function Ue(e){return Q(e)===1?e.toString(`utf8`):e.toString(`hex`)}function We(e){let t=[];for(let n of e){let e=X(n);e&&t.push(e)}return t}function Ge(e,t){if(e.length===0)return null;if(e.length===1)return e.readUInt8(0);if(e.length===2)return t===`le`?e.readUInt16LE(0):e.readUInt16BE(0);if(e.length===4)return t===`le`?e.readUInt32LE(0):e.readUInt32BE(0);if(e.length===8){let n=Number(t===`le`?e.readBigUInt64LE(0):e.readBigUInt64BE(0));return Number.isFinite(n)?n:null}let n=0,r=t===`le`?[...e.values()].toReversed():[...e.values()];for(let e of r)n=n*256+e;return Number.isFinite(n)?n:null}function Ke(e,t){if(e.length===4){let n=t===`le`?e.readFloatLE(0):e.readFloatBE(0);return Number.isFinite(n)?n:null}if(e.length===8){let n=t===`le`?e.readDoubleLE(0):e.readDoubleBE(0);return Number.isFinite(n)?n:null}return null}function qe(e,t){if(t.length===0)return 0;let n=0,r=0,i=e.indexOf(t,r);for(;i>=0;)n+=1,r=i+t.length,i=e.indexOf(t,r);return n}function Je(e){return e.length===0?`bytes`:e.every(e=>e.length===1)&&e.every(e=>e[0]===0||e[0]===1)?`bool`:Ve(e)>=.7?`string`:e.every(e=>e.length===4)&&Ye(e)?`float`:e.every(e=>e.length<=4)?`int`:`bytes`}function Ye(e){let t=[];for(let n of e){let e=Ke(n,`be`);if(e===null)return!1;t.push(e)}return t.some(e=>Math.abs(e)>.001&&Math.abs(e)<1e6)}function Xe(e,t){let n=0,r=0;for(let i of e){let e=i[t];e!==void 0&&(n+=1,Z(e)&&(r+=1))}return n>0&&r/n>=.8}function Ze(e,t){let n=0;for(let r of e){let e=r[t];if(e!==void 0&&(n+=1,e!==0&&e!==1))return!1}return n>0}function Qe(e,t){if(t.length===0)return[];let n=e.map(e=>He(e,t)),r=n[0];if(!r||r.length<2)return[];let i=r.length;if(!n.every(e=>e.length===i))return[];let a=[],o=0;for(let e=0;e<i;e+=1){let i=r[e];if(!i)continue;let s=n.map(t=>t[e]).filter(e=>Buffer.isBuffer(e));a.push({name:`field_${e+1}`,offset:o,length:i.length,type:Je(s)}),o+=i.length+t.length}return a}function $e(e){let t=Math.min(...e.map(e=>e.length)),n=[],r=0;for(;r<t&&n.length<24;){if(Xe(e,r)){let i=r+1;for(;i<t&&Xe(e,i);)i+=1;n.push({name:`field_${n.length+1}`,offset:r,length:i-r,type:`string`}),r=i;continue}if(Ze(e,r)){n.push({name:`field_${n.length+1}`,offset:r,length:1,type:`bool`}),r+=1;continue}let i=t-r;if(i>=4&&Ye(e.map(e=>e.subarray(r,r+4)))){n.push({name:`field_${n.length+1}`,offset:r,length:4,type:`float`}),r+=4;continue}let a=i>=4?4:Math.min(i,2),o=e.map(e=>e.subarray(r,r+a));n.push({name:`field_${n.length+1}`,offset:r,length:a,type:Je(o)}),r+=a}return n}function et(e){for(let t of Be){let n=e.map(e=>qe(e,t)),r=n[0];if(typeof r==`number`&&r>=2&&n.every(e=>e===r))return Ue(t)}}function tt(e){let t=Math.min(...e.map(e=>e.length));if(t<2)return`be`;let n=0,r=0,i=Math.min(t-1,8);for(let t=0;t<i;t+=2){let i=0,a=0;for(let n of e){let e=n.readUInt16LE(t),r=n.readUInt16BE(t);e<4096&&(i+=1),r<4096&&(a+=1)}i>a?n+=1:a>i&&(r+=1)}return n>r?`le`:`be`}function nt(e,t){if(e.length===0||t.length<2)return e;let n=Math.min(...t.map(e=>e.length)),r=0;for(let e=0;e<n;e+=1){let n=t[0][e];if(t.every(t=>t[e]===n))r=e+1;else break}if(r===0)return e;let i=!1;return e.map(e=>!i&&e.offset===0&&r>=2?(i=!0,{...e,name:`magic`}):i&&e.type===`int`&&e.length<=2&&e.offset<=r?{...e,name:`version`}:e)}var rt=class{patterns=new Map;legacyPatterns=new Map;definePattern(e,t,n){let r=Array.isArray(t)?this.createLegacyPattern(e,t,n):this.createLegacyPatternFromSpec(e,t),i=this.createSpecFromLegacyPattern(r);if(this.patterns.set(e,i),this.legacyPatterns.set(e,r),Array.isArray(t))return r}detectPattern(e){let t=X(e);if(!t)return null;let n=null;for(let e of this.patterns.values()){let r=e.fields.length+ +!!e.fieldDelimiter;if(r===0)continue;let i=0;e.fieldDelimiter&&this.payloadContainsDelimiter(t,e.fieldDelimiter)&&(i+=1);for(let n of e.fields)this.matchesField(t,n,e.byteOrder??`be`)&&(i+=1);let a=Number((i/r).toFixed(2));if(a<=0)continue;let o={pattern:e,confidence:a,matches:i,total:r};(!n||o.confidence>n.confidence||o.confidence===n.confidence&&o.matches>n.matches)&&(n=o)}return n}autoDetect(e){let t=We(e);if(t.length===0)return null;let n=et(t),r=this.inferFields(e);return{name:`auto-detected-pattern`,fieldDelimiter:n,byteOrder:tt(t),fields:r}}inferFields(e){let t=We(e);if(t.length===0)return[];let n=et(t);if(n){let e=Qe(t,this.parseDelimiter(n));if(e.length>0)return nt(e,t)}return nt($e(t),t)}autoDetectPattern(e,t){let n=e.map(e=>e.toString(`hex`)),r=this.autoDetect(n),i=t?.name??r?.name??`auto_detected`;if(!r){let e=this.createLegacyPattern(i,[]);return this.patterns.set(i,this.createSpecFromLegacyPattern(e)),this.legacyPatterns.set(i,e),e}let a={...r,name:i};return this.definePattern(i,a),this.getPattern(i)??this.createLegacyPatternFromSpec(i,a)}getPattern(e){return this.legacyPatterns.get(e)}listPatterns(){return[...this.patterns.keys()]}exportProto(e){let t=this.isLegacyPattern(e)?e:this.createLegacyPatternFromSpec(e.name,e),n=[`// Protocol: ${t.name}`,`// Byte order: ${t.byteOrder}`,``];t.encryption&&(n.push(`// Encryption: ${t.encryption.type}`),t.encryption.notes&&n.push(`// Notes: ${t.encryption.notes}`),n.push(``)),n.push(`message ${this.toPascalCase(t.name)} {`);for(let e=0;e<t.fields.length;e+=1){let r=t.fields[e];if(!r)continue;let i=r.description?` // ${r.description}`:``;n.push(` ${this.toProtoType(r.type)} ${r.name} = ${e+1};${i}`)}return n.push(`}`),n.push(``),n.join(`
|
|
1
|
+
import{_r as e,gr as t,hr as n,mr as r,vr as i}from"./constants-DMv3svps.mjs";import{n as a}from"./response-B1RuVVfD.mjs";import{a as o,c as s,s as c}from"./parse-args-ngRrvF9e.mjs";import{readFile as l,writeFile as u}from"node:fs/promises";import{isIP as d}from"node:net";const f={20:`ChangeCipherSpec`,21:`Alert`,22:`Handshake`,23:`ApplicationData`},p={"0300":`SSL 3.0`,"0301":`TLS 1.0`,"0302":`TLS 1.1`,"0303":`TLS 1.2`,"0304":`TLS 1.3`},ee={1301:`TLS_AES_128_GCM_SHA256`,1302:`TLS_AES_256_GCM_SHA384`,1303:`TLS_CHACHA20_POLY1305_SHA256`,c02b:`TLS_ECDHE_ECDSA_AES_128_GCM_SHA256`,c02f:`TLS_ECDHE_RSA_AES_128_GCM_SHA256`,c02c:`TLS_ECDHE_ECDSA_AES_256_GCM_SHA384`,c030:`TLS_ECDHE_RSA_AES_256_GCM_SHA384`,cca9:`TLS_ECDHE_ECDSA_CHACHA20_POLY1305`,cca8:`TLS_ECDHE_RSA_CHACHA20_POLY1305`,"009c":`TLS_RSA_AES_128_GCM_SHA256`,"009d":`TLS_RSA_AES_256_GCM_SHA384`,"002f":`TLS_RSA_AES_128_CBC_SHA`,"0035":`TLS_RSA_AES_256_CBC_SHA`,c013:`TLS_ECDHE_RSA_AES_128_CBC_SHA`,c014:`TLS_ECDHE_RSA_AES_256_CBC_SHA`,"00ff":`TLS_EMPTY_RENEGOTIATION_INFO_SCSV`,5600:`TLS_FALLBACK_SCSV`},m={0:`NOERROR`,1:`FORMERR`,2:`SERVFAIL`,3:`NXDOMAIN`,4:`NOTIMP`,5:`REFUSED`},h={0:`QUERY`,1:`IQUERY`,2:`STATUS`,3:`UNASSIGNED`,4:`NOTIFY`,5:`UPDATE`},g={474554:`GET`,"504f5354":`POST`,505554:`PUT`,"44454c45":`DELETE`,48454144:`HEAD`,50415443:`PATCH`,"4f505449":`OPTIONS`,"434f4e4e":`CONNECT`},_={"0000":`server_name`,"000a":`supported_groups`,"000b":`ec_point_formats`,"000d":`signature_algorithms`,"0010":`application_layer_protocol_negotiation`,"0015":`padding`,"0017":`extended_master_secret`,"001b":`compress_certificate`,"0023":`session_ticket`,"0029":`pre_shared_key`,"002b":`supported_versions`,"002d":`psk_key_exchange_modes`,"0033":`key_share`,"0039":`quic_transport_parameters`,4469:`next_protocol_negotiation`,fe0d:`encrypted_client_hello`,ff01:`renegotiation_info`},te={0:`continuation`,1:`text`,2:`binary`,8:`close`,9:`ping`,10:`pong`};function v(e,t){return Number.parseInt(e.substring(t*2,t*2+2),16)}function y(e,t){return Number.parseInt(e.substring(t*2,t*2+4),16)}function b(e,t,n){return e.substring(t*2,(t+n)*2)}function x(e){return e.length>=24&&/^0{24}$/i.test(e.slice(0,24))}function ne(e){if(e.length<44)return null;let t=v(e,0);if(t!==22)return null;let n=b(e,1,2),r=y(e,3);if(e.length/2<5+r||v(e,5)!==1)return null;let i={recordType:f[t]??`0x${t.toString(16)}`,recordVersion:p[n]??n,recordLength:r,handshakeType:`ClientHello`},a=9;if(a+2>e.length/2)return i;let o=b(e,a,2);if(i.clientVersion=p[o]??o,a+=34,a>=e.length/2)return i;let s=v(e,a);if(a+=1+s,a+2>e.length/2)return i;let c=y(e,a);a+=2;let l=[];for(let t=0;t<c/2&&a+2<=e.length/2;t++){let t=b(e,a,2).toLowerCase();l.push({hex:t,name:ee[t]??`Unknown(0x${t})`}),a+=2}if(i.cipherSuites=l,i.cipherSuiteCount=l.length,a>=e.length/2)return i;let u=v(e,a);if(a+=1+u,a+2>e.length/2)return i;let d=y(e,a);a+=2;let m=a+d,h=[];for(;a+4<=m&&a+4<=e.length/2;){let t=b(e,a,2).toLowerCase(),n=y(e,a+2);h.push({type:t,length:n,name:_[t]}),a+=4+n}return i.extensions=h,i.extensionCount=h.length,i}function re(e){if(e.length<24)return null;let t=y(e,0),n=v(e,2),r=v(e,3),i=n>>7&1,a=n>>3&15,o=n>>2&1,s=n>>1&1,c=n&1,l=r>>7&1,u=r>>4&7,d=r&15;return{transactionId:`0x${t.toString(16).padStart(4,`0`)}`,flags:{qr:i===1?`Response`:`Query`,opcode:h[a]??a,authoritativeAnswer:!!o,truncation:!!s,recursionDesired:!!c,recursionAvailable:!!l,reserved:u,responseCode:m[d]??d},questionCount:y(e,4),answerCount:y(e,6),authorityCount:y(e,8),additionalCount:y(e,10)}}function ie(e){if(e.length<24||x(e))return!1;let t=v(e,2),n=v(e,3),r=t>>7&1,i=t>>3&15,a=n&15,o=y(e,4),s=y(e,6);return!(i>2||o+s===0||r===0&&a!==0||r===1&&a>5)}function S(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ae(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.offset,i=e.length,a=e.type;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`fields[${t}].offset must be a non-negative integer`);if(typeof i!=`number`||!Number.isInteger(i)||i<=0)throw Error(`fields[${t}].length must be a positive integer`);if(a!==`int`&&a!==`string`&&a!==`bytes`&&a!==`bool`&&a!==`float`)throw Error(`fields[${t}].type is invalid`);return{name:n,offset:r,length:i,type:a}}function oe(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.offset,i=e.length,a=e.type,o=e.description;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`fields[${t}].offset must be a non-negative integer`);if(typeof i!=`number`||!Number.isInteger(i)||i<=0)throw Error(`fields[${t}].length must be a positive integer`);if(a!==`uint8`&&a!==`uint16`&&a!==`uint32`&&a!==`int64`&&a!==`float`&&a!==`string`&&a!==`bytes`)throw Error(`fields[${t}].type is invalid`);return{name:n,offset:r,length:i,type:a,...typeof o==`string`?{description:o}:{}}}function se(e,t){let n=t.fields;if(!Array.isArray(n))throw Error(`spec.fields must be an array`);let r=typeof t.fieldDelimiter==`string`&&t.fieldDelimiter.length>0?t.fieldDelimiter:void 0,i=t.byteOrder,a=i===`le`||i===`be`?i:void 0;return{name:e,...r?{fieldDelimiter:r}:{},...a?{byteOrder:a}:{},fields:n.map((e,t)=>ae(e,t))}}function ce(e){if(!S(e))return;let t=e.type;if(t!==`aes`&&t!==`xor`&&t!==`rc4`&&t!==`custom`)return;let n=typeof e.key==`string`?e.key:void 0,r=typeof e.iv==`string`?e.iv:void 0,i=typeof e.notes==`string`?e.notes:void 0;return{type:t,...n?{key:n}:{},...r?{iv:r}:{},...i?{notes:i}:{}}}function le(e,t){if(!S(e))throw Error(`messages[${t}] must be an object`);let n=e.direction,r=e.timestamp,i=e.fields,a=e.raw;if(n!==`req`&&n!==`res`)throw Error(`messages[${t}].direction must be "req" or "res"`);if(typeof r!=`number`||!Number.isFinite(r))throw Error(`messages[${t}].timestamp must be a number`);if(!S(i))throw Error(`messages[${t}].fields must be an object`);if(typeof a!=`string`)throw Error(`messages[${t}].raw must be a string`);return{direction:n,timestamp:r,fields:i,raw:a}}const ue=[`utf8`,`ascii`],C=[`utf8`,`ascii`,`hex`,`base64`],de=[`u8`,`u16`,`u32`,`i8`,`i16`,`i32`,`string`,`bytes`],fe=[`set_byte`,`flip_bit`,`overwrite_bytes`,`append_bytes`,`truncate`,`increment_integer`];function w(e,t=`big`){return e===`little`?`little`:t}function T(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<0)throw Error(`${t} must be a non-negative integer`);return e}function E(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(`${t} must be a positive integer`);return e}function D(e,t){if(typeof e!=`number`||!Number.isInteger(e))throw Error(`${t} must be an integer`);return e}function O(e,t){let n=D(e,t);if(n<0||n>255)throw Error(`${t} must be between 0 and 255`);return n}function pe(e,t){return e===void 0?void 0:E(e,t)}function k(e,t,n,r){if(e===void 0)return n;if(typeof e!=`string`||!t.includes(e))throw Error(`${r} is invalid`);return e}function A(e,t){if(typeof e!=`string`)throw Error(`${t} must be a string`);return e}function j(e,t){let n=e.replace(/^0x/i,``).replace(/\s+/g,``);if(n.length===0)return n;if(n.length%2!=0||/[^0-9a-f]/i.test(n))throw Error(`${t} must be a valid even-length hex string`);return n.toLowerCase()}function M(e,t,n){switch(t){case`utf8`:case`ascii`:return Buffer.from(e,t);case`hex`:return Buffer.from(j(e,n),`hex`);case`base64`:return Buffer.from(e,`base64`)}}function me(e,t){let n=e*8;return t?{min:-(2**(n-1)),max:2**(n-1)-1}:{min:0,max:2**n-1}}function N(e){switch(e){case`u8`:return{width:1,signed:!1};case`u16`:return{width:2,signed:!1};case`u32`:return{width:4,signed:!1};case`i8`:return{width:1,signed:!0};case`i16`:return{width:2,signed:!0};case`i32`:return{width:4,signed:!0};default:return null}}function P(e,t,n,r,i){if(r)switch(n){case 1:e.writeInt8(t,0);return;case 2:i===`little`?e.writeInt16LE(t,0):e.writeInt16BE(t,0);return;case 4:i===`little`?e.writeInt32LE(t,0):e.writeInt32BE(t,0);return}switch(n){case 1:e.writeUInt8(t,0);return;case 2:i===`little`?e.writeUInt16LE(t,0):e.writeUInt16BE(t,0);return;case 4:i===`little`?e.writeUInt32LE(t,0):e.writeUInt32BE(t,0);return}}function he(e,t,n,r,i){if(r)switch(n){case 1:return e.readInt8(t);case 2:return i===`little`?e.readInt16LE(t):e.readInt16BE(t);case 4:return i===`little`?e.readInt32LE(t):e.readInt32BE(t)}switch(n){case 1:return e.readUInt8(t);case 2:return i===`little`?e.readUInt16LE(t):e.readUInt16BE(t);case 4:return i===`little`?e.readUInt32LE(t):e.readUInt32BE(t)}}function F(e,t,n){return t===void 0||e.length===t?e:e.length>t?e.subarray(0,t):Buffer.concat([e,Buffer.alloc(t-e.length,n)])}function ge(e,t){if(!S(e))throw Error(`fields[${t}] must be an object`);let n=e.name,r=e.type,i=e.value;if(typeof n!=`string`||n.trim().length===0)throw Error(`fields[${t}].name must be a non-empty string`);if(typeof r!=`string`||!de.includes(r))throw Error(`fields[${t}].type is invalid`);let a=r,o=N(a);if(o){let s=D(i,`fields[${t}].value`),c=me(o.width,o.signed);if(s<c.min||s>c.max)throw Error(`fields[${t}].value is out of range for ${r} (${c.min}..${c.max})`);if(e.length!==void 0||e.padByte!==void 0||e.encoding!==void 0)throw Error(`fields[${t}] does not support length, padByte, or encoding`);return{name:n,type:a,value:s}}let s=A(i,`fields[${t}].value`),c=pe(e.length,`fields[${t}].length`),l=e.padByte===void 0?0:O(e.padByte,`fields[${t}].padByte`);return r===`string`?{name:n,type:`string`,value:s,encoding:k(e.encoding,ue,`utf8`,`fields[${t}].encoding`),...c===void 0?{}:{length:c},padByte:l}:{name:n,type:`bytes`,value:s,encoding:k(e.encoding,C,`hex`,`fields[${t}].encoding`),...c===void 0?{}:{length:c},padByte:l}}function _e(e,t){switch(e.type){case`u8`:case`u16`:case`u32`:case`i8`:case`i16`:case`i32`:{let n=N(e.type);if(!n)throw Error(`Unsupported numeric field type: ${e.type}`);let r=Buffer.alloc(n.width);return P(r,e.value,n.width,n.signed,t),r}case`string`:return F(Buffer.from(e.value,e.encoding),e.length,e.padByte);case`bytes`:return F(M(e.value,e.encoding,`field ${e.name}`),e.length,e.padByte)}}function ve(e,t){let n=[],r=[],i=0;for(let a of e){let e=_e(a,t);n.push(e),r.push({name:a.name,offset:i,length:e.length,hex:e.toString(`hex`)}),i+=e.length}return{payload:Buffer.concat(n),segments:r}}function ye(e,t){if(!S(e))throw Error(`mutations[${t}] must be an object`);let n=e.strategy;if(typeof n!=`string`||!fe.includes(n))throw Error(`mutations[${t}].strategy is invalid`);switch(n){case`set_byte`:return{strategy:`set_byte`,offset:T(e.offset,`mutations[${t}].offset`),value:O(e.value,`mutations[${t}].value`)};case`flip_bit`:return{strategy:`flip_bit`,offset:T(e.offset,`mutations[${t}].offset`),bit:(()=>{let n=D(e.bit,`mutations[${t}].bit`);if(n<0||n>7)throw Error(`mutations[${t}].bit must be between 0 and 7`);return n})()};case`overwrite_bytes`:return{strategy:`overwrite_bytes`,offset:T(e.offset,`mutations[${t}].offset`),data:M(A(e.data,`mutations[${t}].data`),k(e.encoding,C,`hex`,`mutations[${t}].encoding`),`mutations[${t}].data`)};case`append_bytes`:return{strategy:`append_bytes`,data:M(A(e.data,`mutations[${t}].data`),k(e.encoding,C,`hex`,`mutations[${t}].encoding`),`mutations[${t}].data`)};case`truncate`:return{strategy:`truncate`,length:T(e.length,`mutations[${t}].length`)};case`increment_integer`:{let n=e.width;if(n!==1&&n!==2&&n!==4)throw Error(`mutations[${t}].width must be 1, 2, or 4`);return{strategy:`increment_integer`,offset:T(e.offset,`mutations[${t}].offset`),width:n,delta:D(e.delta,`mutations[${t}].delta`),endian:w(e.endian),signed:e.signed===!0}}}}function be(e,t,n){let r=Buffer.from(e);switch(t.strategy){case`set_byte`:if(t.offset>=r.length)throw Error(`mutations[${n}] offset is outside the payload`);return r[t.offset]=t.value,{payload:r,summary:{index:n,strategy:t.strategy,detail:`set payload[${t.offset}] to ${t.value}`}};case`flip_bit`:if(t.offset>=r.length)throw Error(`mutations[${n}] offset is outside the payload`);{let e=r[t.offset];r[t.offset]=e^1<<t.bit}return{payload:r,summary:{index:n,strategy:t.strategy,detail:`flipped bit ${t.bit} at offset ${t.offset}`}};case`overwrite_bytes`:if(t.offset+t.data.length>r.length)throw Error(`mutations[${n}] overwrite exceeds payload length`);return t.data.copy(r,t.offset),{payload:r,summary:{index:n,strategy:t.strategy,detail:`overwrote ${t.data.length} bytes at offset ${t.offset}`}};case`append_bytes`:return{payload:Buffer.concat([r,t.data]),summary:{index:n,strategy:t.strategy,detail:`appended ${t.data.length} bytes`}};case`truncate`:if(t.length>r.length)throw Error(`mutations[${n}] length exceeds payload size`);return{payload:r.subarray(0,t.length),summary:{index:n,strategy:t.strategy,detail:`truncated payload to ${t.length} bytes`}};case`increment_integer`:{if(t.offset+t.width>r.length)throw Error(`mutations[${n}] integer range exceeds payload length`);let e=he(r,t.offset,t.width,t.signed,t.endian)+t.delta,i=me(t.width,t.signed);if(e<i.min||e>i.max)throw Error(`mutations[${n}] integer overflow (${i.min}..${i.max})`);return P(r.subarray(t.offset,t.offset+t.width),e,t.width,t.signed,t.endian),{payload:r,summary:{index:n,strategy:t.strategy,detail:`incremented ${t.signed?`signed`:`unsigned`} ${t.width}-byte integer at offset ${t.offset} by ${t.delta}`}}}}}const xe=Object.freeze({arp:2054,ipv4:2048,ipv6:34525,vlan:33024}),Se=Object.freeze({icmp:1,igmp:2,tcp:6,udp:17,gre:47,esp:50,ah:51,icmpv6:58,ospf:89}),Ce=Object.freeze({loopback:0,ethernet:1,raw:101});function I(e,t,n,r){if(typeof e==`number`){if(!Number.isInteger(e)||e<0||e>r)throw Error(`${t} must be an integer between 0 and ${r}`);return e}if(typeof e!=`string`||e.trim().length===0)throw Error(`${t} must be a non-empty string or integer`);let i=e.trim().toLowerCase(),a=n[i];if(a!==void 0)return a;if(/^\d+$/.test(i)){let e=Number.parseInt(i,10);if(e>r)throw Error(`${t} must be less than or equal to ${r}`);return e}let o=j(i,t),s=Number.parseInt(o,16);if(s>r)throw Error(`${t} must be less than or equal to ${r}`);return s}function L(e,t){if(typeof e!=`string`||e.trim().length===0)throw Error(`${t} must be a non-empty MAC address string`);let n=e.trim().toLowerCase().replace(/^0x/,``).replace(/[:\-.\s]/g,``);if(!/^[0-9a-f]{12}$/i.test(n))throw Error(`${t} must be a valid 6-byte MAC address`);let r=n.match(/.{2}/g)?.join(`:`);if(!r)throw Error(`${t} must be a valid 6-byte MAC address`);return{canonical:r,bytes:Buffer.from(n,`hex`)}}function R(e,t){if(typeof e!=`string`||d(e.trim())!==4)throw Error(`${t} must be a valid IPv4 address`);let n=e.trim().split(`.`).map(e=>Number.parseInt(e,10));return Buffer.from(n)}function z(e,t){return e.length===0?[]:e.split(`:`).flatMap(e=>{if(e.length===0)return[];if(e.includes(`.`)){let n=R(e,t);return[n.readUInt16BE(0).toString(16),n.readUInt16BE(2).toString(16)]}if(!/^[0-9a-f]{1,4}$/i.test(e))throw Error(`${t} contains an invalid IPv6 group`);return[e]})}function we(e,t){if(typeof e!=`string`)throw Error(`${t} must be a valid IPv6 address`);let n=e.trim().toLowerCase().split(`%`)[0]??``;if(d(n)!==6)throw Error(`${t} must be a valid IPv6 address`);let r=n.split(`::`);if(r.length>2)throw Error(`${t} must be a valid IPv6 address`);let i=z(r[0]??``,t),a=z(r[1]??``,t),o=r.length===2?[...i,...Array.from({length:8-i.length-a.length},()=>`0`),...a]:i;if(o.length!==8)throw Error(`${t} must expand to exactly 8 IPv6 groups`);let s=Buffer.alloc(16);for(let[e,t]of o.entries())s.writeUInt16BE(Number.parseInt(t,16),e*2);return s}function B(e,t,n){return t===`ipv4`?R(e,n):we(e,n)}function V(e,t){return I(e,t,xe,65535)}function Te(e,t){return I(e,t,Se,255)}function Ee(e,t){return I(e,t,Ce,4294967295)}function De(e){return e===`little`?`little`:`big`}function Oe(e){return e===`big`?`big`:`little`}function ke(e){return e===`nano`?`nano`:`micro`}function H(e,t){if(typeof e!=`string`)throw Error(`${t} must be a hex string`);return Buffer.from(j(e,t),`hex`)}function U(e){let t=0;for(let n=0;n<e.length;n+=2){let r=e[n]??0,i=e[n+1]??0;for(t+=r<<8|i;t>65535;)t=(t&65535)+(t>>>16)}return~t&65535}function Ae(e,t,n,r){let i=Buffer.alloc(14);return e.bytes.copy(i,0),t.bytes.copy(i,6),i.writeUInt16BE(n,12),Buffer.concat([i,r])}function je(e){if(e.hardwareSize!==e.senderMac.bytes.length||e.hardwareSize!==e.targetMac.bytes.length)throw Error(`hardwareSize must match the provided MAC address lengths`);if(e.protocolSize!==e.senderIp.length||e.protocolSize!==e.targetIp.length)throw Error(`protocolSize must match the provided IP address lengths`);let t=Buffer.alloc(8+e.hardwareSize*2+e.protocolSize*2),n=0;return t.writeUInt16BE(e.hardwareType,n),n+=2,t.writeUInt16BE(e.protocolType,n),n+=2,t.writeUInt8(e.hardwareSize,n++),t.writeUInt8(e.protocolSize,n++),t.writeUInt16BE(e.operation===`reply`?2:1,n),n+=2,e.senderMac.bytes.copy(t,n),n+=e.hardwareSize,e.senderIp.copy(t,n),n+=e.protocolSize,e.targetMac.bytes.copy(t,n),n+=e.hardwareSize,e.targetIp.copy(t,n),t}function Me(e){let t=Buffer.alloc(20);t[0]=69,t[1]=(e.dscp&63)<<2|e.ecn&3,t.writeUInt16BE(t.length+e.payload.length,2),t.writeUInt16BE(e.identification,4);let n=!!e.dontFragment<<1|!!e.moreFragments;t.writeUInt16BE((n&7)<<13|e.fragmentOffset&8191,6),t[8]=e.ttl,t[9]=e.protocol,t.writeUInt16BE(0,10),e.sourceIp.copy(t,12),e.destinationIp.copy(t,16);let r=U(t);return t.writeUInt16BE(r,10),{packet:Buffer.concat([t,e.payload]),checksum:r}}function Ne(e){let t=Buffer.alloc(40),n=6<<28|(((e.dscp&63)<<2|e.ecn&3)&255)<<20|e.flowLabel&1048575;return t.writeUInt32BE(n>>>0,0),t.writeUInt16BE(e.payload.length,4),t.writeUInt8(e.protocol,6),t.writeUInt8(e.hopLimit,7),e.sourceIp.copy(t,8),e.destinationIp.copy(t,24),Buffer.concat([t,e.payload])}function Pe(e){let t=Buffer.alloc(8+e.payload.length);t[0]=e.operation===`reply`?0:8,t[1]=0,t.writeUInt16BE(0,2),t.writeUInt16BE(e.identifier,4),t.writeUInt16BE(e.sequenceNumber,6),e.payload.copy(t,8);let n=U(t);return t.writeUInt16BE(n,2),{packet:t,checksum:n}}function W(e,t,n,r){r===`little`?e.writeUInt32LE(n,t):e.writeUInt32BE(n,t)}function G(e,t,n,r){r===`little`?e.writeUInt16LE(n,t):e.writeUInt16BE(n,t)}function K(e,t,n){return n===`little`?e.readUInt32LE(t):e.readUInt32BE(t)}function q(e,t,n){return n===`little`?e.readUInt16LE(t):e.readUInt16BE(t)}function Fe(e,t){let n=e===`little`?t===`nano`?`4d3cb2a1`:`d4c3b2a1`:t===`nano`?`a1b23c4d`:`a1b2c3d4`;return Buffer.from(n,`hex`)}function Ie(e){if(e.length<24)throw Error(`PCAP file is too small to contain a global header`);let t=e.subarray(0,4).toString(`hex`),n,r;switch(t){case`d4c3b2a1`:n=`little`,r=`micro`;break;case`4d3cb2a1`:n=`little`,r=`nano`;break;case`a1b2c3d4`:n=`big`,r=`micro`;break;case`a1b23c4d`:n=`big`,r=`nano`;break;default:throw Error(`Unsupported capture format: only classic PCAP files are supported`)}return{endianness:n,timestampPrecision:r,versionMajor:q(e,4,n),versionMinor:q(e,6,n),snapLength:K(e,16,n),linkType:K(e,20,n)}}function Le(e,t){if(!S(e))throw Error(`packets[${t}] must be an object`);let n=H(e.dataHex,`packets[${t}].dataHex`),r=e.timestampSeconds===void 0?0:T(e.timestampSeconds,`packets[${t}].timestampSeconds`),i=e.timestampFraction===void 0?0:T(e.timestampFraction,`packets[${t}].timestampFraction`),a=e.originalLength===void 0?n.length:E(e.originalLength,`packets[${t}].originalLength`);if(a<n.length)throw Error(`packets[${t}].originalLength must be >= included packet length`);return{data:n,timestampSeconds:r,timestampFraction:i,originalLength:a}}function Re(e){let t=Buffer.alloc(24);Fe(e.endianness,e.timestampPrecision).copy(t,0),G(t,4,2,e.endianness),G(t,6,4,e.endianness),W(t,8,0,e.endianness),W(t,12,0,e.endianness),W(t,16,e.snapLength,e.endianness),W(t,20,e.linkType,e.endianness);let n=e.packets.map(t=>{let n=Buffer.alloc(16);return W(n,0,t.timestampSeconds,e.endianness),W(n,4,t.timestampFraction,e.endianness),W(n,8,t.data.length,e.endianness),W(n,12,t.originalLength,e.endianness),Buffer.concat([n,t.data])});return Buffer.concat([t,...n])}function ze(e,t,n){let r=Ie(e),i=[],a=24;for(;a<e.length&&!(t!==void 0&&i.length>=t);){if(a+16>e.length)throw Error(`PCAP file ends with an incomplete packet header`);let t=K(e,a,r.endianness),o=K(e,a+4,r.endianness),s=K(e,a+8,r.endianness),c=K(e,a+12,r.endianness);if(a+=16,a+s>e.length)throw Error(`PCAP file ends with an incomplete packet payload`);let l=e.subarray(a,a+s);a+=s;let u=n===void 0?l.length:n,d=Math.min(u,l.length);i.push({index:i.length,timestampSeconds:t,timestampFraction:o,includedLength:s,originalLength:c,dataHex:l.subarray(0,d).toString(`hex`),truncated:d<l.length})}return{header:r,packets:i}}const Be=[Buffer.from([44]),Buffer.from([124]),Buffer.from([58]),Buffer.from([59]),Buffer.from([9]),Buffer.from([0]),Buffer.from([13,10])];function J(e){return e.replace(/^0x/i,``).replace(/\s+/g,``).toLowerCase()}function Y(e){let t=J(e);return t.length===0||t.length%2!=0?!1:/^[0-9a-f]+$/i.test(t)}function X(e){return Y(e)?Buffer.from(J(e),`hex`):null}function Z(e){return e>=32&&e<=126}function Q(e){if(e.length===0)return 0;let t=0;for(let n of e.values())Z(n)&&(t+=1);return t/e.length}function Ve(e){return e.length===0?0:e.reduce((e,t)=>e+Q(t),0)/e.length}function He(e,t){if(t.length===0)return[e];let n=[],r=0,i=e.indexOf(t,r);for(;i>=0;)n.push(e.subarray(r,i)),r=i+t.length,i=e.indexOf(t,r);return n.push(e.subarray(r)),n}function Ue(e){return Q(e)===1?e.toString(`utf8`):e.toString(`hex`)}function We(e){let t=[];for(let n of e){let e=X(n);e&&t.push(e)}return t}function Ge(e,t){if(e.length===0)return null;if(e.length===1)return e.readUInt8(0);if(e.length===2)return t===`le`?e.readUInt16LE(0):e.readUInt16BE(0);if(e.length===4)return t===`le`?e.readUInt32LE(0):e.readUInt32BE(0);if(e.length===8){let n=Number(t===`le`?e.readBigUInt64LE(0):e.readBigUInt64BE(0));return Number.isFinite(n)?n:null}let n=0,r=t===`le`?[...e.values()].toReversed():[...e.values()];for(let e of r)n=n*256+e;return Number.isFinite(n)?n:null}function Ke(e,t){if(e.length===4){let n=t===`le`?e.readFloatLE(0):e.readFloatBE(0);return Number.isFinite(n)?n:null}if(e.length===8){let n=t===`le`?e.readDoubleLE(0):e.readDoubleBE(0);return Number.isFinite(n)?n:null}return null}function qe(e,t){if(t.length===0)return 0;let n=0,r=0,i=e.indexOf(t,r);for(;i>=0;)n+=1,r=i+t.length,i=e.indexOf(t,r);return n}function Je(e){return e.length===0?`bytes`:e.every(e=>e.length===1)&&e.every(e=>e[0]===0||e[0]===1)?`bool`:Ve(e)>=.7?`string`:e.every(e=>e.length===4)&&Ye(e)?`float`:e.every(e=>e.length<=4)?`int`:`bytes`}function Ye(e){let t=[];for(let n of e){let e=Ke(n,`be`);if(e===null)return!1;t.push(e)}return t.some(e=>Math.abs(e)>.001&&Math.abs(e)<1e6)}function Xe(e,t){let n=0,r=0;for(let i of e){let e=i[t];e!==void 0&&(n+=1,Z(e)&&(r+=1))}return n>0&&r/n>=.8}function Ze(e,t){let n=0;for(let r of e){let e=r[t];if(e!==void 0&&(n+=1,e!==0&&e!==1))return!1}return n>0}function Qe(e,t){if(t.length===0)return[];let n=e.map(e=>He(e,t)),r=n[0];if(!r||r.length<2)return[];let i=r.length;if(!n.every(e=>e.length===i))return[];let a=[],o=0;for(let e=0;e<i;e+=1){let i=r[e];if(!i)continue;let s=n.map(t=>t[e]).filter(e=>Buffer.isBuffer(e));a.push({name:`field_${e+1}`,offset:o,length:i.length,type:Je(s)}),o+=i.length+t.length}return a}function $e(e){let t=Math.min(...e.map(e=>e.length)),n=[],r=0;for(;r<t&&n.length<24;){if(Xe(e,r)){let i=r+1;for(;i<t&&Xe(e,i);)i+=1;n.push({name:`field_${n.length+1}`,offset:r,length:i-r,type:`string`}),r=i;continue}if(Ze(e,r)){n.push({name:`field_${n.length+1}`,offset:r,length:1,type:`bool`}),r+=1;continue}let i=t-r;if(i>=4&&Ye(e.map(e=>e.subarray(r,r+4)))){n.push({name:`field_${n.length+1}`,offset:r,length:4,type:`float`}),r+=4;continue}let a=i>=4?4:Math.min(i,2),o=e.map(e=>e.subarray(r,r+a));n.push({name:`field_${n.length+1}`,offset:r,length:a,type:Je(o)}),r+=a}return n}function et(e){for(let t of Be){let n=e.map(e=>qe(e,t)),r=n[0];if(typeof r==`number`&&r>=2&&n.every(e=>e===r))return Ue(t)}}function tt(e){let t=Math.min(...e.map(e=>e.length));if(t<2)return`be`;let n=0,r=0,i=Math.min(t-1,8);for(let t=0;t<i;t+=2){let i=0,a=0;for(let n of e){let e=n.readUInt16LE(t),r=n.readUInt16BE(t);e<4096&&(i+=1),r<4096&&(a+=1)}i>a?n+=1:a>i&&(r+=1)}return n>r?`le`:`be`}function nt(e,t){if(e.length===0||t.length<2)return e;let n=Math.min(...t.map(e=>e.length)),r=0;for(let e=0;e<n;e+=1){let n=t[0][e];if(t.every(t=>t[e]===n))r=e+1;else break}if(r===0)return e;let i=!1;return e.map(e=>!i&&e.offset===0&&r>=2?(i=!0,{...e,name:`magic`}):i&&e.type===`int`&&e.length<=2&&e.offset<=r?{...e,name:`version`}:e)}var rt=class{patterns=new Map;legacyPatterns=new Map;definePattern(e,t,n){let r=Array.isArray(t)?this.createLegacyPattern(e,t,n):this.createLegacyPatternFromSpec(e,t),i=this.createSpecFromLegacyPattern(r);if(this.patterns.set(e,i),this.legacyPatterns.set(e,r),Array.isArray(t))return r}detectPattern(e){let t=X(e);if(!t)return null;let n=null;for(let e of this.patterns.values()){let r=e.fields.length+ +!!e.fieldDelimiter;if(r===0)continue;let i=0;e.fieldDelimiter&&this.payloadContainsDelimiter(t,e.fieldDelimiter)&&(i+=1);for(let n of e.fields)this.matchesField(t,n,e.byteOrder??`be`)&&(i+=1);let a=Number((i/r).toFixed(2));if(a<=0)continue;let o={pattern:e,confidence:a,matches:i,total:r};(!n||o.confidence>n.confidence||o.confidence===n.confidence&&o.matches>n.matches)&&(n=o)}return n}autoDetect(e){let t=We(e);if(t.length===0)return null;let n=et(t),r=this.inferFields(e);return{name:`auto-detected-pattern`,fieldDelimiter:n,byteOrder:tt(t),fields:r}}inferFields(e){let t=We(e);if(t.length===0)return[];let n=et(t);if(n){let e=Qe(t,this.parseDelimiter(n));if(e.length>0)return nt(e,t)}return nt($e(t),t)}autoDetectPattern(e,t){let n=e.map(e=>e.toString(`hex`)),r=this.autoDetect(n),i=t?.name??r?.name??`auto_detected`;if(!r){let e=this.createLegacyPattern(i,[]);return this.patterns.set(i,this.createSpecFromLegacyPattern(e)),this.legacyPatterns.set(i,e),e}let a={...r,name:i};return this.definePattern(i,a),this.getPattern(i)??this.createLegacyPatternFromSpec(i,a)}getPattern(e){return this.legacyPatterns.get(e)}listPatterns(){return[...this.patterns.keys()]}exportProto(e){let t=this.isLegacyPattern(e)?e:this.createLegacyPatternFromSpec(e.name,e),n=[`// Protocol: ${t.name}`,`// Byte order: ${t.byteOrder}`,``];t.encryption&&(n.push(`// Encryption: ${t.encryption.type}`),t.encryption.notes&&n.push(`// Notes: ${t.encryption.notes}`),n.push(``)),n.push(`message ${this.toPascalCase(t.name)} {`);for(let e=0;e<t.fields.length;e+=1){let r=t.fields[e];if(!r)continue;let i=r.description?` // ${r.description}`:``;n.push(` ${this.toProtoType(r.type)} ${r.name} = ${e+1};${i}`)}return n.push(`}`),n.push(``),n.join(`
|
|
2
2
|
`)}payloadContainsDelimiter(e,t){let n=this.parseDelimiter(t);return n.length===0?!1:e.includes(n)}matchesField(e,t,n){if(t.offset<0||t.length<=0||e.length<t.offset+t.length)return!1;let r=e.subarray(t.offset,t.offset+t.length);switch(t.type){case`bytes`:return r.length===t.length;case`bool`:return r.length===1&&(r[0]===0||r[0]===1);case`string`:return Q(r)>=.6;case`int`:return Ge(r,n)!==null;case`float`:return Ke(r,n)!==null;default:return!1}}createLegacyPattern(e,t,n){return{name:e,fields:t.map(e=>({name:e.name,offset:e.offset,length:e.length,type:e.type,...e.description?{description:e.description}:{}})).toSorted((e,t)=>e.offset-t.offset),byteOrder:n?.byteOrder??`big`,...n?.encryption?{encryption:n.encryption}:{}}}createLegacyPatternFromSpec(e,t){return{name:e,fieldDelimiter:t.fieldDelimiter,byteOrder:t.byteOrder===`le`?`little`:`big`,fields:t.fields.map(e=>({name:e.name,offset:e.offset,length:e.length,type:this.toLegacyFieldType(e),...e.description?{description:e.description}:{}}))}}createSpecFromLegacyPattern(e){return{name:e.name,fieldDelimiter:e.fieldDelimiter,byteOrder:e.byteOrder===`little`?`le`:`be`,fields:e.fields.map(e=>({name:e.name,offset:e.offset,length:e.length,type:this.toSpecFieldType(e.type),...e.description?{description:e.description}:{}}))}}isLegacyPattern(e){return e.byteOrder===`big`||e.byteOrder===`little`}toLegacyFieldType(e){return e.type===`float`?`float`:e.type===`string`?`string`:e.type===`bytes`?`bytes`:e.length===1?`uint8`:e.length===2?`uint16`:e.length===4?`uint32`:`int64`}toSpecFieldType(e){return e===`float`?`float`:e===`string`?`string`:e===`bytes`?`bytes`:`int`}parseDelimiter(e){if(Y(e)){let t=X(e);if(t)return t}return Buffer.from(e,`utf8`)}toProtoType(e){return{uint8:`uint32`,uint16:`uint32`,uint32:`uint32`,int64:`int64`,float:`float`,string:`string`,bytes:`bytes`}[e]}toPascalCase(e){return e.replace(/[^a-zA-Z0-9_]/g,`_`).split(`_`).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)||`Message`}};function it(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $(e){return e.trim().toLowerCase()}function at(e){if(e.length===0)return 0;let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);let n=0;for(let r of t.values()){let t=r/e.length;t>0&&(n-=t*Math.log2(t))}return n}function ot(e){if(e.length===0)return 0;let t=0;for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);r>=32&&r<=126&&(t+=1)}return t/e.length}var st=class{infer(e){if(e.length===0)return{states:[],transitions:[],initial:``,initialState:``,finalStates:[]};let t=new Map,n=new Map,r=``;for(let i=0;i<e.length;i+=1){let a=e[i];if(!a)continue;let o=this.buildSignature(a),s=t.get(o);if(s?s.type=this.mergeStateTypes(s.type,this.inferStateType(a,i===e.length-1)):(s={id:`state_${t.size+1}`,name:this.buildStateName(a,t.size+1),type:this.inferStateType(a,i===e.length-1)},t.set(o,s)),r&&a.timestamp!==void 0){let t=e[0];t&&t.timestamp!==void 0&&(s.timeout=a.timestamp-t.timestamp)}if(r){let e=this.buildEventName(a),t=this.buildCondition(a.fields),i=this.buildAction(a),o=`${r}:${s.id}:${e}`;n.has(o)||n.set(o,{from:r,to:s.id,event:e,confidence:this.computeTransitionConfidence(a),...t?{condition:t}:{},...i?{action:i}:{}})}r=s.id}let i=e[0],a=i?t.get(this.buildSignature(i))?.id??``:``;return{states:[...t.values()],transitions:[...n.values()],initial:a,initialState:a,finalStates:this.collectTerminalStates([...t.values()])}}visualize(e){if(e.states.length===0)return["```mermaid",`stateDiagram-v2`,` [*] --> empty`,"```"].join(`
|
|
3
3
|
`);let t=["```mermaid",`stateDiagram-v2`],n=e.initialState??e.initial;n&&t.push(` [*] --> ${n}`);for(let n of e.states){let e=n.type??`normal`,r=e===`normal`?n.name:`${n.name} (${e})`;t.push(` state "${r}" as ${n.id}`)}for(let n of e.transitions){let e=[n.event??n.trigger??`transition`];typeof n.confidence==`number`&&e.push(`(${n.confidence.toFixed(2)})`),n.condition&&e.push(`[${n.condition}]`),n.action&&e.push(`/ ${n.action}`),t.push(` ${n.from} --> ${n.to} : ${e.join(` `)}`)}let r=new Set(e.finalStates??[]);for(let n of e.states){let e=n.type??`normal`;(e===`accept`||e===`reject`||r.has(n.id))&&t.push(` ${n.id} --> [*]`)}return t.push("```"),t.join(`
|
|
4
|
-
`)}inferStateMachine(e){let t=e.map(e=>({direction:e.direction===`out`?`req`:`res`,timestamp:e.timestamp??0,fields:{},raw:e.payload.length>0?e.payload.toString(`utf8`):e.payload.toString(`hex`),rawBuffer:e.payload}));return this.infer(t)}generateMermaid(e){return this.visualize(e)}simplify(e){if(e.states.length<2)return{...e,initialState:e.initialState??e.initial,finalStates:e.finalStates??this.collectTerminalStates(e.states)};let t=new Map,n=new Map;for(let r of e.states){let e=this.getPayloadPrefix(r);if(!e)continue;let i=[...n.entries()].find(([t])=>t===e);i?t.set(r.id,i[0]):(n.set(e,r.id),t.set(r.id,e))}let r=new Map,i=new Map;for(let[e,t]of n)i.set(e,t);for(let t of e.states){let e=this.getPayloadPrefix(t);if(!e)continue;let n=i.get(e);n&&n!==t.id&&r.set(t.id,n)}if(r.size===0)return{...e,initialState:e.initialState??e.initial,finalStates:e.finalStates??this.collectTerminalStates(e.states)};let a=e.states.filter(e=>!r.has(e.id)),o=e.transitions.map(e=>({...e,from:r.get(e.from)??e.from,to:r.get(e.to)??e.to})).filter(e=>e.from!==e.to),s=e.initialState??e.initial??``,c=r.get(s)??s;return{states:a,transitions:o,initial:c,initialState:c,finalStates:e.finalStates.map(e=>r.get(e)??e).filter((e,t,n)=>n.indexOf(e)===t)}}getPayloadPrefix(e){let t=e.expectedPayload;return!t||t.length<8?null:t.slice(0,8).toLowerCase()}buildSignature(e){let t=Object.keys(e.fields).toSorted().join(`,`),n=$(e.rawBuffer?e.rawBuffer.toString(`hex`):e.raw).slice(0,24);return`${e.direction}|${t}|${n}`}buildStateName(e,t){let n=e.direction===`req`?`send`:`recv`,r=this.findPrimaryFieldName(e.fields),i=e.raw;if(i.length===0)return`${n}_empty`;let a=e.rawBuffer,o=Buffer.isBuffer(a)?a.toString(`hex`):i;if(o.startsWith(`16`)||o.startsWith(`15`)||o.startsWith(`17`))return`${n}_tls_handshake`;let s=i.trimStart();if(s.startsWith(`{`)||s.startsWith(`[`))return`${n}_json_${r||`step_${t}`}`;if(ot(i)>=.7){let e=$(i);return e.includes(`close`)||e.includes(`fin`)||e.includes(`bye`)?`${n}_close`:e.startsWith(`get `)||e.startsWith(`post `)||e.startsWith(`http`)?`${n}_text_http`:`${n}_text_${r||`step_${t}`}`}return Buffer.isBuffer(a)&&a.length>=32&&at(a)>6?`${n}_encrypted`:Buffer.isBuffer(a)&&a.length<=4?`${n}_control`:`${n}_${r||`step_${t}`}`}findPrimaryFieldName(e){return Object.keys(e).toSorted()[0]||``}inferStateType(e,t){let n=$(e.raw),r=this.findStatusValue(e.fields);return this.containsRejectSignal(n)||this.containsRejectSignal(r)?`reject`:this.containsAcceptSignal(n)||this.containsAcceptSignal(r)||t&&e.direction===`res`?`accept`:`normal`}mergeStateTypes(e,t){return e===`reject`||t===`reject`?`reject`:e===`accept`||t===`accept`?`accept`:`normal`}findStatusValue(e){for(let t of[`status`,`result`,`code`,`reason`,`message`]){let n=e[t];if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`)return String(n)}return``}containsRejectSignal(e){return[`error`,`fail`,`denied`,`reject`,`timeout`,`invalid`].some(t=>$(e).includes(t))}containsAcceptSignal(e){return[`ok`,`success`,`accept`,`ready`,`done`,`complete`].some(t=>$(e).includes(t))}buildEventName(e){let t=this.findStatusValue(e.fields);if(t)return`${e.direction}_${$(t).replace(/[^a-z0-9]+/g,`_`)}`;let n=this.findPrimaryFieldName(e.fields);return n?`${e.direction}_${n}`:`${e.direction}_message`}buildCondition(e){let t=this.findStatusValue(e);if(t)return`status=${t}`;let n=Object.keys(e).toSorted().slice(0,2);if(n.length===0)return;let r=[];for(let t of n){let n=e[t];(typeof n==`string`||typeof n==`number`||typeof n==`boolean`)&&r.push(`${t}=${n}`)}return r.length>0?r.join(`, `):void 0}buildAction(e){let t=this.findStatusValue(e.fields);if(this.containsRejectSignal(t)||this.containsRejectSignal(e.raw))return`reject`;if(this.containsAcceptSignal(t)||this.containsAcceptSignal(e.raw))return`complete`;let n=$(e.raw);if(n.includes(`ack`))return`acknowledge`;if(n.includes(`retry`))return`retry`;if(Object.keys(e.fields).length>0&&it(e.fields))return e.direction===`req`?`send`:`receive`}collectTerminalStates(e){let t=e.filter(e=>{let t=e.type??`normal`;return t===`accept`||t===`reject`}).map(e=>e.id);for(let n of e){let e=$(n.name);(e.includes(`close`)||e.includes(`fin`)||e.includes(`bye`))&&(t.includes(n.id)||t.push(n.id))}return t}computeTransitionConfidence(e){let t=.3;return Object.keys(e.fields).length>0&&(t+=.3),this.findStatusValue(e.fields)&&(t+=.2),e.raw.length>0&&(t+=.2),Math.min(t,1)}};const ct={states:[],transitions:[],initial:``,initialState:``,finalStates:[]};var lt=class{engine;inferrer;eventBus;constructor(e,t,n){this.engine=e,this.inferrer=t,this.eventBus=n}emitEvent(e,t){this.eventBus?.emit(e,{...t,timestamp:new Date().toISOString()})}getEngine(){return this.engine||=new rt,this.engine}getInferrer(){return this.inferrer||=new st,this.inferrer}errorMessage(e){return e instanceof Error?e.message:String(e)}},ut=class extends lt{async handleDefinePattern(e){try{let t=typeof e.name==`string`&&e.name.trim().length>0?e.name:`unnamed_pattern`,n=o(e,`spec`);if(n){let e=se(t,n);return this.getEngine().definePattern(t,e),{patternId:t,pattern:this.getEngine().getPattern(t)??{name:t,fields:[],byteOrder:`big`},success:!0}}let r=(Array.isArray(e.fields)?e.fields:[]).map((e,t)=>oe(e,t)),i=e.byteOrder===`little`||e.byteOrder===`big`?e.byteOrder:void 0,a=ce(e.encryption);return{patternId:t,pattern:this.getEngine().definePattern(t,r,{...i?{byteOrder:i}:{},...a?{encryption:a}:{}}),success:!0}}catch(e){return{patternId:`error`,pattern:{name:`error`,fields:[],byteOrder:`big`},success:!1,error:this.errorMessage(e)}}}async handleAutoDetect(e){try{let t=(()=>{let t=s(e,`hexPayloads`);return t.length>0?t:s(e,`payloads`)})(),n=this.getEngine().autoDetect(t),r=typeof e.name==`string`&&e.name.trim().length>0?e.name:void 0;if(!n)return{patterns:[this.getEngine().autoDetectPattern([],r?{name:r}:{})],success:!0};let i={...n,name:r??n.name};this.getEngine().definePattern(i.name,i);let a=this.getEngine().getPattern(i.name)??{name:i.name,fields:[],byteOrder:`big`};return this.emitEvent(`protocol:pattern_detected`,{patternName:i.name,confidence:0}),{patterns:[a],success:!0}}catch(e){return{patterns:[],success:!1,error:this.errorMessage(e)}}}async handleInferFields(e){try{let t=s(e,`hexPayloads`);return{success:!0,fields:this.getEngine().inferFields(t)}}catch(e){return{fields:[],success:!1,error:this.errorMessage(e)}}}async handleExportSchema(e){try{let t=c(e,`patternId`),n=this.getEngine().getPattern(t);return n?{schema:this.getEngine().exportProto(n)}:{schema:`// Error: pattern '${t}' not found`}}catch(e){return{schema:`// Error: ${this.errorMessage(e)}`}}}async handleInferStateMachine(e){try{let t=e.messages;if(!Array.isArray(t))throw Error(`messages must be an array`);let n=t.some(e=>S(e)&&(e.direction===`in`||e.direction===`out`)),r;if(n){let e=t.map((e,t)=>{if(!S(e))throw Error(`messages[${t}] must be an object`);let n=e.direction,r=typeof e.payloadHex==`string`?e.payloadHex:``,i=typeof e.timestamp==`number`?e.timestamp:void 0,a=Buffer.from(r.replace(/\s+/g,``),`hex`);if(n!==`in`&&n!==`out`)throw Error(`messages[${t}].direction must be "in" or "out"`);return{direction:n,payload:a,...i===void 0?{}:{timestamp:i}}});r=this.getInferrer().inferStateMachine(e)}else{let e=t.map((e,t)=>le(e,t));r=this.getInferrer().infer(e)}return e.simplify===!0&&(r=this.getInferrer().simplify(r)),{stateMachine:r,mermaid:this.getInferrer().generateMermaid(r),success:!0}}catch(e){return{stateMachine:{...ct},success:!1,error:this.errorMessage(e)}}}async handleVisualizeState(e){try{let t=e.stateMachine;if(!S(t))return{mermaidDiagram:this.getInferrer().generateMermaid(ct)};let n=Array.isArray(t.states)?t.states:[],r=Array.isArray(t.transitions)?t.transitions:[],i=typeof t.initialState==`string`?t.initialState:``,a=Array.isArray(t.finalStates)?t.finalStates.filter(e=>typeof e==`string`):[];return{mermaidDiagram:this.getInferrer().generateMermaid({states:n.filter(e=>S(e)),transitions:r.filter(e=>S(e)),initial:i,initialState:i,finalStates:a})}}catch(e){return{mermaidDiagram:`stateDiagram-v2\n note right of empty: ${this.errorMessage(e)}`}}}},dt=class extends ut{async handlePayloadTemplateBuild(e){try{let t=e.fields;if(!Array.isArray(t))throw Error(`fields must be an array`);let{payload:n,segments:r}=ve(t.map((e,t)=>ge(e,t)),w(e.endian));return this.emitEvent(`protocol:payload_built`,{byteLength:n.length,fieldCount:r.length}),{hexPayload:n.toString(`hex`),byteLength:n.length,fields:r,success:!0}}catch(e){return{hexPayload:``,byteLength:0,fields:[],success:!1,error:this.errorMessage(e)}}}async handlePayloadMutate(e){let t=``;try{if(typeof e.hexPayload!=`string`)throw Error(`hexPayload must be a string`);t=j(e.hexPayload,`hexPayload`);let n=e.mutations;if(!Array.isArray(n))throw Error(`mutations must be an array`);let r=Buffer.from(t,`hex`),i=[];for(let[e,t]of n.entries()){let n=ye(t,e),a=be(r,n,e);r=a.payload,i.push(a.summary)}return this.emitEvent(`protocol:payload_mutated`,{byteLength:r.length,mutationCount:i.length}),{originalHex:t,mutatedHex:r.toString(`hex`),byteLength:r.length,appliedMutations:i,success:!0}}catch(e){return{originalHex:t,mutatedHex:``,byteLength:0,appliedMutations:[],success:!1,error:this.errorMessage(e)}}}},ft=class extends dt{async handleEthernetFrameBuild(e){try{let t=L(e.destinationMac,`destinationMac`),n=L(e.sourceMac,`sourceMac`),r=V(e.etherType,`etherType`),i=Ae(t,n,r,H(e.payloadHex,`payloadHex`));return this.emitEvent(`protocol:ethernet_frame_built`,{byteLength:i.length,etherType:`0x${r.toString(16).padStart(4,`0`)}`}),{destinationMac:t.canonical,sourceMac:n.canonical,etherType:r,etherTypeHex:`0x${r.toString(16).padStart(4,`0`)}`,byteLength:i.length,headerHex:i.subarray(0,14).toString(`hex`),frameHex:i.toString(`hex`),success:!0}}catch(e){return{destinationMac:``,sourceMac:``,etherType:0,etherTypeHex:`0x0000`,byteLength:0,headerHex:``,frameHex:``,success:!1,error:this.errorMessage(e)}}}async handleArpBuild(e){try{let t=e.operation===`reply`?`reply`:`request`,n=L(e.senderMac,`senderMac`),r=L(e.targetMac??`00:00:00:00:00:00`,`targetMac`),i=R(e.senderIp,`senderIp`),a=R(e.targetIp,`targetIp`),o=je({operation:t,hardwareType:e.hardwareType===void 0?1:T(e.hardwareType,`hardwareType`),protocolType:V(e.protocolType??`ipv4`,`protocolType`),hardwareSize:e.hardwareSize===void 0?6:E(e.hardwareSize,`hardwareSize`),protocolSize:e.protocolSize===void 0?4:E(e.protocolSize,`protocolSize`),senderMac:n,senderIp:i,targetMac:r,targetIp:a});return this.emitEvent(`protocol:arp_built`,{operation:t,byteLength:o.length}),{operation:t,byteLength:o.length,payloadHex:o.toString(`hex`),senderMac:n.canonical,senderIp:e.senderIp,targetMac:r.canonical,targetIp:e.targetIp,success:!0}}catch(e){return{operation:null,byteLength:0,payloadHex:``,senderMac:``,senderIp:``,targetMac:``,targetIp:``,success:!1,error:this.errorMessage(e)}}}},pt=class extends ft{async handleRawIpPacketBuild(e){try{let t=e.version===`ipv6`?`ipv6`:`ipv4`,n=H(e.payloadHex??``,`payloadHex`),r=Te(e.protocol,`protocol`),i=e.dscp===void 0?0:T(e.dscp,`dscp`),a=e.ecn===void 0?0:T(e.ecn,`ecn`);if(i>63)throw Error(`dscp must be between 0 and 63`);if(a>3)throw Error(`ecn must be between 0 and 3`);if(t===`ipv4`){let o=e.ttl===void 0?64:O(e.ttl,`ttl`),s=e.identification===void 0?0:T(e.identification,`identification`),c=e.fragmentOffset===void 0?0:T(e.fragmentOffset,`fragmentOffset`);if(s>65535)throw Error(`identification must be between 0 and 65535`);if(c>8191)throw Error(`fragmentOffset must be between 0 and 8191`);let{packet:l,checksum:u}=Me({sourceIp:B(e.sourceIp,`ipv4`,`sourceIp`),destinationIp:B(e.destinationIp,`ipv4`,`destinationIp`),protocol:r,payload:n,ttl:o,identification:s,dontFragment:e.dontFragment===!0,moreFragments:e.moreFragments===!0,fragmentOffset:c,dscp:i,ecn:a});return this.emitEvent(`protocol:ip_packet_built`,{version:t,protocol:r,byteLength:l.length}),{version:t,protocol:r,byteLength:l.length,headerLength:20,packetHex:l.toString(`hex`),headerHex:l.subarray(0,20).toString(`hex`),payloadHex:n.toString(`hex`),checksumHex:u.toString(16).padStart(4,`0`),success:!0}}let o=e.hopLimit===void 0?e.ttl===void 0?64:O(e.ttl,`ttl`):O(e.hopLimit,`hopLimit`),s=e.flowLabel===void 0?0:T(e.flowLabel,`flowLabel`);if(s>1048575)throw Error(`flowLabel must be between 0 and 1048575`);let c=Ne({sourceIp:B(e.sourceIp,`ipv6`,`sourceIp`),destinationIp:B(e.destinationIp,`ipv6`,`destinationIp`),protocol:r,payload:n,hopLimit:o,dscp:i,ecn:a,flowLabel:s});return this.emitEvent(`protocol:ip_packet_built`,{version:t,protocol:r,byteLength:c.length}),{version:t,protocol:r,byteLength:c.length,headerLength:40,packetHex:c.toString(`hex`),headerHex:c.subarray(0,40).toString(`hex`),payloadHex:n.toString(`hex`),checksumHex:null,success:!0}}catch(e){return{version:null,protocol:null,byteLength:0,headerLength:0,packetHex:``,headerHex:``,payloadHex:``,checksumHex:null,success:!1,error:this.errorMessage(e)}}}async handleIcmpEchoBuild(e){try{let t=e.operation===`reply`?`reply`:`request`,n=e.identifier===void 0?0:T(e.identifier,`identifier`),r=e.sequenceNumber===void 0?0:T(e.sequenceNumber,`sequenceNumber`);if(n>65535)throw Error(`identifier must be between 0 and 65535`);if(r>65535)throw Error(`sequenceNumber must be between 0 and 65535`);let i=H(e.payloadHex??``,`payloadHex`),{packet:a,checksum:o}=Pe({operation:t,identifier:n,sequenceNumber:r,payload:i}),s=o.toString(16).padStart(4,`0`);return this.emitEvent(`protocol:icmp_echo_built`,{operation:t,byteLength:a.length,checksumHex:s}),{operation:t,identifier:n,sequenceNumber:r,checksum:o,checksumHex:s,byteLength:a.length,packetHex:a.toString(`hex`),payloadHex:i.toString(`hex`),success:!0}}catch(e){return{operation:null,identifier:null,sequenceNumber:null,checksum:null,checksumHex:``,byteLength:0,packetHex:``,payloadHex:``,success:!1,error:this.errorMessage(e)}}}},mt=class extends pt{async handleChecksumApply(e){try{let t=H(e.hexPayload,`hexPayload`),n=e.startOffset===void 0?0:T(e.startOffset,`startOffset`),r=e.endOffset===void 0?t.length:T(e.endOffset,`endOffset`);if(n>r||r>t.length)throw Error(`checksum range must stay within the payload`);let i=e.zeroOffset===void 0?void 0:T(e.zeroOffset,`zeroOffset`),a=e.zeroLength===void 0?2:E(e.zeroLength,`zeroLength`),o=e.writeOffset===void 0?i:T(e.writeOffset,`writeOffset`),s=De(e.endian),c=Buffer.from(t);if(i!==void 0){if(i+a>c.length)throw Error(`zeroOffset and zeroLength must stay within the payload`);c.fill(0,i,i+a)}let l=U(c.subarray(n,r));if(o!==void 0){if(o+2>c.length)throw Error(`writeOffset must leave room for a 16-bit checksum field`);s===`little`?c.writeUInt16LE(l,o):c.writeUInt16BE(l,o)}let u=l.toString(16).padStart(4,`0`);return this.emitEvent(`protocol:checksum_applied`,{checksumHex:u,byteLength:c.length}),{checksumHex:u,checksum:l,mutatedHex:c.toString(`hex`),byteLength:c.length,rangeStart:n,rangeEnd:r,success:!0}}catch(e){return{checksumHex:``,checksum:0,mutatedHex:``,byteLength:0,rangeStart:0,rangeEnd:0,success:!1,error:this.errorMessage(e)}}}},ht=class extends mt{},gt=class extends ht{async handlePcapWrite(e){try{let t=this.parseRequiredPath(e);if(!Array.isArray(e.packets))throw Error(`packets must be an array`);let n=e.packets.map((e,t)=>Le(e,t)),r=Oe(e.endianness),i=ke(e.timestampPrecision),a=e.snapLength===void 0?65535:E(e.snapLength,`snapLength`),o=Ee(e.linkType??`ethernet`,`linkType`),s=Re({packets:n,endianness:r,timestampPrecision:i,snapLength:a,linkType:o});return await u(t,s),this.emitEvent(`protocol:pcap_written`,{path:t,packetCount:n.length,byteLength:s.length}),{path:t,packetCount:n.length,byteLength:s.length,endianness:r,timestampPrecision:i,linkType:o,success:!0}}catch(t){return{path:typeof e.path==`string`?e.path:``,packetCount:0,byteLength:0,endianness:null,timestampPrecision:null,linkType:null,success:!1,error:this.errorMessage(t)}}}async handlePcapRead(e){try{let t=this.parseRequiredPath(e),n=e.maxPackets===void 0?void 0:E(e.maxPackets,`maxPackets`),r=e.maxBytesPerPacket===void 0?void 0:E(e.maxBytesPerPacket,`maxBytesPerPacket`),{header:i,packets:a}=ze(await l(t),n,r);return this.emitEvent(`protocol:pcap_read`,{path:t,packetCount:a.length}),{path:t,header:i,packets:a,success:!0}}catch(t){return{path:typeof e.path==`string`?e.path:``,header:null,packets:[],success:!1,error:this.errorMessage(t)}}}parseRequiredPath(e){if(typeof e.path!=`string`||e.path.trim().length===0)throw Error(`path must be a non-empty string`);return e.path}},_t=class extends gt{},vt=class extends _t{async handleProtoFingerprint(o){let c=s(o,`hexPayloads`),l=o.includeKnownProtocols!==!1,u=o.includeFieldHints!==!1;return c.length===0?a({success:!1,error:`hexPayloads is required`}):a({success:!0,fingerprints:c.map((a,o)=>{let s=a.replace(/\s/g,``),c=[],d=s.length/2,f=d>=5?y(s,3):-1,p=Number.isFinite(f)&&f>=0&&d>=5+f,ee=p&&f>=t&&v(s,0)===22&&v(s,5)===1,m=ie(s),h=Object.keys(g).some(e=>s.toUpperCase().startsWith(e)),_=s.toUpperCase().startsWith(`5353482D`),b=s.length>=4&&(()=>{let e=v(s,0),t=v(s,1),n=e&15;if(n===0)return!1;let r=n<=10&&!(n>=3&&n<=7),i=(t>>7&1)==1,a=s.length/2,o=t&127,c=2;if(o===126){if(a<4)return!1;o=y(s,2),c=4}else if(o===127){if(a<10)return!1;let e=y(s,2)<<16|y(s,4),t=y(s,6)<<16|y(s,8);o=e>0?4294967295:t,c=10}return r&&a>=c+(i?4:0)+o})(),x=null;if(ee)c.push({protocol:`TLS ClientHello`,layer:`L6-TLS`,confidence:i}),u&&(x=ne(s));else if(h)c.push({protocol:`HTTP/1.x`,layer:`L7-HTTP`,confidence:e}),u&&(x={method:Object.entries(g).find(([e])=>s.toUpperCase().startsWith(e))?.[1]??`UNKNOWN`,httpVersion:s.indexOf(`2048545450`)>0?`1.x`:`unknown`});else if(_)c.push({protocol:`SSH`,layer:`L7-SSH`,confidence:r}),u&&s.length>=20&&(x={banner:Buffer.from(s.substring(0,Math.min(s.length,80)),`hex`).toString(`ascii`)});else if(b){if(c.push({protocol:`WebSocket`,layer:`L7-WS`,confidence:n}),u&&s.length>=4){let e=v(s,0),t=v(s,1),n=e&15,r=t>>7&1,i=t&127,a=2;if(i===126)i=s.length>=4?y(s,2):0,a=4;else if(i===127){if(s.length>=20){let e=y(s,2)<<16|y(s,4),t=y(s,6)<<16|y(s,8);i=e>0?4294967295:t}else i=0;a=10}r&&(a+=4),x={fin:e>>7&1,rsv1:e>>6&1,opcode:n,opcodeName:te[n]??`reserved(${n})`,masked:!!r,payloadLength:i,headerSize:a}}}else m&&(c.push({protocol:`DNS`,layer:`L7-DNS`,confidence:.85}),u&&(x=re(s)));l&&c.length===0&&(p&&/^160301|^160302|^160303/i.test(s.substring(0,8))&&c.push({protocol:`TLS Record`,layer:`L6-TLS`,confidence:.9}),s.substring(0,8).startsWith(`50524920`)&&c.push({protocol:`HTTP/2 PRI`,layer:`L7-HTTP2`,confidence:.9}));let S=[];if(u&&!x&&s.length>=8){let e=y(s,0);e>0&&e<s.length/2&&S.push({offset:0,hint:`possible length field (${e} bytes)`})}return{index:o,size:d,protocolMatches:c.length>0?c:[{protocol:`unknown`,layer:`unknown`,confidence:0}],...x?{parsedFields:x}:{},...S.length>0?{fieldHints:S}:{}}})})}},yt=class extends vt{};export{yt as ProtocolAnalysisHandlers};
|
|
4
|
+
`)}inferStateMachine(e){let t=e.map(e=>({direction:e.direction===`out`?`req`:`res`,timestamp:e.timestamp??0,fields:{},raw:e.payload.length>0?e.payload.toString(`utf8`):e.payload.toString(`hex`),rawBuffer:e.payload}));return this.infer(t)}generateMermaid(e){return this.visualize(e)}simplify(e){if(e.states.length<2)return{...e,initialState:e.initialState??e.initial,finalStates:e.finalStates??this.collectTerminalStates(e.states)};let t=new Map,n=new Map;for(let r of e.states){let e=this.getPayloadPrefix(r);if(!e)continue;let i=[...n.entries()].find(([t])=>t===e);i?t.set(r.id,i[0]):(n.set(e,r.id),t.set(r.id,e))}let r=new Map,i=new Map;for(let[e,t]of n)i.set(e,t);for(let t of e.states){let e=this.getPayloadPrefix(t);if(!e)continue;let n=i.get(e);n&&n!==t.id&&r.set(t.id,n)}if(r.size===0)return{...e,initialState:e.initialState??e.initial,finalStates:e.finalStates??this.collectTerminalStates(e.states)};let a=e.states.filter(e=>!r.has(e.id)),o=e.transitions.map(e=>({...e,from:r.get(e.from)??e.from,to:r.get(e.to)??e.to})).filter(e=>e.from!==e.to),s=e.initialState??e.initial??``,c=r.get(s)??s;return{states:a,transitions:o,initial:c,initialState:c,finalStates:e.finalStates.map(e=>r.get(e)??e).filter((e,t,n)=>n.indexOf(e)===t)}}getPayloadPrefix(e){let t=e.expectedPayload;return!t||t.length<8?null:t.slice(0,8).toLowerCase()}buildSignature(e){let t=Object.keys(e.fields).toSorted().join(`,`),n=$(e.rawBuffer?e.rawBuffer.toString(`hex`):e.raw).slice(0,24);return`${e.direction}|${t}|${n}`}buildStateName(e,t){let n=e.direction===`req`?`send`:`recv`,r=this.findPrimaryFieldName(e.fields),i=e.raw;if(i.length===0)return`${n}_empty`;let a=e.rawBuffer,o=Buffer.isBuffer(a)?a.toString(`hex`):i;if(o.startsWith(`16`)||o.startsWith(`15`)||o.startsWith(`17`))return`${n}_tls_handshake`;let s=i.trimStart();if(s.startsWith(`{`)||s.startsWith(`[`))return`${n}_json_${r||`step_${t}`}`;if(ot(i)>=.7){let e=$(i);return e.includes(`close`)||e.includes(`fin`)||e.includes(`bye`)?`${n}_close`:e.startsWith(`get `)||e.startsWith(`post `)||e.startsWith(`http`)?`${n}_text_http`:`${n}_text_${r||`step_${t}`}`}return Buffer.isBuffer(a)&&a.length>=32&&at(a)>6?`${n}_encrypted`:Buffer.isBuffer(a)&&a.length<=4?`${n}_control`:`${n}_${r||`step_${t}`}`}findPrimaryFieldName(e){return Object.keys(e).toSorted()[0]||``}inferStateType(e,t){let n=$(e.raw),r=this.findStatusValue(e.fields);return this.containsRejectSignal(n)||this.containsRejectSignal(r)?`reject`:this.containsAcceptSignal(n)||this.containsAcceptSignal(r)||t&&e.direction===`res`?`accept`:`normal`}mergeStateTypes(e,t){return e===`reject`||t===`reject`?`reject`:e===`accept`||t===`accept`?`accept`:`normal`}findStatusValue(e){for(let t of[`status`,`result`,`code`,`reason`,`message`]){let n=e[t];if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`)return String(n)}return``}containsRejectSignal(e){return[`error`,`fail`,`denied`,`reject`,`timeout`,`invalid`].some(t=>$(e).includes(t))}containsAcceptSignal(e){return[`ok`,`success`,`accept`,`ready`,`done`,`complete`].some(t=>$(e).includes(t))}buildEventName(e){let t=this.findStatusValue(e.fields);if(t)return`${e.direction}_${$(t).replace(/[^a-z0-9]+/g,`_`)}`;let n=this.findPrimaryFieldName(e.fields);return n?`${e.direction}_${n}`:`${e.direction}_message`}buildCondition(e){let t=this.findStatusValue(e);if(t)return`status=${t}`;let n=Object.keys(e).toSorted().slice(0,2);if(n.length===0)return;let r=[];for(let t of n){let n=e[t];(typeof n==`string`||typeof n==`number`||typeof n==`boolean`)&&r.push(`${t}=${n}`)}return r.length>0?r.join(`, `):void 0}buildAction(e){let t=this.findStatusValue(e.fields);if(this.containsRejectSignal(t)||this.containsRejectSignal(e.raw))return`reject`;if(this.containsAcceptSignal(t)||this.containsAcceptSignal(e.raw))return`complete`;let n=$(e.raw);if(n.includes(`ack`))return`acknowledge`;if(n.includes(`retry`))return`retry`;if(Object.keys(e.fields).length>0&&it(e.fields))return e.direction===`req`?`send`:`receive`}collectTerminalStates(e){let t=e.filter(e=>{let t=e.type??`normal`;return t===`accept`||t===`reject`}).map(e=>e.id);for(let n of e){let e=$(n.name);(e.includes(`close`)||e.includes(`fin`)||e.includes(`bye`))&&(t.includes(n.id)||t.push(n.id))}return t}computeTransitionConfidence(e){let t=.3;return Object.keys(e.fields).length>0&&(t+=.3),this.findStatusValue(e.fields)&&(t+=.2),e.raw.length>0&&(t+=.2),Math.min(t,1)}};const ct={states:[],transitions:[],initial:``,initialState:``,finalStates:[]};var lt=class{engine;inferrer;eventBus;constructor(e,t,n){this.engine=e,this.inferrer=t,this.eventBus=n}emitEvent(e,t){this.eventBus?.emit(e,{...t,timestamp:new Date().toISOString()})}getEngine(){return this.engine||=new rt,this.engine}getInferrer(){return this.inferrer||=new st,this.inferrer}errorMessage(e){return e instanceof Error?e.message:String(e)}},ut=class extends lt{async handleDefinePattern(e){try{let t=typeof e.name==`string`&&e.name.trim().length>0?e.name:`unnamed_pattern`,n=o(e,`spec`);if(n){let e=se(t,n);return this.getEngine().definePattern(t,e),{patternId:t,pattern:this.getEngine().getPattern(t)??{name:t,fields:[],byteOrder:`big`},success:!0}}let r=(Array.isArray(e.fields)?e.fields:[]).map((e,t)=>oe(e,t)),i=e.byteOrder===`little`||e.byteOrder===`big`?e.byteOrder:void 0,a=ce(e.encryption);return{patternId:t,pattern:this.getEngine().definePattern(t,r,{...i?{byteOrder:i}:{},...a?{encryption:a}:{}}),success:!0}}catch(e){return{patternId:`error`,pattern:{name:`error`,fields:[],byteOrder:`big`},success:!1,error:this.errorMessage(e)}}}async handleAutoDetect(e){try{let t=(()=>{let t=c(e,`hexPayloads`);return t.length>0?t:c(e,`payloads`)})(),n=this.getEngine().autoDetect(t),r=typeof e.name==`string`&&e.name.trim().length>0?e.name:void 0;if(!n)return{patterns:[this.getEngine().autoDetectPattern([],r?{name:r}:{})],success:!0};let i={...n,name:r??n.name};this.getEngine().definePattern(i.name,i);let a=this.getEngine().getPattern(i.name)??{name:i.name,fields:[],byteOrder:`big`};return this.emitEvent(`protocol:pattern_detected`,{patternName:i.name,confidence:0}),{patterns:[a],success:!0}}catch(e){return{patterns:[],success:!1,error:this.errorMessage(e)}}}async handleInferFields(e){try{let t=c(e,`hexPayloads`);return{success:!0,fields:this.getEngine().inferFields(t)}}catch(e){return{fields:[],success:!1,error:this.errorMessage(e)}}}async handleExportSchema(e){try{let t=s(e,`patternId`),n=this.getEngine().getPattern(t);return n?{schema:this.getEngine().exportProto(n)}:{schema:`// Error: pattern '${t}' not found`}}catch(e){return{schema:`// Error: ${this.errorMessage(e)}`}}}async handleInferStateMachine(e){try{let t=e.messages;if(!Array.isArray(t))throw Error(`messages must be an array`);let n=t.some(e=>S(e)&&(e.direction===`in`||e.direction===`out`)),r;if(n){let e=t.map((e,t)=>{if(!S(e))throw Error(`messages[${t}] must be an object`);let n=e.direction,r=typeof e.payloadHex==`string`?e.payloadHex:``,i=typeof e.timestamp==`number`?e.timestamp:void 0,a=Buffer.from(r.replace(/\s+/g,``),`hex`);if(n!==`in`&&n!==`out`)throw Error(`messages[${t}].direction must be "in" or "out"`);return{direction:n,payload:a,...i===void 0?{}:{timestamp:i}}});r=this.getInferrer().inferStateMachine(e)}else{let e=t.map((e,t)=>le(e,t));r=this.getInferrer().infer(e)}return e.simplify===!0&&(r=this.getInferrer().simplify(r)),{stateMachine:r,mermaid:this.getInferrer().generateMermaid(r),success:!0}}catch(e){return{stateMachine:{...ct},success:!1,error:this.errorMessage(e)}}}async handleVisualizeState(e){try{let t=e.stateMachine;if(!S(t))return{mermaidDiagram:this.getInferrer().generateMermaid(ct)};let n=Array.isArray(t.states)?t.states:[],r=Array.isArray(t.transitions)?t.transitions:[],i=typeof t.initialState==`string`?t.initialState:``,a=Array.isArray(t.finalStates)?t.finalStates.filter(e=>typeof e==`string`):[];return{mermaidDiagram:this.getInferrer().generateMermaid({states:n.filter(e=>S(e)),transitions:r.filter(e=>S(e)),initial:i,initialState:i,finalStates:a})}}catch(e){return{mermaidDiagram:`stateDiagram-v2\n note right of empty: ${this.errorMessage(e)}`}}}},dt=class extends ut{async handlePayloadTemplateBuild(e){try{let t=e.fields;if(!Array.isArray(t))throw Error(`fields must be an array`);let{payload:n,segments:r}=ve(t.map((e,t)=>ge(e,t)),w(e.endian));return this.emitEvent(`protocol:payload_built`,{byteLength:n.length,fieldCount:r.length}),{hexPayload:n.toString(`hex`),byteLength:n.length,fields:r,success:!0}}catch(e){return{hexPayload:``,byteLength:0,fields:[],success:!1,error:this.errorMessage(e)}}}async handlePayloadMutate(e){let t=``;try{if(typeof e.hexPayload!=`string`)throw Error(`hexPayload must be a string`);t=j(e.hexPayload,`hexPayload`);let n=e.mutations;if(!Array.isArray(n))throw Error(`mutations must be an array`);let r=Buffer.from(t,`hex`),i=[];for(let[e,t]of n.entries()){let n=ye(t,e),a=be(r,n,e);r=a.payload,i.push(a.summary)}return this.emitEvent(`protocol:payload_mutated`,{byteLength:r.length,mutationCount:i.length}),{originalHex:t,mutatedHex:r.toString(`hex`),byteLength:r.length,appliedMutations:i,success:!0}}catch(e){return{originalHex:t,mutatedHex:``,byteLength:0,appliedMutations:[],success:!1,error:this.errorMessage(e)}}}},ft=class extends dt{async handleEthernetFrameBuild(e){try{let t=L(e.destinationMac,`destinationMac`),n=L(e.sourceMac,`sourceMac`),r=V(e.etherType,`etherType`),i=Ae(t,n,r,H(e.payloadHex,`payloadHex`));return this.emitEvent(`protocol:ethernet_frame_built`,{byteLength:i.length,etherType:`0x${r.toString(16).padStart(4,`0`)}`}),{destinationMac:t.canonical,sourceMac:n.canonical,etherType:r,etherTypeHex:`0x${r.toString(16).padStart(4,`0`)}`,byteLength:i.length,headerHex:i.subarray(0,14).toString(`hex`),frameHex:i.toString(`hex`),success:!0}}catch(e){return{destinationMac:``,sourceMac:``,etherType:0,etherTypeHex:`0x0000`,byteLength:0,headerHex:``,frameHex:``,success:!1,error:this.errorMessage(e)}}}async handleArpBuild(e){try{let t=e.operation===`reply`?`reply`:`request`,n=L(e.senderMac,`senderMac`),r=L(e.targetMac??`00:00:00:00:00:00`,`targetMac`),i=R(e.senderIp,`senderIp`),a=R(e.targetIp,`targetIp`),o=je({operation:t,hardwareType:e.hardwareType===void 0?1:T(e.hardwareType,`hardwareType`),protocolType:V(e.protocolType??`ipv4`,`protocolType`),hardwareSize:e.hardwareSize===void 0?6:E(e.hardwareSize,`hardwareSize`),protocolSize:e.protocolSize===void 0?4:E(e.protocolSize,`protocolSize`),senderMac:n,senderIp:i,targetMac:r,targetIp:a});return this.emitEvent(`protocol:arp_built`,{operation:t,byteLength:o.length}),{operation:t,byteLength:o.length,payloadHex:o.toString(`hex`),senderMac:n.canonical,senderIp:e.senderIp,targetMac:r.canonical,targetIp:e.targetIp,success:!0}}catch(e){return{operation:null,byteLength:0,payloadHex:``,senderMac:``,senderIp:``,targetMac:``,targetIp:``,success:!1,error:this.errorMessage(e)}}}},pt=class extends ft{async handleRawIpPacketBuild(e){try{let t=e.version===`ipv6`?`ipv6`:`ipv4`,n=H(e.payloadHex??``,`payloadHex`),r=Te(e.protocol,`protocol`),i=e.dscp===void 0?0:T(e.dscp,`dscp`),a=e.ecn===void 0?0:T(e.ecn,`ecn`);if(i>63)throw Error(`dscp must be between 0 and 63`);if(a>3)throw Error(`ecn must be between 0 and 3`);if(t===`ipv4`){let o=e.ttl===void 0?64:O(e.ttl,`ttl`),s=e.identification===void 0?0:T(e.identification,`identification`),c=e.fragmentOffset===void 0?0:T(e.fragmentOffset,`fragmentOffset`);if(s>65535)throw Error(`identification must be between 0 and 65535`);if(c>8191)throw Error(`fragmentOffset must be between 0 and 8191`);let{packet:l,checksum:u}=Me({sourceIp:B(e.sourceIp,`ipv4`,`sourceIp`),destinationIp:B(e.destinationIp,`ipv4`,`destinationIp`),protocol:r,payload:n,ttl:o,identification:s,dontFragment:e.dontFragment===!0,moreFragments:e.moreFragments===!0,fragmentOffset:c,dscp:i,ecn:a});return this.emitEvent(`protocol:ip_packet_built`,{version:t,protocol:r,byteLength:l.length}),{version:t,protocol:r,byteLength:l.length,headerLength:20,packetHex:l.toString(`hex`),headerHex:l.subarray(0,20).toString(`hex`),payloadHex:n.toString(`hex`),checksumHex:u.toString(16).padStart(4,`0`),success:!0}}let o=e.hopLimit===void 0?e.ttl===void 0?64:O(e.ttl,`ttl`):O(e.hopLimit,`hopLimit`),s=e.flowLabel===void 0?0:T(e.flowLabel,`flowLabel`);if(s>1048575)throw Error(`flowLabel must be between 0 and 1048575`);let c=Ne({sourceIp:B(e.sourceIp,`ipv6`,`sourceIp`),destinationIp:B(e.destinationIp,`ipv6`,`destinationIp`),protocol:r,payload:n,hopLimit:o,dscp:i,ecn:a,flowLabel:s});return this.emitEvent(`protocol:ip_packet_built`,{version:t,protocol:r,byteLength:c.length}),{version:t,protocol:r,byteLength:c.length,headerLength:40,packetHex:c.toString(`hex`),headerHex:c.subarray(0,40).toString(`hex`),payloadHex:n.toString(`hex`),checksumHex:null,success:!0}}catch(e){return{version:null,protocol:null,byteLength:0,headerLength:0,packetHex:``,headerHex:``,payloadHex:``,checksumHex:null,success:!1,error:this.errorMessage(e)}}}async handleIcmpEchoBuild(e){try{let t=e.operation===`reply`?`reply`:`request`,n=e.identifier===void 0?0:T(e.identifier,`identifier`),r=e.sequenceNumber===void 0?0:T(e.sequenceNumber,`sequenceNumber`);if(n>65535)throw Error(`identifier must be between 0 and 65535`);if(r>65535)throw Error(`sequenceNumber must be between 0 and 65535`);let i=H(e.payloadHex??``,`payloadHex`),{packet:a,checksum:o}=Pe({operation:t,identifier:n,sequenceNumber:r,payload:i}),s=o.toString(16).padStart(4,`0`);return this.emitEvent(`protocol:icmp_echo_built`,{operation:t,byteLength:a.length,checksumHex:s}),{operation:t,identifier:n,sequenceNumber:r,checksum:o,checksumHex:s,byteLength:a.length,packetHex:a.toString(`hex`),payloadHex:i.toString(`hex`),success:!0}}catch(e){return{operation:null,identifier:null,sequenceNumber:null,checksum:null,checksumHex:``,byteLength:0,packetHex:``,payloadHex:``,success:!1,error:this.errorMessage(e)}}}},mt=class extends pt{async handleChecksumApply(e){try{let t=H(e.hexPayload,`hexPayload`),n=e.startOffset===void 0?0:T(e.startOffset,`startOffset`),r=e.endOffset===void 0?t.length:T(e.endOffset,`endOffset`);if(n>r||r>t.length)throw Error(`checksum range must stay within the payload`);let i=e.zeroOffset===void 0?void 0:T(e.zeroOffset,`zeroOffset`),a=e.zeroLength===void 0?2:E(e.zeroLength,`zeroLength`),o=e.writeOffset===void 0?i:T(e.writeOffset,`writeOffset`),s=De(e.endian),c=Buffer.from(t);if(i!==void 0){if(i+a>c.length)throw Error(`zeroOffset and zeroLength must stay within the payload`);c.fill(0,i,i+a)}let l=U(c.subarray(n,r));if(o!==void 0){if(o+2>c.length)throw Error(`writeOffset must leave room for a 16-bit checksum field`);s===`little`?c.writeUInt16LE(l,o):c.writeUInt16BE(l,o)}let u=l.toString(16).padStart(4,`0`);return this.emitEvent(`protocol:checksum_applied`,{checksumHex:u,byteLength:c.length}),{checksumHex:u,checksum:l,mutatedHex:c.toString(`hex`),byteLength:c.length,rangeStart:n,rangeEnd:r,success:!0}}catch(e){return{checksumHex:``,checksum:0,mutatedHex:``,byteLength:0,rangeStart:0,rangeEnd:0,success:!1,error:this.errorMessage(e)}}}},ht=class extends mt{},gt=class extends ht{async handlePcapWrite(e){try{let t=this.parseRequiredPath(e);if(!Array.isArray(e.packets))throw Error(`packets must be an array`);let n=e.packets.map((e,t)=>Le(e,t)),r=Oe(e.endianness),i=ke(e.timestampPrecision),a=e.snapLength===void 0?65535:E(e.snapLength,`snapLength`),o=Ee(e.linkType??`ethernet`,`linkType`),s=Re({packets:n,endianness:r,timestampPrecision:i,snapLength:a,linkType:o});return await u(t,s),this.emitEvent(`protocol:pcap_written`,{path:t,packetCount:n.length,byteLength:s.length}),{path:t,packetCount:n.length,byteLength:s.length,endianness:r,timestampPrecision:i,linkType:o,success:!0}}catch(t){return{path:typeof e.path==`string`?e.path:``,packetCount:0,byteLength:0,endianness:null,timestampPrecision:null,linkType:null,success:!1,error:this.errorMessage(t)}}}async handlePcapRead(e){try{let t=this.parseRequiredPath(e),n=e.maxPackets===void 0?void 0:E(e.maxPackets,`maxPackets`),r=e.maxBytesPerPacket===void 0?void 0:E(e.maxBytesPerPacket,`maxBytesPerPacket`),{header:i,packets:a}=ze(await l(t),n,r);return this.emitEvent(`protocol:pcap_read`,{path:t,packetCount:a.length}),{path:t,header:i,packets:a,success:!0}}catch(t){return{path:typeof e.path==`string`?e.path:``,header:null,packets:[],success:!1,error:this.errorMessage(t)}}}parseRequiredPath(e){if(typeof e.path!=`string`||e.path.trim().length===0)throw Error(`path must be a non-empty string`);return e.path}},_t=class extends gt{},vt=class extends _t{async handleProtoFingerprint(o){let s=c(o,`hexPayloads`),l=o.includeKnownProtocols!==!1,u=o.includeFieldHints!==!1;return s.length===0?a({success:!1,error:`hexPayloads is required`}):a({success:!0,fingerprints:s.map((a,o)=>{let s=a.replace(/\s/g,``),c=[],d=s.length/2,f=d>=5?y(s,3):-1,p=Number.isFinite(f)&&f>=0&&d>=5+f,ee=p&&f>=e&&v(s,0)===22&&v(s,5)===1,m=ie(s),h=Object.keys(g).some(e=>s.toUpperCase().startsWith(e)),_=s.toUpperCase().startsWith(`5353482D`),b=s.length>=4&&(()=>{let e=v(s,0),t=v(s,1),n=e&15;if(n===0)return!1;let r=n<=10&&!(n>=3&&n<=7),i=(t>>7&1)==1,a=s.length/2,o=t&127,c=2;if(o===126){if(a<4)return!1;o=y(s,2),c=4}else if(o===127){if(a<10)return!1;let e=y(s,2)<<16|y(s,4),t=y(s,6)<<16|y(s,8);o=e>0?4294967295:t,c=10}return r&&a>=c+(i?4:0)+o})(),x=null;if(ee)c.push({protocol:`TLS ClientHello`,layer:`L6-TLS`,confidence:t}),u&&(x=ne(s));else if(h)c.push({protocol:`HTTP/1.x`,layer:`L7-HTTP`,confidence:r}),u&&(x={method:Object.entries(g).find(([e])=>s.toUpperCase().startsWith(e))?.[1]??`UNKNOWN`,httpVersion:s.indexOf(`2048545450`)>0?`1.x`:`unknown`});else if(_)c.push({protocol:`SSH`,layer:`L7-SSH`,confidence:n}),u&&s.length>=20&&(x={banner:Buffer.from(s.substring(0,Math.min(s.length,80)),`hex`).toString(`ascii`)});else if(b){if(c.push({protocol:`WebSocket`,layer:`L7-WS`,confidence:i}),u&&s.length>=4){let e=v(s,0),t=v(s,1),n=e&15,r=t>>7&1,i=t&127,a=2;if(i===126)i=s.length>=4?y(s,2):0,a=4;else if(i===127){if(s.length>=20){let e=y(s,2)<<16|y(s,4),t=y(s,6)<<16|y(s,8);i=e>0?4294967295:t}else i=0;a=10}r&&(a+=4),x={fin:e>>7&1,rsv1:e>>6&1,opcode:n,opcodeName:te[n]??`reserved(${n})`,masked:!!r,payloadLength:i,headerSize:a}}}else m&&(c.push({protocol:`DNS`,layer:`L7-DNS`,confidence:.85}),u&&(x=re(s)));l&&c.length===0&&(p&&/^160301|^160302|^160303/i.test(s.substring(0,8))&&c.push({protocol:`TLS Record`,layer:`L6-TLS`,confidence:.9}),s.substring(0,8).startsWith(`50524920`)&&c.push({protocol:`HTTP/2 PRI`,layer:`L7-HTTP2`,confidence:.9}));let S=[];if(u&&!x&&s.length>=8){let e=y(s,0);e>0&&e<s.length/2&&S.push({offset:0,hint:`possible length field (${e} bytes)`})}return{index:o,size:d,protocolMatches:c.length>0?c:[{protocol:`unknown`,layer:`unknown`,confidence:0}],...x?{parsedFields:x}:{},...S.length>0?{fieldHints:S}:{}}})})}},yt=class extends vt{};export{yt as ProtocolAnalysisHandlers};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./response-
|
|
2
|
-
`)}function h(e,t,n){let r=[],i=[],a;if(n&&n.length>0){let e=new Set(n);a=t.functions.filter(t=>e.has(t.name))}else a=t.functions.filter(p);let o=m(a,t.moduleName);for(let n of a){let a=e.addBinarySymbol({moduleName:n.moduleName||t.moduleName,symbolName:n.name,address:n.address??`0x0`}),o=e.addNode(`breakpoint-hook`,`frida:${n.name}`,{domain:`binary-instrument`,hookType:`frida-interceptor`,functionName:n.name,moduleName:n.moduleName||t.moduleName});e.getGraph().addEdge(a.id,o.id,`binary-exports`,{domain:`cross-domain`,relation:`binary-to-frida-hook`}),r.push({binarySymbolNodeId:a.id,hookScriptNodeId:o.id,functionName:n.name}),i.push(n.name)}return{hookCount:a.length,generatedHookScript:o,injectedFunctions:i,evidenceGraphLinks:r}}function g(e){return typeof e==`object`&&!!e}function _(e){return Array.isArray(e)?e.filter(g):[]}function v(e,t=``){return typeof e==`string`?e:t}function y(e){return typeof e==`string`?e:void 0}function b(e,t=0){return typeof e==`number`?e:t}function x(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function S(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):void 0}function C(e){return g(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`number`)):{}}function w(e){return g(e)?{layers:Array.isArray(e.layers)?e.layers:[],drawCommands:Array.isArray(e.drawCommands)?e.drawCommands:[]}:{layers:[],drawCommands:[]}}function T(e){return _(e).map(e=>({objectId:v(e.objectId),className:v(e.className),name:v(e.name),stringProps:x(e.stringProps),numericProps:C(e.numericProps),colorProps:x(e.colorProps),urlProps:x(e.urlProps)}))}function E(e){return _(e).map(e=>({interface:v(e.interface),method:v(e.method),timestamp:b(e.timestamp),messageId:v(e.messageId)}))}function D(e){return _(e).map(e=>({eventType:v(e.eventType),timestamp:b(e.timestamp),url:y(e.url)}))}function O(e){return _(e).map(e=>({requestId:v(e.requestId),url:v(e.url),timestamp:b(e.timestamp)}))}function k(e){return _(e).map(e=>({pid:b(e.pid),tid:b(e.tid),syscallName:v(e.syscallName),timestamp:b(e.timestamp)}))}function A(e){return _(e).map(e=>({threadId:b(e.threadId),timestamp:b(e.timestamp),frames:_(e.frames).map(e=>({functionName:v(e.functionName)}))}))}function j(e){if(!g(e))return null;let t=v(e.moduleName);return t?{functions:_(e.functions).map(e=>({name:v(e.name),moduleName:v(e.moduleName),address:y(e.address),calledFrom:S(e.calledFrom)})),moduleName:t}:null}const M={WORKFLOW_REVERSE_OBFUSCATED:{id:`reverse-obfuscated-api`,displayName:`Reverse Obfuscated API`,steps:[{tool:`deobfuscate`,args:{targetUrl:"${input.targetUrl}"}},{tool:`js_heap_search`,args:{pattern:"${previous.cryptoKeys}"}},{tool:`network_enable`,args:{}},{tool:`tls_cert_pin_bypass`,args:{target:"${input.target}"}},{tool:`console_inject_fetch_interceptor`,args:{urls:["${input.apiEndpoint}"]}}]},WORKFLOW_GAME_CANVAS_SKIA:{id:`game-canvas-skia-v8`,displayName:`Game Canvas + SKIA + V8 Analysis`,steps:[{tool:`canvas_engine_fingerprint`,args:{canvasId:"${input.canvasId}"}},{tool:`canvas_scene_dump`,args:{canvasId:"${input.canvasId}"}},{tool:`skia_correlate_objects`,args:{skiaNodeIds:"${previous.nodeIds}"}},{tool:`performance_take_heap_snapshot`,args:{}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}}]},WORKFLOW_BINARY_NATIVE_HOOK:{id:`binary-native-hook`,displayName:`Binary Analysis + Native Hook`,steps:[{tool:`ghidra_analyze`,args:{binaryPath:"${input.binaryPath}"}},{tool:`generate_hooks`,args:{symbols:"${previous.exportedSymbols}"}},{tool:`frida_attach`,args:{target:"${input.target}"}},{tool:`frida_run_script`,args:{script:"${previous.hookScript}"}}]}},N=[`analysis`,`browser`,`network`,`canvas`,`
|
|
1
|
+
import{n as e}from"./response-B1RuVVfD.mjs";import{o as t,t as n}from"./parse-args-ngRrvF9e.mjs";function r(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function i(e,t){let n=r(e),i=r(t);return n===i&&n.length>0?1:n.length===0||i.length===0?0:n.includes(i)||i.includes(n)?.8:0}function a(e,t){let n=0,r;for(let a of t){let t=i(e,a.name);t>n&&(n=t,r={objectId:a.objectId,name:a.name,score:t});for(let t of a.stringProps){let o=i(e,t);o>n&&(n=o,r={objectId:a.objectId,name:a.name,score:o})}}if(r&&n>=.5)return r}function o(e,t){let n=[],r=[],i=[],o=new Set,s=[];for(let e of t.sceneTree.layers)s.push({id:e.id,label:e.label,heapObjectId:e.heapObjectId});for(let e of t.sceneTree.drawCommands)s.push({id:e.id,label:e.label});let c=s.length;for(let c of s){let s=e.addCanvasNode({nodeId:c.id,label:c.label});if(n.push(s.id),c.heapObjectId){let i=t.jsObjects.find(e=>e.objectId===c.heapObjectId);if(i){let t=e.addV8Object({address:c.heapObjectId,name:i.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:1}),r.push({skiaNodeId:c.id,matchedObjectId:i.objectId,matchedObjectName:i.name,matchScore:1}),o.add(c.id);continue}}let l=a(c.label,t.jsObjects);if(l){let t=e.addV8Object({address:l.objectId,name:l.name});n.push(t.id),e.getGraph().addEdge(t.id,s.id,`canvas-rendered-by`,{domain:`cross-domain`,matchScore:l.score}),r.push({skiaNodeId:c.id,matchedObjectId:l.objectId,matchedObjectName:l.name,matchScore:l.score}),o.add(c.id)}else i.push(c.id)}return{skiaNodes:c,correlations:r,unmatchedSkiaNodes:i,confidence:c===0?0:r.length/c,graphNodeIds:n}}const s=[{mojoPattern:/URLLoader/i,cdpPattern:/Network\./i},{mojoPattern:/WebSocket/i,cdpPattern:/Network\.webSocket/i},{mojoPattern:/Fetch/i,cdpPattern:/Fetch\./i}];function c(e,t,n,r){let i=[],a=[],o=new Set,c=new Map;for(let t of r){let{node:n}=e.addNetworkRequest({requestId:t.requestId,url:t.url});c.set(t.requestId,n.id),i.push(n.id)}if(t.length===0)return{mojoMessages:0,matchedPairs:[],unmatchedMojo:[],confidence:0,graphNodeIds:i};let l=new Map;for(let n of t){let t=e.addMojoMessage({interface:n.interface,method:n.method,timestamp:n.timestamp});l.set(n.messageId,t.id),i.push(t.id)}for(let e of t)if(!o.has(e.messageId))for(let t of s){if(!t.mojoPattern.test(e.interface))continue;let r=n.find(n=>t.cdpPattern.test(n.eventType)&&!o.has(e.messageId));if(r){a.push({mojoMessageId:e.messageId,matchType:`interface`,cdpEventType:r.eventType}),o.add(e.messageId);break}}for(let n of t)if(!o.has(n.messageId)&&/URLLoader/i.test(n.interface)){let t=r.find(e=>Math.abs(e.timestamp-n.timestamp)<=50);if(t){let r=c.get(t.requestId),i=l.get(n.messageId);r&&i&&e.getGraph().addEdge(r,i,`mojo-routed-to`,{domain:`cross-domain`,relation:`network-request-correlates-to-mojo`,matchType:`urlloader`,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),a.push({mojoMessageId:n.messageId,matchType:`urlloader`,networkRequestId:t.requestId,timestampDelta:Math.abs(t.timestamp-n.timestamp)}),o.add(n.messageId)}}for(let e of t){if(o.has(e.messageId))continue;let t=1/0,r;for(let i of n){let n=Math.abs(i.timestamp-e.timestamp);n<=50&&n<t&&(t=n,r=i)}r&&(a.push({mojoMessageId:e.messageId,matchType:`timestamp`,cdpEventType:r.eventType,timestampDelta:t}),o.add(e.messageId))}let u=t.filter(e=>!o.has(e.messageId)).map(e=>e.messageId),d=t.length===0?0:o.size/t.length;return{mojoMessages:t.length,matchedPairs:a,unmatchedMojo:u,confidence:d,graphNodeIds:i}}const l={NtReadFile:/read|fs[_.]read/i,NtWriteFile:/write|fs[_.]write/i,NtOpenFile:/open|fs[_.]open/i,NtCreateFile:/create|fs[_.]create/i,NtClose:/close|fs[_.]close/i,NtDeviceIoControlFile:/ioctl|device/i,NtQueryInformationFile:/stat|info|query/i,NtSetInformationFile:/set|chmod|chown/i};function u(e,t){let n=l[e];return n&&n.test(t)?`high`:/file|fs|read|write|open|close/i.test(t)?`medium`:`low`}function d(e,t,n){let r=[],i=[],a=[];if(t.length===0)return{syscalls:0,correlations:[],unmatchedSyscalls:[],correlationConfidence:0,graphNodeIds:[]};for(let o of t){let t=e.addSyscallEvent({pid:o.pid,tid:o.tid,syscallName:o.syscallName,timestamp:o.timestamp});r.push(t.id);let s=n.find(e=>e.threadId===o.tid&&e.timestamp===o.timestamp);if(s&&s.frames.length>0){let n=s.frames[0];if(n){let a=n.functionName,s=u(o.syscallName,a),c=e.addNode(`function`,a,{domain:`v8-inspector`,functionName:a,threadId:o.tid});r.push(c.id),e.getGraph().addEdge(c.id,t.id,`syscall-emitted-by`,{domain:`cross-domain`,confidence:s}),i.push({syscallName:o.syscallName,topJsFunction:a,threadId:o.tid,timestamp:o.timestamp,confidence:s})}else a.push({syscallName:o.syscallName,tid:o.tid})}else a.push({syscallName:o.syscallName,tid:o.tid})}let o=t.length===0?0:i.length/t.length;return{syscalls:t.length,correlations:i,unmatchedSyscalls:a,correlationConfidence:o,graphNodeIds:r}}const f=[/^native_/i,/^JS_/i,/^Java_/i];function p(e){return e.calledFrom&&e.calledFrom.length>0?!0:f.some(t=>t.test(e.name))}function m(e,t){let n=[];n.push(`// Binary-to-JS Hook Script`),n.push(`// Module: ${t}`),n.push(`// Generated at: ${new Date().toISOString()}`),n.push(``);for(let r of e){let e=r.moduleName||t;r.address?(n.push(`// Hook: ${r.name} at ${r.address} in ${e}`),n.push(`Interceptor.attach(Module.findBaseAddress('${e}').add(${r.address}), {`)):(n.push(`// Hook: ${r.name} in ${e}`),n.push(`Interceptor.attach(Module.findExportByName('${e}', '${r.name}'), {`)),n.push(` onEnter(args) {`),n.push(` console.log('[${r.name}] called with args:', args[0], args[1]);`),n.push(` },`),n.push(` onLeave(retval) {`),n.push(` console.log('[${r.name}] returned:', retval);`),n.push(` }`),n.push(`});`),n.push(``)}return n.push(`console.log('Binary-to-JS hook script loaded for ${t}');`),n.join(`
|
|
2
|
+
`)}function h(e,t,n){let r=[],i=[],a;if(n&&n.length>0){let e=new Set(n);a=t.functions.filter(t=>e.has(t.name))}else a=t.functions.filter(p);let o=m(a,t.moduleName);for(let n of a){let a=e.addBinarySymbol({moduleName:n.moduleName||t.moduleName,symbolName:n.name,address:n.address??`0x0`}),o=e.addNode(`breakpoint-hook`,`frida:${n.name}`,{domain:`binary-instrument`,hookType:`frida-interceptor`,functionName:n.name,moduleName:n.moduleName||t.moduleName});e.getGraph().addEdge(a.id,o.id,`binary-exports`,{domain:`cross-domain`,relation:`binary-to-frida-hook`}),r.push({binarySymbolNodeId:a.id,hookScriptNodeId:o.id,functionName:n.name}),i.push(n.name)}return{hookCount:a.length,generatedHookScript:o,injectedFunctions:i,evidenceGraphLinks:r}}function g(e){return typeof e==`object`&&!!e}function _(e){return Array.isArray(e)?e.filter(g):[]}function v(e,t=``){return typeof e==`string`?e:t}function y(e){return typeof e==`string`?e:void 0}function b(e,t=0){return typeof e==`number`?e:t}function x(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function S(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):void 0}function C(e){return g(e)?Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`number`)):{}}function w(e){return g(e)?{layers:Array.isArray(e.layers)?e.layers:[],drawCommands:Array.isArray(e.drawCommands)?e.drawCommands:[]}:{layers:[],drawCommands:[]}}function T(e){return _(e).map(e=>({objectId:v(e.objectId),className:v(e.className),name:v(e.name),stringProps:x(e.stringProps),numericProps:C(e.numericProps),colorProps:x(e.colorProps),urlProps:x(e.urlProps)}))}function E(e){return _(e).map(e=>({interface:v(e.interface),method:v(e.method),timestamp:b(e.timestamp),messageId:v(e.messageId)}))}function D(e){return _(e).map(e=>({eventType:v(e.eventType),timestamp:b(e.timestamp),url:y(e.url)}))}function O(e){return _(e).map(e=>({requestId:v(e.requestId),url:v(e.url),timestamp:b(e.timestamp)}))}function k(e){return _(e).map(e=>({pid:b(e.pid),tid:b(e.tid),syscallName:v(e.syscallName),timestamp:b(e.timestamp)}))}function A(e){return _(e).map(e=>({threadId:b(e.threadId),timestamp:b(e.timestamp),frames:_(e.frames).map(e=>({functionName:v(e.functionName)}))}))}function j(e){if(!g(e))return null;let t=v(e.moduleName);return t?{functions:_(e.functions).map(e=>({name:v(e.name),moduleName:v(e.moduleName),address:y(e.address),calledFrom:S(e.calledFrom)})),moduleName:t}:null}const M={WORKFLOW_REVERSE_OBFUSCATED:{id:`reverse-obfuscated-api`,displayName:`Reverse Obfuscated API`,steps:[{tool:`deobfuscate`,args:{targetUrl:"${input.targetUrl}"}},{tool:`js_heap_search`,args:{pattern:"${previous.cryptoKeys}"}},{tool:`network_enable`,args:{}},{tool:`tls_cert_pin_bypass`,args:{target:"${input.target}"}},{tool:`console_inject_fetch_interceptor`,args:{urls:["${input.apiEndpoint}"]}}]},WORKFLOW_GAME_CANVAS_SKIA:{id:`game-canvas-skia-v8`,displayName:`Game Canvas + SKIA + V8 Analysis`,steps:[{tool:`canvas_engine_fingerprint`,args:{canvasId:"${input.canvasId}"}},{tool:`canvas_scene_dump`,args:{canvasId:"${input.canvasId}"}},{tool:`skia_correlate_objects`,args:{skiaNodeIds:"${previous.nodeIds}"}},{tool:`performance_take_heap_snapshot`,args:{}},{tool:`js_heap_search`,args:{pattern:"${input.searchTerm}"}}]},WORKFLOW_BINARY_NATIVE_HOOK:{id:`binary-native-hook`,displayName:`Binary Analysis + Native Hook`,steps:[{tool:`ghidra_analyze`,args:{binaryPath:"${input.binaryPath}"}},{tool:`generate_hooks`,args:{symbols:"${previous.exportedSymbols}"}},{tool:`frida_attach`,args:{target:"${input.target}"}},{tool:`frida_run_script`,args:{script:"${previous.hookScript}"}}]}},N=[`analysis`,`browser`,`network`,`canvas`,`v8-inspector`,`mojo-ipc`,`syscall-hook`,`binary-instrument`,`boringssl-inspector`,`instrumentation`];var P=class{ctx;evidenceBridgeReady;constructor(e,t){this.ctx=e,this.evidenceBridgeReady=t}getCapabilities(){let e=this.getAvailableDomains(),t=N.filter(t=>!e.includes(t)),n=Object.entries(M).map(([e,t])=>{let n=this.evaluateWorkflow(t);return{workflowKey:e,id:t.id,displayName:t.displayName,stepCount:t.steps.length,...n}});return{availableDomains:e,missingDomains:t,supportedDomains:[...N],workflows:n}}suggestWorkflow(e,t){let n=e.toLowerCase(),r=Object.entries(M).map(([e,t])=>({workflowKey:e,workflow:t,keywordScore:this.scoreWorkflowGoal(n,e,t),evaluation:this.evaluateWorkflow(t)})),i=t?r.filter(e=>e.evaluation.missingDomains.length===0):r,a=i.length>0?i:r;a.sort((e,t)=>t.keywordScore===e.keywordScore?t.evaluation.coverage-e.evaluation.coverage:t.keywordScore-e.keywordScore);let o=a[0];if(!o)throw Error(`No workflow definitions are available for cross-domain suggestion`);let s=this.describeWorkflowReason(n,o.evaluation);return{workflowKey:o.workflowKey,id:o.workflow.id,displayName:o.workflow.displayName,reason:s,...o.evaluation}}getHealth(){let e=this.getAvailableDomains();return{evidenceBridgeReady:this.evidenceBridgeReady,orchestratorReady:!0,availableDomains:e,missingDomains:N.filter(t=>!e.includes(t))}}getAvailableDomains(){let e=this.ctx.enabledDomains.size>0?this.ctx.enabledDomains:this.ctx.resolveEnabledDomains(this.ctx.selectedTools),t=[];for(let n of N)e.has(n)&&t.push(n);return t}evaluateWorkflow(e){let t=new Set;for(let n of e.steps)for(let e of this.inferDomainsForTool(n.tool))t.add(e);let n=[...t],r=this.getAvailableDomains().filter(e=>t.has(e));return{requiredDomains:n,availableDomains:r,missingDomains:n.filter(e=>!r.includes(e)),coverage:n.length===0?1:r.length/n.length}}inferDomainsForTool(e){return e.startsWith(`deobfuscate`)||e.startsWith(`advanced_deobfuscate`)?[`analysis`]:e.startsWith(`js_heap`)||e.startsWith(`performance_take_heap_snapshot`)?[`v8-inspector`]:e.startsWith(`network_`)?[`network`]:e.startsWith(`console_`)?[`browser`]:e.startsWith(`tls_`)||e.startsWith(`net_raw_`)?[`boringssl-inspector`]:e.startsWith(`canvas_`)||e.startsWith(`skia_`)?[`canvas`]:e.startsWith(`v8_`)?[`v8-inspector`]:e.startsWith(`mojo_`)?[`mojo-ipc`]:e.startsWith(`syscall_`)?[`syscall-hook`]:e.startsWith(`adb_`)?[`adb-bridge`]:e.startsWith(`ghidra_`)||e.startsWith(`frida_`)||e.startsWith(`generate_hooks`)||e.startsWith(`unidbg_`)||e.startsWith(`export_hook_script`)?[`binary-instrument`]:e.startsWith(`extension_`)||e===`webhook`?[`extension-registry`]:e.startsWith(`cross_domain_`)?[`cross-domain`]:e.startsWith(`evidence_`)?[`instrumentation`]:e.startsWith(`boringssl_`)?[`boringssl-inspector`]:[]}scoreWorkflowGoal(e,t,n){let r=0;return t===`WORKFLOW_REVERSE_OBFUSCATED`&&((e.includes(`obfus`)||e.includes(`api`))&&(r+=3),(e.includes(`tls`)||e.includes(`pin`))&&(r+=2)),t===`WORKFLOW_GAME_CANVAS_SKIA`&&((e.includes(`canvas`)||e.includes(`game`))&&(r+=3),(e.includes(`skia`)||e.includes(`scene`))&&(r+=2)),t===`WORKFLOW_BINARY_NATIVE_HOOK`&&((e.includes(`binary`)||e.includes(`native`))&&(r+=3),(e.includes(`hook`)||e.includes(`frida`))&&(r+=2)),r===0&&n.displayName.toLowerCase().includes(e)&&(r+=1),r}describeWorkflowReason(e,t){return t.missingDomains.length===0?`Matched goal "${e}" and all required domains are enabled.`:`Matched goal "${e}" with ${Math.round(t.coverage*100)}% domain coverage. Missing: ${t.missingDomains.join(`, `)}.`}},F=class{evidenceBridge;workflowClassifier;constructor(e,t){this.evidenceBridge=e,this.workflowClassifier=t}async handleCapabilities(t){let n={evidenceGraphAvailable:!0,workflowClassifierAvailable:this.workflowClassifier!==void 0};return this.workflowClassifier?e({capabilities:n,...this.workflowClassifier.getCapabilities()}):e({capabilities:n})}async handleSuggestWorkflow(r){let i=t(r,`query`,``)||t(r,`goal`,``),a=n(r,`preferAvailableOnly`,!0);return this.workflowClassifier&&i?e(this.workflowClassifier.suggestWorkflow(i,a)):e({message:`Cross-domain workflow suggestion requires a classifier and query.`})}async handleHealth(){let t=this.evidenceBridge.getStats();return this.workflowClassifier?e({...this.workflowClassifier.getHealth(),evidenceGraph:t}):e({evidenceBridgeReady:!0,orchestratorReady:!1,evidenceGraph:t})}async handleCorrelateAll(t){let n=[],r={};try{let e=w(t.sceneTree),n=T(t.jsObjects);r.skia=o(this.evidenceBridge,{sceneTree:e,jsObjects:n})}catch(e){n.push(`SKIA-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=E(t.mojoMessages),n=D(t.cdpEvents),i=O(t.networkRequests);r.mojo=c(this.evidenceBridge,e,n,i)}catch(e){n.push(`MOJO-03: ${e instanceof Error?e.message:String(e)}`)}try{let e=k(t.syscallEvents),n=A(t.jsStacks);r.syscall=d(this.evidenceBridge,e,n)}catch(e){n.push(`SYSCALL-02: ${e instanceof Error?e.message:String(e)}`)}try{let e=j(t.ghidraOutput);e&&(r.binary=h(this.evidenceBridge,e))}catch(e){n.push(`BIN-04: ${e instanceof Error?e.message:String(e)}`)}let i=this.evidenceBridge.exportGraph();return e({correlationResults:{...r,errors:n},evidenceGraph:i})}async handleEvidenceExport(){return e(this.evidenceBridge.exportGraph())}async handleEvidenceStats(){return e(this.evidenceBridge.getStats())}};export{F as CrossDomainHandlers,P as CrossDomainWorkflowClassifier};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ToolError-g3rjWzhx.mjs";import{a as t,c as n,r,t as i}from"./parse-args-ngRrvF9e.mjs";import{n as a}from"./ResponseBuilder-nPXl_khE.mjs";import{createReadStream as o}from"node:fs";import{stat as s}from"node:fs/promises";import{Buffer as c}from"node:buffer";const l=(e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=parseInt(n,10);return Number.isFinite(r)?r:t},u=((e,t)=>{let n=process.env[e];if(n===void 0||n===``)return t;let r=n.split(`,`).map(e=>parseInt(e.trim(),10)).filter(e=>Number.isFinite(e)&&e>0);return r.length>0?r:t})(`BINARY_SECRETS_DEFAULT_KEY_LENGTHS`,[16,24,32,64]),d=l(`BINARY_SECRETS_MAX_RESULTS`,500),f=l(`BINARY_SECRETS_MIN_ENTROPY_X10`,70);l(`BINARY_SECRETS_REGEX_TIMEOUT_MS`,50);const p=l(`BINARY_SECRETS_MAX_CHUNK_BYTES`,16*1024*1024),m=l(`BINARY_SECRETS_CHUNK_OVERLAP_BYTES`,1024),h=l(`BINARY_SECRETS_CONTEXT_BYTES`,16),g=l(`BINARY_SECRETS_VALUE_PREVIEW_BYTES`,256),_=l(`BINARY_SECRETS_MIN_BASE64_LENGTH`,24),v=l(`BINARY_SECRETS_MAX_BASE64_LENGTH`,1024),y=l(`BINARY_SECRETS_MIN_HEX_LENGTH`,32),b=l(`BINARY_SECRETS_MAX_HEX_LENGTH`,1024),x=l(`BINARY_SECRETS_MAX_EXTRACT_DURATION_MS`,6e4);function S(e,t,n){if(n<=0)return 0;let r=t+n;if(r>e.length)return 0;let i=new Uint32Array(256);for(let n=t;n<r;n++)i[e[n]]=i[e[n]]+1>>>0;let a=1/n,o=0;for(let e=0;e<256;e++){let t=i[e];if(t===0)continue;let n=t*a;o-=n*Math.log2(n)}return o>8?8:o<0?0:o}function*C(e,t){if(t<=0||t>e.length)return;let n=new Uint32Array(256);for(let r=0;r<t;r++)n[e[r]]=n[e[r]]+1>>>0;yield[0,w(n,t)];for(let r=t;r<e.length;r++){let i=e[r-t],a=e[r];n[i]=n[i]-1>>>0,n[a]=n[a]+1>>>0,yield[r-t+1,w(n,t)]}}function w(e,t){let n=1/t,r=0;for(let t=0;t<256;t++){let i=e[t];if(i===0)continue;let a=i*n;r-=a*Math.log2(a)}return r>8?8:r<0?0:r}const T=p;var E=class{async extractFromFile(t,n={}){if(typeof t!=`string`||t.length===0)throw new e(`VALIDATION`,`filePath must be a non-empty string`);let r=0;try{r=(await s(t)).size}catch(n){throw new e(`NOT_FOUND`,`File not found: ${t}`,{details:{filePath:t},cause:n})}let i=D(n),a=performance.now(),l=Math.max(0,Math.min(i.scanWindowStart,r)),u=Math.max(l,Math.min(i.scanWindowEnd,r)),d=u-l,f=[],p=new Set;if(d===0)return{candidates:[],scannedBytes:0,durationMs:performance.now()-a};let m=c.alloc(0),h=l,g=l,_=o(t,{highWaterMark:i.maxChunkBytes,start:l,end:u-1});for await(let t of _){if(performance.now()-a>x)throw new e(`TIMEOUT`,`binary_key_extract exceeded BINARY_SECRETS_MAX_EXTRACT_DURATION_MS (${x} ms)`);let n=t,r=m.length===0?n:c.concat([m,n]);O(r,h,i,e=>{let t=`${e.format}@${e.absOffset}:${e.length}`;p.has(t)||(p.add(t),f.push(e))}),g+=n.length;let o=Math.min(r.length,i.overlapBytes);m=c.from(r.subarray(r.length-o)),h=g-o}let v=f.map(e=>({hit:e,entropy:S(e.bytes,0,e.length)}));v.sort((e,t)=>e.entropy===t.entropy?e.hit.absOffset-t.hit.absOffset:t.entropy-e.entropy);let y=v.length>i.maxResults;return{candidates:await P(t,y?v.slice(0,i.maxResults):v,i,r),scannedBytes:d,durationMs:performance.now()-a,...y?{truncated:!0}:{}}}};function D(t){let n=(()=>{if(!t.keyLengths)return u;if(!Array.isArray(t.keyLengths))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=t.keyLengths.map(t=>{if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new e(`VALIDATION`,`keyLengths entries must be positive integers (got ${String(t)})`);return t}).filter((e,t,n)=>n.indexOf(e)===t);if(n.length===0)throw new e(`VALIDATION`,`keyLengths must contain at least one positive integer`);return n})(),r=(()=>{if(t.minEntropy===void 0)return f/10;if(typeof t.minEntropy!=`number`||!Number.isFinite(t.minEntropy))throw new e(`VALIDATION`,`minEntropy must be a finite number in [0, 8]`);if(t.minEntropy<0||t.minEntropy>8)throw new e(`VALIDATION`,`minEntropy must be in [0, 8] (got ${t.minEntropy})`);return t.minEntropy})(),i=new Set(t.formats??[`raw`,`base64`,`hex`]);for(let t of i)if(t!==`raw`&&t!==`base64`&&t!==`hex`)throw new e(`VALIDATION`,`Invalid formats entry: "${t}". Expected one of: raw, base64, hex`);let a=t.includeContext??!0,o=(()=>{if(t.contextBytes===void 0)return h;if(typeof t.contextBytes!=`number`||!Number.isInteger(t.contextBytes)||t.contextBytes<0||t.contextBytes>1024)throw new e(`VALIDATION`,`contextBytes must be an integer in [0, 1024] (got ${String(t.contextBytes)})`);return t.contextBytes})(),s=(()=>{if(t.maxResults===void 0)return d;if(typeof t.maxResults!=`number`||!Number.isInteger(t.maxResults)||t.maxResults<=0)throw new e(`VALIDATION`,`maxResults must be a positive integer (got ${String(t.maxResults)})`);return t.maxResults})(),c=Math.max(t.maxChunkBytes??T,8192),l=Math.min(m,c-1),p=t.scanWindow?.start??0,g=t.scanWindow?.end??2**53-1;if(!Number.isFinite(p)||!Number.isFinite(g)||p<0||g<=p)throw new e(`VALIDATION`,`scanWindow must satisfy 0 <= start < end (got start=${p}, end=${g})`);return{keyLengths:n,maxRawWindow:Math.max(...n),minRawWindow:Math.min(...n),minEntropy:r,formats:i,includeContext:a,contextBytes:o,maxResults:s,maxChunkBytes:c,overlapBytes:l,scanWindowStart:p,scanWindowEnd:g}}function O(e,t,n,r){if(n.formats.has(`raw`)){for(let i of n.keyLengths)if(!(i>e.length))for(let[a,o]of C(e,i)){if(o<n.minEntropy)continue;let s=e.subarray(a,a+i);r({absOffset:t+a,length:i,format:`raw`,bytes:Uint8Array.from(s)})}}if(n.formats.has(`base64`))for(let i of j(e,t,n))r(i);if(n.formats.has(`hex`))for(let i of M(e,t,n))r(i)}function k(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47}function A(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function*j(e,t,n){let r=_,i=v,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&k(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=o;o=-1;let u=n,d=0;for(;d<2&&u<e.length&&e[u]===61;)u++,d++;let f=u-l;if(f<r||f>i||N(e,l,f)<5)continue;let p=e.subarray(l,u),m;try{m=c.from(p.toString(`ascii`),`base64`)}catch{continue}m.length!==0&&a.has(m.length)&&(yield{absOffset:t+l,length:m.length,format:`base64`,bytes:Uint8Array.from(m)})}}function*M(e,t,n){let r=y,i=b,a=new Set(n.keyLengths),o=-1;for(let n=0;n<=e.length;n++){let s=n<e.length?e[n]:-1;if(s!==-1&&A(s)){o===-1&&(o=n);continue}if(o===-1)continue;let l=n-o;l%2==1&&--l;let u=o;if(o=-1,l<r||l>i)continue;let d=l/2;if(!a.has(d))continue;let f=e.subarray(u,u+l),p=c.from(f.toString(`ascii`),`hex`);p.length===d&&(yield{absOffset:t+u,length:d,format:`hex`,bytes:Uint8Array.from(p)})}}function N(e,t,n){let r=new Uint8Array(256),i=0;for(let a=t;a<t+n;a++){let t=e[a];r[t]===0&&(r[t]=1,i++)}return i}async function P(e,t,n,r){let i=[];for(let{hit:a,entropy:o}of t){let t=Math.min(a.length,g),s=c.from(a.bytes.subarray(0,t)).toString(`hex`),l={offset:a.absOffset,length:a.length,format:a.format,entropy:o,value:s,...a.length>t?{valueTruncated:!0}:{},...n.includeContext?{context:await F(e,a,n.contextBytes,r)}:{}};i.push(l)}return i}async function F(e,t,n,r){if(n===0)return{before:``,after:``,beforeAscii:``,afterAscii:``};let i=t.format===`hex`?t.length*2:t.format===`base64`?Math.ceil(t.length/3)*4:t.length,a=Math.max(0,t.absOffset-n),o=t.absOffset,s=Math.min(r,t.absOffset+i),c=Math.min(r,s+n),l=await I(e,a,o),u=await I(e,s,c);return{before:l.toString(`hex`),after:u.toString(`hex`),beforeAscii:L(l),afterAscii:L(u)}}async function I(e,t,n){if(n<=t)return c.alloc(0);let r=[],i=o(e,{start:t,end:n-1});for await(let e of i)r.push(e);return c.concat(r)}function L(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];t+=r>=32&&r<=126?String.fromCharCode(r):`.`}return t}const R=new Set([`raw`,`base64`,`hex`]);function z(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`keyLengths must be an array of positive integers`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`number`||!Number.isFinite(i)||!Number.isInteger(i)||i<=0)throw new e(`VALIDATION`,`keyLengths[${r}] must be a positive integer (got ${String(i)})`);n.push(i)}return n}function B(t){if(t==null)return;if(!Array.isArray(t))throw new e(`VALIDATION`,`formats must be an array of strings`);let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(typeof i!=`string`||!R.has(i))throw new e(`VALIDATION`,`formats[${r}] must be one of: raw, base64, hex (got ${String(i)})`);n.push(i)}return n}var V=class{extractor;constructor(e=new E){this.extractor=e}handleBinaryKeyExtract(e){return a(async()=>{let a=n(e,`filePath`),o={},s=z(e.keyLengths);s!==void 0&&(o.keyLengths=s);let c=r(e,`minEntropy`);c!==void 0&&(o.minEntropy=c);let l=B(e.formats);l!==void 0&&(o.formats=l);let u=i(e,`includeContext`);u!==void 0&&(o.includeContext=u);let d=r(e,`contextBytes`);d!==void 0&&(o.contextBytes=d);let f=r(e,`maxResults`);f!==void 0&&(o.maxResults=f);let p=r(e,`maxChunkBytes`);p!==void 0&&(o.maxChunkBytes=p);let m=t(e,`scanWindow`);return m!==void 0&&(o.scanWindow={start:typeof m.start==`number`?m.start:void 0,end:typeof m.end==`number`?m.end:void 0}),{result:await this.extractor.extractFromFile(a,o)}})}};export{V as BinarySecretsHandlers};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./response-B1RuVVfD.mjs";import{o as t}from"./parse-args-ngRrvF9e.mjs";import{n}from"./ResponseBuilder-nPXl_khE.mjs";var r=class{sessionManager;deps;constructor(e,t={}){this.sessionManager=e,this.deps=t}async handleSessionDispatch(n){let r=t(n,`action`);switch(r){case`create`:return this.handleSessionCreate(n);case`list`:return this.handleSessionList(n);case`destroy`:return this.handleSessionDestroy(n);case`status`:return this.handleSessionStatus(n);default:return e({success:!1,error:`Unknown action: ${r}. Valid: create, list, destroy, status`})}}async handleOperationDispatch(n){let r=t(n,`action`);switch(r){case`register`:return this.handleOperationRegister(n);case`list`:return this.handleOperationList(n);default:return e({success:!1,error:`Unknown action: ${r}. Valid: register, list`})}}async handleArtifactDispatch(n){let r=t(n,`action`);switch(r){case`record`:return this.handleArtifactRecord(n);case`query`:return this.handleArtifactQuery(n);default:return e({success:!1,error:`Unknown action: ${r}. Valid: record, query`})}}async handleSessionCreate(e){return n(async()=>{let n=t(e,`name`);return{session:this.sessionManager.createSession(n||void 0)}})}async handleSessionList(e){return n(async()=>{let e=this.sessionManager.listSessions();return{totalSessions:e.length,sessions:e}})}async handleSessionDestroy(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);return this.sessionManager.destroySession(n),{sessionId:n,message:`Session destroyed`}})}async handleSessionStatus(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);let r=this.sessionManager.getSession(n);if(!r)throw Error(`Session "${n}" not found`);return{session:r,stats:this.sessionManager.getSessionStats(n)}})}async handleOperationList(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);let r=this.sessionManager.getSessionOperations(n),i=t(e,`type`);return i&&(r=r.filter(e=>e.type===i)),{totalOperations:r.length,operations:r}})}async handleOperationRegister(e){return n(async()=>{let n=t(e,`sessionId`,``),r=t(e,`type`,``),i=t(e,`target`,``),a=e.config&&typeof e.config==`object`&&!Array.isArray(e.config)?e.config:{};if(!n)throw Error(`sessionId is required`);if(!r)throw Error(`type is required`);if(!i)throw Error(`target is required`);return{operation:this.sessionManager.registerOperation(n,r,i,a)}})}async handleArtifactQuery(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);let r=t(e,`type`)||void 0,i=typeof e.limit==`number`?e.limit:50,a=this.sessionManager.getArtifacts(n,r);return i>0&&(a=a.slice(0,i)),{totalArtifacts:a.length,artifacts:a}})}async handleArtifactRecord(e){return n(async()=>{let n=t(e,`operationId`,``),r=e.data&&typeof e.data==`object`&&!Array.isArray(e.data)?e.data:void 0;if(!n)throw Error(`operationId is required`);if(!r)throw Error(`data is required`);return{artifact:this.sessionManager.recordArtifact(n,r)}})}async handleHookPreset(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);if(!this.deps.hookPresetHandlers)throw Error(`hookPresetHandlers is not available`);let r={...e};delete r.sessionId;let i=await this.sessionManager.applyHookPreset(n,this.deps.hookPresetHandlers,r);return{operation:i.operation,artifacts:i.artifacts,result:i.payload}})}async handleNetworkReplay(e){return n(async()=>{let n=t(e,`sessionId`,``);if(!n)throw Error(`sessionId is required`);if(!this.deps.advancedHandlers)throw Error(`advancedHandlers is not available`);let r={...e};delete r.sessionId;let i=await this.sessionManager.replayNetworkRequest(n,this.deps.advancedHandlers,r);return{operation:i.operation,artifacts:i.artifacts,result:i.payload}})}};export{r as InstrumentationHandlers};
|