rea-agents 6.3.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +51 -19
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +22 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +70 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +66 -31
- package/dist/application/DirectAnalysis.js +2 -2
- package/dist/application/DirectAnalysisCleanup.js +1 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +5 -3
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +6 -0
- package/dist/application/JsonFiles.js +6 -5
- package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
- package/dist/application/LinuxHopper.js +4 -12
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +9 -3
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +93 -7
- package/dist/application/Setup.js +54 -6
- package/dist/application/SetupClientConfiguration.js +116 -16
- package/dist/application/SetupHost.js +102 -24
- package/dist/application/SetupPlan.js +5 -8
- package/dist/application/SetupSkill.js +58 -39
- package/dist/application/SupportedClients.js +290 -65
- package/dist/application/Uninstall.js +158 -10
- package/dist/application/UpdateMaintenance.js +17 -21
- package/dist/application/Utf8JsonInput.js +7 -0
- package/dist/application/WebScriptExportService.js +131 -65
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/BinarySession.js +2 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +20 -15
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +176 -102
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
- package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +75 -32
- package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +62 -25
- package/dist/artifacts/inventory/scanReader.js +38 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +5 -0
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +32 -10
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
- package/dist/browser/PlaywrightScenarioSession.js +127 -54
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +3 -3
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreBinaryCommands.js +0 -5
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +6 -1
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +17 -1
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +11 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/utilityCommands.js +66 -18
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +6 -0
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +2 -2
- package/dist/cliObservationOptions.js +3 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/directAnalysis.js +12 -4
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +10 -10
- package/dist/contracts/javascript/electronToolContracts.js +15 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionToolContracts.js +2 -2
- package/dist/contracts/sessionToolSchemas.js +6 -2
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +5 -3
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -6
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +2 -1
- package/dist/domain/analysisView/analysisView.js +52 -2
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +2 -2
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +35 -7
- package/dist/domain/artifactGraph.js +5 -3
- package/dist/domain/artifactIdentity.js +30 -2
- package/dist/domain/artifactInspection.js +3 -43
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +11 -12
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/evidence.js +2 -1
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
- package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
- package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
- package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
- package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
- package/dist/domain/javascript/javascriptAstValues.js +32 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
- package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
- package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonShape.js +63 -52
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/managed/managedApplicationGraph.js +37 -0
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +91 -1
- package/dist/domain/process/processCaptureExample.js +24 -0
- package/dist/domain/process/processCaptureValidation.js +79 -0
- package/dist/domain/process/processScenario.js +59 -7
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/referenceSourceGraph.js +25 -16
- package/dist/domain/referenceSourceImportParsing.js +6 -3
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/webBundleAnalyzerInspection.js +14 -2
- package/dist/domain/webCaptureDiff.js +102 -4
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +55 -24
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +33 -1
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +76 -4
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +1 -1
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +80 -39
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +8 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +3 -1
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/NativeMacOSProvider.js +91 -16
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +96 -39
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +28 -4
- package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessHarness.js +194 -26
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +97 -25
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +32 -3
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +49 -18
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +33 -5
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isBuiltin } from "node:module";
|
|
2
2
|
import { posix } from "node:path";
|
|
3
|
+
import { normalizeJoinedLogicalPath, logicalPathEscapesRoot, } from "../../domain/artifactIdentity.js";
|
|
3
4
|
import { admitsCanonicalPathSyntax, hasScheme, htmlUrlText, looksExternal, percentDecodeUrlPath, stripQueryAndFragment, } from "../../domain/artifactPathSyntax.js";
|
|
4
5
|
const EXTENSIONS = [
|
|
5
6
|
".js",
|
|
@@ -11,59 +12,59 @@ const EXTENSIONS = [
|
|
|
11
12
|
".html",
|
|
12
13
|
".node",
|
|
13
14
|
];
|
|
14
|
-
/** Resolve one declaration
|
|
15
|
-
export const resolveArtifactPathByContext = (input) =>
|
|
16
|
-
const
|
|
17
|
-
|
|
15
|
+
/** Resolve one declaration while preserving its original input identity. */
|
|
16
|
+
export const resolveArtifactPathByContext = (input) => {
|
|
17
|
+
const resolution = resolvePath(input);
|
|
18
|
+
return resolution.status === "resolved"
|
|
19
|
+
? {
|
|
20
|
+
declared_path: input.declaredPath,
|
|
21
|
+
resolution_context: input.context,
|
|
22
|
+
resolved_path: resolution.resolvedPath,
|
|
23
|
+
resolution_status: resolution.status,
|
|
24
|
+
limitations: resolution.limitations,
|
|
25
|
+
}
|
|
26
|
+
: {
|
|
27
|
+
declared_path: input.declaredPath,
|
|
28
|
+
resolution_context: input.context,
|
|
29
|
+
resolved_path: null,
|
|
30
|
+
resolution_status: resolution.status,
|
|
31
|
+
limitations: resolution.limitations,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const resolvePath = (input) => {
|
|
35
|
+
const rejected = rejectDeclaration(input.declaredPath);
|
|
18
36
|
if (rejected !== null)
|
|
19
37
|
return rejected;
|
|
20
|
-
const candidate = contextualCandidate(input
|
|
38
|
+
const candidate = contextualCandidate(input);
|
|
21
39
|
if (typeof candidate !== "string")
|
|
22
40
|
return candidate;
|
|
23
|
-
const confined = confineCandidate(
|
|
41
|
+
const confined = confineCandidate(candidate);
|
|
24
42
|
if (typeof confined !== "string")
|
|
25
43
|
return confined;
|
|
26
44
|
if (input.context === "html-reference")
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
status: "not-found",
|
|
30
|
-
limitations: [
|
|
45
|
+
return (resolveFileCandidates(input, [confined]) ??
|
|
46
|
+
unresolvedCandidate("not-found", [
|
|
31
47
|
`The exact HTML resource ${confined} was not found among the selected application files.`,
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
// An exports target names one exact file; Node tries no extension or index.
|
|
35
|
-
const resolved = exportsTargetUrl
|
|
36
|
-
? (resolveFileCandidates(input, [confined]) ??
|
|
37
|
-
exactExportsTargetNotFound(confined))
|
|
38
|
-
: mode === "files-and-index"
|
|
39
|
-
? (resolveFileCandidates(input, [
|
|
40
|
-
...fileCandidates(confined),
|
|
41
|
-
...indexCandidates(confined),
|
|
42
|
-
]) ?? notFoundCandidate())
|
|
43
|
-
: resolveCandidate(input, confined, packageChain);
|
|
44
|
-
return outcome(input, resolved);
|
|
48
|
+
]));
|
|
49
|
+
return resolveCandidate(input, confined, new Set());
|
|
45
50
|
};
|
|
46
|
-
const rejectDeclaration = (
|
|
47
|
-
const declared = input.declaredPath;
|
|
51
|
+
const rejectDeclaration = (declared) => {
|
|
48
52
|
if (declared.length === 0)
|
|
49
|
-
return
|
|
50
|
-
"The declared path is empty.",
|
|
51
|
-
]);
|
|
53
|
+
return unresolvedCandidate("rejected", ["The declared path is empty."]);
|
|
52
54
|
if (declared.includes("\0") || declared.includes("\\"))
|
|
53
|
-
return
|
|
55
|
+
return unresolvedCandidate("rejected", [
|
|
54
56
|
"NUL and backslash path syntax are not admitted for canonical artifact paths.",
|
|
55
57
|
]);
|
|
56
58
|
if (!admitsCanonicalPathSyntax(declared))
|
|
57
|
-
return
|
|
59
|
+
return unresolvedCandidate("rejected", [
|
|
58
60
|
"Encoded dot or separator bytes are rejected before artifact path resolution.",
|
|
59
61
|
]);
|
|
60
62
|
return null;
|
|
61
63
|
};
|
|
62
|
-
const contextualCandidate = (input
|
|
64
|
+
const contextualCandidate = (input) => {
|
|
63
65
|
const { context } = input;
|
|
64
66
|
let declared = context === "html-reference" ||
|
|
65
67
|
context === "url-reference" ||
|
|
66
|
-
exportsTargetUrl ||
|
|
67
68
|
(context === "module-specifier" && input.moduleKind !== "require")
|
|
68
69
|
? stripQueryAndFragment(input.declaredPath)
|
|
69
70
|
: input.declaredPath;
|
|
@@ -74,62 +75,117 @@ const contextualCandidate = (input, exportsTargetUrl) => {
|
|
|
74
75
|
if (fileUrl !== undefined)
|
|
75
76
|
return fileUrl;
|
|
76
77
|
if (hasScheme(declared))
|
|
77
|
-
return
|
|
78
|
+
return unresolvedCandidate("external", [
|
|
78
79
|
"URL and Node builtin schemes are outside static artifact module resolution.",
|
|
79
80
|
]);
|
|
80
81
|
if (!declared.startsWith(".") && !declared.startsWith("/"))
|
|
81
82
|
return bareModuleCandidate(input, declared);
|
|
83
|
+
if (input.moduleKind !== "require") {
|
|
84
|
+
const decoded = decodeModuleUrlPath(declared);
|
|
85
|
+
if (typeof decoded !== "string")
|
|
86
|
+
return decoded;
|
|
87
|
+
declared = decoded;
|
|
88
|
+
}
|
|
82
89
|
}
|
|
83
90
|
else if (looksExternal(declared))
|
|
84
|
-
return
|
|
91
|
+
return unresolvedCandidate("external", [
|
|
85
92
|
"URL schemes and protocol-relative URLs are outside this local artifact path context.",
|
|
86
93
|
]);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
catch (cause) {
|
|
94
|
-
void cause;
|
|
95
|
-
return unresolvedOutcome(input, "rejected", [
|
|
96
|
-
"The module URL path contains malformed percent encoding.",
|
|
97
|
-
]);
|
|
98
|
-
}
|
|
99
|
-
if (declared.includes("\0"))
|
|
100
|
-
return unresolvedOutcome(input, "rejected", [
|
|
101
|
-
"The decoded module URL path contains NUL.",
|
|
102
|
-
]);
|
|
94
|
+
return relativeCandidate(input.sourcePath, declared);
|
|
95
|
+
};
|
|
96
|
+
const decodeModuleUrlPath = (declared) => {
|
|
97
|
+
let decoded;
|
|
98
|
+
try {
|
|
99
|
+
decoded = decodeURIComponent(declared);
|
|
103
100
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
catch (cause) {
|
|
102
|
+
void cause;
|
|
103
|
+
return unresolvedCandidate("rejected", [
|
|
104
|
+
"The module URL path contains malformed percent encoding.",
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
return decoded.includes("\0")
|
|
108
|
+
? unresolvedCandidate("rejected", [
|
|
109
|
+
"The decoded module URL path contains NUL.",
|
|
110
|
+
])
|
|
111
|
+
: decoded;
|
|
108
112
|
};
|
|
113
|
+
const relativeCandidate = (sourcePath, declared) => declared.startsWith("/")
|
|
114
|
+
? declared.slice(1)
|
|
115
|
+
: posix.join(posix.dirname(sourcePath), declared);
|
|
109
116
|
const bareModuleCandidate = (input, declared) => {
|
|
110
117
|
const packageName = barePackageName(declared);
|
|
111
118
|
if (packageName === null || isBuiltin(declared) || declared.startsWith("#"))
|
|
112
|
-
return
|
|
119
|
+
return unresolvedCandidate("external", [
|
|
113
120
|
"The bare specifier is a Node builtin, package import map, or invalid package name.",
|
|
114
121
|
]);
|
|
115
|
-
|
|
116
|
-
return unresolvedOutcome(input, "external", [
|
|
117
|
-
"Bare package subpaths remain unresolved unless an exact package-exports subpath model is available.",
|
|
118
|
-
]);
|
|
122
|
+
const subpath = declared === packageName ? "." : `.${declared.slice(packageName.length)}`;
|
|
119
123
|
const source = input.files.get(input.sourcePath);
|
|
120
124
|
let directory = posix.dirname(input.sourcePath);
|
|
121
125
|
while (true) {
|
|
122
|
-
const candidate = posix.join(directory, "node_modules",
|
|
123
|
-
if (
|
|
124
|
-
|
|
126
|
+
const candidate = posix.join(directory, "node_modules", packageName);
|
|
127
|
+
if (subpath === ".") {
|
|
128
|
+
const direct = resolveFileCandidates(input, fileCandidates(candidate));
|
|
129
|
+
if (direct !== null)
|
|
130
|
+
return direct;
|
|
131
|
+
}
|
|
132
|
+
if (hasContainerDirectory(input.files, candidate, source?.container_sha256))
|
|
133
|
+
return resolvePackageSpecifier(input, candidate, subpath);
|
|
125
134
|
if (directory === "." || directory === "")
|
|
126
135
|
break;
|
|
127
136
|
directory = posix.dirname(directory);
|
|
128
137
|
}
|
|
129
|
-
return
|
|
138
|
+
return unresolvedCandidate("external", [
|
|
130
139
|
"No matching bare package was inventoried in an enclosing node_modules directory.",
|
|
131
140
|
]);
|
|
132
141
|
};
|
|
142
|
+
/** Package roots and exact subpaths share metadata and exports selection. */
|
|
143
|
+
const resolvePackageSpecifier = (input, directory, subpath) => {
|
|
144
|
+
const metadata = readPackageMetadata(input, directory);
|
|
145
|
+
if (metadata.kind === "unavailable")
|
|
146
|
+
return unresolvedCandidate("unavailable", [metadata.limitation]);
|
|
147
|
+
const rawExports = metadata.kind === "available"
|
|
148
|
+
? Reflect.get(metadata.value, "exports")
|
|
149
|
+
: undefined;
|
|
150
|
+
if (rawExports === undefined || rawExports === null) {
|
|
151
|
+
if (subpath === ".")
|
|
152
|
+
return resolveDirectory(input, directory, metadata, new Set());
|
|
153
|
+
// Preserve the trailing slash for a package directory request.
|
|
154
|
+
const candidate = confineCandidate(`${directory}/${subpath.slice(2)}`);
|
|
155
|
+
return typeof candidate === "string"
|
|
156
|
+
? resolveCandidate(input, candidate, new Set())
|
|
157
|
+
: candidate;
|
|
158
|
+
}
|
|
159
|
+
const exported = selectPackageExport(rawExports, subpath, input.moduleKind);
|
|
160
|
+
const packagePath = posix.join(directory, "package.json");
|
|
161
|
+
if (exported.status === "rejected")
|
|
162
|
+
return unresolvedCandidate("rejected", [
|
|
163
|
+
`Package metadata ${packagePath}: ${exported.limitation}`,
|
|
164
|
+
]);
|
|
165
|
+
if (exported.status === "unmatched")
|
|
166
|
+
return unresolvedCandidate("external", [
|
|
167
|
+
`Directory package metadata ${packagePath} declares no exports target ${subpath === "." ? "for the active conditions" : `for subpath ${subpath}`}; exports encapsulation permits no file or index lookup. It declares ${exported.declared.join(", ") || "a root target only"}.`,
|
|
168
|
+
]);
|
|
169
|
+
if (exported.status === "blocked")
|
|
170
|
+
return unresolvedCandidate("external", [
|
|
171
|
+
`Directory package metadata ${packagePath} blocks subpath ${subpath} with an explicit null exports target.`,
|
|
172
|
+
]);
|
|
173
|
+
return resolveExportTarget(input, packagePath, exported.value);
|
|
174
|
+
};
|
|
175
|
+
/** An exports target is a URL naming one exact file for both Node loaders. */
|
|
176
|
+
const resolveExportTarget = (input, packagePath, target) => {
|
|
177
|
+
const rejected = rejectDeclaration(target);
|
|
178
|
+
if (rejected !== null)
|
|
179
|
+
return rejected;
|
|
180
|
+
const decoded = decodeModuleUrlPath(stripQueryAndFragment(target));
|
|
181
|
+
if (typeof decoded !== "string")
|
|
182
|
+
return decoded;
|
|
183
|
+
const candidate = confineCandidate(relativeCandidate(packagePath, decoded));
|
|
184
|
+
if (typeof candidate !== "string")
|
|
185
|
+
return candidate;
|
|
186
|
+
return (resolveFileCandidates(input, [candidate]) ??
|
|
187
|
+
exactExportsTargetNotFound(candidate));
|
|
188
|
+
};
|
|
133
189
|
const barePackageName = (specifier) => {
|
|
134
190
|
const segments = specifier.split("/");
|
|
135
191
|
if (specifier.startsWith("@"))
|
|
@@ -138,20 +194,28 @@ const barePackageName = (specifier) => {
|
|
|
138
194
|
: null;
|
|
139
195
|
return segments[0] === "" ? null : (segments[0] ?? null);
|
|
140
196
|
};
|
|
141
|
-
const
|
|
142
|
-
...
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
197
|
+
const hasContainerDirectory = (files, candidate, containerSha256) => {
|
|
198
|
+
if ([...indexCandidates(candidate), posix.join(candidate, "package.json")].some((path) => {
|
|
199
|
+
const file = files.get(path);
|
|
200
|
+
return (file !== undefined &&
|
|
201
|
+
(containerSha256 === undefined ||
|
|
202
|
+
file.container_sha256 === containerSha256));
|
|
203
|
+
}))
|
|
204
|
+
return true;
|
|
205
|
+
// Inventory has files rather than directory entries. Any same-container
|
|
206
|
+
// descendant establishes a package directory even without package.json.
|
|
207
|
+
const prefix = `${candidate}/`;
|
|
208
|
+
for (const [path, file] of files)
|
|
209
|
+
if (path.startsWith(prefix) &&
|
|
210
|
+
(containerSha256 === undefined ||
|
|
211
|
+
file.container_sha256 === containerSha256))
|
|
212
|
+
return true;
|
|
213
|
+
return false;
|
|
214
|
+
};
|
|
151
215
|
const htmlCandidate = (input) => {
|
|
152
216
|
const declared = stripQueryAndFragment(htmlUrlText(input.declaredPath));
|
|
153
217
|
if (looksExternal(declared))
|
|
154
|
-
return
|
|
218
|
+
return unresolvedCandidate("external", [
|
|
155
219
|
"External HTML references are not mapped to local artifact assets.",
|
|
156
220
|
]);
|
|
157
221
|
const rawBase = input.htmlBaseHref;
|
|
@@ -159,18 +223,18 @@ const htmlCandidate = (input) => {
|
|
|
159
223
|
? rawBase
|
|
160
224
|
: stripQueryAndFragment(htmlUrlText(rawBase));
|
|
161
225
|
if (base !== undefined && base !== null && looksExternal(base))
|
|
162
|
-
return
|
|
226
|
+
return unresolvedCandidate("external", [
|
|
163
227
|
"The document base href is external, so its script reference is not a local artifact path.",
|
|
164
228
|
]);
|
|
165
229
|
// Removing URL tabs and newlines can join an encoded dot or separator that
|
|
166
230
|
// the raw declaration split, so admit the parsed URL text again.
|
|
167
231
|
if (!admitsCanonicalPathSyntax(declared))
|
|
168
|
-
return
|
|
232
|
+
return unresolvedCandidate("rejected", [
|
|
169
233
|
"Encoded dot or separator bytes are rejected before artifact path resolution.",
|
|
170
234
|
]);
|
|
171
235
|
const declaredPath = percentDecodeUrlPath(declared);
|
|
172
236
|
if (declaredPath === null)
|
|
173
|
-
return
|
|
237
|
+
return unresolvedCandidate("rejected", [
|
|
174
238
|
"The HTML reference path percent-decodes to NUL or to bytes that are not UTF-8.",
|
|
175
239
|
]);
|
|
176
240
|
if (declaredPath.startsWith("/"))
|
|
@@ -183,28 +247,28 @@ const htmlCandidate = (input) => {
|
|
|
183
247
|
// admission rules a declared path gets so it cannot smuggle traversal or
|
|
184
248
|
// separator syntax past canonicalization.
|
|
185
249
|
if (!admitsCanonicalPathSyntax(base))
|
|
186
|
-
return
|
|
250
|
+
return unresolvedCandidate("rejected", [
|
|
187
251
|
"The document base href uses NUL, backslash, or encoded dot and separator bytes that are not admitted for canonical artifact paths.",
|
|
188
252
|
]);
|
|
189
253
|
const decodedBase = percentDecodeUrlPath(base);
|
|
190
254
|
if (decodedBase === null)
|
|
191
|
-
return
|
|
255
|
+
return unresolvedCandidate("rejected", [
|
|
192
256
|
"The document base href path percent-decodes to NUL or to bytes that are not UTF-8.",
|
|
193
257
|
]);
|
|
194
258
|
const basePath = decodedBase.startsWith("/")
|
|
195
259
|
? decodedBase.slice(1)
|
|
196
260
|
: posix.join(posix.dirname(input.sourcePath), decodedBase);
|
|
197
261
|
if (declaredPath === "")
|
|
198
|
-
return emptyHtmlReference(
|
|
262
|
+
return emptyHtmlReference(decodedBase, basePath);
|
|
199
263
|
return posix.join(htmlBaseDirectory(decodedBase, basePath), declaredPath);
|
|
200
264
|
};
|
|
201
|
-
const emptyHtmlReference = (
|
|
265
|
+
const emptyHtmlReference = (base, basePath) => {
|
|
202
266
|
if (!htmlBaseIsDirectory(base))
|
|
203
267
|
return basePath;
|
|
204
|
-
const confined = confineCandidate(
|
|
268
|
+
const confined = confineCandidate(basePath);
|
|
205
269
|
if (typeof confined !== "string")
|
|
206
270
|
return confined;
|
|
207
|
-
return
|
|
271
|
+
return unresolvedCandidate("not-found", [
|
|
208
272
|
`The HTML reference resolves to directory ${confined || "."}, not an exact selected application file.`,
|
|
209
273
|
]);
|
|
210
274
|
};
|
|
@@ -220,103 +284,95 @@ const htmlBaseIsDirectory = (base) => base.endsWith("/") ||
|
|
|
220
284
|
base === "." ||
|
|
221
285
|
base === "..";
|
|
222
286
|
const htmlBaseDirectory = (base, basePath) => htmlBaseIsDirectory(base) ? basePath : posix.dirname(basePath);
|
|
223
|
-
const confineCandidate = (
|
|
224
|
-
const normalized =
|
|
225
|
-
if (normalized
|
|
226
|
-
|
|
227
|
-
normalized.startsWith("/"))
|
|
228
|
-
return unresolvedOutcome(input, "rejected", [
|
|
287
|
+
const confineCandidate = (candidate) => {
|
|
288
|
+
const normalized = normalizeJoinedLogicalPath(candidate);
|
|
289
|
+
if (logicalPathEscapesRoot(normalized))
|
|
290
|
+
return unresolvedCandidate("rejected", [
|
|
229
291
|
"The resolved candidate escapes the canonical artifact root.",
|
|
230
292
|
]);
|
|
231
293
|
return normalized === "." ? "" : normalized;
|
|
232
294
|
};
|
|
233
|
-
const
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
return direct;
|
|
295
|
+
const readPackageMetadata = (input, directory) => {
|
|
296
|
+
const path = posix.join(directory, "package.json");
|
|
297
|
+
const file = input.files.get(path);
|
|
237
298
|
const source = input.files.get(input.sourcePath);
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
packageFile.container_sha256 !== source.container_sha256))
|
|
243
|
-
return (resolveFileCandidates(input, indexCandidates(candidate)) ??
|
|
244
|
-
notFoundCandidate());
|
|
245
|
-
if (!packageFile.text.included)
|
|
246
|
-
return {
|
|
247
|
-
resolvedPath: null,
|
|
248
|
-
status: "unavailable",
|
|
249
|
-
limitations: [
|
|
250
|
-
`Directory package metadata ${packagePath} was inventoried but its text is unavailable: ${packageFile.text.reason}.`,
|
|
251
|
-
],
|
|
252
|
-
};
|
|
253
|
-
const main = packageEntry(packageFile.text.value, input.moduleKind, input.context === "module-specifier" &&
|
|
254
|
-
!input.declaredPath.startsWith(".") &&
|
|
255
|
-
!input.declaredPath.startsWith("/") &&
|
|
256
|
-
!hasScheme(input.declaredPath));
|
|
257
|
-
if (main.status === "invalid")
|
|
258
|
-
return {
|
|
259
|
-
resolvedPath: null,
|
|
260
|
-
status: "unavailable",
|
|
261
|
-
limitations: [
|
|
262
|
-
`Directory package metadata ${packagePath} is not valid package JSON.`,
|
|
263
|
-
],
|
|
264
|
-
};
|
|
265
|
-
if (main.status === "rejected")
|
|
299
|
+
if (file === undefined ||
|
|
300
|
+
(source !== undefined && file.container_sha256 !== source.container_sha256))
|
|
301
|
+
return { kind: "absent" };
|
|
302
|
+
if (!file.text.included)
|
|
266
303
|
return {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
limitations: [`Package metadata ${packagePath}: ${main.limitation}`],
|
|
304
|
+
kind: "unavailable",
|
|
305
|
+
limitation: `Directory package metadata ${path} was inventoried but its text is unavailable: ${file.text.reason}.`,
|
|
270
306
|
};
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
],
|
|
278
|
-
};
|
|
279
|
-
if (packageChain.has(packagePath)) {
|
|
307
|
+
let value;
|
|
308
|
+
try {
|
|
309
|
+
value = JSON.parse(file.text.value);
|
|
310
|
+
}
|
|
311
|
+
catch (cause) {
|
|
312
|
+
void cause;
|
|
280
313
|
return {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
limitations: [
|
|
284
|
-
`Directory package entrypoint cycle includes ${packagePath}.`,
|
|
285
|
-
],
|
|
314
|
+
kind: "unavailable",
|
|
315
|
+
limitation: `Directory package metadata ${path} is not valid package JSON.`,
|
|
286
316
|
};
|
|
287
317
|
}
|
|
288
|
-
|
|
289
|
-
|
|
318
|
+
return typeof value === "object" && value !== null
|
|
319
|
+
? { kind: "available", path, value }
|
|
320
|
+
: {
|
|
321
|
+
kind: "unavailable",
|
|
322
|
+
limitation: `Directory package metadata ${path} is not valid package JSON.`,
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
/** File and directory lookup never interprets a nested directory's exports. */
|
|
326
|
+
const resolveCandidate = (input, candidate, packageChain) => resolveFileCandidates(input, fileCandidates(candidate)) ??
|
|
327
|
+
resolveDirectory(input, candidate, readPackageMetadata(input, candidate), packageChain);
|
|
328
|
+
const resolveDirectory = (input, directory, metadata, packageChain) => {
|
|
329
|
+
if (metadata.kind === "absent")
|
|
330
|
+
return (resolveFileCandidates(input, indexCandidates(directory)) ??
|
|
290
331
|
notFoundCandidate());
|
|
332
|
+
if (metadata.kind === "unavailable")
|
|
333
|
+
return unresolvedCandidate("unavailable", [metadata.limitation]);
|
|
334
|
+
if (packageChain.has(metadata.path))
|
|
335
|
+
return unresolvedCandidate("unavailable", [
|
|
336
|
+
`Directory package entrypoint cycle includes ${metadata.path}.`,
|
|
337
|
+
]);
|
|
338
|
+
const preferred = [
|
|
339
|
+
Reflect.get(metadata.value, "main"),
|
|
340
|
+
...(input.moduleKind === undefined
|
|
341
|
+
? [Reflect.get(metadata.value, "module")]
|
|
342
|
+
: []),
|
|
343
|
+
];
|
|
344
|
+
const entry = preferred.find((value) => value !== undefined);
|
|
345
|
+
if (entry === undefined)
|
|
346
|
+
return (resolveFileCandidates(input, indexCandidates(directory)) ??
|
|
347
|
+
notFoundCandidate());
|
|
348
|
+
if (typeof entry !== "string" || entry.length === 0)
|
|
349
|
+
return unresolvedCandidate("unavailable", [
|
|
350
|
+
`Directory package metadata ${metadata.path} is not valid package JSON.`,
|
|
351
|
+
]);
|
|
291
352
|
const entryInput = {
|
|
292
|
-
declaredPath:
|
|
293
|
-
sourcePath:
|
|
353
|
+
declaredPath: entry,
|
|
354
|
+
sourcePath: metadata.path,
|
|
294
355
|
context: "package-entrypoint",
|
|
295
356
|
files: input.files,
|
|
357
|
+
...(input.moduleKind === undefined ? {} : { moduleKind: input.moduleKind }),
|
|
296
358
|
};
|
|
297
|
-
const
|
|
298
|
-
if (
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
359
|
+
const rejected = rejectDeclaration(entryInput.declaredPath);
|
|
360
|
+
if (rejected !== null)
|
|
361
|
+
return rejected;
|
|
362
|
+
const candidate = contextualCandidate(entryInput);
|
|
363
|
+
if (typeof candidate !== "string")
|
|
364
|
+
return candidate;
|
|
365
|
+
const confined = confineCandidate(candidate);
|
|
366
|
+
if (typeof confined !== "string")
|
|
367
|
+
return confined;
|
|
368
|
+
const selected = resolveFileCandidates(entryInput, [
|
|
369
|
+
...fileCandidates(confined),
|
|
370
|
+
...indexCandidates(confined),
|
|
371
|
+
]) ?? resolveFileCandidates(input, indexCandidates(directory));
|
|
372
|
+
if (selected !== null)
|
|
373
|
+
return selected;
|
|
374
|
+
return resolveCandidate(entryInput, confined, new Set([...packageChain, metadata.path]));
|
|
308
375
|
};
|
|
309
|
-
const candidateOutcome = (nested) => nested.resolution_status === "resolved"
|
|
310
|
-
? {
|
|
311
|
-
resolvedPath: nested.resolved_path,
|
|
312
|
-
status: nested.resolution_status,
|
|
313
|
-
limitations: nested.limitations,
|
|
314
|
-
}
|
|
315
|
-
: {
|
|
316
|
-
resolvedPath: null,
|
|
317
|
-
status: nested.resolution_status,
|
|
318
|
-
limitations: nested.limitations,
|
|
319
|
-
};
|
|
320
376
|
const resolveFileCandidates = (input, candidates) => {
|
|
321
377
|
const source = input.files.get(input.sourcePath);
|
|
322
378
|
for (const path of candidates) {
|
|
@@ -333,59 +389,44 @@ const fileCandidates = (candidate) => [
|
|
|
333
389
|
...EXTENSIONS.map((extension) => `${candidate}${extension}`),
|
|
334
390
|
];
|
|
335
391
|
const indexCandidates = (candidate) => EXTENSIONS.map((extension) => posix.join(candidate, `index${extension}`));
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
return { status: "invalid" };
|
|
341
|
-
const rawExports = Reflect.get(value, "exports");
|
|
342
|
-
if (useExports && rawExports !== undefined && rawExports !== null) {
|
|
343
|
-
const exported = packageExport(rawExports, moduleKind);
|
|
344
|
-
return exported.status === "value"
|
|
345
|
-
? { ...exported, source: "exports" }
|
|
346
|
-
: exported;
|
|
347
|
-
}
|
|
348
|
-
// Node imports and requires ignore the bundler-only module field. Keep
|
|
349
|
-
// that fallback for callers without an explicit module-loading kind.
|
|
350
|
-
const preferred = [
|
|
351
|
-
Reflect.get(value, "main"),
|
|
352
|
-
...(moduleKind === undefined ? [Reflect.get(value, "module")] : []),
|
|
353
|
-
];
|
|
354
|
-
const entry = preferred.find((candidate) => candidate !== undefined);
|
|
355
|
-
if (entry === undefined)
|
|
356
|
-
return { status: "missing" };
|
|
357
|
-
const legacy = packagePathValue(entry);
|
|
358
|
-
return legacy.status === "value" ? { ...legacy, source: "legacy" } : legacy;
|
|
359
|
-
}
|
|
360
|
-
catch (cause) {
|
|
361
|
-
// Reflect-based manifest reads fail closed as invalid.
|
|
362
|
-
void cause;
|
|
363
|
-
return { status: "invalid" };
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
const packageExport = (value, moduleKind) => {
|
|
392
|
+
/** Only exact non-directory keys participate; wildcard expansion is unsupported. */
|
|
393
|
+
const selectPackageExport = (value, subpath, moduleKind) => {
|
|
394
|
+
let target = value;
|
|
395
|
+
let declared = [];
|
|
367
396
|
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
368
397
|
const keys = Object.keys(value);
|
|
369
|
-
|
|
370
|
-
|
|
398
|
+
const hasSubpaths = keys.some((key) => key.startsWith("."));
|
|
399
|
+
if (hasSubpaths && keys.some((key) => !key.startsWith(".")))
|
|
371
400
|
return {
|
|
372
401
|
status: "rejected",
|
|
373
402
|
limitation: "The package exports configuration mixes subpath keys and condition keys.",
|
|
374
403
|
};
|
|
404
|
+
declared = keys;
|
|
405
|
+
if (hasSubpaths) {
|
|
406
|
+
if (subpath.endsWith("/") ||
|
|
407
|
+
subpath.includes("*") ||
|
|
408
|
+
!Object.hasOwn(value, subpath))
|
|
409
|
+
return { status: "unmatched", declared };
|
|
410
|
+
target = Reflect.get(value, subpath);
|
|
411
|
+
}
|
|
412
|
+
else if (subpath !== ".")
|
|
413
|
+
return { status: "unmatched", declared };
|
|
375
414
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
return first === undefined
|
|
384
|
-
? {
|
|
415
|
+
else if (subpath !== ".")
|
|
416
|
+
return { status: "unmatched", declared };
|
|
417
|
+
const selected = selectExportTarget(target, packageExportConditions(moduleKind));
|
|
418
|
+
if (selected.kind === "invalid" || selected.kind === "invalid-config")
|
|
419
|
+
return { status: "rejected", limitation: selected.limitation };
|
|
420
|
+
if (selected.kind === "unmatched")
|
|
421
|
+
return {
|
|
385
422
|
status: "unmatched",
|
|
386
|
-
declared: typeof
|
|
387
|
-
|
|
388
|
-
|
|
423
|
+
declared: typeof target === "object" && target !== null
|
|
424
|
+
? Object.keys(target)
|
|
425
|
+
: declared,
|
|
426
|
+
};
|
|
427
|
+
return selected.kind === "blocked"
|
|
428
|
+
? { status: "blocked" }
|
|
429
|
+
: { status: "value", value: selected.value };
|
|
389
430
|
};
|
|
390
431
|
const invalidExportTarget = (value, reason) => ({
|
|
391
432
|
kind: "invalid",
|
|
@@ -408,21 +449,21 @@ const forbiddenExportSegment = (value) => value
|
|
|
408
449
|
* An array skips unmatched and invalid entries, stops at its first string, and
|
|
409
450
|
* preserves the final invalid-versus-null refusal if no string is selected.
|
|
410
451
|
*/
|
|
411
|
-
const
|
|
452
|
+
const selectExportTarget = (value, conditions) => {
|
|
412
453
|
if (typeof value === "string") {
|
|
413
454
|
if (!value.startsWith("./"))
|
|
414
455
|
return invalidExportTarget(value, 'must start with "./"');
|
|
415
456
|
const forbidden = forbiddenExportSegment(value);
|
|
416
457
|
return forbidden === undefined
|
|
417
|
-
? { kind: "
|
|
458
|
+
? { kind: "value", value }
|
|
418
459
|
: invalidExportTarget(value, `contains forbidden path segment ${JSON.stringify(forbidden)} before URL normalization`);
|
|
419
460
|
}
|
|
420
461
|
if (value === null)
|
|
421
|
-
return { kind: "
|
|
462
|
+
return { kind: "blocked" };
|
|
422
463
|
if (Array.isArray(value)) {
|
|
423
464
|
let invalid = null;
|
|
424
465
|
for (const entry of value) {
|
|
425
|
-
const nested =
|
|
466
|
+
const nested = selectExportTarget(entry, conditions);
|
|
426
467
|
// Node's array fallback catches invalid targets, not invalid configuration.
|
|
427
468
|
if (nested.kind === "invalid-config")
|
|
428
469
|
return nested;
|
|
@@ -433,11 +474,11 @@ const exportTargets = (value, conditions) => {
|
|
|
433
474
|
if (nested.kind === "unmatched")
|
|
434
475
|
continue;
|
|
435
476
|
invalid = null;
|
|
436
|
-
if (nested.
|
|
477
|
+
if (nested.kind === "value")
|
|
437
478
|
return nested;
|
|
438
479
|
}
|
|
439
480
|
return invalid === null
|
|
440
|
-
? { kind: "
|
|
481
|
+
? { kind: "blocked" }
|
|
441
482
|
: { kind: "invalid", limitation: invalid };
|
|
442
483
|
}
|
|
443
484
|
if (typeof value !== "object")
|
|
@@ -453,7 +494,7 @@ const exportTargets = (value, conditions) => {
|
|
|
453
494
|
for (const [condition, target] of Object.entries(value)) {
|
|
454
495
|
if (!conditions.has(condition))
|
|
455
496
|
continue;
|
|
456
|
-
const nested =
|
|
497
|
+
const nested = selectExportTarget(target, conditions);
|
|
457
498
|
if (nested.kind !== "unmatched")
|
|
458
499
|
return nested;
|
|
459
500
|
}
|
|
@@ -473,9 +514,6 @@ const packageExportConditions = (moduleKind) => new Set([
|
|
|
473
514
|
...(moduleKind === undefined ? [] : [moduleKind]),
|
|
474
515
|
"default",
|
|
475
516
|
]);
|
|
476
|
-
const packagePathValue = (value) => typeof value === "string" && value.length > 0
|
|
477
|
-
? { status: "value", value }
|
|
478
|
-
: { status: "invalid" };
|
|
479
517
|
const notFoundCandidate = () => ({
|
|
480
518
|
resolvedPath: null,
|
|
481
519
|
status: "not-found",
|
|
@@ -505,19 +543,4 @@ const fileUrlPath = (value) => {
|
|
|
505
543
|
return undefined;
|
|
506
544
|
}
|
|
507
545
|
};
|
|
508
|
-
const
|
|
509
|
-
? {
|
|
510
|
-
declared_path: input.declaredPath,
|
|
511
|
-
resolution_context: input.context,
|
|
512
|
-
resolved_path: resolution.resolvedPath,
|
|
513
|
-
resolution_status: resolution.status,
|
|
514
|
-
limitations: resolution.limitations,
|
|
515
|
-
}
|
|
516
|
-
: {
|
|
517
|
-
declared_path: input.declaredPath,
|
|
518
|
-
resolution_context: input.context,
|
|
519
|
-
resolved_path: null,
|
|
520
|
-
resolution_status: resolution.status,
|
|
521
|
-
limitations: resolution.limitations,
|
|
522
|
-
};
|
|
523
|
-
const unresolvedOutcome = (input, status, limitations) => outcome(input, { resolvedPath: null, status, limitations });
|
|
546
|
+
const unresolvedCandidate = (status, limitations) => ({ resolvedPath: null, status, limitations });
|