rea-agents 6.3.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +51 -19
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +22 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +70 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +66 -31
- package/dist/application/DirectAnalysis.js +2 -2
- package/dist/application/DirectAnalysisCleanup.js +1 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +5 -3
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +6 -0
- package/dist/application/JsonFiles.js +6 -5
- package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
- package/dist/application/LinuxHopper.js +4 -12
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +9 -3
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +93 -7
- package/dist/application/Setup.js +54 -6
- package/dist/application/SetupClientConfiguration.js +116 -16
- package/dist/application/SetupHost.js +102 -24
- package/dist/application/SetupPlan.js +5 -8
- package/dist/application/SetupSkill.js +58 -39
- package/dist/application/SupportedClients.js +290 -65
- package/dist/application/Uninstall.js +158 -10
- package/dist/application/UpdateMaintenance.js +17 -21
- package/dist/application/Utf8JsonInput.js +7 -0
- package/dist/application/WebScriptExportService.js +131 -65
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/BinarySession.js +2 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +20 -15
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +176 -102
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
- package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +75 -32
- package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +62 -25
- package/dist/artifacts/inventory/scanReader.js +38 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +5 -0
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +32 -10
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
- package/dist/browser/PlaywrightScenarioSession.js +127 -54
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +3 -3
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreBinaryCommands.js +0 -5
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +6 -1
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +17 -1
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +11 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/utilityCommands.js +66 -18
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +6 -0
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +2 -2
- package/dist/cliObservationOptions.js +3 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/directAnalysis.js +12 -4
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +10 -10
- package/dist/contracts/javascript/electronToolContracts.js +15 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionToolContracts.js +2 -2
- package/dist/contracts/sessionToolSchemas.js +6 -2
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +5 -3
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -6
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +2 -1
- package/dist/domain/analysisView/analysisView.js +52 -2
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +2 -2
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +35 -7
- package/dist/domain/artifactGraph.js +5 -3
- package/dist/domain/artifactIdentity.js +30 -2
- package/dist/domain/artifactInspection.js +3 -43
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +11 -12
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/evidence.js +2 -1
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
- package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
- package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
- package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
- package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
- package/dist/domain/javascript/javascriptAstValues.js +32 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
- package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
- package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonShape.js +63 -52
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/managed/managedApplicationGraph.js +37 -0
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +91 -1
- package/dist/domain/process/processCaptureExample.js +24 -0
- package/dist/domain/process/processCaptureValidation.js +79 -0
- package/dist/domain/process/processScenario.js +59 -7
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/referenceSourceGraph.js +25 -16
- package/dist/domain/referenceSourceImportParsing.js +6 -3
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/webBundleAnalyzerInspection.js +14 -2
- package/dist/domain/webCaptureDiff.js +102 -4
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +55 -24
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +33 -1
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +76 -4
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +1 -1
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +80 -39
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +8 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +3 -1
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/NativeMacOSProvider.js +91 -16
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +96 -39
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +28 -4
- package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessHarness.js +194 -26
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +97 -25
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +32 -3
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +49 -18
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +33 -5
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
|
@@ -12,6 +12,27 @@ const reference = z.strictObject({
|
|
|
12
12
|
indirect: z.boolean(),
|
|
13
13
|
computed: z.boolean(),
|
|
14
14
|
operand_index: z.number().int(),
|
|
15
|
+
source_address: z.string().min(1).nullable().optional(),
|
|
16
|
+
data: z.boolean().nullable().optional(),
|
|
17
|
+
read: z.boolean().nullable().optional(),
|
|
18
|
+
write: z.boolean().nullable().optional(),
|
|
19
|
+
primary: z
|
|
20
|
+
.boolean()
|
|
21
|
+
.nullable()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Provider primary-reference status, not proof of literal addressing or a runtime access. Null or omission means unavailable."),
|
|
24
|
+
provenance: z
|
|
25
|
+
.string()
|
|
26
|
+
.min(1)
|
|
27
|
+
.nullable()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Provider subsystem reporting this reference; null or omission means unavailable."),
|
|
30
|
+
source: z
|
|
31
|
+
.string()
|
|
32
|
+
.min(1)
|
|
33
|
+
.nullable()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Provider reference origin, such as analysis, default, imported or user_defined; null or omission means unavailable."),
|
|
15
36
|
});
|
|
16
37
|
/** Provider-decoded facts for one instruction; operand tokens preserve their native ordering. */
|
|
17
38
|
export const nativeInstructionSchema = z.strictObject({
|
|
@@ -4,6 +4,8 @@ const relatedType = z.strictObject({ address, type: z.string().nullable() });
|
|
|
4
4
|
/** Runtime-format metadata recovered in an analysis image, with explicit inference boundaries. */
|
|
5
5
|
export const nativeMetadataRecoverySchema = z.strictObject({
|
|
6
6
|
format: z.literal("dotnet-nativeaot"),
|
|
7
|
+
/** Identifies parser-only facts without claiming Ghidra defined a DataType. */
|
|
8
|
+
source: z.enum(["analysis-database", "read-only-derived-overlay"]).optional(),
|
|
7
9
|
status: z.enum(["complete", "partial"]),
|
|
8
10
|
header_address: address,
|
|
9
11
|
format_major: z.number().int().nonnegative(),
|
|
@@ -21,18 +23,25 @@ export const nativeMetadataRecoverySchema = z.strictObject({
|
|
|
21
23
|
procedure_name: z.string().nullable(),
|
|
22
24
|
basis: z.literal("method-table-pointer"),
|
|
23
25
|
})),
|
|
24
|
-
derived_memory: z
|
|
26
|
+
derived_memory: z
|
|
27
|
+
.strictObject({
|
|
25
28
|
address,
|
|
26
29
|
size_bytes: z.number().int().nonnegative(),
|
|
27
30
|
sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
28
31
|
file_offset: z.null(),
|
|
29
|
-
})
|
|
32
|
+
})
|
|
33
|
+
.nullable(),
|
|
34
|
+
truncated: z.boolean().optional(),
|
|
35
|
+
virtual_slots_omitted: z.number().int().nonnegative().optional(),
|
|
36
|
+
interfaces_omitted: z.number().int().nonnegative().optional(),
|
|
37
|
+
output_budget_bytes: z.number().int().nonnegative().optional(),
|
|
30
38
|
diagnostics: z.array(z.string()),
|
|
31
39
|
limitations: z.array(z.string()),
|
|
32
40
|
});
|
|
33
41
|
/** Discover a recovered runtime format and reusable type identities from the loaded image. */
|
|
34
42
|
export const nativeMetadataRecoverySummarySchema = z.strictObject({
|
|
35
43
|
format: z.literal("dotnet-nativeaot"),
|
|
44
|
+
analysis_mode: z.literal("read-only-derived-overlay").optional(),
|
|
36
45
|
status: z.enum(["complete", "partial", "not_applicable"]),
|
|
37
46
|
reason: z.string().nullable(),
|
|
38
47
|
analysis_artifact_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
@@ -42,12 +51,76 @@ export const nativeMetadataRecoverySummarySchema = z.strictObject({
|
|
|
42
51
|
format_minor: z.number().int().nonnegative().nullable(),
|
|
43
52
|
method_tables: z.number().int().nonnegative(),
|
|
44
53
|
types: z.array(relatedType),
|
|
45
|
-
|
|
54
|
+
frozen_strings: z
|
|
55
|
+
.array(z.strictObject({ address, value: z.string() }))
|
|
56
|
+
.optional(),
|
|
57
|
+
truncated: z.boolean().optional(),
|
|
58
|
+
types_omitted: z.number().int().nonnegative().optional(),
|
|
59
|
+
frozen_strings_omitted: z.number().int().nonnegative().optional(),
|
|
60
|
+
output_budget_bytes: z.number().int().nonnegative().optional(),
|
|
61
|
+
derived_overlay: z
|
|
62
|
+
.strictObject({
|
|
63
|
+
address,
|
|
64
|
+
size_bytes: z.number().int().nonnegative(),
|
|
65
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
66
|
+
})
|
|
67
|
+
.nullable()
|
|
68
|
+
.optional(),
|
|
69
|
+
derived_memory: nativeMetadataRecoverySchema.shape.derived_memory,
|
|
46
70
|
coverage: z
|
|
47
71
|
.strictObject({
|
|
48
|
-
frozen_object_candidates: z.number().int().nonnegative(),
|
|
49
|
-
frozen_objects_annotated: z.number().int().nonnegative(),
|
|
50
|
-
|
|
72
|
+
frozen_object_candidates: z.number().int().nonnegative().optional(),
|
|
73
|
+
frozen_objects_annotated: z.number().int().nonnegative().optional(),
|
|
74
|
+
pointer_candidates_examined: z.number().int().nonnegative().optional(),
|
|
75
|
+
pointer_slots_examined: z.number().int().nonnegative().optional(),
|
|
76
|
+
scan_bytes_examined: z.number().int().nonnegative().optional(),
|
|
77
|
+
scan_bytes_omitted: z.number().int().nonnegative().optional(),
|
|
78
|
+
rtr_signature_scan_bytes_examined: z
|
|
79
|
+
.number()
|
|
80
|
+
.int()
|
|
81
|
+
.nonnegative()
|
|
82
|
+
.optional(),
|
|
83
|
+
rtr_signature_scan_bytes_omitted: z
|
|
84
|
+
.number()
|
|
85
|
+
.int()
|
|
86
|
+
.nonnegative()
|
|
87
|
+
.optional(),
|
|
88
|
+
method_table_validation_items_examined: z
|
|
89
|
+
.number()
|
|
90
|
+
.int()
|
|
91
|
+
.nonnegative()
|
|
92
|
+
.optional(),
|
|
93
|
+
work_units_examined: z.number().int().nonnegative().optional(),
|
|
94
|
+
method_tables_recovered: z.number().int().nonnegative().optional(),
|
|
95
|
+
frozen_string_candidates: z.number().int().nonnegative().optional(),
|
|
96
|
+
frozen_scan_bytes_examined: z.number().int().nonnegative().optional(),
|
|
97
|
+
frozen_scan_bytes_omitted: z.number().int().nonnegative().optional(),
|
|
98
|
+
frozen_string_data_bytes_examined: z
|
|
99
|
+
.number()
|
|
100
|
+
.int()
|
|
101
|
+
.nonnegative()
|
|
102
|
+
.optional(),
|
|
103
|
+
source_bytes_examined: z.number().int().nonnegative().optional(),
|
|
104
|
+
source_bytes_omitted: z.number().int().nonnegative().optional(),
|
|
105
|
+
source_byte_budget_bytes: z.number().int().nonnegative().optional(),
|
|
106
|
+
work_budget_units: z.number().int().nonnegative().optional(),
|
|
107
|
+
working_memory_budget_bytes: z.number().int().nonnegative().optional(),
|
|
108
|
+
working_memory_bytes_peak: z.number().int().nonnegative().optional(),
|
|
109
|
+
truncation_reason: z
|
|
110
|
+
.enum([
|
|
111
|
+
"source-byte-budget",
|
|
112
|
+
"work-unit-budget",
|
|
113
|
+
"working-memory-budget",
|
|
114
|
+
"response-budget",
|
|
115
|
+
])
|
|
116
|
+
.optional(),
|
|
117
|
+
basis: z.enum([
|
|
118
|
+
"rehydrated-pointer-candidates-and-committed-instance-types",
|
|
119
|
+
"raw-image-pointer-scan",
|
|
120
|
+
"raw-image-and-rehydrated-pointer-scan",
|
|
121
|
+
"unsupported-layout",
|
|
122
|
+
"no-rtr-header",
|
|
123
|
+
]),
|
|
51
124
|
})
|
|
52
125
|
.nullable(),
|
|
53
126
|
diagnostics: z.array(z.string()),
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const uint = z.number().int().min(0).max(0xffffffff);
|
|
3
|
+
const range = z.strictObject({ offset: uint, bytes: uint });
|
|
4
|
+
const identity = z.discriminatedUnion("kind", [
|
|
5
|
+
z.strictObject({ kind: z.literal("id"), id: uint }),
|
|
6
|
+
z.strictObject({
|
|
7
|
+
kind: z.literal("name"),
|
|
8
|
+
name: z.string(),
|
|
9
|
+
utf16le_hex: z.string().regex(/^(?:[0-9a-f]{4})*$/),
|
|
10
|
+
location: range,
|
|
11
|
+
}),
|
|
12
|
+
]);
|
|
13
|
+
/** Complete bounded inspection of a caller-selected PE image, without execution. */
|
|
14
|
+
export const inspectPeResourcesInputSchema = z.strictObject({
|
|
15
|
+
path: z.string().min(1).describe("Absolute filesystem path to a PE image"),
|
|
16
|
+
max_file_bytes: z
|
|
17
|
+
.number()
|
|
18
|
+
.int()
|
|
19
|
+
.min(64)
|
|
20
|
+
.max(536870912)
|
|
21
|
+
.default(67108864)
|
|
22
|
+
.describe("Maximum stable artifact bytes to read (default 64 MiB)"),
|
|
23
|
+
max_entries: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.min(1)
|
|
27
|
+
.max(65536)
|
|
28
|
+
.default(4096)
|
|
29
|
+
.describe("Maximum resource directory entries to examine; exceeding the budget fails without partial success"),
|
|
30
|
+
});
|
|
31
|
+
/** Original file/RVA locations and resource identities; icon edges are static relationships. */
|
|
32
|
+
export const peResourcesSchema = z.strictObject({
|
|
33
|
+
artifact: z.strictObject({
|
|
34
|
+
path: z.string().min(1),
|
|
35
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
36
|
+
bytes: uint,
|
|
37
|
+
}),
|
|
38
|
+
format: z.enum(["pe32", "pe32-plus"]),
|
|
39
|
+
machine: uint,
|
|
40
|
+
directory: z
|
|
41
|
+
.strictObject({
|
|
42
|
+
rva: uint,
|
|
43
|
+
location: range,
|
|
44
|
+
data_directory_location: range,
|
|
45
|
+
})
|
|
46
|
+
.nullable(),
|
|
47
|
+
directories: z.array(z.strictObject({
|
|
48
|
+
location: range,
|
|
49
|
+
characteristics: uint,
|
|
50
|
+
timestamp: uint,
|
|
51
|
+
major_version: uint,
|
|
52
|
+
minor_version: uint,
|
|
53
|
+
named_entries: uint,
|
|
54
|
+
id_entries: uint,
|
|
55
|
+
})),
|
|
56
|
+
resources: z.array(z.strictObject({
|
|
57
|
+
index: uint,
|
|
58
|
+
type: identity,
|
|
59
|
+
name: identity,
|
|
60
|
+
language: identity,
|
|
61
|
+
entry_locations: z.array(range).length(3),
|
|
62
|
+
data_entry_location: range,
|
|
63
|
+
code_page: uint,
|
|
64
|
+
reserved: uint,
|
|
65
|
+
payload: z.strictObject({
|
|
66
|
+
rva: uint,
|
|
67
|
+
location: range,
|
|
68
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
69
|
+
}),
|
|
70
|
+
})),
|
|
71
|
+
icon_groups: z.array(z.strictObject({
|
|
72
|
+
resource_index: uint,
|
|
73
|
+
images: z.array(z.strictObject({
|
|
74
|
+
location: range,
|
|
75
|
+
width: uint,
|
|
76
|
+
height: uint,
|
|
77
|
+
color_count: uint,
|
|
78
|
+
reserved: uint,
|
|
79
|
+
planes: uint,
|
|
80
|
+
bit_count: uint,
|
|
81
|
+
declared_bytes: uint,
|
|
82
|
+
resource_id: uint,
|
|
83
|
+
candidate_resource_indices: z.array(uint),
|
|
84
|
+
same_language_resource_index: uint.nullable(),
|
|
85
|
+
size_matches: z.boolean().nullable(),
|
|
86
|
+
})),
|
|
87
|
+
})),
|
|
88
|
+
coverage: z.strictObject({
|
|
89
|
+
status: z.literal("complete"),
|
|
90
|
+
examined_entries: uint,
|
|
91
|
+
resources: uint,
|
|
92
|
+
}),
|
|
93
|
+
limitations: z.array(z.string()),
|
|
94
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Path-segment conventions. These are inferences, not observations of runtime behavior. */
|
|
2
|
+
const foldSegment = (segment) => segment.toLocaleLowerCase("en-US");
|
|
3
|
+
const REACT_NATIVE_SEGMENTS = new Set([
|
|
4
|
+
"react.framework",
|
|
5
|
+
"reactnative.framework",
|
|
6
|
+
"libreactnative.so",
|
|
7
|
+
"libreactnativejni.so",
|
|
8
|
+
"libhermes_executor.so",
|
|
9
|
+
"libhermes.so",
|
|
10
|
+
"hermes.framework",
|
|
11
|
+
]);
|
|
12
|
+
const FLUTTER_SEGMENTS = new Set(["libflutter.so", "flutter.framework"]);
|
|
13
|
+
const UNITY_SEGMENTS = new Set(["libunity.so", "unityframework.framework"]);
|
|
14
|
+
/**
|
|
15
|
+
* A runtime family named by one filename or directory segment.
|
|
16
|
+
* Only recognized complete library and framework names establish a convention.
|
|
17
|
+
*/
|
|
18
|
+
export const nativeRuntimeConvention = (path) => {
|
|
19
|
+
for (const segment of path.split("/")) {
|
|
20
|
+
const folded = foldSegment(segment);
|
|
21
|
+
if (REACT_NATIVE_SEGMENTS.has(folded))
|
|
22
|
+
return "react-native";
|
|
23
|
+
if (FLUTTER_SEGMENTS.has(folded))
|
|
24
|
+
return "flutter";
|
|
25
|
+
if (UNITY_SEGMENTS.has(folded))
|
|
26
|
+
return "unity";
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
};
|
|
30
|
+
/** Swift runtime libraries are `libswift*.dylib` segments, not every dynamic library. */
|
|
31
|
+
export const isSwiftRuntimeLibrary = (path) => path
|
|
32
|
+
.split("/")
|
|
33
|
+
.some((segment) => /^libswift.+\.dylib$/u.test(foldSegment(segment)));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
3
3
|
import { normalizationSchema } from "./processScenario.js";
|
|
4
|
-
import { collectProcessCaptureIssues } from "./processCaptureValidation.js";
|
|
4
|
+
import { collectProcessCaptureIssues, finalizationAgreementIssue, finalizationConsistencyIssue, finalizationManifestIssue, } from "./processCaptureValidation.js";
|
|
5
5
|
import { filesystemCoverageSchema, processCaptureTruncationDetailsSchema, } from "./processCaptureCoverage.js";
|
|
6
6
|
/** Capture collection whose members participate in global observation order. */
|
|
7
7
|
export const PROCESS_CAPTURE_EVENT_COLLECTIONS = [
|
|
@@ -88,6 +88,40 @@ const processSettlementSchema = z.discriminatedUnion("state", [
|
|
|
88
88
|
}),
|
|
89
89
|
]);
|
|
90
90
|
const unverifiedCleanupProcessesSchema = z.array(z.strictObject({ pid: z.number().int().positive(), reason: z.string() }));
|
|
91
|
+
const processCaptureFinalizationSchema = z
|
|
92
|
+
.strictObject({
|
|
93
|
+
requested_ms: z.number().int().safe().positive(),
|
|
94
|
+
elapsed_ms: z.number().int().nonnegative().nullable(),
|
|
95
|
+
exit_code: z.number().int().nonnegative().nullable(),
|
|
96
|
+
signals: z
|
|
97
|
+
.array(z.strictObject({
|
|
98
|
+
signal: z.enum(["SIGTERM", "SIGKILL"]),
|
|
99
|
+
sent_at_ms: z.number().int().nonnegative(),
|
|
100
|
+
delivery: z.enum([
|
|
101
|
+
"signaled",
|
|
102
|
+
"gone",
|
|
103
|
+
"identity-changed",
|
|
104
|
+
"unverified",
|
|
105
|
+
]),
|
|
106
|
+
reason: z.string().min(1).optional(),
|
|
107
|
+
}))
|
|
108
|
+
.min(1),
|
|
109
|
+
})
|
|
110
|
+
.superRefine((finalization, context) => {
|
|
111
|
+
if (finalization.exit_code !== null && finalization.elapsed_ms === null)
|
|
112
|
+
context.addIssue({
|
|
113
|
+
code: "custom",
|
|
114
|
+
path: ["exit_code"],
|
|
115
|
+
message: "finalization exit_code requires an observed exit",
|
|
116
|
+
});
|
|
117
|
+
for (const [index, attempt] of finalization.signals.entries())
|
|
118
|
+
if (attempt.reason !== undefined && attempt.delivery !== "unverified")
|
|
119
|
+
context.addIssue({
|
|
120
|
+
code: "custom",
|
|
121
|
+
path: ["signals", index, "reason"],
|
|
122
|
+
message: "finalization reason is only allowed for an unverified delivery",
|
|
123
|
+
});
|
|
124
|
+
});
|
|
91
125
|
const processCaptureShapeSchema = z.strictObject({
|
|
92
126
|
manifest: z.strictObject({
|
|
93
127
|
rea_version: z.string().min(1),
|
|
@@ -145,6 +179,7 @@ const processCaptureShapeSchema = z.strictObject({
|
|
|
145
179
|
code: z.number().int().nullable(),
|
|
146
180
|
signal: z.number().int().nullable(),
|
|
147
181
|
reason: z.enum(["exited", "timeout", "idle_timeout"]),
|
|
182
|
+
finalization: processCaptureFinalizationSchema.optional(),
|
|
148
183
|
}),
|
|
149
184
|
settlement: z.discriminatedUnion("state", [
|
|
150
185
|
z.object({
|
|
@@ -221,7 +256,9 @@ const incompleteProcessCaptureObservationsSchema = z.strictObject({
|
|
|
221
256
|
code: z.number().int().nullable(),
|
|
222
257
|
signal: z.number().int().nullable(),
|
|
223
258
|
reason: z.enum(["exited", "timeout", "idle_timeout", "cancelled"]),
|
|
259
|
+
finalization: processCaptureFinalizationSchema.optional(),
|
|
224
260
|
})),
|
|
261
|
+
finalization: partialObservationFieldSchema(processCaptureFinalizationSchema).optional(),
|
|
225
262
|
settlement: partialObservationFieldSchema(z.strictObject({
|
|
226
263
|
state: z.enum(["quiesced", "alive_at_deadline", "unverifiable"]),
|
|
227
264
|
elapsed_ms: z.number().int().nonnegative(),
|
|
@@ -265,6 +302,59 @@ export const partialProcessCaptureObservationSchema = z
|
|
|
265
302
|
path: ["execution_failure"],
|
|
266
303
|
message: "partial observations require incomplete cleanup or an execution failure",
|
|
267
304
|
});
|
|
305
|
+
const observedExit = "capture" in partial
|
|
306
|
+
? partial.capture.exit
|
|
307
|
+
: partial.observations.exit.state === "available"
|
|
308
|
+
? partial.observations.exit.value
|
|
309
|
+
: undefined;
|
|
310
|
+
const observedFinalization = "observations" in partial &&
|
|
311
|
+
partial.observations.finalization?.state === "available"
|
|
312
|
+
? partial.observations.finalization.value
|
|
313
|
+
: undefined;
|
|
314
|
+
const committedManifest = "capture" in partial
|
|
315
|
+
? partial.capture.manifest
|
|
316
|
+
: partial.observations.manifest.state === "available"
|
|
317
|
+
? partial.observations.manifest.value
|
|
318
|
+
: undefined;
|
|
319
|
+
const manifestFinalizationIssue = finalizationManifestIssue(committedManifest?.scenario, committedManifest?.comparison_contract);
|
|
320
|
+
const exitFinalizationIssue = manifestFinalizationIssue ??
|
|
321
|
+
(observedExit === undefined
|
|
322
|
+
? undefined
|
|
323
|
+
: finalizationConsistencyIssue(observedExit, committedManifest?.scenario, committedManifest?.comparison_contract));
|
|
324
|
+
const incompleteFinalizationIssue = manifestFinalizationIssue ??
|
|
325
|
+
(observedFinalization === undefined
|
|
326
|
+
? undefined
|
|
327
|
+
: finalizationConsistencyIssue(observedExit === undefined
|
|
328
|
+
? undefined
|
|
329
|
+
: { reason: observedExit.reason, signal: observedExit.signal }, committedManifest?.scenario, committedManifest?.comparison_contract, { finalization: observedFinalization, allowNullElapsedMs: true }));
|
|
330
|
+
if (exitFinalizationIssue !== undefined)
|
|
331
|
+
context.addIssue({
|
|
332
|
+
code: "custom",
|
|
333
|
+
path: ["exit"],
|
|
334
|
+
message: exitFinalizationIssue,
|
|
335
|
+
});
|
|
336
|
+
if (incompleteFinalizationIssue !== undefined)
|
|
337
|
+
context.addIssue({
|
|
338
|
+
code: "custom",
|
|
339
|
+
path: ["finalization"],
|
|
340
|
+
message: incompleteFinalizationIssue,
|
|
341
|
+
});
|
|
342
|
+
const agreementIssue = finalizationAgreementIssue(observedExit?.finalization, observedFinalization);
|
|
343
|
+
if (agreementIssue !== undefined)
|
|
344
|
+
context.addIssue({
|
|
345
|
+
code: "custom",
|
|
346
|
+
path: ["finalization"],
|
|
347
|
+
message: agreementIssue,
|
|
348
|
+
});
|
|
349
|
+
if ("observations" in partial &&
|
|
350
|
+
partial.observations.exit.state === "unavailable" &&
|
|
351
|
+
observedFinalization !== undefined &&
|
|
352
|
+
observedFinalization?.elapsed_ms !== null)
|
|
353
|
+
context.addIssue({
|
|
354
|
+
code: "custom",
|
|
355
|
+
path: ["finalization"],
|
|
356
|
+
message: "finalization elapsed_ms must be null when the exit observation is unavailable",
|
|
357
|
+
});
|
|
268
358
|
if ("observations" in partial) {
|
|
269
359
|
const { observations } = partial;
|
|
270
360
|
if (![
|
|
@@ -106,3 +106,27 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
|
|
|
106
106
|
temporary_root: "removed",
|
|
107
107
|
},
|
|
108
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,6 +150,8 @@ 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;
|
|
@@ -2,6 +2,12 @@ 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
13
|
const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
|
|
@@ -34,6 +40,7 @@ const environmentName = z
|
|
|
34
40
|
const childProcessString = z
|
|
35
41
|
.string()
|
|
36
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",
|
|
@@ -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) => {
|