@jshookmcp/jshook 0.2.3 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/README.zh.md +18 -3
- package/dist/packages/extension-sdk/src/bridges/shared.js +2 -2
- package/dist/packages/extension-sdk/src/plugin.d.ts +5 -0
- package/dist/packages/extension-sdk/src/plugin.js +119 -33
- package/dist/packages/extension-sdk/src/workflow.d.ts +171 -0
- package/dist/packages/extension-sdk/src/workflow.js +272 -0
- package/dist/src/config/search-defaults.js +161 -0
- package/dist/src/constants.d.ts +3 -0
- package/dist/src/constants.js +4 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +13 -17
- package/dist/src/modules/analyzer/CodeAnalyzer.d.ts +1 -3
- package/dist/src/modules/analyzer/CodeAnalyzer.js +16 -28
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.d.ts +1 -2
- package/dist/src/modules/analyzer/CodeAnalyzerDataFlow.js +1 -45
- package/dist/src/modules/analyzer/IntelligentAnalyzer.d.ts +1 -37
- package/dist/src/modules/analyzer/IntelligentAnalyzer.js +9 -142
- package/dist/src/modules/analyzer/PatternDetector.js +3 -3
- package/dist/src/modules/analyzer/PatternDetectorAuthPatterns.js +1 -1
- package/dist/src/modules/browser/BrowserDiscovery.js +2 -2
- package/dist/src/modules/browser/BrowserModeManager.js +11 -10
- package/dist/src/modules/browser/BrowserPool.d.ts +49 -0
- package/dist/src/modules/browser/BrowserPool.js +288 -0
- package/dist/src/modules/browser/TabRegistry.js +2 -2
- package/dist/src/modules/browser/UnifiedBrowserManager.d.ts +1 -0
- package/dist/src/modules/browser/UnifiedBrowserManager.js +18 -3
- package/dist/src/modules/captcha/AICaptchaDetector.d.ts +1 -10
- package/dist/src/modules/captcha/AICaptchaDetector.js +7 -201
- package/dist/src/modules/collector/CodeCollector.js +4 -5
- package/dist/src/modules/collector/DOMInspector.js +48 -58
- package/dist/src/modules/collector/PageController.d.ts +17 -4
- package/dist/src/modules/collector/PageController.js +2 -5
- package/dist/src/modules/collector/PageScriptCollectors.js +3 -3
- package/dist/src/modules/crypto/CryptoDetector.d.ts +1 -4
- package/dist/src/modules/crypto/CryptoDetector.js +2 -42
- package/dist/src/modules/crypto/CryptoRules.js +1 -1
- package/dist/src/modules/debugger/BlackboxManager.js +1 -1
- package/dist/src/modules/debugger/DebuggerManager.impl.core.scope.js +1 -1
- package/dist/src/modules/debugger/ScriptManager.impl.extract-function-tree.js +4 -2
- package/dist/src/modules/debugger/WatchExpressionManager.js +1 -1
- package/dist/src/modules/deobfuscator/AdvancedDeobfuscator.d.ts +5 -0
- package/dist/src/modules/deobfuscator/AdvancedDeobfuscator.js +43 -2
- package/dist/src/modules/deobfuscator/Deobfuscator.d.ts +1 -4
- package/dist/src/modules/deobfuscator/Deobfuscator.js +9 -39
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.d.ts +0 -3
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.js +2 -8
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.d.ts +1 -2
- package/dist/src/modules/deobfuscator/JSVMPDeobfuscator.restore.js +3 -55
- package/dist/src/modules/deobfuscator/JScramblerDeobfuscator.js +3 -4
- package/dist/src/modules/deobfuscator/VMDeobfuscator.d.ts +2 -10
- package/dist/src/modules/deobfuscator/VMDeobfuscator.js +3 -128
- package/dist/src/modules/deobfuscator/webcrack.js +15 -2
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.d.ts +5 -8
- package/dist/src/modules/emulator/AIEnvironmentAnalyzer.js +10 -102
- package/dist/src/modules/emulator/EnvironmentEmulator.d.ts +1 -5
- package/dist/src/modules/emulator/EnvironmentEmulator.js +7 -91
- package/dist/src/modules/emulator/EnvironmentEmulatorFetch.js +58 -61
- package/dist/src/modules/emulator/templates/chrome-env.d.ts +17 -7
- package/dist/src/modules/emulator/templates/chrome-env.js +14 -7
- package/dist/src/modules/external/ExternalToolRunner.js +25 -22
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.compose.js +5 -5
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.network.js +311 -311
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.runtime.js +410 -410
- package/dist/src/modules/hook/HookGeneratorBuilders.core.generators.storage.js +122 -122
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.d.ts +13 -0
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.class.js +42 -0
- package/dist/src/modules/monitor/ConsoleMonitor.impl.core.dynamic.js +194 -194
- package/dist/src/modules/monitor/FetchInterceptor.d.ts +46 -0
- package/dist/src/modules/monitor/FetchInterceptor.js +191 -0
- package/dist/src/modules/monitor/PerformanceMonitor.js +8 -7
- package/dist/src/modules/monitor/PlaywrightNetworkMonitor.js +62 -62
- package/dist/src/modules/process/BaseMemoryManager.d.ts +1 -1
- package/dist/src/modules/process/LinuxProcessManager.js +2 -0
- package/dist/src/modules/process/MacProcessManager.js +25 -25
- package/dist/src/modules/process/MemoryManager.d.ts +1 -1
- package/dist/src/modules/process/MemoryManager.js +2 -2
- package/dist/src/modules/process/memory/AuditTrail.js +1 -1
- package/dist/src/modules/process/memory/availability.js +49 -49
- package/dist/src/modules/process/memory/injector.js +185 -185
- package/dist/src/modules/process/memory/reader.js +85 -53
- package/dist/src/modules/process/memory/regions.dump.js +51 -51
- package/dist/src/modules/process/memory/regions.enumerate.js +108 -108
- package/dist/src/modules/process/memory/regions.modules.js +80 -80
- package/dist/src/modules/process/memory/regions.protection.js +148 -115
- package/dist/src/modules/process/memory/scanner.d.ts +5 -1
- package/dist/src/modules/process/memory/scanner.darwin.js +98 -41
- package/dist/src/modules/process/memory/scanner.js +88 -4
- package/dist/src/modules/process/memory/scanner.windows.js +124 -124
- package/dist/src/modules/process/memory/writer.js +98 -58
- package/dist/src/modules/security/ExecutionSandbox.js +51 -52
- package/dist/src/modules/stealth/FingerprintManager.js +1 -1
- package/dist/src/modules/stealth/StealthScripts.d.ts +1 -0
- package/dist/src/modules/stealth/StealthScripts.js +18 -13
- package/dist/src/modules/stealth/StealthVerifier.js +1 -3
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.d.ts +14 -0
- package/dist/src/modules/symbolic/JSVMPSymbolicExecutor.js +181 -2
- package/dist/src/modules/trace/TraceDB.js +75 -69
- package/dist/src/modules/trace/TraceRecorder.js +1 -5
- package/dist/src/native/AntiCheatDetector.js +67 -16
- package/dist/src/native/CodeInjector.js +3 -3
- package/dist/src/native/HardwareBreakpoint.js +24 -15
- package/dist/src/native/HeapAnalyzer.js +2 -2
- package/dist/src/native/MemoryController.js +1 -1
- package/dist/src/native/MemoryScanSession.js +2 -2
- package/dist/src/native/MemoryScanner.js +4 -8
- package/dist/src/native/NativeMemoryManager.impl.js +2 -2
- package/dist/src/native/PEAnalyzer.js +14 -15
- package/dist/src/native/PointerChainEngine.js +2 -4
- package/dist/src/native/ScriptLoader.js +4 -9
- package/dist/src/native/Speedhack.js +1 -1
- package/dist/src/native/StructureAnalyzer.js +52 -33
- package/dist/src/native/Win32API.d.ts +1 -0
- package/dist/src/native/Win32API.js +13 -0
- package/dist/src/native/Win32Debug.js +19 -19
- package/dist/src/native/platform/darwin/DarwinAPI.d.ts +2 -0
- package/dist/src/native/platform/darwin/DarwinAPI.js +8 -0
- package/dist/src/native/platform/darwin/DarwinMemoryProvider.js +6 -1
- package/dist/src/server/MCPServer.context.d.ts +3 -1
- package/dist/src/server/MCPServer.d.ts +2 -1
- package/dist/src/server/MCPServer.domain.d.ts +1 -1
- package/dist/src/server/MCPServer.domain.js +81 -16
- package/dist/src/server/MCPServer.js +41 -14
- package/dist/src/server/MCPServer.resources.d.ts +2 -0
- package/dist/src/server/MCPServer.resources.js +91 -0
- package/dist/src/server/MCPServer.search.handlers.call.js +2 -1
- package/dist/src/server/MCPServer.search.helpers.js +1 -1
- package/dist/src/server/MCPServer.transport.js +12 -0
- package/dist/src/server/ToolCallContextGuard.js +8 -0
- package/dist/src/server/ToolRouter.d.ts +25 -9
- package/dist/src/server/ToolRouter.intent.d.ts +26 -0
- package/dist/src/server/ToolRouter.intent.js +77 -0
- package/dist/src/server/ToolRouter.js +103 -284
- package/dist/src/server/ToolRouter.policy.d.ts +22 -0
- package/dist/src/server/ToolRouter.policy.js +163 -0
- package/dist/src/server/ToolRouter.probe.d.ts +17 -0
- package/dist/src/server/ToolRouter.probe.js +103 -0
- package/dist/src/server/ToolRouter.renderer.d.ts +9 -0
- package/dist/src/server/ToolRouter.renderer.js +52 -0
- package/dist/src/server/activation/ActivationController.js +15 -12
- package/dist/src/server/activation/CompoundConditionEngine.js +1 -1
- package/dist/src/server/activation/PredictiveBooster.js +1 -3
- package/dist/src/server/domains/analysis/definitions.js +155 -655
- package/dist/src/server/domains/analysis/handlers.impl.js +26 -20
- package/dist/src/server/domains/analysis/handlers.web-tools.js +2 -1
- package/dist/src/server/domains/analysis/manifest.js +6 -4
- package/dist/src/server/domains/antidebug/definitions.js +25 -111
- package/dist/src/server/domains/browser/definitions.tools.advanced.js +59 -88
- package/dist/src/server/domains/browser/definitions.tools.behavior.js +120 -227
- package/dist/src/server/domains/browser/definitions.tools.page-core.js +210 -439
- package/dist/src/server/domains/browser/definitions.tools.page-system.js +108 -250
- package/dist/src/server/domains/browser/definitions.tools.runtime.js +98 -211
- package/dist/src/server/domains/browser/definitions.tools.security.js +194 -339
- package/dist/src/server/domains/browser/handlers/camoufox-browser.js +3 -2
- package/dist/src/server/domains/browser/handlers/captcha-solver.js +3 -3
- package/dist/src/server/domains/browser/handlers/dom-query.js +2 -1
- package/dist/src/server/domains/browser/handlers/framework-state.js +27 -9
- package/dist/src/server/domains/browser/handlers/indexeddb-dump.js +21 -20
- package/dist/src/server/domains/browser/handlers/script-management.js +1 -1
- package/dist/src/server/domains/browser/handlers/stealth-injection.d.ts +1 -0
- package/dist/src/server/domains/browser/handlers/stealth-injection.js +3 -0
- package/dist/src/server/domains/browser/handlers.impl.d.ts +1 -2
- package/dist/src/server/domains/browser/handlers.impl.js +2 -3
- package/dist/src/server/domains/browser/manifest.js +37 -13
- package/dist/src/server/domains/coordination/definitions.js +50 -216
- package/dist/src/server/domains/coordination/index.d.ts +2 -1
- package/dist/src/server/domains/coordination/index.js +1 -0
- package/dist/src/server/domains/debugger/definitions.tools.advanced.js +72 -189
- package/dist/src/server/domains/debugger/definitions.tools.core.js +114 -288
- package/dist/src/server/domains/debugger/manifest.js +9 -2
- package/dist/src/server/domains/encoding/definitions.js +43 -153
- package/dist/src/server/domains/encoding/handlers.base.js +2 -2
- package/dist/src/server/domains/evidence/definitions.d.ts +2 -0
- package/dist/src/server/domains/evidence/definitions.js +42 -0
- package/dist/src/server/domains/evidence/handlers.d.ts +582 -0
- package/dist/src/server/domains/evidence/handlers.js +60 -0
- package/dist/src/server/domains/evidence/index.d.ts +2 -0
- package/dist/src/server/domains/evidence/index.js +2 -0
- package/dist/src/server/domains/evidence/manifest.d.ts +63 -0
- package/dist/src/server/domains/evidence/manifest.js +78 -0
- package/dist/src/server/domains/graphql/definitions.js +53 -141
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.replay.js +92 -114
- package/dist/src/server/domains/graphql/handlers.impl.core.runtime.shared.js +77 -77
- package/dist/src/server/domains/hooks/ai-handlers.d.ts +0 -7
- package/dist/src/server/domains/hooks/ai-handlers.js +1 -67
- package/dist/src/server/domains/hooks/definitions.js +69 -335
- package/dist/src/server/domains/hooks/manifest.d.ts +1 -1
- package/dist/src/server/domains/hooks/manifest.js +1 -2
- package/dist/src/server/domains/instrumentation/definitions.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/definitions.js +99 -0
- package/dist/src/server/domains/instrumentation/handlers.d.ts +78 -0
- package/dist/src/server/domains/instrumentation/handlers.js +206 -0
- package/dist/src/server/domains/instrumentation/index.d.ts +2 -0
- package/dist/src/server/domains/instrumentation/index.js +2 -0
- package/dist/src/server/domains/instrumentation/manifest.d.ts +63 -0
- package/dist/src/server/domains/instrumentation/manifest.js +114 -0
- package/dist/src/server/domains/macro/definitions.js +16 -43
- package/dist/src/server/domains/maintenance/definitions.js +60 -219
- package/dist/src/server/domains/maintenance/handlers.extensions.js +78 -20
- package/dist/src/server/domains/memory/definitions.js +387 -559
- package/dist/src/server/domains/memory/handlers/hooks.d.ts +55 -0
- package/dist/src/server/domains/memory/handlers/hooks.js +115 -0
- package/dist/src/server/domains/memory/handlers/integrity.d.ts +77 -0
- package/dist/src/server/domains/memory/handlers/integrity.js +180 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/pointer-chain.js +82 -0
- package/dist/src/server/domains/memory/handlers/readwrite.d.ts +41 -0
- package/dist/src/server/domains/memory/handlers/readwrite.js +78 -0
- package/dist/src/server/domains/memory/handlers/scan.d.ts +35 -0
- package/dist/src/server/domains/memory/handlers/scan.js +97 -0
- package/dist/src/server/domains/memory/handlers/session.d.ts +23 -0
- package/dist/src/server/domains/memory/handlers/session.js +49 -0
- package/dist/src/server/domains/memory/handlers/structure.d.ts +29 -0
- package/dist/src/server/domains/memory/handlers/structure.js +74 -0
- package/dist/src/server/domains/memory/handlers.impl.d.ts +49 -54
- package/dist/src/server/domains/memory/handlers.impl.js +63 -494
- package/dist/src/server/domains/memory/manifest.js +236 -64
- package/dist/src/server/domains/native-bridge/definitions.js +54 -192
- package/dist/src/server/domains/native-bridge/index.d.ts +1 -0
- package/dist/src/server/domains/native-bridge/index.js +2 -1
- package/dist/src/server/domains/network/auth-extractor.js +1 -1
- package/dist/src/server/domains/network/definitions.js +175 -578
- package/dist/src/server/domains/network/handlers.base.core.d.ts +64 -0
- package/dist/src/server/domains/network/handlers.base.core.js +623 -0
- package/dist/src/server/domains/network/handlers.base.d.ts +2 -124
- package/dist/src/server/domains/network/handlers.base.js +3 -878
- package/dist/src/server/domains/network/handlers.base.performance.d.ts +63 -0
- package/dist/src/server/domains/network/handlers.base.performance.js +193 -0
- package/dist/src/server/domains/network/handlers.base.types.d.ts +42 -0
- package/dist/src/server/domains/network/handlers.base.types.js +89 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.d.ts +1 -1
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.d.ts +21 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.intercept.js +186 -0
- package/dist/src/server/domains/network/handlers.impl.core.runtime.js +1 -1
- package/dist/src/server/domains/network/manifest.js +15 -0
- package/dist/src/server/domains/network/replay.js +1 -4
- package/dist/src/server/domains/platform/definitions.js +121 -112
- package/dist/src/server/domains/platform/handlers/bridge-handlers.d.ts +4 -0
- package/dist/src/server/domains/platform/handlers/bridge-handlers.js +193 -4
- package/dist/src/server/domains/platform/handlers/electron-asar-helpers.js +26 -6
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-dual-cdp.js +170 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.d.ts +3 -0
- package/dist/src/server/domains/platform/handlers/electron-fuse-handler.js +193 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.d.ts +6 -0
- package/dist/src/server/domains/platform/handlers/electron-handlers.js +95 -2
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-ipc-sniffer.js +370 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/electron-userdata-handler.js +78 -0
- package/dist/src/server/domains/platform/handlers/miniapp-handlers.js +3 -3
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.d.ts +2 -0
- package/dist/src/server/domains/platform/handlers/v8-bytecode-handler.js +207 -0
- package/dist/src/server/domains/platform/handlers.d.ts +48 -0
- package/dist/src/server/domains/platform/handlers.js +29 -0
- package/dist/src/server/domains/platform/manifest.js +38 -0
- package/dist/src/server/domains/process/definitions.js +163 -647
- package/dist/src/server/domains/process/handlers.base.d.ts +3 -95
- package/dist/src/server/domains/process/handlers.base.js +7 -462
- package/dist/src/server/domains/process/handlers.base.process.d.ts +61 -0
- package/dist/src/server/domains/process/handlers.base.process.js +417 -0
- package/dist/src/server/domains/process/handlers.base.types.d.ts +57 -0
- package/dist/src/server/domains/process/handlers.base.types.js +50 -0
- package/dist/src/server/domains/process/handlers.impl.core.runtime.inject.js +18 -16
- package/dist/src/server/domains/process/manifest.js +6 -1
- package/dist/src/server/domains/sandbox/definitions.js +11 -33
- package/dist/src/server/domains/sandbox/handlers.js +8 -3
- package/dist/src/server/domains/shared/ResponseBuilder.d.ts +209 -0
- package/dist/src/server/domains/shared/ResponseBuilder.js +48 -0
- package/dist/src/server/domains/shared/modules.d.ts +0 -2
- package/dist/src/server/domains/shared/modules.js +0 -1
- package/dist/src/server/domains/shared-state-board/definitions.d.ts +2 -0
- package/dist/src/server/domains/shared-state-board/definitions.js +78 -0
- package/dist/src/server/domains/shared-state-board/handlers.impl.d.ts +58 -0
- package/dist/src/server/domains/shared-state-board/handlers.impl.js +419 -0
- package/dist/src/server/domains/shared-state-board/index.d.ts +2 -0
- package/dist/src/server/domains/shared-state-board/index.js +2 -0
- package/dist/src/server/domains/shared-state-board/manifest.d.ts +57 -0
- package/dist/src/server/domains/shared-state-board/manifest.js +74 -0
- package/dist/src/server/domains/sourcemap/definitions.js +27 -111
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-common.js +7 -2
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-main.js +1 -1
- package/dist/src/server/domains/sourcemap/handlers.impl.sourcemap-parse-base.js +1 -1
- package/dist/src/server/domains/sourcemap/manifest.d.ts +1 -1
- package/dist/src/server/domains/sourcemap/manifest.js +1 -1
- package/dist/src/server/domains/streaming/definitions.js +36 -148
- package/dist/src/server/domains/streaming/handlers.impl.streaming-sse.js +163 -164
- package/dist/src/server/domains/streaming/handlers.impl.streaming-ws.js +1 -1
- package/dist/src/server/domains/trace/TraceSummarizer.js +8 -5
- package/dist/src/server/domains/trace/definitions.tools.js +51 -206
- package/dist/src/server/domains/trace/handlers.js +10 -12
- package/dist/src/server/domains/trace/index.d.ts +2 -1
- package/dist/src/server/domains/trace/index.js +2 -1
- package/dist/src/server/domains/trace/manifest.js +15 -3
- package/dist/src/server/domains/transform/definitions.js +50 -210
- package/dist/src/server/domains/transform/handlers.impl.transform-base.js +108 -108
- package/dist/src/server/domains/transform/handlers.impl.transform-crypto.js +18 -19
- package/dist/src/server/domains/transform/manifest.d.ts +1 -1
- package/dist/src/server/domains/transform/manifest.js +1 -1
- package/dist/src/server/domains/wasm/definitions.js +55 -232
- package/dist/src/server/domains/wasm/handlers.js +1 -1
- package/dist/src/server/domains/workflow/definitions.js +144 -414
- package/dist/src/server/domains/workflow/handlers.impl.workflow-account-bundle.js +1 -1
- package/dist/src/server/domains/workflow/handlers.impl.workflow-api.js +51 -51
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.d.ts +2 -0
- package/dist/src/server/domains/workflow/handlers.impl.workflow-base.js +126 -87
- package/dist/src/server/domains/workflow/handlers.impl.workflow-batch.js +5 -5
- package/dist/src/server/evidence/ReverseEvidenceGraph.d.ts +20 -0
- package/dist/src/server/evidence/ReverseEvidenceGraph.js +208 -0
- package/dist/src/server/evidence/index.d.ts +2 -0
- package/dist/src/server/evidence/index.js +1 -0
- package/dist/src/server/evidence/types.d.ts +22 -0
- package/dist/src/server/evidence/types.js +1 -0
- package/dist/src/server/extensions/ExtensionManager.d.ts +1 -0
- package/dist/src/server/extensions/ExtensionManager.discovery.js +72 -9
- package/dist/src/server/extensions/ExtensionManager.integrity.js +1 -1
- package/dist/src/server/extensions/ExtensionManager.js +193 -40
- package/dist/src/server/extensions/ExtensionManager.roots.d.ts +1 -1
- package/dist/src/server/extensions/ExtensionManager.roots.js +4 -4
- package/dist/src/server/extensions/plugin-config.js +1 -1
- package/dist/src/server/extensions/plugin-env.d.ts +1 -1
- package/dist/src/server/extensions/plugin-env.js +10 -4
- package/dist/src/server/extensions/types.d.ts +17 -0
- package/dist/src/server/extensions/types.js +1 -1
- package/dist/src/server/http/SseStream.d.ts +21 -0
- package/dist/src/server/http/SseStream.js +129 -0
- package/dist/src/server/instrumentation/EvidenceGraphBridge.d.ts +13 -0
- package/dist/src/server/instrumentation/EvidenceGraphBridge.js +150 -0
- package/dist/src/server/instrumentation/InstrumentationSession.d.ts +60 -0
- package/dist/src/server/instrumentation/InstrumentationSession.js +269 -0
- package/dist/src/server/instrumentation/index.d.ts +2 -0
- package/dist/src/server/instrumentation/index.js +2 -0
- package/dist/src/server/instrumentation/types.d.ts +62 -0
- package/dist/src/server/instrumentation/types.js +7 -0
- package/dist/src/server/macros/MacroConfigLoader.d.ts +6 -5
- package/dist/src/server/macros/MacroConfigLoader.js +61 -59
- package/dist/src/server/macros/MacroRunner.js +6 -2
- package/dist/src/server/macros/builtins/index.d.ts +2 -3
- package/dist/src/server/macros/builtins/index.js +51 -7
- package/dist/src/server/plugins/PluginContract.d.ts +1 -1
- package/dist/src/server/registry/contracts.d.ts +1 -1
- package/dist/src/server/registry/discovery.js +5 -4
- package/dist/src/server/registry/ensure-browser-core.js +0 -3
- package/dist/src/server/registry/index.js +4 -4
- package/dist/src/server/registry/tool-builder.d.ts +46 -0
- package/dist/src/server/registry/tool-builder.js +105 -0
- package/dist/src/server/sandbox/QuickJSSandbox.js +16 -5
- package/dist/src/server/sandbox/SandboxHelpers.js +250 -250
- package/dist/src/server/search/EmbeddingWorker.js +5 -3
- package/dist/src/server/search/FeedbackTracker.d.ts +9 -0
- package/dist/src/server/search/FeedbackTracker.js +26 -0
- package/dist/src/server/search/QueryNormalizer.d.ts +6 -0
- package/dist/src/server/search/QueryNormalizer.js +94 -0
- package/dist/src/server/search/ToolSearchEngineImpl.d.ts +2 -3
- package/dist/src/server/search/ToolSearchEngineImpl.js +38 -88
- package/dist/src/server/teams/TeamManager.d.ts +43 -0
- package/dist/src/server/teams/TeamManager.js +238 -0
- package/dist/src/server/teams/index.d.ts +1 -0
- package/dist/src/server/teams/index.js +1 -0
- package/dist/src/server/workflows/WorkflowContract.d.ts +44 -4
- package/dist/src/server/workflows/WorkflowContract.js +52 -0
- package/dist/src/server/workflows/WorkflowEngine.d.ts +1 -0
- package/dist/src/server/workflows/WorkflowEngine.js +314 -4
- package/dist/src/types/config.d.ts +0 -14
- package/dist/src/types/deobfuscator.d.ts +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/utils/DetailedDataManager.js +2 -0
- package/dist/src/utils/RingBuffer.js +5 -5
- package/dist/src/utils/TokenBudgetManager.js +1 -1
- package/dist/src/utils/UnifiedCacheManager.js +1 -1
- package/dist/src/utils/artifactRetention.js +2 -2
- package/dist/src/utils/betterSqlite3.d.ts +11 -0
- package/dist/src/utils/betterSqlite3.js +88 -0
- package/dist/src/utils/browserExecutable.js +2 -2
- package/dist/src/utils/cache/CachedDecorator.d.ts +8 -0
- package/dist/src/utils/cache/CachedDecorator.js +55 -0
- package/dist/src/utils/cache/PersistentCache.d.ts +33 -0
- package/dist/src/utils/cache/PersistentCache.js +246 -0
- package/dist/src/utils/cache/index.d.ts +2 -0
- package/dist/src/utils/cache/index.js +2 -0
- package/dist/src/utils/cliFastPath.js +5 -8
- package/dist/src/utils/config.js +4 -26
- package/dist/src/utils/environmentDoctor.js +138 -11
- package/dist/src/utils/outputPaths.js +16 -9
- package/dist/src/utils/parallel.js +1 -3
- package/package.json +82 -81
- package/scripts/postinstall.cjs +54 -27
- package/workflows/.gitkeep +0 -0
- package/workflows/anti-bot-diagnoser/.jshook-install.json +14 -0
- package/workflows/anti-bot-diagnoser/LICENSE +21 -0
- package/workflows/anti-bot-diagnoser/README.md +105 -0
- package/workflows/anti-bot-diagnoser/docs/agent-recipes.md +44 -0
- package/workflows/anti-bot-diagnoser/meta.yaml +6 -0
- package/workflows/anti-bot-diagnoser/package.json +22 -0
- package/workflows/anti-bot-diagnoser/tsconfig.json +15 -0
- package/workflows/anti-bot-diagnoser/workflow.ts +224 -0
- package/workflows/api-openapi-probe/.jshook-install.json +14 -0
- package/workflows/api-openapi-probe/meta.yaml +6 -0
- package/workflows/api-openapi-probe/package.json +22 -0
- package/workflows/api-openapi-probe/pnpm-lock.yaml +819 -0
- package/workflows/api-openapi-probe/tsconfig.json +15 -0
- package/workflows/api-openapi-probe/workflow.ts +40 -0
- package/workflows/api-probe-batch/.jshook-install.json +14 -0
- package/workflows/api-probe-batch/LICENSE +21 -0
- package/workflows/api-probe-batch/README.md +45 -0
- package/workflows/api-probe-batch/meta.yaml +4 -0
- package/workflows/api-probe-batch/package.json +23 -0
- package/workflows/api-probe-batch/tsconfig.json +16 -0
- package/workflows/api-probe-batch/workflow.ts +111 -0
- package/workflows/auth-bootstrap/.jshook-install.json +14 -0
- package/workflows/auth-bootstrap/LICENSE +21 -0
- package/workflows/auth-bootstrap/README.md +74 -0
- package/workflows/auth-bootstrap/meta.yaml +4 -0
- package/workflows/auth-bootstrap/package.json +23 -0
- package/workflows/auth-bootstrap/tsconfig.json +16 -0
- package/workflows/auth-bootstrap/workflow.ts +141 -0
- package/workflows/auth-extract/.jshook-install.json +14 -0
- package/workflows/auth-extract/meta.yaml +6 -0
- package/workflows/auth-extract/package.json +22 -0
- package/workflows/auth-extract/pnpm-lock.yaml +819 -0
- package/workflows/auth-extract/tsconfig.json +15 -0
- package/workflows/auth-extract/workflow.ts +36 -0
- package/workflows/auth-surface-mapper/.jshook-install.json +14 -0
- package/workflows/auth-surface-mapper/meta.yaml +6 -0
- package/workflows/auth-surface-mapper/package.json +22 -0
- package/workflows/auth-surface-mapper/pnpm-lock.yaml +819 -0
- package/workflows/auth-surface-mapper/tsconfig.json +15 -0
- package/workflows/auth-surface-mapper/workflow.ts +104 -0
- package/workflows/batch-register/.jshook-install.json +14 -0
- package/workflows/batch-register/LICENSE +21 -0
- package/workflows/batch-register/README.md +39 -0
- package/workflows/batch-register/meta.yaml +4 -0
- package/workflows/batch-register/package.json +23 -0
- package/workflows/batch-register/tsconfig.json +16 -0
- package/workflows/batch-register/workflow.ts +67 -0
- package/workflows/bundle-recovery/.jshook-install.json +14 -0
- package/workflows/bundle-recovery/LICENSE +21 -0
- package/workflows/bundle-recovery/README.md +105 -0
- package/workflows/bundle-recovery/docs/agent-recipes.md +44 -0
- package/workflows/bundle-recovery/meta.yaml +6 -0
- package/workflows/bundle-recovery/package.json +22 -0
- package/workflows/bundle-recovery/tsconfig.json +15 -0
- package/workflows/bundle-recovery/workflow.ts +179 -0
- package/workflows/challenge-detector/.jshook-install.json +14 -0
- package/workflows/challenge-detector/meta.yaml +14 -0
- package/workflows/challenge-detector/package.json +22 -0
- package/workflows/challenge-detector/pnpm-lock.yaml +819 -0
- package/workflows/challenge-detector/tsconfig.json +15 -0
- package/workflows/challenge-detector/workflow.ts +298 -0
- package/workflows/deobfuscation-pipeline/.jshook-install.json +14 -0
- package/workflows/deobfuscation-pipeline/meta.yaml +6 -0
- package/workflows/deobfuscation-pipeline/package.json +22 -0
- package/workflows/deobfuscation-pipeline/pnpm-lock.yaml +819 -0
- package/workflows/deobfuscation-pipeline/tsconfig.json +15 -0
- package/workflows/deobfuscation-pipeline/workflow.ts +119 -0
- package/workflows/electron-bridge-mapper/.jshook-install.json +14 -0
- package/workflows/electron-bridge-mapper/meta.yaml +6 -0
- package/workflows/electron-bridge-mapper/package.json +22 -0
- package/workflows/electron-bridge-mapper/pnpm-lock.yaml +819 -0
- package/workflows/electron-bridge-mapper/tsconfig.json +15 -0
- package/workflows/electron-bridge-mapper/workflow.ts +125 -0
- package/workflows/evidence-pack/.jshook-install.json +14 -0
- package/workflows/evidence-pack/LICENSE +21 -0
- package/workflows/evidence-pack/README.md +105 -0
- package/workflows/evidence-pack/docs/agent-recipes.md +44 -0
- package/workflows/evidence-pack/meta.yaml +6 -0
- package/workflows/evidence-pack/package.json +22 -0
- package/workflows/evidence-pack/tsconfig.json +15 -0
- package/workflows/evidence-pack/workflow.ts +154 -0
- package/workflows/js-bundle-search/.jshook-install.json +14 -0
- package/workflows/js-bundle-search/LICENSE +21 -0
- package/workflows/js-bundle-search/README.md +46 -0
- package/workflows/js-bundle-search/meta.yaml +4 -0
- package/workflows/js-bundle-search/package.json +23 -0
- package/workflows/js-bundle-search/tsconfig.json +16 -0
- package/workflows/js-bundle-search/workflow.ts +118 -0
- package/workflows/protocol-registry/.jshook-install.json +14 -0
- package/workflows/protocol-registry/meta.yaml +6 -0
- package/workflows/protocol-registry/package.json +22 -0
- package/workflows/protocol-registry/pnpm-lock.yaml +819 -0
- package/workflows/protocol-registry/tsconfig.json +15 -0
- package/workflows/protocol-registry/workflow.ts +107 -0
- package/workflows/qwen-mail-open-latest/meta.yaml +7 -0
- package/workflows/qwen-mail-open-latest/package.json +22 -0
- package/workflows/qwen-mail-open-latest/pnpm-lock.yaml +819 -0
- package/workflows/qwen-mail-open-latest/tsconfig.json +15 -0
- package/workflows/qwen-mail-open-latest/workflow.ts +77 -0
- package/workflows/register-account-flow/.jshook-install.json +14 -0
- package/workflows/register-account-flow/LICENSE +21 -0
- package/workflows/register-account-flow/README.md +64 -0
- package/workflows/register-account-flow/meta.yaml +4 -0
- package/workflows/register-account-flow/package.json +23 -0
- package/workflows/register-account-flow/tsconfig.json +16 -0
- package/workflows/register-account-flow/workflow.ts +127 -0
- package/workflows/replay-lab/.jshook-install.json +14 -0
- package/workflows/replay-lab/meta.yaml +6 -0
- package/workflows/replay-lab/package.json +22 -0
- package/workflows/replay-lab/pnpm-lock.yaml +819 -0
- package/workflows/replay-lab/tsconfig.json +15 -0
- package/workflows/replay-lab/workflow.ts +106 -0
- package/workflows/script-evidence-scan/.jshook-install.json +14 -0
- package/workflows/script-evidence-scan/LICENSE +21 -0
- package/workflows/script-evidence-scan/README.md +61 -0
- package/workflows/script-evidence-scan/meta.yaml +4 -0
- package/workflows/script-evidence-scan/package.json +23 -0
- package/workflows/script-evidence-scan/tsconfig.json +16 -0
- package/workflows/script-evidence-scan/workflow.ts +89 -0
- package/workflows/signature-hunter/.jshook-install.json +14 -0
- package/workflows/signature-hunter/LICENSE +21 -0
- package/workflows/signature-hunter/README.md +105 -0
- package/workflows/signature-hunter/docs/agent-recipes.md +44 -0
- package/workflows/signature-hunter/meta.yaml +6 -0
- package/workflows/signature-hunter/package.json +22 -0
- package/workflows/signature-hunter/tsconfig.json +15 -0
- package/workflows/signature-hunter/workflow.ts +170 -0
- package/workflows/signing-lineage/.jshook-install.json +14 -0
- package/workflows/signing-lineage/meta.yaml +6 -0
- package/workflows/signing-lineage/package.json +22 -0
- package/workflows/signing-lineage/pnpm-lock.yaml +819 -0
- package/workflows/signing-lineage/tsconfig.json +15 -0
- package/workflows/signing-lineage/workflow.ts +120 -0
- package/workflows/temp-mail-extract-link/.jshook-install.json +14 -0
- package/workflows/temp-mail-extract-link/LICENSE +21 -0
- package/workflows/temp-mail-extract-link/README.md +71 -0
- package/workflows/temp-mail-extract-link/meta.yaml +4 -0
- package/workflows/temp-mail-extract-link/package.json +23 -0
- package/workflows/temp-mail-extract-link/tsconfig.json +16 -0
- package/workflows/temp-mail-extract-link/workflow.ts +221 -0
- package/workflows/temp-mail-open-latest/.jshook-install.json +14 -0
- package/workflows/temp-mail-open-latest/LICENSE +21 -0
- package/workflows/temp-mail-open-latest/README.md +61 -0
- package/workflows/temp-mail-open-latest/meta.yaml +4 -0
- package/workflows/temp-mail-open-latest/package.json +23 -0
- package/workflows/temp-mail-open-latest/tsconfig.json +16 -0
- package/workflows/temp-mail-open-latest/workflow.ts +136 -0
- package/workflows/template/.jshook-install.json +14 -0
- package/workflows/template/LICENSE +21 -0
- package/workflows/template/README.md +45 -0
- package/workflows/template/docs/SKILL.md +111 -0
- package/workflows/template/meta.yaml +6 -0
- package/workflows/template/package.json +22 -0
- package/workflows/template/pnpm-lock.yaml +819 -0
- package/workflows/template/tsconfig.json +15 -0
- package/workflows/template/workflow.ts +73 -0
- package/workflows/web-api-capture-session/.jshook-install.json +14 -0
- package/workflows/web-api-capture-session/LICENSE +21 -0
- package/workflows/web-api-capture-session/README.md +64 -0
- package/workflows/web-api-capture-session/meta.yaml +4 -0
- package/workflows/web-api-capture-session/package.json +23 -0
- package/workflows/web-api-capture-session/tsconfig.json +16 -0
- package/workflows/web-api-capture-session/workflow.ts +124 -0
- package/workflows/ws-protocol-lifter/.jshook-install.json +14 -0
- package/workflows/ws-protocol-lifter/LICENSE +21 -0
- package/workflows/ws-protocol-lifter/README.md +105 -0
- package/workflows/ws-protocol-lifter/docs/agent-recipes.md +44 -0
- package/workflows/ws-protocol-lifter/meta.yaml +6 -0
- package/workflows/ws-protocol-lifter/package.json +22 -0
- package/workflows/ws-protocol-lifter/tsconfig.json +15 -0
- package/workflows/ws-protocol-lifter/workflow.ts +163 -0
- package/dist/src/modules/analyzer/AISummarizer.d.ts +0 -39
- package/dist/src/modules/analyzer/AISummarizer.js +0 -122
- package/dist/src/modules/hook/AIHookGenerator.d.ts +0 -52
- package/dist/src/modules/hook/AIHookGenerator.js +0 -360
- package/dist/src/modules/hook/AIHookGeneratorTemplates.d.ts +0 -9
- package/dist/src/modules/hook/AIHookGeneratorTemplates.js +0 -157
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/deobfuscate-ast-flow.js +0 -25
- package/dist/src/server/macros/builtins/unpacker-flow.d.ts +0 -2
- package/dist/src/server/macros/builtins/unpacker-flow.js +0 -25
- package/dist/src/services/LLMService.d.ts +0 -37
- package/dist/src/services/LLMService.js +0 -233
- package/dist/src/services/prompts/analysis.d.ts +0 -9
- package/dist/src/services/prompts/analysis.js +0 -158
- package/dist/src/services/prompts/crypto.d.ts +0 -2
- package/dist/src/services/prompts/crypto.js +0 -108
- package/dist/src/services/prompts/deobfuscation.d.ts +0 -6
- package/dist/src/services/prompts/deobfuscation.js +0 -300
- package/dist/src/services/prompts/environment.d.ts +0 -16
- package/dist/src/services/prompts/environment.js +0 -372
- package/dist/src/services/prompts/intelligence.d.ts +0 -4
- package/dist/src/services/prompts/intelligence.js +0 -250
- package/dist/src/services/prompts/taint.d.ts +0 -2
- package/dist/src/services/prompts/taint.js +0 -54
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type EvidenceNodeType = 'request' | 'initiator-stack' | 'script' | 'function' | 'breakpoint-hook' | 'captured-data' | 'replay-artifact';
|
|
2
|
+
export type EvidenceEdgeType = 'initiates' | 'contains' | 'triggers' | 'captures' | 'replays' | 'loads' | 'references';
|
|
3
|
+
export interface EvidenceNode {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly type: EvidenceNodeType;
|
|
6
|
+
label: string;
|
|
7
|
+
metadata: Record<string, unknown>;
|
|
8
|
+
readonly createdAt: number;
|
|
9
|
+
}
|
|
10
|
+
export interface EvidenceEdge {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly source: string;
|
|
13
|
+
readonly target: string;
|
|
14
|
+
readonly type: EvidenceEdgeType;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface EvidenceGraphSnapshot {
|
|
18
|
+
version: 1;
|
|
19
|
+
nodes: EvidenceNode[];
|
|
20
|
+
edges: EvidenceEdge[];
|
|
21
|
+
exportedAt: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -2,3 +2,4 @@ import type { MCPServerContext } from '../MCPServer.context.js';
|
|
|
2
2
|
import type { ExtensionListResult, ExtensionReloadResult } from '../extensions/types.js';
|
|
3
3
|
export declare function listExtensions(ctx: MCPServerContext): ExtensionListResult;
|
|
4
4
|
export declare function reloadExtensions(ctx: MCPServerContext): Promise<ExtensionReloadResult>;
|
|
5
|
+
export declare function ensureWorkflowsLoaded(ctx: MCPServerContext): Promise<void>;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, relative, resolve } from 'node:path';
|
|
2
4
|
import { glob } from 'tinyglobby';
|
|
5
|
+
import { INSTALLED_EXTENSION_METADATA_FILENAME, } from '../extensions/types.js';
|
|
3
6
|
async function collectMatchingFiles(roots, matcher) {
|
|
4
7
|
const files = new Set();
|
|
5
8
|
for (const root of roots) {
|
|
@@ -21,7 +24,7 @@ async function collectMatchingFiles(roots, matcher) {
|
|
|
21
24
|
}
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
|
-
return [...files].
|
|
27
|
+
return [...files].toSorted((a, b) => a.localeCompare(b));
|
|
25
28
|
}
|
|
26
29
|
function normalizeExtensionCandidateKey(root, file) {
|
|
27
30
|
const normalizedRoot = root
|
|
@@ -29,8 +32,7 @@ function normalizeExtensionCandidateKey(root, file) {
|
|
|
29
32
|
.replace(/\/+/g, '/')
|
|
30
33
|
.replace(/^\/+|\/+$/g, '')
|
|
31
34
|
.toLowerCase();
|
|
32
|
-
const relDir = dirname(file)
|
|
33
|
-
.slice(root.length)
|
|
35
|
+
const relDir = relative(root, dirname(file))
|
|
34
36
|
.replace(/^[/\\]+/, '')
|
|
35
37
|
.replace(/\\/g, '/')
|
|
36
38
|
.replace(/\/+/g, '/')
|
|
@@ -49,9 +51,62 @@ function extensionRank(candidate) {
|
|
|
49
51
|
return 1;
|
|
50
52
|
return 2;
|
|
51
53
|
}
|
|
54
|
+
function isInstalledExtensionMetadata(value, kind) {
|
|
55
|
+
if (!value || typeof value !== 'object')
|
|
56
|
+
return false;
|
|
57
|
+
const record = value;
|
|
58
|
+
if (record.version !== 1 || record.kind !== kind)
|
|
59
|
+
return false;
|
|
60
|
+
if (typeof record.slug !== 'string' || typeof record.id !== 'string')
|
|
61
|
+
return false;
|
|
62
|
+
if (!record.source || typeof record.source !== 'object')
|
|
63
|
+
return false;
|
|
64
|
+
const source = record.source;
|
|
65
|
+
return (typeof source.type === 'string' &&
|
|
66
|
+
typeof source.repo === 'string' &&
|
|
67
|
+
typeof source.ref === 'string' &&
|
|
68
|
+
typeof source.commit === 'string' &&
|
|
69
|
+
typeof source.subpath === 'string' &&
|
|
70
|
+
typeof source.entry === 'string');
|
|
71
|
+
}
|
|
72
|
+
async function collectInstalledEntryCandidates(roots, kind) {
|
|
73
|
+
const candidates = [];
|
|
74
|
+
for (const [rootIndex, root] of roots.entries()) {
|
|
75
|
+
const metadataFiles = await collectMatchingFiles([root], (filename) => filename === INSTALLED_EXTENSION_METADATA_FILENAME);
|
|
76
|
+
for (const metadataFile of metadataFiles) {
|
|
77
|
+
let metadataRaw;
|
|
78
|
+
try {
|
|
79
|
+
metadataRaw = JSON.parse(await readFile(metadataFile, 'utf8'));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (!isInstalledExtensionMetadata(metadataRaw, kind)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const entryPath = metadataRaw.source.entry.trim();
|
|
88
|
+
if (!entryPath) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const file = resolve(dirname(metadataFile), entryPath);
|
|
92
|
+
if (!existsSync(file)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
candidates.push({
|
|
96
|
+
file,
|
|
97
|
+
key: normalizeExtensionCandidateKey(root, file),
|
|
98
|
+
isJs: file.endsWith('.js'),
|
|
99
|
+
isTs: file.endsWith('.ts'),
|
|
100
|
+
rootIndex,
|
|
101
|
+
priority: 0,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return candidates;
|
|
106
|
+
}
|
|
52
107
|
function deduplicateCandidates(candidates) {
|
|
53
108
|
const byKey = new Map();
|
|
54
|
-
for (const candidate of candidates.
|
|
109
|
+
for (const candidate of candidates.toSorted((a, b) => a.file.localeCompare(b.file))) {
|
|
55
110
|
const existing = byKey.get(candidate.key);
|
|
56
111
|
if (!existing) {
|
|
57
112
|
byKey.set(candidate.key, candidate);
|
|
@@ -59,21 +114,27 @@ function deduplicateCandidates(candidates) {
|
|
|
59
114
|
}
|
|
60
115
|
const existingRoot = existing.rootIndex;
|
|
61
116
|
const candidateRoot = candidate.rootIndex;
|
|
117
|
+
const existingPriority = existing.priority;
|
|
118
|
+
const candidatePriority = candidate.priority;
|
|
62
119
|
const existingExtRank = extensionRank(existing);
|
|
63
120
|
const candidateExtRank = extensionRank(candidate);
|
|
64
121
|
const shouldReplace = candidateRoot < existingRoot ||
|
|
65
|
-
(candidateRoot === existingRoot &&
|
|
122
|
+
(candidateRoot === existingRoot && candidatePriority < existingPriority) ||
|
|
123
|
+
(candidateRoot === existingRoot &&
|
|
124
|
+
candidatePriority === existingPriority &&
|
|
125
|
+
candidateExtRank < existingExtRank) ||
|
|
66
126
|
(candidateRoot === existingRoot &&
|
|
127
|
+
candidatePriority === existingPriority &&
|
|
67
128
|
candidateExtRank === existingExtRank &&
|
|
68
129
|
candidate.file.localeCompare(existing.file) < 0);
|
|
69
130
|
if (shouldReplace) {
|
|
70
131
|
byKey.set(candidate.key, candidate);
|
|
71
132
|
}
|
|
72
133
|
}
|
|
73
|
-
return [...byKey.values()].map((item) => item.file).
|
|
134
|
+
return [...byKey.values()].map((item) => item.file).toSorted((a, b) => a.localeCompare(b));
|
|
74
135
|
}
|
|
75
136
|
export async function discoverPluginFiles(pluginRoots) {
|
|
76
|
-
const candidates =
|
|
137
|
+
const candidates = await collectInstalledEntryCandidates(pluginRoots, 'plugin');
|
|
77
138
|
for (const [rootIndex, root] of pluginRoots.entries()) {
|
|
78
139
|
const files = await collectMatchingFiles([root], (filename) => filename === 'manifest.js' || filename === 'manifest.ts');
|
|
79
140
|
for (const file of files) {
|
|
@@ -83,13 +144,14 @@ export async function discoverPluginFiles(pluginRoots) {
|
|
|
83
144
|
isJs: file.endsWith('.js'),
|
|
84
145
|
isTs: file.endsWith('.ts'),
|
|
85
146
|
rootIndex,
|
|
147
|
+
priority: 1,
|
|
86
148
|
});
|
|
87
149
|
}
|
|
88
150
|
}
|
|
89
151
|
return deduplicateCandidates(candidates);
|
|
90
152
|
}
|
|
91
153
|
export async function discoverWorkflowFiles(workflowRoots) {
|
|
92
|
-
const candidates =
|
|
154
|
+
const candidates = await collectInstalledEntryCandidates(workflowRoots, 'workflow');
|
|
93
155
|
for (const [rootIndex, root] of workflowRoots.entries()) {
|
|
94
156
|
const files = await collectMatchingFiles([root], (filename) => filename.endsWith('.workflow.js') ||
|
|
95
157
|
filename.endsWith('.workflow.ts') ||
|
|
@@ -102,6 +164,7 @@ export async function discoverWorkflowFiles(workflowRoots) {
|
|
|
102
164
|
isJs: file.endsWith('.js'),
|
|
103
165
|
isTs: file.endsWith('.ts'),
|
|
104
166
|
rootIndex,
|
|
167
|
+
priority: 1,
|
|
105
168
|
});
|
|
106
169
|
}
|
|
107
170
|
}
|
|
@@ -9,7 +9,7 @@ export function normalizeHex(value) {
|
|
|
9
9
|
return value.trim().toLowerCase().replace(/^0x/, '');
|
|
10
10
|
}
|
|
11
11
|
function isTruthyEnv(value) {
|
|
12
|
-
return ['1', 'true'].includes(
|
|
12
|
+
return ['1', 'true'].includes(value.toLowerCase());
|
|
13
13
|
}
|
|
14
14
|
export function isPluginSignatureRequired() {
|
|
15
15
|
const raw = process.env.MCP_PLUGIN_SIGNATURE_REQUIRED;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join } from 'node:path';
|
|
3
3
|
import { allTools } from '../ToolCatalog.js';
|
|
4
4
|
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import { INSTALLED_EXTENSION_METADATA_FILENAME } from '../extensions/types.js';
|
|
5
6
|
import { DEFAULT_PLUGIN_ROOTS, DEFAULT_WORKFLOW_ROOTS, parseRoots, resolveRoots, } from './ExtensionManager.roots.js';
|
|
6
7
|
import { sha256Hex, normalizeHex, isPluginStrictLoad, parseDigestAllowlist, verifyPluginIntegrity, } from './ExtensionManager.integrity.js';
|
|
7
8
|
import { isExtensionBuilder, isWorkflowContract } from './ExtensionManager.guards.js';
|
|
@@ -34,8 +35,39 @@ function parseSimpleYaml(filePath) {
|
|
|
34
35
|
return {};
|
|
35
36
|
}
|
|
36
37
|
}
|
|
38
|
+
function findInstalledMetadataRoot(startDir) {
|
|
39
|
+
let currentDir = startDir;
|
|
40
|
+
while (true) {
|
|
41
|
+
if (existsSync(join(currentDir, INSTALLED_EXTENSION_METADATA_FILENAME))) {
|
|
42
|
+
return currentDir;
|
|
43
|
+
}
|
|
44
|
+
const parentDir = dirname(currentDir);
|
|
45
|
+
if (parentDir === currentDir) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
currentDir = parentDir;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function resolvePluginProjectRoot(pluginFile) {
|
|
52
|
+
const entryDir = dirname(pluginFile);
|
|
53
|
+
const metadataRoot = findInstalledMetadataRoot(entryDir);
|
|
54
|
+
if (metadataRoot) {
|
|
55
|
+
return metadataRoot;
|
|
56
|
+
}
|
|
57
|
+
if (basename(entryDir).toLowerCase() === 'dist') {
|
|
58
|
+
return dirname(entryDir);
|
|
59
|
+
}
|
|
60
|
+
return entryDir;
|
|
61
|
+
}
|
|
37
62
|
let reloadMutex = Promise.resolve();
|
|
38
|
-
|
|
63
|
+
const lazyWorkflowLoadAttempted = new WeakSet();
|
|
64
|
+
const STRICT_PLUGIN_ALLOWLIST_ERROR = 'MCP_PLUGIN_ALLOWED_DIGESTS is required when MCP_PLUGIN_SIGNATURE_REQUIRED=true ' +
|
|
65
|
+
'or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — ' +
|
|
66
|
+
'without it, plugin code executes before integrity verification. No plugins will be loaded.';
|
|
67
|
+
const MISSING_PLUGIN_ALLOWLIST_WARNING = '[extensions] Loading plugins WITHOUT MCP_PLUGIN_ALLOWED_DIGESTS allowlist. ' +
|
|
68
|
+
'Plugin code will execute on import() before post-load integrity checks. ' +
|
|
69
|
+
'Set MCP_PLUGIN_STRICT_LOAD=true to enforce allowlist requirement.';
|
|
70
|
+
async function withReloadMutex(operation) {
|
|
39
71
|
const prev = reloadMutex;
|
|
40
72
|
let resolve;
|
|
41
73
|
reloadMutex = new Promise((r) => {
|
|
@@ -43,12 +75,39 @@ export async function reloadExtensions(ctx) {
|
|
|
43
75
|
});
|
|
44
76
|
await prev;
|
|
45
77
|
try {
|
|
46
|
-
return await
|
|
78
|
+
return await operation();
|
|
47
79
|
}
|
|
48
80
|
finally {
|
|
49
81
|
resolve();
|
|
50
82
|
}
|
|
51
83
|
}
|
|
84
|
+
export async function reloadExtensions(ctx) {
|
|
85
|
+
return withReloadMutex(() => reloadExtensionsInner(ctx));
|
|
86
|
+
}
|
|
87
|
+
export async function ensureWorkflowsLoaded(ctx) {
|
|
88
|
+
if (ctx.extensionWorkflowRuntimeById.size > 0 || lazyWorkflowLoadAttempted.has(ctx)) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await withReloadMutex(async () => {
|
|
92
|
+
if (ctx.extensionWorkflowRuntimeById.size > 0 || lazyWorkflowLoadAttempted.has(ctx)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
lazyWorkflowLoadAttempted.add(ctx);
|
|
96
|
+
const warnings = [];
|
|
97
|
+
const errors = [];
|
|
98
|
+
const pluginRoots = resolveRoots(parseRoots(process.env.MCP_PLUGIN_ROOTS, DEFAULT_PLUGIN_ROOTS));
|
|
99
|
+
const workflowRoots = resolveRoots(parseRoots(process.env.MCP_WORKFLOW_ROOTS, DEFAULT_WORKFLOW_ROOTS));
|
|
100
|
+
await loadPluginWorkflowContributions(ctx, pluginRoots, warnings, errors);
|
|
101
|
+
const workflowFiles = await discoverWorkflowFiles(workflowRoots);
|
|
102
|
+
await loadWorkflows(ctx, workflowFiles, warnings, errors);
|
|
103
|
+
for (const warning of warnings) {
|
|
104
|
+
logger.warn(`[extensions] ${warning}`);
|
|
105
|
+
}
|
|
106
|
+
for (const error of errors) {
|
|
107
|
+
logger.error(`[extensions] ${error}`);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
52
111
|
async function loadWorkflows(ctx, workflowFiles, warnings, errors) {
|
|
53
112
|
for (const workflowFile of workflowFiles) {
|
|
54
113
|
try {
|
|
@@ -59,29 +118,124 @@ async function loadWorkflows(ctx, workflowFiles, warnings, errors) {
|
|
|
59
118
|
continue;
|
|
60
119
|
}
|
|
61
120
|
const workflow = candidate;
|
|
62
|
-
|
|
63
|
-
|
|
121
|
+
registerWorkflowContract(ctx, workflow, workflowFile, warnings);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
errors.push(`Failed to import workflow file ${workflowFile}: ${String(error)}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function registerWorkflowContract(ctx, workflow, source, warnings) {
|
|
129
|
+
if (ctx.extensionWorkflowsById.has(workflow.id)) {
|
|
130
|
+
warnings.push(`Skip workflow "${workflow.id}" from ${source}: duplicate id`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const record = {
|
|
134
|
+
id: workflow.id,
|
|
135
|
+
displayName: workflow.displayName,
|
|
136
|
+
source,
|
|
137
|
+
description: workflow.description,
|
|
138
|
+
tags: workflow.tags,
|
|
139
|
+
timeoutMs: workflow.timeoutMs,
|
|
140
|
+
defaultMaxConcurrency: workflow.defaultMaxConcurrency,
|
|
141
|
+
route: workflow.route,
|
|
142
|
+
};
|
|
143
|
+
ctx.extensionWorkflowsById.set(record.id, record);
|
|
144
|
+
const runtimeRecord = {
|
|
145
|
+
workflow,
|
|
146
|
+
source,
|
|
147
|
+
route: workflow.route,
|
|
148
|
+
};
|
|
149
|
+
ctx.extensionWorkflowRuntimeById.set(record.id, runtimeRecord);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
function buildPluginRecord(plugin, pluginFile, loadedTools, loadedWorkflows) {
|
|
153
|
+
return {
|
|
154
|
+
id: plugin.id,
|
|
155
|
+
name: plugin.pluginName,
|
|
156
|
+
source: pluginFile,
|
|
157
|
+
author: plugin.pluginAuthor || undefined,
|
|
158
|
+
sourceRepo: plugin.pluginSourceRepo || undefined,
|
|
159
|
+
domains: [],
|
|
160
|
+
workflows: loadedWorkflows,
|
|
161
|
+
tools: loadedTools,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
async function loadPluginWorkflowContributions(ctx, pluginRoots, warnings, errors) {
|
|
165
|
+
const allowedDigests = parseDigestAllowlist(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);
|
|
166
|
+
const strictLoad = isPluginStrictLoad();
|
|
167
|
+
if (strictLoad && allowedDigests.size === 0) {
|
|
168
|
+
errors.push(STRICT_PLUGIN_ALLOWLIST_ERROR);
|
|
169
|
+
logger.error('[extensions] ' + STRICT_PLUGIN_ALLOWLIST_ERROR);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (allowedDigests.size === 0) {
|
|
173
|
+
logger.warn(MISSING_PLUGIN_ALLOWLIST_WARNING);
|
|
174
|
+
}
|
|
175
|
+
const pluginFiles = await discoverPluginFiles(pluginRoots);
|
|
176
|
+
const coreVersion = ctx.config?.mcp?.version ?? '0.0.0';
|
|
177
|
+
for (const pluginFile of pluginFiles) {
|
|
178
|
+
let fileDigest;
|
|
179
|
+
try {
|
|
180
|
+
fileDigest = normalizeHex(await sha256Hex(pluginFile));
|
|
181
|
+
if (allowedDigests.size > 0 && !allowedDigests.has(fileDigest)) {
|
|
182
|
+
warnings.push(`Skip plugin file not in MCP_PLUGIN_ALLOWED_DIGESTS allowlist: ${pluginFile}`);
|
|
64
183
|
continue;
|
|
65
184
|
}
|
|
66
|
-
const record = {
|
|
67
|
-
id: workflow.id,
|
|
68
|
-
displayName: workflow.displayName,
|
|
69
|
-
source: workflowFile,
|
|
70
|
-
description: workflow.description,
|
|
71
|
-
tags: workflow.tags,
|
|
72
|
-
timeoutMs: workflow.timeoutMs,
|
|
73
|
-
defaultMaxConcurrency: workflow.defaultMaxConcurrency,
|
|
74
|
-
};
|
|
75
|
-
ctx.extensionWorkflowsById.set(record.id, record);
|
|
76
|
-
const runtimeRecord = {
|
|
77
|
-
workflow,
|
|
78
|
-
source: workflowFile,
|
|
79
|
-
};
|
|
80
|
-
ctx.extensionWorkflowRuntimeById.set(record.id, runtimeRecord);
|
|
81
185
|
}
|
|
82
186
|
catch (error) {
|
|
83
|
-
errors.push(`Failed to
|
|
187
|
+
errors.push(`Failed to hash plugin file ${pluginFile}: ${String(error)}`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
let plugin;
|
|
191
|
+
try {
|
|
192
|
+
const mod = await import(createFreshImportUrl(pluginFile, 'plugin'));
|
|
193
|
+
const candidate = mod.default ?? mod;
|
|
194
|
+
if (!isExtensionBuilder(candidate)) {
|
|
195
|
+
warnings.push(`Skip plugin file without valid ExtensionBuilder: ${pluginFile}`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
plugin = candidate;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
errors.push(`Failed to import plugin file ${pluginFile}: ${String(error)}`);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const pluginProjectRoot = resolvePluginProjectRoot(pluginFile);
|
|
205
|
+
const metaYamlPath = join(pluginProjectRoot, 'meta.yaml');
|
|
206
|
+
const meta = parseSimpleYaml(metaYamlPath);
|
|
207
|
+
plugin.mergeMetadata(meta);
|
|
208
|
+
if (ctx.extensionPluginsById.has(plugin.id)) {
|
|
209
|
+
warnings.push(`Skip plugin "${plugin.id}" from ${pluginFile}: duplicate plugin id`);
|
|
210
|
+
continue;
|
|
84
211
|
}
|
|
212
|
+
try {
|
|
213
|
+
const verification = await verifyPluginIntegrity(plugin, coreVersion);
|
|
214
|
+
warnings.push(...verification.warnings);
|
|
215
|
+
if (!verification.ok) {
|
|
216
|
+
errors.push(...verification.errors);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
errors.push(`Failed to verify plugin ${plugin.id}: ${String(error)}`);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const loadedWorkflows = [];
|
|
225
|
+
for (const candidate of plugin.workflows) {
|
|
226
|
+
if (!isWorkflowContract(candidate)) {
|
|
227
|
+
warnings.push(`Skip invalid workflow contribution from plugin "${plugin.id}" in ${pluginFile}`);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const workflowSource = `${pluginFile}#workflow:${candidate.id}`;
|
|
231
|
+
if (registerWorkflowContract(ctx, candidate, workflowSource, warnings)) {
|
|
232
|
+
loadedWorkflows.push(candidate.id);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (loadedWorkflows.length === 0) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
ctx.extensionPluginsById.set(plugin.id, buildPluginRecord(plugin, pluginFile, [], loadedWorkflows));
|
|
85
239
|
}
|
|
86
240
|
}
|
|
87
241
|
async function reloadExtensionsInner(ctx) {
|
|
@@ -93,9 +247,7 @@ async function reloadExtensionsInner(ctx) {
|
|
|
93
247
|
const allowedDigests = parseDigestAllowlist(process.env.MCP_PLUGIN_ALLOWED_DIGESTS);
|
|
94
248
|
const strictLoad = isPluginStrictLoad();
|
|
95
249
|
if (strictLoad && allowedDigests.size === 0) {
|
|
96
|
-
const msg =
|
|
97
|
-
'or MCP_PLUGIN_STRICT_LOAD=true. The digest allowlist is the only pre-import trust boundary — ' +
|
|
98
|
-
'without it, plugin code executes before integrity verification. No plugins will be loaded.';
|
|
250
|
+
const msg = STRICT_PLUGIN_ALLOWLIST_ERROR;
|
|
99
251
|
errors.push(msg);
|
|
100
252
|
logger.error('[extensions] ' + msg);
|
|
101
253
|
const workflowFiles = await discoverWorkflowFiles(workflowRoots);
|
|
@@ -105,9 +257,7 @@ async function reloadExtensionsInner(ctx) {
|
|
|
105
257
|
return { ...list, addedTools: 0, removedTools, warnings, errors };
|
|
106
258
|
}
|
|
107
259
|
if (allowedDigests.size === 0) {
|
|
108
|
-
logger.warn(
|
|
109
|
-
'Plugin code will execute on import() before post-load integrity checks. ' +
|
|
110
|
-
'Set MCP_PLUGIN_STRICT_LOAD=true to enforce allowlist requirement.');
|
|
260
|
+
logger.warn(MISSING_PLUGIN_ALLOWLIST_WARNING);
|
|
111
261
|
}
|
|
112
262
|
const baseToolNames = new Set(allTools.map((tool) => tool.name));
|
|
113
263
|
const pluginFiles = await discoverPluginFiles(pluginRoots);
|
|
@@ -139,7 +289,8 @@ async function reloadExtensionsInner(ctx) {
|
|
|
139
289
|
errors.push(`Failed to import plugin file ${pluginFile}: ${String(error)}`);
|
|
140
290
|
continue;
|
|
141
291
|
}
|
|
142
|
-
const
|
|
292
|
+
const pluginProjectRoot = resolvePluginProjectRoot(pluginFile);
|
|
293
|
+
const metaYamlPath = join(pluginProjectRoot, 'meta.yaml');
|
|
143
294
|
const meta = parseSimpleYaml(metaYamlPath);
|
|
144
295
|
plugin.mergeMetadata(meta);
|
|
145
296
|
if (ctx.extensionPluginsById.has(plugin.id)) {
|
|
@@ -164,7 +315,7 @@ async function reloadExtensionsInner(ctx) {
|
|
|
164
315
|
const allowInvokeAll = plugin.allowedTools.includes('*');
|
|
165
316
|
const lifecycleContext = {
|
|
166
317
|
pluginId: plugin.id,
|
|
167
|
-
pluginRoot:
|
|
318
|
+
pluginRoot: pluginProjectRoot,
|
|
168
319
|
config: ctx.config,
|
|
169
320
|
get state() {
|
|
170
321
|
return pluginState;
|
|
@@ -244,16 +395,18 @@ async function reloadExtensionsInner(ctx) {
|
|
|
244
395
|
continue;
|
|
245
396
|
}
|
|
246
397
|
const loadedTools = plugin.tools.map((t) => t.name);
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
398
|
+
const loadedWorkflows = [];
|
|
399
|
+
for (const candidate of plugin.workflows) {
|
|
400
|
+
if (!isWorkflowContract(candidate)) {
|
|
401
|
+
warnings.push(`Skip invalid workflow contribution from plugin "${plugin.id}" in ${pluginFile}`);
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const workflowSource = `${pluginFile}#workflow:${candidate.id}`;
|
|
405
|
+
if (registerWorkflowContract(ctx, candidate, workflowSource, warnings)) {
|
|
406
|
+
loadedWorkflows.push(candidate.id);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const record = buildPluginRecord(plugin, pluginFile, loadedTools, loadedWorkflows);
|
|
257
410
|
ctx.extensionPluginsById.set(record.id, record);
|
|
258
411
|
}
|
|
259
412
|
const workflowFiles = await discoverWorkflowFiles(workflowRoots);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const DEFAULT_PLUGIN_ROOTS: string[];
|
|
2
2
|
export declare const DEFAULT_WORKFLOW_ROOTS: string[];
|
|
3
3
|
export declare function parseRoots(raw: string | undefined, fallback: string[]): string[];
|
|
4
|
-
export declare function resolveRoots(roots: string[]): string[];
|
|
4
|
+
export declare function resolveRoots(roots: string[], baseDir?: string): string[];
|
|
@@ -13,7 +13,7 @@ function findProjectRoot(startDir) {
|
|
|
13
13
|
}
|
|
14
14
|
return resolve(startDir, '..', '..', '..', '..');
|
|
15
15
|
}
|
|
16
|
-
const EXTENSION_MANAGER_DIR =
|
|
16
|
+
const EXTENSION_MANAGER_DIR = fileURLToPath(new URL('.', import.meta.url));
|
|
17
17
|
const EXTENSION_INSTALL_ROOT = findProjectRoot(EXTENSION_MANAGER_DIR);
|
|
18
18
|
export const DEFAULT_PLUGIN_ROOTS = [join(EXTENSION_INSTALL_ROOT, 'plugins')];
|
|
19
19
|
export const DEFAULT_WORKFLOW_ROOTS = [join(EXTENSION_INSTALL_ROOT, 'workflows')];
|
|
@@ -27,7 +27,7 @@ export function parseRoots(raw, fallback) {
|
|
|
27
27
|
.filter(Boolean);
|
|
28
28
|
return roots.length > 0 ? [...new Set(roots)] : fallback;
|
|
29
29
|
}
|
|
30
|
-
export function resolveRoots(roots) {
|
|
31
|
-
const resolved = roots.map((root) => (isAbsolute(root) ? root : resolve(
|
|
32
|
-
return [...new Set(resolved)].
|
|
30
|
+
export function resolveRoots(roots, baseDir = EXTENSION_INSTALL_ROOT) {
|
|
31
|
+
const resolved = roots.map((root) => (isAbsolute(root) ? root : resolve(baseDir, root)));
|
|
32
|
+
return [...new Set(resolved)].toSorted((a, b) => a.localeCompare(b));
|
|
33
33
|
}
|
|
@@ -11,7 +11,7 @@ function envCandidates(pluginId, key) {
|
|
|
11
11
|
return [`PLUGIN_${pluginSegment}_${keySegment}`, `PLUGINS_${pluginSegment}_${keySegment}`];
|
|
12
12
|
}
|
|
13
13
|
function parseBoolean(raw) {
|
|
14
|
-
if (raw
|
|
14
|
+
if (raw === undefined)
|
|
15
15
|
return undefined;
|
|
16
16
|
const value = raw.trim().toLowerCase();
|
|
17
17
|
if (['1', 'true', 'yes', 'on'].includes(value))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function loadPluginEnv(
|
|
1
|
+
export declare function loadPluginEnv(manifestLocation: string): void;
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
4
|
import dotenv from 'dotenv';
|
|
5
5
|
const loadedEnvPaths = new Set();
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
function toManifestUrl(manifestLocation) {
|
|
7
|
+
return manifestLocation.startsWith('file:')
|
|
8
|
+
? new URL(manifestLocation)
|
|
9
|
+
: pathToFileURL(manifestLocation);
|
|
10
|
+
}
|
|
11
|
+
export function loadPluginEnv(manifestLocation) {
|
|
12
|
+
const pluginDirUrl = new URL('.', toManifestUrl(manifestLocation));
|
|
13
|
+
const pluginDir = fileURLToPath(pluginDirUrl);
|
|
8
14
|
const envPath = join(pluginDir, '.env');
|
|
9
15
|
if (loadedEnvPaths.has(envPath))
|
|
10
16
|
return;
|
|
@@ -2,6 +2,21 @@ import type { RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import type { ExtensionBuilder, PluginLifecycleContext, PluginState } from '../plugins/PluginContract.js';
|
|
4
4
|
import type { WorkflowContract } from '../workflows/WorkflowContract.js';
|
|
5
|
+
export declare const INSTALLED_EXTENSION_METADATA_FILENAME = ".jshook-install.json";
|
|
6
|
+
export interface InstalledExtensionMetadata {
|
|
7
|
+
version: 1;
|
|
8
|
+
kind: 'plugin' | 'workflow';
|
|
9
|
+
slug: string;
|
|
10
|
+
id: string;
|
|
11
|
+
source: {
|
|
12
|
+
type: string;
|
|
13
|
+
repo: string;
|
|
14
|
+
ref: string;
|
|
15
|
+
commit: string;
|
|
16
|
+
subpath: string;
|
|
17
|
+
entry: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
5
20
|
export interface ExtensionToolRecord {
|
|
6
21
|
name: string;
|
|
7
22
|
domain: string;
|
|
@@ -30,6 +45,7 @@ export interface ExtensionPluginRuntimeRecord {
|
|
|
30
45
|
export interface ExtensionWorkflowRuntimeRecord {
|
|
31
46
|
workflow: WorkflowContract;
|
|
32
47
|
source: string;
|
|
48
|
+
route?: WorkflowContract['route'];
|
|
33
49
|
}
|
|
34
50
|
export interface ExtensionWorkflowRecord {
|
|
35
51
|
id: string;
|
|
@@ -39,6 +55,7 @@ export interface ExtensionWorkflowRecord {
|
|
|
39
55
|
tags?: string[];
|
|
40
56
|
timeoutMs?: number;
|
|
41
57
|
defaultMaxConcurrency?: number;
|
|
58
|
+
route?: WorkflowContract['route'];
|
|
42
59
|
}
|
|
43
60
|
export interface ExtensionListResult {
|
|
44
61
|
pluginRoots: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export const INSTALLED_EXTENSION_METADATA_FILENAME = '.jshook-install.json';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ServerResponse, IncomingMessage } from 'node:http';
|
|
2
|
+
import type { EventBus, ServerEventMap } from '../EventBus.js';
|
|
3
|
+
export interface SseStreamOptions {
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
heartbeatMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class SseStream {
|
|
8
|
+
private readonly eventBus;
|
|
9
|
+
private readonly options;
|
|
10
|
+
private res;
|
|
11
|
+
private heartbeatTimer;
|
|
12
|
+
private unsubscribe;
|
|
13
|
+
private closed;
|
|
14
|
+
constructor(eventBus: EventBus<ServerEventMap>, options?: SseStreamOptions);
|
|
15
|
+
start(res: ServerResponse): void;
|
|
16
|
+
sendEvent(event: string, data: unknown): void;
|
|
17
|
+
sendRaw(message: string): void;
|
|
18
|
+
close(): void;
|
|
19
|
+
private startHeartbeat;
|
|
20
|
+
}
|
|
21
|
+
export declare function createProgressHandler(eventBus: EventBus<ServerEventMap>): (req: IncomingMessage, res: ServerResponse, sessionId?: string) => void;
|