rea-agents 6.2.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 +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -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 +59 -21
- package/dist/android/JadxSession.js +51 -9
- 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 +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- 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 +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- 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 +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- 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 +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- 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/android/AndroidAnalysisService.js +1 -1
- 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/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -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/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- 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/NativeCallRoutes.js +2 -4
- 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 +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- 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 +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- 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 +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- 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 +9 -3
- 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/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- 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/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- 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/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- 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 +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- 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/android/androidPartialObservation.js +36 -0
- 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 +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- 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 +5 -4
- 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 +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- 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 +73 -0
- 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 +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- 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/HopperCleanup.js +1 -1
- 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 +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- 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/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- 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/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- 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 +104 -51
- 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 +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- 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/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- 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 +6 -7
- 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/helpers.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/registerArtifactTools.js +2 -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 +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- 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/registerManagedTools.js +7 -4
- 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/registerOfficialTools.js +31 -25
- 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 +58 -21
- 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 +38 -7
- 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 +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { semanticContainer, semanticPropertyPointer, } from "../../domain/javascript/javascriptSemanticSlots.js";
|
|
2
|
+
import { digestCanonicalValue } from "../../domain/canonicalDigest.js";
|
|
2
3
|
import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
3
4
|
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
4
5
|
import { observedSemanticEvidence, unknownSemanticEvidence, } from "./JavaScriptSemanticGraphEvidence.js";
|
|
@@ -72,17 +73,20 @@ const projectValue = (input) => {
|
|
|
72
73
|
detail: `Initializer container has unknown ${value.status === "object" ? "properties" : "items"}${container.coverage.omitted === null ? " with an unknown omitted count" : `; ${container.coverage.omitted} omitted`}.`,
|
|
73
74
|
candidate_node_ids: [target.node_id],
|
|
74
75
|
evidence: unknownSemanticEvidence(context.file, binding.definitions[0]?.location ?? null),
|
|
75
|
-
}));
|
|
76
|
+
}, context.state.evidenceContexts));
|
|
76
77
|
}
|
|
77
|
-
else if (value.status === "unknown"
|
|
78
|
+
else if (value.status === "unknown" ||
|
|
79
|
+
value.status === "ambiguous" ||
|
|
80
|
+
value.status === "cycle") {
|
|
78
81
|
const location = binding.definitions[0]?.location ?? null;
|
|
79
82
|
const evidence = observedSemanticEvidence(context.file, location);
|
|
80
|
-
const isPropertyValue = role.startsWith("property:");
|
|
81
83
|
addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
|
|
82
84
|
node_id: target.node_id,
|
|
83
|
-
family:
|
|
84
|
-
relation_kinds: [
|
|
85
|
-
reason:
|
|
85
|
+
family: "data-flow",
|
|
86
|
+
relation_kinds: ["defines"],
|
|
87
|
+
reason: value.resourceLimit === undefined
|
|
88
|
+
? "unknown-value"
|
|
89
|
+
: "resource-limit",
|
|
86
90
|
detail: `${value.reason} Unknown value at ${role}.`,
|
|
87
91
|
candidate_node_ids: [target.node_id],
|
|
88
92
|
evidence: {
|
|
@@ -92,17 +96,27 @@ const projectValue = (input) => {
|
|
|
92
96
|
confidence: "unknown",
|
|
93
97
|
limitations: [value.reason],
|
|
94
98
|
},
|
|
95
|
-
}));
|
|
99
|
+
}, context.state.evidenceContexts));
|
|
96
100
|
}
|
|
97
101
|
};
|
|
98
|
-
const addLiteralNode = (context, binding, value, role) =>
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
const addLiteralNode = (context, binding, value, role) => {
|
|
103
|
+
const encodedValue = JSON.stringify(value);
|
|
104
|
+
const valueDigest = `value-sha256:${digestCanonicalValue(value, "Semantic literal")}`;
|
|
105
|
+
const valueKey = encodedValue.length <= valueDigest.length ? encodedValue : valueDigest;
|
|
106
|
+
const stringLabel = "string literal";
|
|
107
|
+
return retainSemanticGraphNode(context.state, context.file, {
|
|
108
|
+
kind: "literal",
|
|
109
|
+
// Identity needs an exact value commitment, not another payload copy.
|
|
110
|
+
// Keep the complete literal in properties for queries and Evidence export.
|
|
111
|
+
roleKey: `literal:${binding.bindingId}:${role}:${valueKey}`,
|
|
112
|
+
location: binding.definitions[0]?.location ?? null,
|
|
113
|
+
label: typeof value === "string" && encodedValue.length > stringLabel.length
|
|
114
|
+
? stringLabel
|
|
115
|
+
: encodedValue,
|
|
116
|
+
functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
|
|
117
|
+
properties: { value },
|
|
118
|
+
});
|
|
119
|
+
};
|
|
106
120
|
/** Create one canonical slot for a root binding and exact static property path. */
|
|
107
121
|
export const semanticPropertySlot = (context, objectBindingId, path, fact) => retainSemanticGraphNode(context.state, context.file, {
|
|
108
122
|
kind: "property-slot",
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
|
+
import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
4
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
5
6
|
import { queryJavaScriptSemanticGraph } from "../../domain/javascript/javascriptSemanticQuery.js";
|
|
6
7
|
import { javaScriptSemanticTraceResultSchema, traceJavaScriptSemanticsInputSchema, } from "../../domain/javascript/javascriptSemanticTraceSchemas.js";
|
|
7
8
|
import { err, ok } from "../../domain/result.js";
|
|
8
|
-
import { parseApplicationGraphEvidence } from "./JavaScriptApplicationEvidenceGraph.js";
|
|
9
9
|
import { createJavaScriptSemanticTraceEvidence } from "./JavaScriptApplicationWorkflowEvidence.js";
|
|
10
10
|
const OPERATION = "trace_javascript_semantics";
|
|
11
11
|
/** Trace semantic relations from input already parsed by a trusted adapter. */
|
|
12
12
|
export const traceJavaScriptSemanticsEvidenceValidated = (input) => {
|
|
13
|
+
const sourceResult = parseApplicationGraphEvidence(input.application, [
|
|
14
|
+
"application",
|
|
15
|
+
]);
|
|
16
|
+
if (!sourceResult.ok)
|
|
17
|
+
return err(applicationGraphEvidenceInputError(OPERATION, sourceResult.error));
|
|
18
|
+
const source = sourceResult.value;
|
|
19
|
+
if (source.semanticGraph === null)
|
|
20
|
+
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
21
|
+
{
|
|
22
|
+
path: ["application"],
|
|
23
|
+
reason: "invalid_value",
|
|
24
|
+
expected: "inline Evidence from analyze_javascript_application with a semantic graph",
|
|
25
|
+
},
|
|
26
|
+
]));
|
|
13
27
|
try {
|
|
14
|
-
const source = parseApplicationGraphEvidence(input.application);
|
|
15
|
-
if (source.semanticGraph === null)
|
|
16
|
-
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
17
|
-
{
|
|
18
|
-
path: ["application"],
|
|
19
|
-
reason: "invalid_value",
|
|
20
|
-
expected: "inline Evidence from analyze_javascript_application with a semantic graph",
|
|
21
|
-
},
|
|
22
|
-
]));
|
|
23
28
|
const query = queryJavaScriptSemanticGraph(source.semanticGraph, input.query);
|
|
24
29
|
const result = javaScriptSemanticTraceResultSchema.parse({
|
|
25
30
|
...query,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jebRequestSchema, } from "../../domain/jeb/jebAnalysis.js";
|
|
2
|
+
import { executeProviderOperation } from "../ProviderOperationExecution.js";
|
|
3
|
+
/** Shared CLI/MCP admission, execution and Evidence composition for JEB. */
|
|
4
|
+
export class JebAnalysisService {
|
|
5
|
+
provider;
|
|
6
|
+
constructor(provider) {
|
|
7
|
+
this.provider = provider;
|
|
8
|
+
}
|
|
9
|
+
/** Run one caller-selected JEB request and retain engine provenance inline. */
|
|
10
|
+
async execute(operation, input, options) {
|
|
11
|
+
return executeProviderOperation(operation, input, options, jebRequestSchema, this.provider, operation === "decompile_jeb_item" ? "derived" : "observed");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
|
-
import { createEvidence } from "../../domain/evidence.js";
|
|
4
|
+
import { createEvidence, } from "../../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
6
6
|
import { managedApplicationGraphResultSchema, projectManagedApplicationGraph, projectManagedApplicationGraphInputSchema, } from "../../domain/managed/managedApplicationGraph.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
@@ -3,16 +3,14 @@ import { parseRelatedAddresses, referenceKindSchema, } from "../../domain/hopper
|
|
|
3
3
|
import { err, ok } from "../../domain/result.js";
|
|
4
4
|
import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
|
|
5
5
|
const referencesSchema = z.object({
|
|
6
|
-
reference_kinds_available: z.boolean()
|
|
6
|
+
reference_kinds_available: z.boolean(),
|
|
7
7
|
references: z.array(z.object({
|
|
8
8
|
source_address: z.string(),
|
|
9
9
|
target_address: z.string(),
|
|
10
10
|
target_procedure: z.object({ address: z.string() }).nullable(),
|
|
11
11
|
kind: referenceKindSchema,
|
|
12
12
|
})),
|
|
13
|
-
unresolved_calls: z
|
|
14
|
-
.array(z.object({ address: z.string(), reason: z.string() }))
|
|
15
|
-
.default([]),
|
|
13
|
+
unresolved_calls: z.array(z.object({ address: z.string(), reason: z.string() })),
|
|
16
14
|
});
|
|
17
15
|
/** Prefer typed static call references, preserving computed targets and targetless sites. */
|
|
18
16
|
export const readNativeCallRoutes = async (analysis, procedure, signal) => {
|
|
@@ -35,14 +35,23 @@ export const traceNativeUiAction = async (analysis, input, signal) => {
|
|
|
35
35
|
if (decoded.data.target_sha256 !== targetSha256)
|
|
36
36
|
return err(new AnalysisOutputError("decode_interface_builder", "UI and native provider results refer to different target SHA-256 values"));
|
|
37
37
|
graph = joinInterfaceBuilderDispatch(decoded.data.graph, metadata.result);
|
|
38
|
+
const archiveDecode = decoded.data.graph.coverage.find((facet) => facet.facet === "archive_decode");
|
|
39
|
+
const documentsFound = decoded.data.documents.length > 0;
|
|
38
40
|
coverage.push({
|
|
39
41
|
facet: "interface_builder_archives",
|
|
40
|
-
status:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
status: archiveDecode?.status === "partial" ||
|
|
43
|
+
archiveDecode?.status === "complete" ||
|
|
44
|
+
archiveDecode?.status === "unsupported"
|
|
45
|
+
? archiveDecode.status
|
|
46
|
+
: documentsFound
|
|
47
|
+
? "complete"
|
|
48
|
+
: "unsupported",
|
|
49
|
+
reason: archiveDecode?.reason ??
|
|
50
|
+
(documentsFound
|
|
51
|
+
? null
|
|
52
|
+
: "no_compiled_interface_builder_archives_found"),
|
|
53
|
+
examined: archiveDecode?.examined ?? decoded.data.documents.length,
|
|
54
|
+
omitted: archiveDecode?.omitted ?? 0,
|
|
46
55
|
});
|
|
47
56
|
const bounded = boundUiGraph(graph, input.max_nodes, input.max_edges);
|
|
48
57
|
graph = bounded.graph;
|
|
@@ -218,8 +227,7 @@ const resolveUiAction = (graph, query) => {
|
|
|
218
227
|
};
|
|
219
228
|
const objectMatches = graph.nodes.filter((node) => ["control", "view", "view_controller", "scene"].includes(node.kind) &&
|
|
220
229
|
(node.id === query ||
|
|
221
|
-
node.attributes.interface_builder_object_id === query
|
|
222
|
-
node.id.endsWith(`:object:${query}`)));
|
|
230
|
+
node.attributes.interface_builder_object_id === query));
|
|
223
231
|
const actionIds = new Set(graph.edges.flatMap((edge) => edge.resolution === "observed" &&
|
|
224
232
|
edge.relation === "target_action" &&
|
|
225
233
|
objectMatches.some(({ id }) => edge.from === id) &&
|
|
@@ -8,6 +8,7 @@ import { err, ok } from "../../domain/result.js";
|
|
|
8
8
|
export const traceNativeValues = async (analysis, parameters, signal) => {
|
|
9
9
|
const input = nativeValueTraceInputSchema.parse(parameters);
|
|
10
10
|
const nodes = [];
|
|
11
|
+
const nodeIds = new Set();
|
|
11
12
|
const edges = [];
|
|
12
13
|
const procedures = [];
|
|
13
14
|
const unknowns = [];
|
|
@@ -116,24 +117,27 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
|
|
|
116
117
|
bytes += size;
|
|
117
118
|
ids.add(operation.id);
|
|
118
119
|
nodes.push(node);
|
|
120
|
+
nodeIds.add(node.id);
|
|
119
121
|
}
|
|
120
122
|
for (const parameter of flow.parameters) {
|
|
121
123
|
if (nodes.length >= input.max_nodes) {
|
|
122
124
|
truncated = true;
|
|
123
125
|
break;
|
|
124
126
|
}
|
|
127
|
+
const id = `${address}/parameter:${parameter.ordinal}`;
|
|
125
128
|
nodes.push({
|
|
126
|
-
id
|
|
129
|
+
id,
|
|
127
130
|
procedure: address,
|
|
128
131
|
evidence_id: evidenceId,
|
|
129
132
|
kind: "parameter",
|
|
130
133
|
operation: null,
|
|
131
134
|
parameter,
|
|
132
135
|
});
|
|
136
|
+
nodeIds.add(id);
|
|
133
137
|
}
|
|
134
138
|
for (const use of flow.parameter_uses) {
|
|
135
139
|
if (!ids.has(use.use) ||
|
|
136
|
-
!
|
|
140
|
+
!nodeIds.has(`${address}/parameter:${use.ordinal}`))
|
|
137
141
|
continue;
|
|
138
142
|
if (edges.length >= input.max_edges) {
|
|
139
143
|
truncated = true;
|
|
@@ -243,8 +247,23 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
|
|
|
243
247
|
}
|
|
244
248
|
if (targetSha256 === undefined)
|
|
245
249
|
return err(new AnalysisOutputError("trace_native_values", "No seed function could be analyzed"));
|
|
250
|
+
const parametersByProcedure = new Map();
|
|
251
|
+
const returnsByProcedure = new Map();
|
|
252
|
+
for (const node of nodes) {
|
|
253
|
+
if (node.kind === "parameter") {
|
|
254
|
+
const parameters = parametersByProcedure.get(node.procedure) ?? [];
|
|
255
|
+
parameters.push(node);
|
|
256
|
+
parametersByProcedure.set(node.procedure, parameters);
|
|
257
|
+
}
|
|
258
|
+
else if (node.operation?.opcode === "RETURN" &&
|
|
259
|
+
node.operation.inputs.length > 1) {
|
|
260
|
+
const returns = returnsByProcedure.get(node.procedure) ?? [];
|
|
261
|
+
returns.push(node);
|
|
262
|
+
returnsByProcedure.set(node.procedure, returns);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
246
265
|
for (const binding of callBindings) {
|
|
247
|
-
const parameters =
|
|
266
|
+
const parameters = parametersByProcedure.get(binding.callee) ?? [];
|
|
248
267
|
if (parameters.length === 0)
|
|
249
268
|
unknowns.push({
|
|
250
269
|
procedure: binding.caller,
|
|
@@ -275,9 +294,7 @@ export const traceNativeValues = async (analysis, parameters, signal) => {
|
|
|
275
294
|
});
|
|
276
295
|
}
|
|
277
296
|
if (binding.output)
|
|
278
|
-
for (const node of
|
|
279
|
-
node.operation?.opcode === "RETURN" &&
|
|
280
|
-
node.operation.inputs.length > 1)) {
|
|
297
|
+
for (const node of returnsByProcedure.get(binding.callee) ?? []) {
|
|
281
298
|
if (edges.length >= input.max_edges) {
|
|
282
299
|
truncated = true;
|
|
283
300
|
break;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { z } from "zod";
|
|
3
2
|
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
4
3
|
import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
|
|
@@ -11,9 +10,12 @@ import { processTraceSpecificationSchema } from "../../domain/process/processTra
|
|
|
11
10
|
import { processScenarioSchema } from "../../domain/process/processScenario.js";
|
|
12
11
|
import { compareProcessCaptures } from "../../domain/process/processComparison.js";
|
|
13
12
|
import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
|
|
13
|
+
import { createProgressReporter } from "../ProgressReporter.js";
|
|
14
14
|
import { captureProcessScenario } from "../../process/capture/ProcessHarness.js";
|
|
15
|
+
import { ProcessCaptureResourceScope } from "../../process/capture/ProcessCaptureLifecycle.js";
|
|
15
16
|
import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
16
17
|
import { createProcessCaptureEvidence } from "./ProcessEvidence.js";
|
|
18
|
+
import { readJsonFile } from "../JsonFiles.js";
|
|
17
19
|
/** Identify the process workflow's typed diagnostic result for CLI exit status. */
|
|
18
20
|
export const isProcessCliFailure = (value) => typeof value === "object" &&
|
|
19
21
|
value !== null &&
|
|
@@ -30,7 +32,19 @@ export const captureProcessScenarioFile = async (path, environment = process.env
|
|
|
30
32
|
const parsed = processScenarioSchema.safeParse(input);
|
|
31
33
|
if (!parsed.success)
|
|
32
34
|
throw analysisInputErrorFromIssues("capture_process_scenario", parsed.error.issues, input, { cause: parsed.error });
|
|
33
|
-
const
|
|
35
|
+
const progress = createProgressReporter(async (update) => {
|
|
36
|
+
process.stderr.write(`${JSON.stringify({ rea_progress: update })}\n`);
|
|
37
|
+
}, { minimumIntervalMs: 100 });
|
|
38
|
+
const resourceScope = new ProcessCaptureResourceScope();
|
|
39
|
+
const captured = await captureProcessScenario(parsed.data, signal, process.platform, environment, undefined, undefined, progress, resourceScope);
|
|
40
|
+
try {
|
|
41
|
+
await resourceScope.close();
|
|
42
|
+
}
|
|
43
|
+
catch (cause) {
|
|
44
|
+
if (!captured.ok)
|
|
45
|
+
return cliAnalysisError(captured.error);
|
|
46
|
+
throw cause;
|
|
47
|
+
}
|
|
34
48
|
if (!captured.ok)
|
|
35
49
|
return cliAnalysisError(captured.error);
|
|
36
50
|
return createProcessCaptureEvidence(parsed.data, captured.value);
|
|
@@ -115,24 +129,15 @@ const parseTraceSpecification = (input) => {
|
|
|
115
129
|
};
|
|
116
130
|
const invalidCaptureEvidence = (cause) => new ProcessCliFailure("invalid_input", `Capture evidence is malformed (${describeValidationFailure(cause)}). Create new capture evidence, then try again.`);
|
|
117
131
|
const readJson = async (path) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
fatal: true,
|
|
128
|
-
ignoreBOM: true,
|
|
129
|
-
}).decode(bytes);
|
|
130
|
-
const parsed = JSON.parse(text);
|
|
131
|
-
return parsed;
|
|
132
|
-
}
|
|
133
|
-
catch (cause) {
|
|
134
|
-
throw new ProcessCliFailure("invalid_input", `Process input file is not valid UTF-8 JSON: ${path} (${describeValidationFailure(cause)}). Repair the file, then try again.`);
|
|
135
|
-
}
|
|
132
|
+
const loaded = await readJsonFile(path);
|
|
133
|
+
if (loaded.ok)
|
|
134
|
+
return loaded.value;
|
|
135
|
+
if (loaded.error._tag !== "EvidenceFileError")
|
|
136
|
+
throw loaded.error;
|
|
137
|
+
const detail = describeValidationFailure(loaded.error.cause);
|
|
138
|
+
throw new ProcessCliFailure("invalid_input", loaded.error.reason === "invalid-json"
|
|
139
|
+
? `Process input file is not valid UTF-8 JSON: ${path} (${detail}). Repair the file, then try again.`
|
|
140
|
+
: `Process input file could not be read: ${path} (${detail}). Check the reported filesystem constraint and retry.`);
|
|
136
141
|
};
|
|
137
142
|
class ProcessCliFailure extends Error {
|
|
138
143
|
category;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
|
+
import { logicalPathNfc } from "../domain/artifactIdentity.js";
|
|
3
|
+
import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
|
|
2
4
|
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
3
5
|
const DRIVE_OR_UNC = /^(?:[A-Za-z]:|\\|\/\/)/u;
|
|
6
|
+
/**
|
|
7
|
+
* English Unicode case folding used only to describe logical names a
|
|
8
|
+
* case-insensitive destination might collapse. It is not a filesystem case table.
|
|
9
|
+
*/
|
|
10
|
+
const ENGLISH_UNICODE_CASE_NOTE = "This comparison is not a filesystem observation.";
|
|
11
|
+
/** Inventory limitation when logical names collide under English Unicode case folding. */
|
|
12
|
+
export const ENGLISH_UNICODE_CASE_INVENTORY_LIMITATION = `Logical archive names collide under English (en-US) Unicode case folding; a case-insensitive destination cannot store both spellings. ${ENGLISH_UNICODE_CASE_NOTE}`;
|
|
13
|
+
/** User-facing prefix for a destination that cannot keep two logical spellings. */
|
|
14
|
+
export const DESTINATION_CASE_COLLISION_PREFIX = "Destination filesystem cannot store both ";
|
|
4
15
|
/** Normalize an untrusted logical archive path without touching filesystem. */
|
|
5
16
|
export const normalizeArtifactPath = (input) => {
|
|
6
17
|
if (input.includes("\0") ||
|
|
@@ -8,7 +19,7 @@ export const normalizeArtifactPath = (input) => {
|
|
|
8
19
|
input.startsWith("/") ||
|
|
9
20
|
DRIVE_OR_UNC.test(input))
|
|
10
21
|
throw new ArtifactReaderFailure("path", `Artifact path is absolute or unsafe: ${JSON.stringify(input)}`);
|
|
11
|
-
const normalized = input
|
|
22
|
+
const normalized = logicalPathNfc(input).replace(/\/+$/u, "");
|
|
12
23
|
const parts = normalized.split("/");
|
|
13
24
|
if (normalized.length === 0 ||
|
|
14
25
|
parts.some((part) => part === "" || part === "." || part === "..") ||
|
|
@@ -16,7 +27,7 @@ export const normalizeArtifactPath = (input) => {
|
|
|
16
27
|
throw new ArtifactReaderFailure("path", `Artifact path is not normalized: ${JSON.stringify(input)}`);
|
|
17
28
|
return normalized;
|
|
18
29
|
};
|
|
19
|
-
/** Reject exact
|
|
30
|
+
/** Reject exact and same-spelling prefix collisions. Case-distinct names stay distinct. */
|
|
20
31
|
export class ArtifactPathRegistry {
|
|
21
32
|
#root = { kind: undefined, children: new Map() };
|
|
22
33
|
add(path, kind) {
|
|
@@ -25,13 +36,10 @@ export class ArtifactPathRegistry {
|
|
|
25
36
|
for (const [index, part] of parts.entries()) {
|
|
26
37
|
if (node.kind !== undefined && node.kind !== "directory")
|
|
27
38
|
throw new ArtifactReaderFailure("path", `Artifact prefix conflict: ${path}`);
|
|
28
|
-
|
|
29
|
-
let child = node.children.get(foldedPart);
|
|
30
|
-
if (child !== undefined && child.spelling !== part)
|
|
31
|
-
throw new ArtifactReaderFailure("path", `Artifact path collision: ${path} differs only in case from ${[...parts.slice(0, index), child.spelling].join("/")}`);
|
|
39
|
+
let child = node.children.get(part);
|
|
32
40
|
if (child === undefined) {
|
|
33
|
-
child = {
|
|
34
|
-
node.children.set(
|
|
41
|
+
child = { kind: undefined, children: new Map() };
|
|
42
|
+
node.children.set(part, child);
|
|
35
43
|
}
|
|
36
44
|
node = child;
|
|
37
45
|
if (index === parts.length - 1) {
|
|
@@ -44,3 +52,116 @@ export class ArtifactPathRegistry {
|
|
|
44
52
|
node.kind = kind;
|
|
45
53
|
}
|
|
46
54
|
}
|
|
55
|
+
const emptyCaseNode = () => ({
|
|
56
|
+
bySpelling: new Map(),
|
|
57
|
+
spellingsByFold: new Map(),
|
|
58
|
+
terminals: [],
|
|
59
|
+
});
|
|
60
|
+
const englishCaseFold = (part) => part.toLocaleLowerCase("en-US");
|
|
61
|
+
/**
|
|
62
|
+
* Record English (en-US) Unicode case collisions on each affected occurrence.
|
|
63
|
+
* Returns the inventory limitation when any logical names collide.
|
|
64
|
+
*/
|
|
65
|
+
export const annotateEnglishUnicodeCaseCollisions = (occurrences) => {
|
|
66
|
+
const collisions = englishUnicodeCaseCollisions(occurrences.map(({ logical_path }) => logical_path));
|
|
67
|
+
if (collisions.size === 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
for (const occurrence of occurrences)
|
|
70
|
+
for (const collision of collisions.get(occurrence.logical_path) ?? [])
|
|
71
|
+
occurrence.limitations.push(caseCollisionLimitation(occurrence.logical_path, collision));
|
|
72
|
+
return ENGLISH_UNICODE_CASE_INVENTORY_LIMITATION;
|
|
73
|
+
};
|
|
74
|
+
const caseCollisionLimitation = (path, { prefix, other, additional }) => {
|
|
75
|
+
const others = additional === 0
|
|
76
|
+
? other
|
|
77
|
+
: `${other} and ${String(additional)} other spelling${additional === 1 ? "" : "s"}`;
|
|
78
|
+
const subject = prefix === path
|
|
79
|
+
? `Logical path ${path} collides`
|
|
80
|
+
: `Logical path ${path} is under ${prefix}, which collides`;
|
|
81
|
+
return `${subject} under English (en-US) Unicode case folding with ${others}; a case-insensitive destination cannot store both. ${ENGLISH_UNICODE_CASE_NOTE}`;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Name the directory-listing spelling that differs from the requested segment
|
|
85
|
+
* only by English (en-US) Unicode case. Exact matches are the same logical name.
|
|
86
|
+
*/
|
|
87
|
+
export const destinationCaseCollisionMessage = (requestedPath, existingNames) => {
|
|
88
|
+
const slash = requestedPath.lastIndexOf("/");
|
|
89
|
+
const segment = slash < 0 ? requestedPath : requestedPath.slice(slash + 1);
|
|
90
|
+
if (existingNames.includes(segment))
|
|
91
|
+
return undefined;
|
|
92
|
+
const folded = englishCaseFold(segment);
|
|
93
|
+
const existing = existingNames
|
|
94
|
+
.filter((name) => englishCaseFold(name) === folded)
|
|
95
|
+
.sort(compareUnicodeCodePoints)[0];
|
|
96
|
+
if (existing === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
const parent = slash < 0 ? "" : requestedPath.slice(0, slash + 1);
|
|
99
|
+
return `${DESTINATION_CASE_COLLISION_PREFIX}${requestedPath} and ${parent}${existing}; inventory retains both logical names.`;
|
|
100
|
+
};
|
|
101
|
+
const englishUnicodeCaseCollisions = (paths) => {
|
|
102
|
+
const root = emptyCaseNode();
|
|
103
|
+
for (const path of paths) {
|
|
104
|
+
if (path.length === 0 || path === ".")
|
|
105
|
+
continue;
|
|
106
|
+
let node = root;
|
|
107
|
+
for (const part of path.split("/")) {
|
|
108
|
+
let child = node.bySpelling.get(part);
|
|
109
|
+
if (child === undefined) {
|
|
110
|
+
const folded = englishCaseFold(part);
|
|
111
|
+
const spellings = node.spellingsByFold.get(folded);
|
|
112
|
+
if (spellings === undefined)
|
|
113
|
+
node.spellingsByFold.set(folded, [part]);
|
|
114
|
+
else
|
|
115
|
+
spellings.push(part);
|
|
116
|
+
child = emptyCaseNode();
|
|
117
|
+
node.bySpelling.set(part, child);
|
|
118
|
+
}
|
|
119
|
+
node = child;
|
|
120
|
+
}
|
|
121
|
+
node.terminals.push(path);
|
|
122
|
+
}
|
|
123
|
+
// A collision is recorded once, at the segment where spellings diverge, and
|
|
124
|
+
// shared down the subtree. Pairing every descendant of one spelling with
|
|
125
|
+
// every descendant of another grew quadratically with the subtree sizes.
|
|
126
|
+
// The walk is iterative because a ZIP name can hold more components than
|
|
127
|
+
// the call stack allows.
|
|
128
|
+
const collisions = new Map();
|
|
129
|
+
const pending = [{ node: root, prefix: undefined, chain: undefined }];
|
|
130
|
+
for (let item = pending.pop(); item !== undefined; item = pending.pop()) {
|
|
131
|
+
const { node, prefix, chain } = item;
|
|
132
|
+
if (chain !== undefined)
|
|
133
|
+
for (const path of node.terminals)
|
|
134
|
+
collisions.set(path, collisionsAlong(chain));
|
|
135
|
+
for (const spellings of node.spellingsByFold.values())
|
|
136
|
+
spellings.sort(compareUnicodeCodePoints);
|
|
137
|
+
for (const [spelling, child] of node.bySpelling) {
|
|
138
|
+
const childPrefix = prefix === undefined ? spelling : `${prefix}/${spelling}`;
|
|
139
|
+
const spellings = node.spellingsByFold.get(englishCaseFold(spelling)) ?? [];
|
|
140
|
+
const other = spellings[0] === spelling ? spellings[1] : spellings[0];
|
|
141
|
+
pending.push({
|
|
142
|
+
node: child,
|
|
143
|
+
prefix: childPrefix,
|
|
144
|
+
chain: other === undefined
|
|
145
|
+
? chain
|
|
146
|
+
: {
|
|
147
|
+
collision: {
|
|
148
|
+
prefix: childPrefix,
|
|
149
|
+
other: prefix === undefined ? other : `${prefix}/${other}`,
|
|
150
|
+
additional: spellings.length - 2,
|
|
151
|
+
},
|
|
152
|
+
parent: chain,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return collisions;
|
|
158
|
+
};
|
|
159
|
+
const collisionsAlong = (chain) => {
|
|
160
|
+
const collisions = [];
|
|
161
|
+
let link = chain;
|
|
162
|
+
while (link !== undefined) {
|
|
163
|
+
collisions.push(link.collision);
|
|
164
|
+
link = link.parent;
|
|
165
|
+
}
|
|
166
|
+
return collisions.reverse();
|
|
167
|
+
};
|