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
|
@@ -56,6 +56,49 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
|
|
|
56
56
|
files_after: [],
|
|
57
57
|
filesystem_effects: [],
|
|
58
58
|
truncated: false,
|
|
59
|
+
truncation_details: {
|
|
60
|
+
raw_terminal: {
|
|
61
|
+
budget_bytes: 1_000_000,
|
|
62
|
+
observed_bytes: 0,
|
|
63
|
+
retained_bytes: 0,
|
|
64
|
+
observed_frames: 0,
|
|
65
|
+
retained_frames: 0,
|
|
66
|
+
},
|
|
67
|
+
rendered_terminal: {
|
|
68
|
+
budget_bytes: 1_000_000,
|
|
69
|
+
observed_bytes: 0,
|
|
70
|
+
retained_bytes: 0,
|
|
71
|
+
observed_frames: 0,
|
|
72
|
+
retained_frames: 0,
|
|
73
|
+
},
|
|
74
|
+
filesystem_before: {
|
|
75
|
+
files_limit: 10_000,
|
|
76
|
+
depth_limit: 16,
|
|
77
|
+
enumeration_truncated: false,
|
|
78
|
+
enumeration_reasons: [],
|
|
79
|
+
hash_budget_bytes: 10_000_000,
|
|
80
|
+
hashed_bytes: 0,
|
|
81
|
+
hash_omissions: [],
|
|
82
|
+
},
|
|
83
|
+
filesystem_after: {
|
|
84
|
+
files_limit: 10_000,
|
|
85
|
+
depth_limit: 16,
|
|
86
|
+
enumeration_truncated: false,
|
|
87
|
+
enumeration_reasons: [],
|
|
88
|
+
hash_budget_bytes: 10_000_000,
|
|
89
|
+
hashed_bytes: 0,
|
|
90
|
+
hash_omissions: [],
|
|
91
|
+
},
|
|
92
|
+
process: {
|
|
93
|
+
sample_limit: 1_000,
|
|
94
|
+
sampling_partial: false,
|
|
95
|
+
retained_samples: 0,
|
|
96
|
+
sample_limit_reached: false,
|
|
97
|
+
sampling_failures: 0,
|
|
98
|
+
first_sampling_failure: null,
|
|
99
|
+
coverage: "sampled",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
59
102
|
limitations: [],
|
|
60
103
|
residual_unknowns: [],
|
|
61
104
|
cleanup: {
|
|
@@ -63,3 +106,27 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
|
|
|
63
106
|
temporary_root: "removed",
|
|
64
107
|
},
|
|
65
108
|
};
|
|
109
|
+
const finalizedScenario = { ...scenario, finalization_ms: 1_500 };
|
|
110
|
+
const finalizedComparisonContract = { finalization_ms: 1_500 };
|
|
111
|
+
/** Valid capture of a timeout that finalized: SIGTERM delivered, exit observed. */
|
|
112
|
+
export const FINALIZED_PROCESS_CAPTURE_EXAMPLE = {
|
|
113
|
+
...EMPTY_PROCESS_CAPTURE_EXAMPLE,
|
|
114
|
+
manifest: {
|
|
115
|
+
...EMPTY_PROCESS_CAPTURE_EXAMPLE.manifest,
|
|
116
|
+
scenario: finalizedScenario,
|
|
117
|
+
comparison_contract: finalizedComparisonContract,
|
|
118
|
+
full_scenario_sha256: digestProcessCommitment(finalizedScenario),
|
|
119
|
+
comparison_contract_sha256: digestProcessCommitment(finalizedComparisonContract),
|
|
120
|
+
},
|
|
121
|
+
exit: {
|
|
122
|
+
code: null,
|
|
123
|
+
signal: 0,
|
|
124
|
+
reason: "timeout",
|
|
125
|
+
finalization: {
|
|
126
|
+
requested_ms: 1_500,
|
|
127
|
+
elapsed_ms: 12,
|
|
128
|
+
exit_code: 0,
|
|
129
|
+
signals: [{ signal: "SIGTERM", sent_at_ms: 0, delivery: "signaled" }],
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
};
|
|
@@ -64,6 +64,83 @@ const validateEventJournal = (capture, require) => {
|
|
|
64
64
|
require(journal.length ===
|
|
65
65
|
expectedSize, "event_journal", "nonempty journal must reference every captured observation");
|
|
66
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* The committed comparison contract carries `finalization_ms` exactly when the
|
|
69
|
+
* committed scenario does, with the same value. Independent of the exit, so a
|
|
70
|
+
* partial capture with an unavailable exit is still checked.
|
|
71
|
+
*/
|
|
72
|
+
export const finalizationManifestIssue = (committedScenario, committedComparison) => committedScenario !== undefined &&
|
|
73
|
+
committedComparison !== undefined &&
|
|
74
|
+
committedScenario["finalization_ms"] !==
|
|
75
|
+
committedComparison["finalization_ms"]
|
|
76
|
+
? "comparison_contract finalization_ms must match the committed scenario"
|
|
77
|
+
: undefined;
|
|
78
|
+
/** Ensure incomplete exit and sibling finalization observations preserve one fact. */
|
|
79
|
+
export const finalizationAgreementIssue = (exitFinalization, observedFinalization) => exitFinalization !== undefined &&
|
|
80
|
+
observedFinalization !== undefined &&
|
|
81
|
+
JSON.stringify(exitFinalization) !== JSON.stringify(observedFinalization)
|
|
82
|
+
? "exit finalization and finalization observation must agree"
|
|
83
|
+
: undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Cross-field rule for `exit.finalization`, shared by complete and partial
|
|
86
|
+
* captures. Returns the violated rule, or undefined when the record is
|
|
87
|
+
* consistent.
|
|
88
|
+
*/
|
|
89
|
+
export const finalizationConsistencyIssue = (exit, committedScenario, committedComparison, options) => {
|
|
90
|
+
const manifestIssue = finalizationManifestIssue(committedScenario, committedComparison);
|
|
91
|
+
if (manifestIssue !== undefined)
|
|
92
|
+
return manifestIssue;
|
|
93
|
+
const finalization = exit?.finalization ?? options?.finalization;
|
|
94
|
+
if (finalization === undefined) {
|
|
95
|
+
// A deadline that fired under a committed interval must have attempted
|
|
96
|
+
// finalization; cancellation before the deadline legitimately has none.
|
|
97
|
+
const committed = committedScenario?.["finalization_ms"];
|
|
98
|
+
return (exit?.reason === "timeout" || exit?.reason === "idle_timeout") &&
|
|
99
|
+
typeof committed === "number" &&
|
|
100
|
+
committed > 0
|
|
101
|
+
? "a deadline exit under a committed finalization_ms requires finalization evidence"
|
|
102
|
+
: undefined;
|
|
103
|
+
}
|
|
104
|
+
if (exit?.reason === "exited")
|
|
105
|
+
return "finalization requires a deadline exit reason";
|
|
106
|
+
const first = finalization.signals[0];
|
|
107
|
+
if (first?.signal !== "SIGTERM")
|
|
108
|
+
return "finalization signals must start with SIGTERM";
|
|
109
|
+
const killIndexes = finalization.signals.flatMap(({ signal }, index) => signal === "SIGKILL" ? [index] : []);
|
|
110
|
+
if (killIndexes.length > 1 ||
|
|
111
|
+
(killIndexes[0] !== undefined &&
|
|
112
|
+
killIndexes[0] !== finalization.signals.length - 1))
|
|
113
|
+
return "finalization may contain at most one final SIGKILL";
|
|
114
|
+
if (!finalization.signals.every(({ sent_at_ms }, index) => {
|
|
115
|
+
const previous = finalization.signals[index - 1];
|
|
116
|
+
return previous === undefined || sent_at_ms >= previous.sent_at_ms;
|
|
117
|
+
}))
|
|
118
|
+
return "finalization signal attempt times must not decrease";
|
|
119
|
+
if (finalization.signals.filter(({ signal }) => signal === "SIGTERM").length !==
|
|
120
|
+
1)
|
|
121
|
+
return "finalization must attempt SIGTERM exactly once";
|
|
122
|
+
const kill = finalization.signals.find(({ signal }) => signal === "SIGKILL");
|
|
123
|
+
if (kill !== undefined &&
|
|
124
|
+
kill.sent_at_ms < finalization.requested_ms &&
|
|
125
|
+
exit !== undefined &&
|
|
126
|
+
exit.reason !== "cancelled")
|
|
127
|
+
return "finalization SIGKILL cannot precede the requested interval";
|
|
128
|
+
if (finalization.elapsed_ms === null && options?.allowNullElapsedMs !== true)
|
|
129
|
+
return "finalization requires an observed elapsed_ms";
|
|
130
|
+
if (finalization.exit_code !== null &&
|
|
131
|
+
exit?.signal !== undefined &&
|
|
132
|
+
exit.signal !== null &&
|
|
133
|
+
exit.signal !== 0)
|
|
134
|
+
return "finalization exit_code requires an exit not caused by a signal";
|
|
135
|
+
if (finalization.elapsed_ms !== null &&
|
|
136
|
+
finalization.elapsed_ms <
|
|
137
|
+
(finalization.signals.at(-1)?.sent_at_ms ?? first.sent_at_ms))
|
|
138
|
+
return "finalization elapsed_ms cannot precede the last signal attempt";
|
|
139
|
+
if (committedScenario !== undefined &&
|
|
140
|
+
committedScenario["finalization_ms"] !== finalization.requested_ms)
|
|
141
|
+
return "finalization must match the committed finalization_ms";
|
|
142
|
+
return undefined;
|
|
143
|
+
};
|
|
67
144
|
const validateLifecycle = (capture, require) => {
|
|
68
145
|
require(capture.filesystem_checkpoints.map(({ name }) => name).join(",") ===
|
|
69
146
|
"before,after_settlement", "filesystem_checkpoints", "capture must include initial and final filesystem snapshots");
|
|
@@ -73,11 +150,11 @@ const validateLifecycle = (capture, require) => {
|
|
|
73
150
|
require(capture.exit.reason === "exited" ||
|
|
74
151
|
capture.exit.code ===
|
|
75
152
|
null, "exit", "deadline termination cannot declare a normal exit code");
|
|
153
|
+
const finalizationIssue = finalizationConsistencyIssue(capture.exit, capture.manifest.scenario, capture.manifest.comparison_contract);
|
|
154
|
+
require(finalizationIssue === undefined, "exit", finalizationIssue ?? "");
|
|
76
155
|
};
|
|
77
156
|
const validateCoverage = (capture, require) => {
|
|
78
157
|
const details = capture.truncation_details;
|
|
79
|
-
if (details === undefined)
|
|
80
|
-
return;
|
|
81
158
|
require(details.process.retained_samples === capture.process_samples.length &&
|
|
82
159
|
details.process.retained_samples <= details.process.sample_limit &&
|
|
83
160
|
details.process.sampling_partial ===
|
|
@@ -134,7 +211,10 @@ const validateCoverage = (capture, require) => {
|
|
|
134
211
|
new Set(coverage.hash_omissions.map(({ path }) => path)).size ===
|
|
135
212
|
unhashedFiles.size &&
|
|
136
213
|
coverage.hash_omissions.every((omission) => unhashedFiles.get(omission.path)?.size === omission.size_bytes &&
|
|
137
|
-
omission.remaining_budget_bytes <= coverage.hash_budget_bytes
|
|
214
|
+
omission.remaining_budget_bytes <= coverage.hash_budget_bytes &&
|
|
215
|
+
(omission.reason === "file_unavailable"
|
|
216
|
+
? omission.system_code !== null
|
|
217
|
+
: omission.system_code === null)), `truncation_details.${name}.hash_omissions`, "every retained regular file without a digest must have one matching omission reason");
|
|
138
218
|
require(coverage.hashed_bytes ===
|
|
139
219
|
files
|
|
140
220
|
.filter((file) => file.type === "file" && file.sha256 !== null)
|
|
@@ -202,19 +202,6 @@ const differingContractFields = (left, right) => [...new Set([...Object.keys(lef
|
|
|
202
202
|
!Object.hasOwn(right, field) ||
|
|
203
203
|
canonicalize(left[field]) !== canonicalize(right[field]))
|
|
204
204
|
.sort();
|
|
205
|
-
const truncatedComparison = () => ({
|
|
206
|
-
status: "truncated",
|
|
207
|
-
terminal: "truncated",
|
|
208
|
-
interaction: "truncated",
|
|
209
|
-
exit: "truncated",
|
|
210
|
-
filesystem: "truncated",
|
|
211
|
-
process: "truncated",
|
|
212
|
-
first_divergence: {
|
|
213
|
-
status: "unknown",
|
|
214
|
-
reason: "At least one capture is truncated.",
|
|
215
|
-
},
|
|
216
|
-
limitations: ["At least one capture is truncated."],
|
|
217
|
-
});
|
|
218
205
|
const applyTraceVerdict = (dimensions, specification, trace, captures) => {
|
|
219
206
|
const traceShowsDifference = processTraceOutcomesDiffer(trace);
|
|
220
207
|
const traceStatus = trace.verdict === "unknown"
|
|
@@ -275,16 +262,6 @@ const compareDimensions = (left, right, sameNormalization) => {
|
|
|
275
262
|
*/
|
|
276
263
|
export const compareProcessCaptures = (left, right, options = {}) => {
|
|
277
264
|
assertComparable(left, right, options);
|
|
278
|
-
if ((left.truncated && left.truncation_details === undefined) ||
|
|
279
|
-
(right.truncated && right.truncation_details === undefined)) {
|
|
280
|
-
const truncated = truncatedComparison();
|
|
281
|
-
return options.traceSpecification === undefined
|
|
282
|
-
? truncated
|
|
283
|
-
: {
|
|
284
|
-
...truncated,
|
|
285
|
-
trace: compareProcessTraces(left, right, options.traceSpecification),
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
265
|
const sameNormalization = sameJsonValue(left.normalization, right.normalization);
|
|
289
266
|
const exactDimensions = compareDimensions(left, right, sameNormalization);
|
|
290
267
|
const trace = options.traceSpecification === undefined
|
|
@@ -2,9 +2,15 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
const positiveBudget = z.number().int().safe().positive();
|
|
5
|
+
/**
|
|
6
|
+
* Maximum xterm backing cells for one visible-plus-scrollback buffer. Each
|
|
7
|
+
* xterm BufferLine stores three Uint32 words per cell (12 MB at this cap),
|
|
8
|
+
* before row objects, serialization strings, and retained frame copies.
|
|
9
|
+
*/
|
|
10
|
+
export const PROCESS_TERMINAL_CELL_BUDGET = 1_000_000;
|
|
5
11
|
const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
|
|
6
12
|
const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
|
|
7
|
-
const ENVIRONMENT_NAME_CHARACTER = "[^=\\
|
|
13
|
+
const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
|
|
8
14
|
/**
|
|
9
15
|
* Nonempty environment names other than the reserved run identifier. The
|
|
10
16
|
* exclusion is spelled as a complement instead of a negative look-ahead,
|
|
@@ -18,7 +24,7 @@ const environmentNamePattern = (reserved) => {
|
|
|
18
24
|
const character = reserved[index] ?? "";
|
|
19
25
|
// Diverge here, match the next reserved character, or (after a nonempty
|
|
20
26
|
// prefix) end the name early.
|
|
21
|
-
const choice = `[^=\\
|
|
27
|
+
const choice = `[^=\\x00${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
|
|
22
28
|
rest = index === 0 ? choice : `(?:${choice})?`;
|
|
23
29
|
}
|
|
24
30
|
return new RegExp(`^(?:${rest})$`, "u");
|
|
@@ -33,7 +39,8 @@ const environmentName = z
|
|
|
33
39
|
});
|
|
34
40
|
const childProcessString = z
|
|
35
41
|
.string()
|
|
36
|
-
.regex(/^[^\
|
|
42
|
+
.regex(/^[^\x00]*$/u, "Values passed to operating-system APIs cannot contain NUL");
|
|
43
|
+
const fitsProcessTerminalCellBudget = (columns, rows, scrollback) => rows + scrollback <= Math.floor(PROCESS_TERMINAL_CELL_BUDGET / columns);
|
|
37
44
|
export const normalizationSchema = z.object({
|
|
38
45
|
paths: z.boolean(),
|
|
39
46
|
pids: z.boolean(),
|
|
@@ -60,11 +67,17 @@ const committedScenarioEvents = (events, includeSensitiveInputLength) => events.
|
|
|
60
67
|
}
|
|
61
68
|
: event);
|
|
62
69
|
/** Build the caller-selected scenario projection committed by process-capture Evidence. */
|
|
63
|
-
export const processScenarioCommitment = (scenario, executableSha256) =>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
export const processScenarioCommitment = (scenario, executableSha256) => {
|
|
71
|
+
// A zero interval is today's immediate kill; leaving it out keeps the
|
|
72
|
+
// committed identity of every scenario that predates the field unchanged.
|
|
73
|
+
const { finalization_ms: finalizationMs, ...committed } = scenario;
|
|
74
|
+
return {
|
|
75
|
+
...committed,
|
|
76
|
+
...(finalizationMs > 0 ? { finalization_ms: finalizationMs } : {}),
|
|
77
|
+
events: committedScenarioEvents(scenario.events, true),
|
|
78
|
+
executable_sha256: executableSha256 ?? null,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
68
81
|
/** Project observation settings shared by capture and reconstruction. */
|
|
69
82
|
export const processComparisonContract = (scenario) => ({
|
|
70
83
|
working_directory: scenario.working_directory,
|
|
@@ -79,11 +92,18 @@ export const processComparisonContract = (scenario) => ({
|
|
|
79
92
|
timeout_ms: scenario.timeout_ms,
|
|
80
93
|
idle_timeout_ms: scenario.idle_timeout_ms,
|
|
81
94
|
settle_ms: scenario.settle_ms,
|
|
95
|
+
...(scenario.finalization_ms > 0
|
|
96
|
+
? { finalization_ms: scenario.finalization_ms }
|
|
97
|
+
: {}),
|
|
82
98
|
limits: scenario.limits,
|
|
83
99
|
normalization: scenario.normalization,
|
|
84
100
|
...(scenario.normalization.ports
|
|
85
101
|
? { port_normalization_version: "contextual-endpoints-v2" }
|
|
86
102
|
: {}),
|
|
103
|
+
...(scenario.normalization.patterns.length > 0
|
|
104
|
+
? { pattern_normalization_version: "literal-replacements-v1" }
|
|
105
|
+
: {}),
|
|
106
|
+
rendered_line_format: "trailing-spaces-trimmed-v1",
|
|
87
107
|
});
|
|
88
108
|
/**
|
|
89
109
|
* Boundary schema for one bounded process experiment.
|
|
@@ -102,8 +122,9 @@ export const processScenarioSchema = z
|
|
|
102
122
|
.strictObject({
|
|
103
123
|
columns: z.number().int().min(1).max(65_535).default(80),
|
|
104
124
|
rows: z.number().int().min(1).max(65_535).default(24),
|
|
105
|
-
scrollback: z.number().int().
|
|
125
|
+
scrollback: z.number().int().safe().nonnegative().default(1_000),
|
|
106
126
|
})
|
|
127
|
+
.describe("The visible terminal and scrollback together must use at most 1,000,000 xterm renderer cells: columns × (rows + scrollback). Resize events use the same scrollback and limit.")
|
|
107
128
|
.default({ columns: 80, rows: 24, scrollback: 1_000 }),
|
|
108
129
|
events: z
|
|
109
130
|
.array(z.discriminatedUnion("type", [
|
|
@@ -129,6 +150,13 @@ export const processScenarioSchema = z
|
|
|
129
150
|
timeout_ms: positiveBudget.default(30_000),
|
|
130
151
|
idle_timeout_ms: positiveBudget.default(30_000),
|
|
131
152
|
settle_ms: z.number().int().safe().nonnegative().default(100),
|
|
153
|
+
finalization_ms: z
|
|
154
|
+
.number()
|
|
155
|
+
.int()
|
|
156
|
+
.safe()
|
|
157
|
+
.nonnegative()
|
|
158
|
+
.default(0)
|
|
159
|
+
.describe("Milliseconds a target may keep running after SIGTERM when timeout_ms or idle_timeout_ms fires, before SIGKILL; 0 sends SIGKILL immediately. Both signals reach the captured root only while its launch-time start identity still matches; cancellation ends the run at once."),
|
|
132
160
|
limits: z
|
|
133
161
|
.strictObject({
|
|
134
162
|
output_bytes: positiveBudget.default(1_000_000),
|
|
@@ -169,6 +197,23 @@ export const processScenarioSchema = z
|
|
|
169
197
|
}),
|
|
170
198
|
})
|
|
171
199
|
.superRefine((scenario, context) => {
|
|
200
|
+
// Each budget is a safe integer, but their sum is not checked anywhere
|
|
201
|
+
// else. BigInt keeps the comparison exact beyond the representable range.
|
|
202
|
+
const lifecycleBudget = BigInt(scenario.timeout_ms) +
|
|
203
|
+
BigInt(scenario.finalization_ms) +
|
|
204
|
+
BigInt(scenario.settle_ms);
|
|
205
|
+
if (lifecycleBudget > BigInt(Number.MAX_SAFE_INTEGER))
|
|
206
|
+
context.addIssue({
|
|
207
|
+
code: "custom",
|
|
208
|
+
message: `timeout_ms + finalization_ms + settle_ms must stay at or below ${String(Number.MAX_SAFE_INTEGER)} ms, the largest total exactly representable as a JavaScript number`,
|
|
209
|
+
path: ["timeout_ms"],
|
|
210
|
+
});
|
|
211
|
+
if (!fitsProcessTerminalCellBudget(scenario.terminal.columns, scenario.terminal.rows, scenario.terminal.scrollback))
|
|
212
|
+
context.addIssue({
|
|
213
|
+
code: "custom",
|
|
214
|
+
path: ["terminal"],
|
|
215
|
+
message: `terminal columns × (rows + scrollback) must not exceed ${String(PROCESS_TERMINAL_CELL_BUDGET)} renderer cells`,
|
|
216
|
+
});
|
|
172
217
|
for (let index = 1; index < scenario.events.length; index += 1) {
|
|
173
218
|
const event = scenario.events[index];
|
|
174
219
|
const previous = scenario.events[index - 1];
|
|
@@ -180,7 +225,14 @@ export const processScenarioSchema = z
|
|
|
180
225
|
});
|
|
181
226
|
}
|
|
182
227
|
}
|
|
183
|
-
for (const event of scenario.events) {
|
|
228
|
+
for (const [index, event] of scenario.events.entries()) {
|
|
229
|
+
if (event.type === "resize" &&
|
|
230
|
+
!fitsProcessTerminalCellBudget(event.columns, event.rows, scenario.terminal.scrollback))
|
|
231
|
+
context.addIssue({
|
|
232
|
+
code: "custom",
|
|
233
|
+
path: ["events", index],
|
|
234
|
+
message: `resize event at ${String(event.at_ms)} ms exceeds the ${String(PROCESS_TERMINAL_CELL_BUDGET)}-cell renderer budget with the selected scrollback`,
|
|
235
|
+
});
|
|
184
236
|
if (event.at_ms > scenario.timeout_ms) {
|
|
185
237
|
context.addIssue({
|
|
186
238
|
code: "custom",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { processSourceTruncated } from "./processCaptureCoverage.js";
|
|
3
|
-
import { processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
|
|
4
|
-
import { canonicalTraceJson,
|
|
3
|
+
import { comparableProcessObservationPayload, processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
|
|
4
|
+
import { canonicalTraceJson, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
|
|
5
5
|
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._\x2d]{0,63}$/u);
|
|
6
6
|
const matchedEventSchema = z.strictObject({
|
|
7
7
|
event_id: identifierSchema,
|
|
@@ -121,10 +121,10 @@ const matchRecords = (records, specification) => {
|
|
|
121
121
|
for (const event of specification.events) {
|
|
122
122
|
const ignoredFields = event.ignore_fields ?? [];
|
|
123
123
|
ignoredFieldsBySource.set(event.source, ignoredFields);
|
|
124
|
-
eventsByKey.set(`${event.source}\0${canonicalTraceJson(
|
|
124
|
+
eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`, event);
|
|
125
125
|
}
|
|
126
126
|
for (const record of records) {
|
|
127
|
-
const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(
|
|
127
|
+
const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableProcessObservationPayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
|
|
128
128
|
if (match === undefined)
|
|
129
129
|
return failure({
|
|
130
130
|
kind: "predicate",
|
|
@@ -86,8 +86,6 @@ export const canonicalTraceJson = (value) => {
|
|
|
86
86
|
throw new TypeError("Trace specification contains a non-JSON value");
|
|
87
87
|
return serialized;
|
|
88
88
|
};
|
|
89
|
-
/** Remove only explicitly declared schedule metadata before exact matching. */
|
|
90
|
-
export const comparableTracePayload = (value, ignoredFields = []) => comparableProcessObservationPayload(value, ignoredFields);
|
|
91
89
|
export const processTraceCardinalityBounds = (cardinality) => {
|
|
92
90
|
switch (cardinality.kind) {
|
|
93
91
|
case "required":
|
|
@@ -352,7 +350,7 @@ export const processTraceSpecificationSchema = specificationShapeSchema.superRef
|
|
|
352
350
|
message: "exact payload must omit every ignored schedule field",
|
|
353
351
|
path: ["events", index, "exact"],
|
|
354
352
|
});
|
|
355
|
-
const predicate = `${event.source}\0${canonicalTraceJson(
|
|
353
|
+
const predicate = `${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`;
|
|
356
354
|
if (predicates.has(predicate))
|
|
357
355
|
context.addIssue({
|
|
358
356
|
code: "custom",
|
|
@@ -2,7 +2,9 @@ import { parse } from "plist";
|
|
|
2
2
|
/** The dictionary key REA results cannot carry: validation strips it. */
|
|
3
3
|
const PROTOTYPE_KEY = "__proto__";
|
|
4
4
|
/** Limitation for results whose source plist held `__proto__` entries. */
|
|
5
|
-
export const omittedPrototypeKeysLimitation = (count) =>
|
|
5
|
+
export const omittedPrototypeKeysLimitation = (count) => count === null
|
|
6
|
+
? "Dictionary entries keyed __proto__ were omitted because REA results cannot represent that key."
|
|
7
|
+
: `${String(count)} dictionary ${count === 1 ? "entry" : "entries"} keyed __proto__ ${count === 1 ? "was" : "were"} omitted because REA results cannot represent that key.`;
|
|
6
8
|
const withoutKey = (value, key) => {
|
|
7
9
|
let omitted = 0;
|
|
8
10
|
const strip = (item) => {
|
|
@@ -7,8 +7,12 @@ export class ProviderCleanupError extends ProviderAdapterError {
|
|
|
7
7
|
constructor(providerId, resources, diagnostics,
|
|
8
8
|
/** Identify the operation owning these resources; binary callers retain their default. */
|
|
9
9
|
options) {
|
|
10
|
-
const { operation = "close_binary", ...errorOptions } = options ?? {};
|
|
11
|
-
super(providerId, operation, {
|
|
10
|
+
const { operation = "close_binary", partialObservation, ...errorOptions } = options ?? {};
|
|
11
|
+
super(providerId, operation, {
|
|
12
|
+
...errorOptions,
|
|
13
|
+
...(partialObservation === undefined ? {} : { partialObservation }),
|
|
14
|
+
diagnostics,
|
|
15
|
+
});
|
|
12
16
|
this.cleanupResources = [...resources];
|
|
13
17
|
}
|
|
14
18
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { evidenceBundleSchema, parseEvidenceBundle } from "./evidenceBundle.js";
|
|
5
6
|
import { evaluateReconstructionClaims, evaluateReconstructionPackageProofs, evaluateReconstructionSurfaces, evaluateReconstructionCoverageRisks, recommendedReconstructionProbes, } from "./reconstructionCoverageEvaluation.js";
|
|
6
7
|
import { digestSchema } from "./../domain/digests.js";
|
|
@@ -315,7 +316,7 @@ const closureStatus = (reasons) => {
|
|
|
315
316
|
return "unknown";
|
|
316
317
|
return "partial";
|
|
317
318
|
};
|
|
318
|
-
const reasonOrder = (left, right) =>
|
|
319
|
+
const reasonOrder = (left, right) => compareUnicodeCodePoints(compositeKey([left.code, left.subject_id]), compositeKey([right.code, right.subject_id]));
|
|
319
320
|
const digest = (value) => {
|
|
320
321
|
const encoded = canonicalize(value);
|
|
321
322
|
if (encoded === undefined)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
2
|
+
import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
|
|
2
3
|
/** Select the latest revision of each residual unknown. */
|
|
3
4
|
export const reconstructionUnknownHeads = (revisions) => {
|
|
4
5
|
const heads = new Map();
|
|
@@ -44,7 +45,7 @@ export const reconstructionClaimUnknowns = (heads, comparisonId, sourceIds) => {
|
|
|
44
45
|
const unknown = heads.get(id);
|
|
45
46
|
return unknown === undefined ? [] : [unknown];
|
|
46
47
|
})
|
|
47
|
-
.sort((left, right) => left.unknown_id
|
|
48
|
+
.sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id));
|
|
48
49
|
};
|
|
49
50
|
/** Aggregate deterministic probes for unresolved claims. */
|
|
50
51
|
export const reconstructionProbes = (results, heads) => {
|
|
@@ -57,7 +58,7 @@ export const reconstructionProbes = (results, heads) => {
|
|
|
57
58
|
const probes = unknowns.flatMap(({ recommended_probes: items }) => items);
|
|
58
59
|
const candidates = probes.length > 0 ? probes : [defaultProbe(result.kind)];
|
|
59
60
|
for (const probe of candidates) {
|
|
60
|
-
const key =
|
|
61
|
+
const key = compositeKey([probe.operation, probe.rationale]);
|
|
61
62
|
const current = output.get(key) ?? {
|
|
62
63
|
...probe,
|
|
63
64
|
claim_ids: [],
|
|
@@ -71,7 +72,7 @@ export const reconstructionProbes = (results, heads) => {
|
|
|
71
72
|
output.set(key, current);
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
const sorted = [...output.values()].sort((left, right) =>
|
|
75
|
+
const sorted = [...output.values()].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.operation, left.rationale]), compositeKey([right.operation, right.rationale])));
|
|
75
76
|
return sorted;
|
|
76
77
|
};
|
|
77
78
|
const defaultProbe = (kind) => kind === "behavioral"
|
|
@@ -4,6 +4,7 @@ import { z } from "zod";
|
|
|
4
4
|
import { artifactComparisonResultSchema } from "./artifactComparison.js";
|
|
5
5
|
import { artifactInventoryResultSchema } from "./artifactGraph.js";
|
|
6
6
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
7
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
7
8
|
import { comparisonSourceEvidenceSides } from "./comparisonSourceEvidence.js";
|
|
8
9
|
import { parseEvidence } from "./evidence.js";
|
|
9
10
|
import { parseEvidenceBundle } from "./evidenceBundle.js";
|
|
@@ -42,7 +43,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
|
|
|
42
43
|
const heads = reconstructionUnknownHeads(bundle.unknowns);
|
|
43
44
|
const results = specification.claims
|
|
44
45
|
.map((claim) => evaluateClaim(claim, records, heads))
|
|
45
|
-
.sort((left, right) => left.claim_id
|
|
46
|
+
.sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id));
|
|
46
47
|
const failed = count(results, "fail");
|
|
47
48
|
const unresolved = count(results, "unknown");
|
|
48
49
|
const probes = reconstructionProbes(results, heads);
|
|
@@ -51,7 +52,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
|
|
|
51
52
|
status: failed > 0 ? "fail" : unresolved > 0 ? "unknown" : "pass",
|
|
52
53
|
specification_sha256: digest({
|
|
53
54
|
...specification,
|
|
54
|
-
claims: [...specification.claims].sort((left, right) => left.claim_id
|
|
55
|
+
claims: [...specification.claims].sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id)),
|
|
55
56
|
}),
|
|
56
57
|
summary: {
|
|
57
58
|
total: results.length,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import {
|
|
3
|
+
import { canonicalJson } from "./comparisonSemantics.js";
|
|
4
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
5
|
+
import { createReferenceSourcePathLookup, isPortableAbsoluteReferenceTarget, } from "./referenceSourcePathIdentity.js";
|
|
4
6
|
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
5
7
|
import { digestSchema } from "./../domain/digests.js";
|
|
6
8
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
@@ -66,13 +68,10 @@ const sourceDirectorySchema = z.strictObject({
|
|
|
66
68
|
const symlinkTargetSchema = z
|
|
67
69
|
.string()
|
|
68
70
|
.min(1)
|
|
69
|
-
.refine((target) =>
|
|
71
|
+
.refine((target) => isPortableAbsoluteReferenceTarget(target) ||
|
|
70
72
|
(!target.startsWith("/") &&
|
|
71
73
|
!target.includes("\\") &&
|
|
72
74
|
posix.normalize(target) === target), "Expected a normalized POSIX symlink target");
|
|
73
|
-
const isPortableAbsoluteSymlinkTarget = (target) => target.startsWith("/") ||
|
|
74
|
-
/^[A-Za-z]:[\\/]/u.test(target) ||
|
|
75
|
-
/^\\\\[^\\/]+[\\/][^\\/]+/u.test(target);
|
|
76
75
|
const sourceSymlinkSchema = z.union([
|
|
77
76
|
z.strictObject({
|
|
78
77
|
...entryBaseShape,
|
|
@@ -104,17 +103,22 @@ const parseFailureSchema = z.strictObject({
|
|
|
104
103
|
parser: z.string().min(1),
|
|
105
104
|
reason: boundedTextSchema,
|
|
106
105
|
});
|
|
107
|
-
const exclusionSchema = z.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
})
|
|
106
|
+
const exclusionSchema = z.discriminatedUnion("reason", [
|
|
107
|
+
z.strictObject({
|
|
108
|
+
path: relativePathSchema,
|
|
109
|
+
reason: z.enum([
|
|
110
|
+
"configured-secret",
|
|
111
|
+
"project-ignored",
|
|
112
|
+
"default-ignored",
|
|
113
|
+
"caller-excluded",
|
|
114
|
+
]),
|
|
115
|
+
pattern: boundedTextSchema,
|
|
116
|
+
}),
|
|
117
|
+
z.strictObject({
|
|
118
|
+
path: relativePathSchema,
|
|
119
|
+
reason: z.enum(["symlink-escape", "unreadable"]),
|
|
120
|
+
}),
|
|
121
|
+
]);
|
|
118
122
|
const vcsSchema = z
|
|
119
123
|
.discriminatedUnion("kind", [
|
|
120
124
|
z.strictObject({
|
|
@@ -230,12 +234,13 @@ const checkRelationships = (graph, paths, context) => {
|
|
|
230
234
|
}
|
|
231
235
|
};
|
|
232
236
|
const checkSymlinks = (graph, paths, context) => {
|
|
237
|
+
const lookupPath = createReferenceSourcePathLookup(paths);
|
|
233
238
|
for (const [index, entry] of graph.entries.entries()) {
|
|
234
239
|
if (entry.kind !== "symlink")
|
|
235
240
|
continue;
|
|
236
241
|
if (entry.target === null)
|
|
237
242
|
continue;
|
|
238
|
-
const absolute =
|
|
243
|
+
const absolute = isPortableAbsoluteReferenceTarget(entry.target);
|
|
239
244
|
if ((entry.target_state === "external" && !absolute) ||
|
|
240
245
|
(entry.target_state === "internal" && absolute))
|
|
241
246
|
context.addIssue({
|
|
@@ -246,7 +251,10 @@ const checkSymlinks = (graph, paths, context) => {
|
|
|
246
251
|
if (entry.target_state !== "internal")
|
|
247
252
|
continue;
|
|
248
253
|
const resolved = posix.normalize(posix.join(posix.dirname(entry.path), entry.target));
|
|
249
|
-
if (resolved.startsWith("../") ||
|
|
254
|
+
if (resolved.startsWith("../") ||
|
|
255
|
+
resolved === ".." ||
|
|
256
|
+
// The inventory root is implicit rather than an entry with path ".".
|
|
257
|
+
(resolved !== "." && lookupPath.resolve(resolved) === undefined))
|
|
250
258
|
context.addIssue({
|
|
251
259
|
code: "custom",
|
|
252
260
|
message: "Internal symlink target must resolve to an inventoried entry",
|
|
@@ -283,7 +291,7 @@ function checkGraphInvariants(graph, context) {
|
|
|
283
291
|
checkSortedUnique(graph.manifests, "manifests", context);
|
|
284
292
|
checkSortedUnique(graph.relationships.map(relationshipKey), "relationships", context);
|
|
285
293
|
checkSortedUnique(graph.parse_failures.map(historicalSourceParseFailureKey), "parse_failures", context);
|
|
286
|
-
checkSortedUnique(graph.exclusions.map((
|
|
294
|
+
checkSortedUnique(graph.exclusions.map((exclusion) => `${exclusion.path}\u0000${exclusion.reason}\u0000${"pattern" in exclusion ? exclusion.pattern : ""}`), "exclusions", context);
|
|
287
295
|
if (canonicalJson(graph.languages, "Reference source graph") !==
|
|
288
296
|
canonicalJson(historicalSourceLanguages(graph.entries), "Reference source graph"))
|
|
289
297
|
context.addIssue({
|
|
@@ -331,7 +339,7 @@ const rootCommitment = (entries, exclusions) => ({
|
|
|
331
339
|
}),
|
|
332
340
|
exclusions,
|
|
333
341
|
});
|
|
334
|
-
const computeRootSha256 = (entries, exclusions) =>
|
|
342
|
+
const computeRootSha256 = (entries, exclusions) => digestCanonicalValue(rootCommitment(entries, exclusions), "Reference source graph");
|
|
335
343
|
/** Build and internally commit a normalized historical source graph. */
|
|
336
344
|
export const createHistoricalSourceGraph = (input) => {
|
|
337
345
|
const parsed = historicalSourceGraphInputSchema.parse(input);
|
|
@@ -343,7 +351,7 @@ export const createHistoricalSourceGraph = (input) => {
|
|
|
343
351
|
/** Parse a graph and reject stale or caller-invented root commitments. */
|
|
344
352
|
export const parseHistoricalSourceGraph = (input) => historicalSourceGraphSchema.parse(input);
|
|
345
353
|
/** Compute a deterministic graph commitment containing no absolute root path. */
|
|
346
|
-
export const computeHistoricalSourceGraphSha256 = (input) =>
|
|
354
|
+
export const computeHistoricalSourceGraphSha256 = (input) => digestCanonicalValue(parseHistoricalSourceGraph(input), "Reference source graph");
|
|
347
355
|
/** Build a deterministic, relocation-independent manifest for a source graph. */
|
|
348
356
|
export const createHistoricalSourceManifest = (input) => {
|
|
349
357
|
const graph = parseHistoricalSourceGraph(input);
|
|
@@ -358,14 +366,15 @@ export const createHistoricalSourceManifest = (input) => {
|
|
|
358
366
|
};
|
|
359
367
|
return historicalSourceManifestBaseSchema.parse({
|
|
360
368
|
...semantic,
|
|
361
|
-
manifest_id: `hsm_${
|
|
369
|
+
manifest_id: `hsm_${digestCanonicalValue(semantic, "Reference source graph")}`,
|
|
362
370
|
});
|
|
363
371
|
};
|
|
364
372
|
/** Parse and verify a historical source manifest's semantic identifier. */
|
|
365
373
|
export const parseHistoricalSourceManifest = (input) => {
|
|
366
374
|
const manifest = historicalSourceManifestBaseSchema.parse(input);
|
|
367
375
|
const { manifest_id: manifestId, ...semantic } = manifest;
|
|
368
|
-
if (`hsm_${
|
|
376
|
+
if (`hsm_${digestCanonicalValue(semantic, "Reference source graph")}` !==
|
|
377
|
+
manifestId)
|
|
369
378
|
throw new TypeError("Historical source manifest identifier does not match");
|
|
370
379
|
return manifest;
|
|
371
380
|
};
|