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
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
import { webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
3
4
|
/** Compare normalized observations without treating incomplete absence as proof. */
|
|
4
5
|
export const compareWebCaptures = (input) => {
|
|
@@ -23,7 +24,7 @@ export const compareWebCaptures = (input) => {
|
|
|
23
24
|
dimensions,
|
|
24
25
|
limitations: [
|
|
25
26
|
"A changed status proves an observed difference; an unknown status means absence could not be established from capture completeness.",
|
|
26
|
-
"Network comparison covers only activity observed after each CDP attachment.",
|
|
27
|
+
"Network comparison covers only activity observed after each CDP attachment. WebSocket connections with the same URL are compared as an unordered collection of ordered frame streams, retaining connection counts; their individual identities are not stable across captures.",
|
|
27
28
|
"Accessibility roles, ignored state, text, and hierarchy are compared only when the accessibility tree was fully captured and text capture was selected and not truncated.",
|
|
28
29
|
"Storage key inventories are compared only when selected and complete; usage and quota are compared only when reported. Redacted content is compared through complete SHA-256 fingerprints.",
|
|
29
30
|
],
|
|
@@ -41,8 +42,8 @@ const compareIdentities = (before, after) => {
|
|
|
41
42
|
for (const identity of after.keys())
|
|
42
43
|
if (!before.has(identity))
|
|
43
44
|
changes.push({ identity, change: "added" });
|
|
44
|
-
return changes.sort((left, right) => left.identity
|
|
45
|
-
left.change
|
|
45
|
+
return changes.sort((left, right) => compareUnicodeCodePoints(left.identity, right.identity) ||
|
|
46
|
+
compareUnicodeCodePoints(left.change, right.change));
|
|
46
47
|
};
|
|
47
48
|
const compareDimension = (before, after, complete, reason) => {
|
|
48
49
|
const all = compareIdentities(before, after).filter(({ change }) => complete || change === "modified");
|
|
@@ -72,7 +73,7 @@ const accessibilityDimension = (before, after) => {
|
|
|
72
73
|
const afterAccess = accessibilityComparable(after);
|
|
73
74
|
const textComparable = beforeAccess.text && afterAccess.text;
|
|
74
75
|
const nodesComparable = beforeAccess.nodes && afterAccess.nodes;
|
|
75
|
-
return compareDimension(singleton("accessibility_tree",
|
|
76
|
+
return compareDimension(singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(before.accessibility, textComparable, nodesComparable))), singleton("accessibility_tree", digestCanonicalValue(accessibilityProjection(after.accessibility, textComparable, nodesComparable))), beforeAccess.complete && afterAccess.complete, "Accessibility tree or text capture was incomplete in at least one observation.");
|
|
76
77
|
};
|
|
77
78
|
const storageDimension = (before, after) => {
|
|
78
79
|
const keysComplete = storageKeysComparable(before) && storageKeysComparable(after);
|
|
@@ -86,32 +87,87 @@ const storageDimension = (before, after) => {
|
|
|
86
87
|
const compareWebCaptureDimensions = (input) => {
|
|
87
88
|
const before = input.before.inspection;
|
|
88
89
|
const after = input.after.inspection;
|
|
89
|
-
const dimension = compareDimension;
|
|
90
90
|
return {
|
|
91
|
-
dom_structure:
|
|
91
|
+
dom_structure: compareDimension(singleton("document", digestCanonicalValue(domProjection(before))), singleton("document", digestCanonicalValue(domProjection(after))), sectionsComplete(before, ["frames", "dom"]) &&
|
|
92
92
|
sectionsComplete(after, ["frames", "dom"]), "DOM or frame capture was incomplete in at least one observation."),
|
|
93
|
-
scripts:
|
|
93
|
+
scripts: compareDimension(keyed(before.scripts.items.map(scriptProjection), (item) => item.script_key), keyed(after.scripts.items.map(scriptProjection), (item) => item.script_key), sectionsComplete(before, ["scripts"]) &&
|
|
94
94
|
sectionsComplete(after, ["scripts"]), "Script inventory was incomplete in at least one observation."),
|
|
95
|
-
resources:
|
|
95
|
+
resources: compareDimension(keyed(before.resources, (item) => item.resource_key), keyed(after.resources, (item) => item.resource_key), sectionsComplete(before, ["resources"]) &&
|
|
96
96
|
sectionsComplete(after, ["resources"]), "Resource inventory was incomplete in at least one observation."),
|
|
97
|
-
network:
|
|
98
|
-
|
|
99
|
-
metadata: dimension(singleton("metadata", digest(metadataProjection(before))), singleton("metadata", digest(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
|
|
97
|
+
network: networkDimension(before, after),
|
|
98
|
+
metadata: compareDimension(singleton("metadata", digestCanonicalValue(metadataProjection(before))), singleton("metadata", digestCanonicalValue(metadataProjection(after))), sectionsComplete(before, ["metadata"]) &&
|
|
100
99
|
sectionsComplete(after, ["metadata"]), "Safe metadata capture was incomplete in at least one observation."),
|
|
101
|
-
webmcp:
|
|
100
|
+
webmcp: compareDimension(webMcpMap(input.before.webmcp), webMcpMap(input.after.webmcp), webMcpComplete(input.before.webmcp) && webMcpComplete(input.after.webmcp), "WebMCP discovery was unavailable or incomplete in at least one capture."),
|
|
102
101
|
accessibility: accessibilityDimension(before, after),
|
|
103
102
|
storage: storageDimension(before, after),
|
|
104
103
|
};
|
|
105
104
|
};
|
|
106
|
-
const keyed = (values, identity) => new Map(values.map((value) => [identity(value),
|
|
107
|
-
const
|
|
105
|
+
const keyed = (values, identity) => new Map(values.map((value) => [identity(value), digestCanonicalValue(value)]));
|
|
106
|
+
const bodyShapesSelected = (inspection) => !inspection.completeness.excluded.some(({ section, reason }) => section === "json_body_shapes" && reason === "not_approved") &&
|
|
107
|
+
(inspection.network.requests.length === 0 ||
|
|
108
|
+
inspection.network.requests.some(({ body_shapes }) => body_shapes.status !== "not_approved"));
|
|
109
|
+
const webSocketShapesSelected = (inspection) => !inspection.completeness.excluded.some(({ section, reason }) => section === "websocket_shapes" && reason === "not_approved");
|
|
110
|
+
const networkIdentity = (request) => `net_${digestCanonicalValue({ method: request.method, url: request.url, resource_type: request.resource_type })}`;
|
|
111
|
+
const networkDimension = (before, after) => {
|
|
112
|
+
const selected = bodyShapesSelected(before) && bodyShapesSelected(after);
|
|
113
|
+
const webSocketShapes = webSocketShapesSelected(before) && webSocketShapesSelected(after);
|
|
114
|
+
const sources = new Map();
|
|
115
|
+
if (selected) {
|
|
116
|
+
const observedSources = (inspection) => {
|
|
117
|
+
const result = new Map();
|
|
118
|
+
for (const request of inspection.network.requests) {
|
|
119
|
+
const identity = networkIdentity(request);
|
|
120
|
+
const previous = result.get(identity);
|
|
121
|
+
result.set(identity, {
|
|
122
|
+
request: previous?.request !== false && request.body_shapes.request !== null,
|
|
123
|
+
response: previous?.response !== false &&
|
|
124
|
+
request.body_shapes.response !== null,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
};
|
|
129
|
+
const left = observedSources(before);
|
|
130
|
+
const right = observedSources(after);
|
|
131
|
+
for (const [identity, coverage] of left) {
|
|
132
|
+
const next = right.get(identity);
|
|
133
|
+
sources.set(identity, {
|
|
134
|
+
request: coverage.request && next?.request === true,
|
|
135
|
+
response: coverage.response && next?.response === true,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const shapesComplete = !selected ||
|
|
140
|
+
[before, after].every((inspection) => sectionsComplete(inspection, ["json_body_shapes"]) &&
|
|
141
|
+
inspection.network.requests.every(({ body_shapes }) => body_shapes.status === "included"));
|
|
142
|
+
const webSocketShapesComplete = !webSocketShapes ||
|
|
143
|
+
[before, after].every((inspection) => sectionsComplete(inspection, ["websocket_shapes"]) &&
|
|
144
|
+
inspection.network.websocket_connections.every((connection) => connection.events.every((event) => event.payload_shape !== null)));
|
|
145
|
+
const webSocketPayloadBytesComplete = [before, after].every((inspection) => inspection.network.websocket_connections.every((connection) => connection.events.every((event) => event.payload_bytes !== null)));
|
|
146
|
+
const beforeWebSockets = webSocketGroups(before);
|
|
147
|
+
const afterWebSockets = webSocketGroups(after);
|
|
148
|
+
const [beforeWebSocketPayload, afterWebSocketPayload] = webSocketPayloadMaps(beforeWebSockets, afterWebSockets, webSocketShapes);
|
|
149
|
+
return compareDimension(new Map([
|
|
150
|
+
...networkMap(before, sources),
|
|
151
|
+
...webSocketMetadataMap(beforeWebSockets),
|
|
152
|
+
...beforeWebSocketPayload,
|
|
153
|
+
]), new Map([
|
|
154
|
+
...networkMap(after, sources),
|
|
155
|
+
...webSocketMetadataMap(afterWebSockets),
|
|
156
|
+
...afterWebSocketPayload,
|
|
157
|
+
]), [before, after].every((inspection) => sectionsComplete(inspection, [
|
|
158
|
+
"network_requests",
|
|
159
|
+
"websocket_connections",
|
|
160
|
+
"websocket_frames",
|
|
161
|
+
])) &&
|
|
162
|
+
shapesComplete &&
|
|
163
|
+
webSocketPayloadBytesComplete &&
|
|
164
|
+
webSocketShapesComplete, "Network capture or selected HTTP/WebSocket payload-shape coverage is attach-window limited, unavailable, or incomplete.");
|
|
165
|
+
};
|
|
166
|
+
const networkMap = (inspection, sources) => {
|
|
108
167
|
const grouped = new Map();
|
|
109
168
|
for (const request of inspection.network.requests) {
|
|
110
|
-
const identity =
|
|
111
|
-
|
|
112
|
-
url: request.url,
|
|
113
|
-
resource_type: request.resource_type,
|
|
114
|
-
})}`;
|
|
169
|
+
const identity = networkIdentity(request);
|
|
170
|
+
const shapes = sources.get(identity);
|
|
115
171
|
const values = grouped.get(identity) ?? [];
|
|
116
172
|
values.push({
|
|
117
173
|
status: request.status,
|
|
@@ -119,15 +175,96 @@ const networkMap = (inspection) => {
|
|
|
119
175
|
encoded_data_length: request.encoded_data_length,
|
|
120
176
|
redirects: (request.redirects ?? []).map(({ request_timestamp: _requestTimestamp, redirect_event_timestamp: _redirectEventTimestamp, ...redirect }) => redirect),
|
|
121
177
|
initiator: request.initiator,
|
|
122
|
-
|
|
178
|
+
...(shapes?.request === true
|
|
179
|
+
? { request_shape: request.body_shapes.request }
|
|
180
|
+
: {}),
|
|
181
|
+
...(shapes?.response === true
|
|
182
|
+
? { response_shape: request.body_shapes.response }
|
|
183
|
+
: {}),
|
|
123
184
|
});
|
|
124
185
|
grouped.set(identity, values);
|
|
125
186
|
}
|
|
126
187
|
return new Map([...grouped].map(([identity, values]) => [
|
|
127
188
|
identity,
|
|
128
|
-
|
|
189
|
+
digestCanonicalValue(values.map((value) => digestCanonicalValue(value)).sort()),
|
|
190
|
+
]));
|
|
191
|
+
};
|
|
192
|
+
const webSocketGroups = (inspection) => {
|
|
193
|
+
const groups = new Map();
|
|
194
|
+
for (const connection of inspection.network.websocket_connections) {
|
|
195
|
+
const stream = digestCanonicalValue(connection.events.map(({ direction, opcode }) => ({
|
|
196
|
+
direction,
|
|
197
|
+
opcode,
|
|
198
|
+
})));
|
|
199
|
+
const key = digestCanonicalValue({ url: connection.url, stream });
|
|
200
|
+
const previous = groups.get(key);
|
|
201
|
+
if (previous !== undefined)
|
|
202
|
+
previous.connections.push(connection);
|
|
203
|
+
else
|
|
204
|
+
groups.set(key, {
|
|
205
|
+
url: connection.url,
|
|
206
|
+
stream,
|
|
207
|
+
connections: [connection],
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return groups;
|
|
211
|
+
};
|
|
212
|
+
const webSocketMetadataMap = (groups) => {
|
|
213
|
+
const byUrl = new Map();
|
|
214
|
+
for (const group of groups.values()) {
|
|
215
|
+
const streams = byUrl.get(group.url) ?? [];
|
|
216
|
+
for (let index = 0; index < group.connections.length; index += 1)
|
|
217
|
+
streams.push(group.stream);
|
|
218
|
+
byUrl.set(group.url, streams);
|
|
219
|
+
}
|
|
220
|
+
return new Map([...byUrl].map(([url, streams]) => [
|
|
221
|
+
`ws_${digestCanonicalValue(url)}`,
|
|
222
|
+
digestCanonicalValue(streams.sort(compareUnicodeCodePoints)),
|
|
129
223
|
]));
|
|
130
224
|
};
|
|
225
|
+
const webSocketPayloadMaps = (beforeGroups, afterGroups, selected) => {
|
|
226
|
+
const left = new Map();
|
|
227
|
+
const right = new Map();
|
|
228
|
+
for (const [groupKey, beforeGroup] of beforeGroups) {
|
|
229
|
+
const afterGroup = afterGroups.get(groupKey);
|
|
230
|
+
if (afterGroup === undefined ||
|
|
231
|
+
beforeGroup.connections.length !== afterGroup.connections.length)
|
|
232
|
+
continue;
|
|
233
|
+
const eventCount = beforeGroup.connections[0]?.events.length ?? 0;
|
|
234
|
+
const comparableBytes = new Set();
|
|
235
|
+
const comparableShapes = new Set();
|
|
236
|
+
for (let index = 0; index < eventCount; index += 1) {
|
|
237
|
+
if (beforeGroup.connections.every((connection) => connection.events[index]?.payload_bytes !== null) &&
|
|
238
|
+
afterGroup.connections.every((connection) => connection.events[index]?.payload_bytes !== null))
|
|
239
|
+
comparableBytes.add(index);
|
|
240
|
+
// Compare only when every same-metadata connection has shape evidence
|
|
241
|
+
// on both sides; this avoids assigning an unknown shape to a known one.
|
|
242
|
+
if (selected &&
|
|
243
|
+
beforeGroup.connections.every((connection) => connection.events[index]?.payload_shape !== null) &&
|
|
244
|
+
afterGroup.connections.every((connection) => connection.events[index]?.payload_shape !== null))
|
|
245
|
+
comparableShapes.add(index);
|
|
246
|
+
}
|
|
247
|
+
if (comparableBytes.size === 0 && comparableShapes.size === 0)
|
|
248
|
+
continue;
|
|
249
|
+
const project = (group) => digestCanonicalValue(group.connections
|
|
250
|
+
.map((connection) => connection.events.map((event, index) => {
|
|
251
|
+
const comparablePayload = {};
|
|
252
|
+
if (comparableBytes.has(index))
|
|
253
|
+
comparablePayload.payload_bytes = event.payload_bytes;
|
|
254
|
+
if (comparableShapes.has(index))
|
|
255
|
+
comparablePayload.payload_shape = event.payload_shape;
|
|
256
|
+
return Object.keys(comparablePayload).length === 0
|
|
257
|
+
? null
|
|
258
|
+
: comparablePayload;
|
|
259
|
+
}))
|
|
260
|
+
.map((stream) => digestCanonicalValue(stream))
|
|
261
|
+
.sort(compareUnicodeCodePoints));
|
|
262
|
+
const identity = `wss_${groupKey}`;
|
|
263
|
+
left.set(identity, project(beforeGroup));
|
|
264
|
+
right.set(identity, project(afterGroup));
|
|
265
|
+
}
|
|
266
|
+
return [left, right];
|
|
267
|
+
};
|
|
131
268
|
const webMcpMap = (discovery) => discovery === null
|
|
132
269
|
? new Map()
|
|
133
270
|
: keyed(discovery.tools.items, (tool) => tool.tool_key);
|
|
@@ -147,7 +284,9 @@ const incompleteSections = (completeness) => new Set([
|
|
|
147
284
|
const domProjection = (inspection) => ({
|
|
148
285
|
frames: inspection.frames
|
|
149
286
|
.map(({ url, origin }) => ({ url, origin }))
|
|
150
|
-
.sort((left, right) => left.url
|
|
287
|
+
.sort((left, right) => compareUnicodeCodePoints(left.url, right.url) ||
|
|
288
|
+
compareUnicodeCodePoints(left.origin ?? "", right.origin ?? "") ||
|
|
289
|
+
Number(left.origin !== null) - Number(right.origin !== null)),
|
|
151
290
|
nodes: inspection.dom.nodes.map(({ index: _index, ...node }) => node),
|
|
152
291
|
});
|
|
153
292
|
const scriptProjection = (script) => ({
|
|
@@ -162,17 +301,18 @@ const scriptProjection = (script) => ({
|
|
|
162
301
|
const metadataProjection = (inspection) => ({
|
|
163
302
|
responses: inspection.metadata.responses
|
|
164
303
|
.map(({ request_id: _requestId, ...response }) => response)
|
|
165
|
-
.map((value) =>
|
|
304
|
+
.map((value) => digestCanonicalValue(value))
|
|
305
|
+
.sort(),
|
|
306
|
+
dom_urls: inspection.metadata.dom_urls
|
|
307
|
+
.map((value) => digestCanonicalValue(value))
|
|
166
308
|
.sort(),
|
|
167
|
-
dom_urls: inspection.metadata.dom_urls.map((value) => digest(value)).sort(),
|
|
168
309
|
agent_hints: inspection.metadata.agent_hints
|
|
169
|
-
.map((value) =>
|
|
310
|
+
.map((value) => digestCanonicalValue(value))
|
|
170
311
|
.sort(),
|
|
171
312
|
excluded_dom_urls: inspection.metadata.excluded_dom_urls,
|
|
172
313
|
headers_allowlisted: inspection.metadata.headers_allowlisted,
|
|
173
314
|
});
|
|
174
315
|
const singleton = (key, value) => new Map([[key, value]]);
|
|
175
|
-
const digest = (value) => canonicalDigest(value);
|
|
176
316
|
const accessibilityComparable = (inspection) => {
|
|
177
317
|
const text = inspection.accessibility.text_capture.status === "included" &&
|
|
178
318
|
inspection.accessibility.text_capture.excluded_fields === 0;
|
|
@@ -209,7 +349,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
209
349
|
const map = new Map([
|
|
210
350
|
[
|
|
211
351
|
"storage:summary",
|
|
212
|
-
|
|
352
|
+
digestCanonicalValue({
|
|
213
353
|
origin: storage.origin,
|
|
214
354
|
values_redacted: storage.values_redacted,
|
|
215
355
|
...(includeUsage
|
|
@@ -225,7 +365,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
225
365
|
return map;
|
|
226
366
|
const add = (kind, keys) => {
|
|
227
367
|
for (const key of keys) {
|
|
228
|
-
map.set(`storage:${kind}:${key}`,
|
|
368
|
+
map.set(`storage:${kind}:${key}`, digestCanonicalValue(key));
|
|
229
369
|
}
|
|
230
370
|
};
|
|
231
371
|
add("local_storage", storage.local_storage_keys);
|
|
@@ -236,7 +376,7 @@ const storageMap = (storage, includeKeys, includeUsage, fingerprintIdentities) =
|
|
|
236
376
|
const identity = `${fingerprint.scope}:${fingerprint.identity_sha256}`;
|
|
237
377
|
if (!fingerprintIdentities.has(identity))
|
|
238
378
|
continue;
|
|
239
|
-
map.set(`storage:content:${identity}`,
|
|
379
|
+
map.set(`storage:content:${identity}`, digestCanonicalValue(fingerprint.value_sha256));
|
|
240
380
|
}
|
|
241
381
|
return map;
|
|
242
382
|
};
|
|
@@ -50,12 +50,6 @@ const dimensionSchema = z.union([
|
|
|
50
50
|
reason: z.string(),
|
|
51
51
|
}),
|
|
52
52
|
]);
|
|
53
|
-
const legacyUnknownDimension = {
|
|
54
|
-
status: "unknown",
|
|
55
|
-
total_changes: 0,
|
|
56
|
-
changes: [],
|
|
57
|
-
reason: "Dimension was not recorded by this version 1 capture diff.",
|
|
58
|
-
};
|
|
59
53
|
/** Completeness-aware changes across stable browser evidence dimensions. */
|
|
60
54
|
export const webCaptureDiffSchema = z
|
|
61
55
|
.object({
|
|
@@ -69,8 +63,8 @@ export const webCaptureDiffSchema = z
|
|
|
69
63
|
network: dimensionSchema,
|
|
70
64
|
metadata: dimensionSchema,
|
|
71
65
|
webmcp: dimensionSchema,
|
|
72
|
-
accessibility: dimensionSchema
|
|
73
|
-
storage: dimensionSchema
|
|
66
|
+
accessibility: dimensionSchema,
|
|
67
|
+
storage: dimensionSchema,
|
|
74
68
|
}),
|
|
75
69
|
limitations: z.array(z.string()),
|
|
76
70
|
})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
3
4
|
/** Assign deterministic identities to a bounded resource inventory. */
|
|
4
5
|
export const stableWebResources = (resources) => {
|
|
5
6
|
const keyed = resources.map((resource) => ({
|
|
@@ -8,8 +9,8 @@ export const stableWebResources = (resources) => {
|
|
|
8
9
|
}));
|
|
9
10
|
return [
|
|
10
11
|
...new Map(keyed.map((resource) => [resource.resource_key, resource])).values(),
|
|
11
|
-
].sort((left, right) => left.resource_key
|
|
12
|
-
left.url
|
|
12
|
+
].sort((left, right) => compareUnicodeCodePoints(left.resource_key, right.resource_key) ||
|
|
13
|
+
compareUnicodeCodePoints(left.url, right.url));
|
|
13
14
|
};
|
|
14
15
|
/** Reconcile one script with resource-tree observations without fuzzy matching. */
|
|
15
16
|
export const reconcileWebScript = (script, resources) => {
|
|
@@ -2,8 +2,8 @@ import { z } from "zod";
|
|
|
2
2
|
import { browserCompletenessSchema } from "./browserCompleteness.js";
|
|
3
3
|
import { browserAllowedOriginsSchema, browserEndpointSchema, } from "./browserObservation.js";
|
|
4
4
|
import { browserVersionSchema } from "./browserObservationSchemas.js";
|
|
5
|
-
import {
|
|
6
|
-
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
|
+
import { jsonValueSchema } from "./jsonValue.js";
|
|
6
|
+
import { digestSchema, prefixedDigestSchema } from "./../domain/digests.js";
|
|
7
7
|
/** Input for passive discovery of page-registered WebMCP tools. */
|
|
8
8
|
export const discoverWebMcpToolsInputSchema = z.strictObject({
|
|
9
9
|
cdp_endpoint: browserEndpointSchema,
|
|
@@ -19,7 +19,8 @@ const webMcpToolSchema = z.object({
|
|
|
19
19
|
frame_url: z.string(),
|
|
20
20
|
owner_origin: z.string(),
|
|
21
21
|
declaration_kind: z.enum(["declarative", "imperative"]),
|
|
22
|
-
|
|
22
|
+
input_schema: jsonValueSchema.nullable(),
|
|
23
|
+
input_schema_sha256: digestSchema.nullable(),
|
|
23
24
|
annotations: z.object({
|
|
24
25
|
read_only: z.boolean().nullable(),
|
|
25
26
|
untrusted_content: z.boolean().nullable(),
|
|
@@ -24,7 +24,7 @@ const sourceSchema = z.discriminatedUnion("kind", [
|
|
|
24
24
|
}),
|
|
25
25
|
z.strictObject({
|
|
26
26
|
kind: z.literal("scenario-response"),
|
|
27
|
-
transaction_id: z.string().
|
|
27
|
+
transaction_id: z.string().min(1),
|
|
28
28
|
request_sequence: z.number().int().min(1),
|
|
29
29
|
response_sequence: z.number().int().min(1).nullable(),
|
|
30
30
|
status: z.number().nullable(),
|
|
@@ -4,10 +4,16 @@ export class WebScriptExportError extends ArtifactOperationError {
|
|
|
4
4
|
userMessage;
|
|
5
5
|
cleanupIncomplete;
|
|
6
6
|
cleanupResources;
|
|
7
|
-
constructor(reason, target, diagnostic,
|
|
8
|
-
super("export_web_scripts", reason);
|
|
7
|
+
constructor(reason, target, diagnostic, options = {}) {
|
|
8
|
+
super("export_web_scripts", reason, undefined, undefined, options);
|
|
9
9
|
this.userMessage = `Script export failed for ${target}: ${diagnostic}`;
|
|
10
|
-
this.cleanupResources =
|
|
11
|
-
|
|
10
|
+
this.cleanupResources = [
|
|
11
|
+
...new Set([
|
|
12
|
+
...(options.cleanup?.resources ?? []),
|
|
13
|
+
...(options.residualPaths ?? []),
|
|
14
|
+
]),
|
|
15
|
+
];
|
|
16
|
+
this.cleanupIncomplete =
|
|
17
|
+
options.cleanup !== undefined || (options.residualPaths?.length ?? 0) > 0;
|
|
12
18
|
}
|
|
13
19
|
}
|
|
@@ -18,7 +18,7 @@ export const planWebScriptExport = (scripts) => {
|
|
|
18
18
|
};
|
|
19
19
|
const candidate = candidates[index];
|
|
20
20
|
const reason = conflicts.has(index)
|
|
21
|
-
? "Captured paths collide by content version
|
|
21
|
+
? "Captured paths collide by content version or file/directory prefix."
|
|
22
22
|
: (candidate?.reason ?? null);
|
|
23
23
|
const path = reason === null ? candidate?.path : undefined;
|
|
24
24
|
return {
|
|
@@ -74,8 +74,9 @@ const candidatePath = (script) => {
|
|
|
74
74
|
: null,
|
|
75
75
|
};
|
|
76
76
|
};
|
|
77
|
-
// Register every prefix so
|
|
78
|
-
//
|
|
77
|
+
// Register every exact prefix so a repeated path, or a file that is also a
|
|
78
|
+
// directory prefix, isolates every affected source. Case-distinct spellings
|
|
79
|
+
// stay distinct until the destination filesystem reports a collision.
|
|
79
80
|
const conflictingPaths = (candidates) => {
|
|
80
81
|
const prefixes = new Map();
|
|
81
82
|
candidates.forEach(({ path }, index) => {
|
|
@@ -84,23 +85,16 @@ const conflictingPaths = (candidates) => {
|
|
|
84
85
|
const parts = path.split("/");
|
|
85
86
|
parts.forEach((_, position) => {
|
|
86
87
|
const spelling = parts.slice(0, position + 1).join("/");
|
|
87
|
-
const
|
|
88
|
-
const entry = prefixes.get(key) ?? {
|
|
89
|
-
spellings: new Set(),
|
|
90
|
-
indices: [],
|
|
91
|
-
files: [],
|
|
92
|
-
};
|
|
93
|
-
entry.spellings.add(spelling);
|
|
88
|
+
const entry = prefixes.get(spelling) ?? { indices: [], files: [] };
|
|
94
89
|
entry.indices.push(index);
|
|
95
90
|
if (position === parts.length - 1)
|
|
96
91
|
entry.files.push(index);
|
|
97
|
-
prefixes.set(
|
|
92
|
+
prefixes.set(spelling, entry);
|
|
98
93
|
});
|
|
99
94
|
});
|
|
100
95
|
const conflicts = new Set();
|
|
101
96
|
for (const entry of prefixes.values())
|
|
102
|
-
if (entry.
|
|
103
|
-
entry.files.length > 1 ||
|
|
97
|
+
if (entry.files.length > 1 ||
|
|
104
98
|
(entry.files.length > 0 && entry.indices.length > entry.files.length))
|
|
105
99
|
for (const index of entry.indices)
|
|
106
100
|
conflicts.add(index);
|
|
@@ -17,7 +17,8 @@ export const zipPackageFormatForPath = (path) => {
|
|
|
17
17
|
return "zip";
|
|
18
18
|
if (lower.endsWith(".ipa"))
|
|
19
19
|
return "ipa";
|
|
20
|
-
|
|
20
|
+
// An Android App Bundle is a ZIP archive, not a standalone APK.
|
|
21
|
+
if (lower.endsWith(".apk"))
|
|
21
22
|
return "apk";
|
|
22
23
|
if (lower.endsWith(".msix") || lower.endsWith(".msixbundle"))
|
|
23
24
|
return "msix";
|
|
@@ -25,3 +26,5 @@ export const zipPackageFormatForPath = (path) => {
|
|
|
25
26
|
return "appx";
|
|
26
27
|
return undefined;
|
|
27
28
|
};
|
|
29
|
+
/** Inventory cannot see bytes that are not central-directory entries. */
|
|
30
|
+
export const ZIP_NON_ENTRY_TAIL_LIMITATION = "ZIP inventory lists central-directory entries only. Bytes after the central directory, including an APK Signing Block or a ZIP comment, are not occurrences.";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* An array schema's own constraints, such as a minimum length, without its
|
|
4
|
+
* element schema. Pair it with {@link parseElementSteps} to validate a large
|
|
5
|
+
* collection in cooperative steps.
|
|
6
|
+
*/
|
|
7
|
+
export const arrayContainerSchema = (array) => array.clone({ ...array.def, element: z.unknown() });
|
|
8
|
+
/** Elements validated between yields, in the issues and paths a whole-array parse reports. */
|
|
9
|
+
export function* parseElementSteps(element, values, path, issues) {
|
|
10
|
+
const parsed = [];
|
|
11
|
+
for (const [index, value] of values.entries()) {
|
|
12
|
+
if (index % 64 === 0)
|
|
13
|
+
yield;
|
|
14
|
+
const result = element.safeParse(value);
|
|
15
|
+
if (result.success)
|
|
16
|
+
parsed.push(result.data);
|
|
17
|
+
else
|
|
18
|
+
issues.push(...result.error.issues.map((issue) => ({
|
|
19
|
+
...issue,
|
|
20
|
+
path: [...path, index, ...issue.path],
|
|
21
|
+
})));
|
|
22
|
+
}
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { admitManagedProjection, managedDecodeBudget, } from "./ManagedDecodeBudget.js";
|
|
1
2
|
import { managedArtifactInspectionSchema, } from "../domain/managed/managedArtifact.js";
|
|
2
3
|
import { readManagedPeLayout, } from "./ManagedPeReader.js";
|
|
3
4
|
import { managedTableRowCounts, readManagedMetadataInventory, readManagedResourceDirectory, } from "./ManagedMetadataInventory.js";
|
|
@@ -73,7 +74,7 @@ const unavailableResult = (target, bytes, layout) => {
|
|
|
73
74
|
: [
|
|
74
75
|
"The PE has no CLI data directory; managed metadata and CIL are unavailable.",
|
|
75
76
|
];
|
|
76
|
-
return managedArtifactInspectionSchema.parse({
|
|
77
|
+
return managedArtifactInspectionSchema.parse(admitManagedProjection({
|
|
77
78
|
...base(target, bytes, layout),
|
|
78
79
|
classification: {
|
|
79
80
|
status: malformed ? "malformed" : "not-managed",
|
|
@@ -83,7 +84,9 @@ const unavailableResult = (target, bytes, layout) => {
|
|
|
83
84
|
managed_architecture: "unknown",
|
|
84
85
|
evidence: [
|
|
85
86
|
{
|
|
86
|
-
code: malformed
|
|
87
|
+
code: malformed
|
|
88
|
+
? "cli-directory-malformed"
|
|
89
|
+
: "cli-directory-absent",
|
|
87
90
|
detail: limitations[0],
|
|
88
91
|
file_offset: layout.cliIssue?.offset ?? null,
|
|
89
92
|
},
|
|
@@ -106,7 +109,7 @@ const unavailableResult = (target, bytes, layout) => {
|
|
|
106
109
|
issues,
|
|
107
110
|
},
|
|
108
111
|
limitations,
|
|
109
|
-
});
|
|
112
|
+
}));
|
|
110
113
|
};
|
|
111
114
|
const runtimeFamilyFor = (cli, inventory, metadata, layout) => {
|
|
112
115
|
const evidence = [
|
|
@@ -198,7 +201,7 @@ const runtimeClassification = ({ layout, metadata, inventory, }) => {
|
|
|
198
201
|
const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
|
|
199
202
|
...base(target, bytes, layout),
|
|
200
203
|
classification: {
|
|
201
|
-
status: "malformed",
|
|
204
|
+
status: issue.code === "resource-limit" ? "managed" : "malformed",
|
|
202
205
|
container: "pe",
|
|
203
206
|
runtime_family: (layout.cli?.flags ?? 1) & 1 ? "unknown" : "mixed-clr-native",
|
|
204
207
|
implementation: "unknown",
|
|
@@ -212,7 +215,7 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
|
|
|
212
215
|
],
|
|
213
216
|
},
|
|
214
217
|
metadata: {
|
|
215
|
-
status: "malformed",
|
|
218
|
+
status: issue.code === "resource-limit" ? "partial" : "malformed",
|
|
216
219
|
version: null,
|
|
217
220
|
stream_names: [],
|
|
218
221
|
table_row_counts: {},
|
|
@@ -225,7 +228,9 @@ const partialMetadataResult = ({ target, bytes, layout, issue, }) => ({
|
|
|
225
228
|
attributes: [],
|
|
226
229
|
coverage: { state: "partial", issues: [issue] },
|
|
227
230
|
limitations: [
|
|
228
|
-
|
|
231
|
+
issue.code === "resource-limit"
|
|
232
|
+
? "CLI metadata inspection stopped at its representation budget; omitted facts are unknown."
|
|
233
|
+
: "CLI metadata could not be read because the PE/CLI structure is malformed or unsupported.",
|
|
229
234
|
],
|
|
230
235
|
});
|
|
231
236
|
/** Inspect PE/CLI identity directly from local bytes without CLR loading. */
|
|
@@ -242,48 +247,55 @@ export const inspectManagedArtifactBytes = (bytes, target) => {
|
|
|
242
247
|
catch (cause) {
|
|
243
248
|
if (!(cause instanceof ManagedReaderFailure))
|
|
244
249
|
throw cause;
|
|
245
|
-
return managedArtifactInspectionSchema.parse(partialMetadataResult({
|
|
250
|
+
return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({
|
|
246
251
|
target,
|
|
247
252
|
bytes,
|
|
248
253
|
layout,
|
|
249
254
|
issue: cause.issue,
|
|
250
|
-
}));
|
|
255
|
+
})));
|
|
251
256
|
}
|
|
252
257
|
const resourceIssues = [];
|
|
253
258
|
const resourceDirectory = readManagedResourceDirectory(layout, resourceIssues);
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
259
|
+
try {
|
|
260
|
+
const inventory = readManagedMetadataInventory(bytes, metadata, resourceDirectory);
|
|
261
|
+
const issues = [...resourceIssues, ...inventory.issues];
|
|
262
|
+
const limitations = [
|
|
263
|
+
...(issues.length === 0
|
|
264
|
+
? []
|
|
265
|
+
: [
|
|
266
|
+
"At least one metadata or resource item could not be read; coverage is partial.",
|
|
267
|
+
]),
|
|
268
|
+
"Static inspection did not load the assembly, resolve dependencies through a CLR, decompile C#, or execute target code.",
|
|
269
|
+
];
|
|
270
|
+
return managedArtifactInspectionSchema.parse(admitManagedProjection({
|
|
271
|
+
...base(target, bytes, layout),
|
|
272
|
+
classification: {
|
|
273
|
+
status: "managed",
|
|
274
|
+
container: "pe",
|
|
275
|
+
...runtimeClassification({ layout, metadata, inventory }),
|
|
276
|
+
},
|
|
277
|
+
metadata: {
|
|
278
|
+
status: issues.length === 0 ? "complete" : "partial",
|
|
279
|
+
version: metadata.version,
|
|
280
|
+
stream_names: metadata.streamNames,
|
|
281
|
+
table_row_counts: managedTableRowCounts(metadata),
|
|
282
|
+
},
|
|
283
|
+
module: inventory.module,
|
|
284
|
+
assembly: inventory.assembly,
|
|
285
|
+
target_frameworks: inventory.targetFrameworks,
|
|
286
|
+
references: inventory.references,
|
|
287
|
+
resources: inventory.resources,
|
|
288
|
+
attributes: inventory.attributes,
|
|
289
|
+
coverage: {
|
|
290
|
+
state: issues.length === 0 ? "complete" : "partial",
|
|
291
|
+
issues,
|
|
292
|
+
},
|
|
293
|
+
limitations,
|
|
294
|
+
}, managedDecodeBudget(metadata)));
|
|
295
|
+
}
|
|
296
|
+
catch (cause) {
|
|
297
|
+
if (!(cause instanceof ManagedReaderFailure))
|
|
298
|
+
throw cause;
|
|
299
|
+
return managedArtifactInspectionSchema.parse(admitManagedProjection(partialMetadataResult({ target, bytes, layout, issue: cause.issue })));
|
|
300
|
+
}
|
|
289
301
|
};
|