rea-agents 3.0.0 → 3.2.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,5 +1,81 @@
|
|
|
1
1
|
import { Script, SourceTextModule, SyntheticModule, createContext, } from "node:vm";
|
|
2
2
|
import { types } from "node:util";
|
|
3
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
const record = (value, label) => {
|
|
5
|
+
if (!isRecord(value))
|
|
6
|
+
throw new TypeError(`Invalid replay worker ${label}`);
|
|
7
|
+
return value;
|
|
8
|
+
};
|
|
9
|
+
const string = (value, label) => {
|
|
10
|
+
if (typeof value !== "string")
|
|
11
|
+
throw new TypeError(`Invalid replay worker ${label}`);
|
|
12
|
+
return value;
|
|
13
|
+
};
|
|
14
|
+
const integer = (value, label) => {
|
|
15
|
+
if (!Number.isSafeInteger(value) || Number(value) < 0)
|
|
16
|
+
throw new TypeError(`Invalid replay worker ${label}`);
|
|
17
|
+
return Number(value);
|
|
18
|
+
};
|
|
19
|
+
const parseWorkerModule = (value) => {
|
|
20
|
+
const module = record(value, "module");
|
|
21
|
+
const format = module.format;
|
|
22
|
+
if (format !== "esm" && format !== "commonjs-factory")
|
|
23
|
+
throw new TypeError("Invalid replay worker module format");
|
|
24
|
+
const dependencies = record(module.dependencies, "module dependencies");
|
|
25
|
+
if (Object.values(dependencies).some((dependency) => typeof dependency !== "string"))
|
|
26
|
+
throw new TypeError("Invalid replay worker module dependency");
|
|
27
|
+
return {
|
|
28
|
+
alias: string(module.alias, "module alias"),
|
|
29
|
+
format,
|
|
30
|
+
dependencies: Object.fromEntries(Object.entries(dependencies).map(([key, dependency]) => [
|
|
31
|
+
key,
|
|
32
|
+
string(dependency, "module dependency"),
|
|
33
|
+
])),
|
|
34
|
+
source: string(module.source, "module source"),
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const parseWorkerSide = (value) => {
|
|
38
|
+
const side = record(value, "side");
|
|
39
|
+
if (!Array.isArray(side.modules))
|
|
40
|
+
throw new TypeError("Invalid replay worker modules");
|
|
41
|
+
return {
|
|
42
|
+
modules: side.modules.map(parseWorkerModule),
|
|
43
|
+
entryAlias: string(side.entryAlias, "entry alias"),
|
|
44
|
+
entryExport: string(side.entryExport, "entry export"),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const parseWorkerRequest = (value) => {
|
|
48
|
+
const request = record(value, "request");
|
|
49
|
+
if (!Array.isArray(request.cases))
|
|
50
|
+
throw new TypeError("Invalid replay worker cases");
|
|
51
|
+
const determinism = record(request.determinism, "determinism");
|
|
52
|
+
const limits = record(request.limits, "limits");
|
|
53
|
+
return {
|
|
54
|
+
left: parseWorkerSide(request.left),
|
|
55
|
+
...(request.right === undefined
|
|
56
|
+
? {}
|
|
57
|
+
: { right: parseWorkerSide(request.right) }),
|
|
58
|
+
cases: request.cases.map((value) => {
|
|
59
|
+
const replayCase = record(value, "case");
|
|
60
|
+
if (!Array.isArray(replayCase.arguments))
|
|
61
|
+
throw new TypeError("Invalid replay worker case arguments");
|
|
62
|
+
return {
|
|
63
|
+
caseId: string(replayCase.caseId, "case ID"),
|
|
64
|
+
arguments: replayCase.arguments,
|
|
65
|
+
inputSha256: string(replayCase.inputSha256, "case digest"),
|
|
66
|
+
};
|
|
67
|
+
}),
|
|
68
|
+
determinism: {
|
|
69
|
+
clockIso: string(determinism.clockIso, "clock"),
|
|
70
|
+
randomSeed: integer(determinism.randomSeed, "random seed"),
|
|
71
|
+
},
|
|
72
|
+
limits: {
|
|
73
|
+
resultDepth: integer(limits.resultDepth, "result depth"),
|
|
74
|
+
resultNodes: integer(limits.resultNodes, "result nodes"),
|
|
75
|
+
exceptionBytes: integer(limits.exceptionBytes, "exception bytes"),
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
};
|
|
3
79
|
class ReplayDeniedError extends Error {
|
|
4
80
|
name = "ReplayDeniedError";
|
|
5
81
|
}
|
|
@@ -7,9 +83,8 @@ const main = async () => {
|
|
|
7
83
|
const chunks = [];
|
|
8
84
|
for await (const chunk of process.stdin)
|
|
9
85
|
chunks.push(Buffer.from(chunk));
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
throw new TypeError("Unsupported replay worker protocol");
|
|
86
|
+
const rawRequest = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
87
|
+
const request = parseWorkerRequest(rawRequest);
|
|
13
88
|
const left = [];
|
|
14
89
|
const right = [];
|
|
15
90
|
for (let index = 0; index < request.cases.length; index += 1) {
|
|
@@ -21,7 +96,6 @@ const main = async () => {
|
|
|
21
96
|
right.push(await runCase(request.right, replayCase, request, index));
|
|
22
97
|
}
|
|
23
98
|
process.stdout.write(JSON.stringify({
|
|
24
|
-
schema_version: 1,
|
|
25
99
|
left,
|
|
26
100
|
...(request.right === undefined ? {} : { right }),
|
|
27
101
|
}));
|
|
@@ -66,18 +140,20 @@ const loadEntry = async (side, request, caseIndex) => {
|
|
|
66
140
|
throw new TypeError(`Synchronous require cannot load ESM module: ${alias}`);
|
|
67
141
|
const module = { exports: {} };
|
|
68
142
|
commonJsCache.set(alias, module.exports);
|
|
69
|
-
const requireModule = (
|
|
143
|
+
const requireModule = (specifier) => {
|
|
70
144
|
const dependency = descriptor.dependencies[specifier];
|
|
71
145
|
if (dependency === undefined)
|
|
72
146
|
throw new ReplayDeniedError(`Undeclared require: ${specifier}`);
|
|
73
147
|
return loadCommonJs(dependency);
|
|
74
|
-
}
|
|
148
|
+
};
|
|
75
149
|
installRspackHelpers(requireModule);
|
|
76
150
|
const source = normalizeFactorySource(descriptor.source);
|
|
77
151
|
const factory = new Script(`(${source})`, {
|
|
78
152
|
filename: `/modules/${alias}.js`,
|
|
79
153
|
}).runInContext(context);
|
|
80
|
-
|
|
154
|
+
if (typeof factory !== "function")
|
|
155
|
+
throw new TypeError(`CommonJS factory is not callable: ${alias}`);
|
|
156
|
+
Reflect.apply(factory, undefined, [module, module.exports, requireModule]);
|
|
81
157
|
commonJsCache.set(alias, module.exports);
|
|
82
158
|
return module.exports;
|
|
83
159
|
};
|
|
@@ -126,7 +202,7 @@ const loadEntry = async (side, request, caseIndex) => {
|
|
|
126
202
|
: exported[side.entryExport];
|
|
127
203
|
}
|
|
128
204
|
const namespace = (await loadEsm(side.entryAlias)).namespace;
|
|
129
|
-
return namespace
|
|
205
|
+
return Reflect.get(namespace, side.entryExport);
|
|
130
206
|
};
|
|
131
207
|
const deterministicContext = (request, caseIndex) => {
|
|
132
208
|
let state = (request.determinism.randomSeed + caseIndex) >>> 0;
|
|
@@ -153,21 +229,27 @@ const deterministicContext = (request, caseIndex) => {
|
|
|
153
229
|
});
|
|
154
230
|
};
|
|
155
231
|
const installRspackHelpers = (require_) => {
|
|
156
|
-
|
|
232
|
+
const defineExports = (exports, definitions) => {
|
|
157
233
|
for (const [name, getter] of Object.entries(definitions))
|
|
158
234
|
if (!Object.prototype.hasOwnProperty.call(exports, name))
|
|
159
235
|
Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
|
160
236
|
};
|
|
161
|
-
|
|
237
|
+
const markModule = (exports) => {
|
|
162
238
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
163
239
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
164
240
|
};
|
|
165
|
-
|
|
241
|
+
const normalizeModule = (module) => {
|
|
166
242
|
const getter = () => (module.__esModule === true ? module.default : module);
|
|
167
243
|
Object.defineProperty(getter, "a", { get: getter });
|
|
168
244
|
return getter;
|
|
169
245
|
};
|
|
170
|
-
|
|
246
|
+
const passModule = (module) => module;
|
|
247
|
+
Object.defineProperties(require_, {
|
|
248
|
+
d: { value: defineExports },
|
|
249
|
+
r: { value: markModule },
|
|
250
|
+
n: { value: normalizeModule },
|
|
251
|
+
nmd: { value: passModule },
|
|
252
|
+
});
|
|
171
253
|
};
|
|
172
254
|
const requiredModule = (modules, alias) => {
|
|
173
255
|
const module = modules.get(alias);
|
|
@@ -295,6 +377,6 @@ const bounded = (value, maximumBytes) => {
|
|
|
295
377
|
};
|
|
296
378
|
void main().catch((error) => {
|
|
297
379
|
const message = error instanceof Error ? error.message : "Replay worker failed";
|
|
298
|
-
process.stderr.write(message
|
|
380
|
+
process.stderr.write(message);
|
|
299
381
|
process.exitCode = 70;
|
|
300
382
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { temporaryFilterHandle } from "./ReplaySeccompFile.js";
|
|
1
2
|
import { spawn } from "node:child_process";
|
|
2
3
|
import { randomBytes } from "node:crypto";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
5
|
import { digestBytes, } from "../application/JavaScriptReplayPlanning.js";
|
|
5
6
|
import { linuxX64ReplaySeccompDigest } from "./LinuxSeccompPolicy.js";
|
|
6
7
|
import { resolveLinuxRuntimeClosure } from "./LinuxRuntimeClosure.js";
|
|
7
|
-
import { assertRuntimeCommitment, systemdArguments,
|
|
8
|
+
import { assertRuntimeCommitment, systemdArguments, } from "./LinuxJavaScriptReplaySandbox.js";
|
|
8
9
|
import { boundedCollector, killUnit, observeCleanup, observeUnitResult, } from "./ReplayProcessLifecycle.js";
|
|
9
10
|
import { commitOutcomes, compareOutcomes, terminationResult, workerRequest, } from "./ReplayOutcome.js";
|
|
10
11
|
import { parseReplayWorkerResponse, } from "./ReplayWorkerProtocol.js";
|
|
@@ -23,39 +24,42 @@ export class LinuxJavaScriptReplayRunner {
|
|
|
23
24
|
const closure = await validateReplayCommitments(prepared, policy);
|
|
24
25
|
const encoded = buildWorkerPayload(prepared);
|
|
25
26
|
const filter = await temporaryFilterHandle();
|
|
26
|
-
const replayProcess = launchReplayProcess({
|
|
27
|
-
prepared,
|
|
28
|
-
policy,
|
|
29
|
-
encoded,
|
|
30
|
-
closure,
|
|
31
|
-
filterPath: filter.path,
|
|
32
|
-
unit,
|
|
33
|
-
signal,
|
|
34
|
-
});
|
|
35
27
|
try {
|
|
36
|
-
const
|
|
37
|
-
if (replayProcess.terminationRequest !== undefined)
|
|
38
|
-
await replayProcess.terminationRequest;
|
|
39
|
-
const unitResult = await observeUnitResult(policy.systemctlPath, unit);
|
|
40
|
-
const cleanup = await observeCleanup(policy.systemctlPath, unit);
|
|
41
|
-
return resolveReplayResult({
|
|
28
|
+
const replayProcess = launchReplayProcess({
|
|
42
29
|
prepared,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
30
|
+
policy,
|
|
31
|
+
encoded,
|
|
32
|
+
closure,
|
|
33
|
+
filterPath: filter.path,
|
|
34
|
+
unit,
|
|
35
|
+
signal,
|
|
48
36
|
});
|
|
37
|
+
try {
|
|
38
|
+
const collected = await replayProcess.completion;
|
|
39
|
+
if (replayProcess.terminationRequest !== undefined)
|
|
40
|
+
await replayProcess.terminationRequest;
|
|
41
|
+
const unitResult = await observeUnitResult(policy.systemctlPath, unit);
|
|
42
|
+
const cleanup = await observeCleanup(policy.systemctlPath, unit);
|
|
43
|
+
return resolveReplayResult({
|
|
44
|
+
prepared,
|
|
45
|
+
collected,
|
|
46
|
+
unitResult,
|
|
47
|
+
cleanup,
|
|
48
|
+
termination: replayProcess.termination,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
signal?.removeEventListener("abort", replayProcess.terminate);
|
|
53
|
+
if (replayProcess.timeout !== undefined)
|
|
54
|
+
clearTimeout(replayProcess.timeout);
|
|
55
|
+
if (replayProcess.child !== undefined &&
|
|
56
|
+
replayProcess.child.exitCode === null) {
|
|
57
|
+
replayProcess.requestTermination();
|
|
58
|
+
await replayProcess.terminationRequest;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
49
61
|
}
|
|
50
62
|
finally {
|
|
51
|
-
signal?.removeEventListener("abort", replayProcess.terminate);
|
|
52
|
-
if (replayProcess.timeout !== undefined)
|
|
53
|
-
clearTimeout(replayProcess.timeout);
|
|
54
|
-
if (replayProcess.child !== undefined &&
|
|
55
|
-
replayProcess.child.exitCode === null) {
|
|
56
|
-
replayProcess.requestTermination();
|
|
57
|
-
await replayProcess.terminationRequest;
|
|
58
|
-
}
|
|
59
63
|
await filter.close();
|
|
60
64
|
}
|
|
61
65
|
}
|
|
@@ -90,15 +94,14 @@ const launchReplayProcess = (options) => {
|
|
|
90
94
|
});
|
|
91
95
|
let child;
|
|
92
96
|
let timeout;
|
|
93
|
-
let
|
|
94
|
-
let timedOut = false;
|
|
97
|
+
let termination;
|
|
95
98
|
let terminationRequest;
|
|
96
99
|
const requestTermination = () => {
|
|
97
100
|
terminationRequest ??= killUnit(policy.systemctlPath, unit);
|
|
98
101
|
child?.kill("SIGKILL");
|
|
99
102
|
};
|
|
100
103
|
const terminate = () => {
|
|
101
|
-
|
|
104
|
+
termination ??= "cancelled";
|
|
102
105
|
requestTermination();
|
|
103
106
|
};
|
|
104
107
|
const completion = new Promise((resolve, reject) => {
|
|
@@ -124,7 +127,7 @@ const launchReplayProcess = (options) => {
|
|
|
124
127
|
if (isAborted(signal))
|
|
125
128
|
terminate();
|
|
126
129
|
timeout = setTimeout(() => {
|
|
127
|
-
|
|
130
|
+
termination ??= "timeout";
|
|
128
131
|
requestTermination();
|
|
129
132
|
}, prepared.publicPlan.limits.wall_time_ms);
|
|
130
133
|
timeout.unref();
|
|
@@ -139,11 +142,8 @@ const launchReplayProcess = (options) => {
|
|
|
139
142
|
get terminationRequest() {
|
|
140
143
|
return terminationRequest;
|
|
141
144
|
},
|
|
142
|
-
get
|
|
143
|
-
return
|
|
144
|
-
},
|
|
145
|
-
get timedOut() {
|
|
146
|
-
return timedOut;
|
|
145
|
+
get termination() {
|
|
146
|
+
return termination;
|
|
147
147
|
},
|
|
148
148
|
};
|
|
149
149
|
};
|
|
@@ -160,12 +160,12 @@ const replayProcessEnvironment = () => ({
|
|
|
160
160
|
: { DBUS_SESSION_BUS_ADDRESS: process.env.DBUS_SESSION_BUS_ADDRESS }),
|
|
161
161
|
});
|
|
162
162
|
const resolveReplayResult = (options) => {
|
|
163
|
-
const { prepared, collected, unitResult, cleanup,
|
|
164
|
-
if (
|
|
163
|
+
const { prepared, collected, unitResult, cleanup, termination } = options;
|
|
164
|
+
if (termination !== undefined)
|
|
165
165
|
return terminationResult({
|
|
166
166
|
prepared,
|
|
167
167
|
stderr: collected.stderr,
|
|
168
|
-
termination
|
|
168
|
+
termination,
|
|
169
169
|
cleanup,
|
|
170
170
|
});
|
|
171
171
|
if (collected.outputExceeded)
|
|
@@ -186,7 +186,7 @@ const resolveReplayResult = (options) => {
|
|
|
186
186
|
let response;
|
|
187
187
|
try {
|
|
188
188
|
const rawResponse = JSON.parse(collected.stdout);
|
|
189
|
-
response = parseReplayWorkerResponse(rawResponse, prepared.publicPlan.cases, prepared.publicPlan.right
|
|
189
|
+
response = parseReplayWorkerResponse(rawResponse, prepared.publicPlan.cases, prepared.publicPlan.right === undefined ? "single" : "differential");
|
|
190
190
|
}
|
|
191
191
|
catch {
|
|
192
192
|
return terminationResult({
|
|
@@ -199,7 +199,6 @@ const resolveReplayResult = (options) => {
|
|
|
199
199
|
const outcomes = commitOutcomes(response.left);
|
|
200
200
|
const right = response.right === undefined ? undefined : commitOutcomes(response.right);
|
|
201
201
|
return {
|
|
202
|
-
schema_version: 1,
|
|
203
202
|
plan_digest: prepared.publicPlan.plan_digest,
|
|
204
203
|
outcomes: [...outcomes, ...(right ?? [])],
|
|
205
204
|
...(right === undefined
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { open } from "node:fs/promises";
|
|
2
1
|
import { dirname } from "node:path";
|
|
3
2
|
import { digestJson, } from "../application/JavaScriptReplayPlanning.js";
|
|
4
|
-
import { buildLinuxX64ReplaySeccomp } from "./LinuxSeccompPolicy.js";
|
|
5
3
|
import { resolveLinuxRuntimeClosure } from "./LinuxRuntimeClosure.js";
|
|
6
4
|
export const assertRuntimeCommitment = (prepared, closure) => {
|
|
7
5
|
const observed = closure.map((item) => ({
|
|
@@ -13,23 +11,6 @@ export const assertRuntimeCommitment = (prepared, closure) => {
|
|
|
13
11
|
digestJson(prepared.publicPlan.runtime.read_only_files))
|
|
14
12
|
throw new TypeError("Replay runtime closure changed after approval");
|
|
15
13
|
};
|
|
16
|
-
export const temporaryFilterHandle = async () => {
|
|
17
|
-
const { mkdtemp, writeFile, rm } = await import("node:fs/promises");
|
|
18
|
-
const { tmpdir } = await import("node:os");
|
|
19
|
-
const { join } = await import("node:path");
|
|
20
|
-
const directory = await mkdtemp(join(tmpdir(), "rea-replay-filter-"));
|
|
21
|
-
const path = join(directory, "seccomp.bpf");
|
|
22
|
-
await writeFile(path, buildLinuxX64ReplaySeccomp(), { mode: 0o600 });
|
|
23
|
-
const handle = await open(path, "r");
|
|
24
|
-
return {
|
|
25
|
-
path,
|
|
26
|
-
handle,
|
|
27
|
-
close: async () => {
|
|
28
|
-
await handle.close();
|
|
29
|
-
await rm(directory, { recursive: true, force: true });
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
14
|
export const systemdArguments = (options) => {
|
|
34
15
|
const { unit, policy, prepared, workerPath, closure, filterPath } = options;
|
|
35
16
|
const limits = prepared.publicPlan.limits;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { readFile, realpath } from "node:fs/promises";
|
|
4
|
-
const LDD_OUTPUT_LIMIT = 64 * 1024;
|
|
5
4
|
/** Resolve and content-address the exact ELF closure mounted into a replay. */
|
|
6
5
|
export const resolveLinuxRuntimeClosure = async (nodePath) => {
|
|
7
6
|
const canonicalNode = await realpath(nodePath);
|
|
@@ -32,8 +31,7 @@ const collectLdd = async (path) => new Promise((resolve, reject) => {
|
|
|
32
31
|
timeout.unref();
|
|
33
32
|
let stdout = "";
|
|
34
33
|
child.stdout.on("data", (chunk) => {
|
|
35
|
-
|
|
36
|
-
stdout += chunk.subarray(0, remaining).toString("utf8");
|
|
34
|
+
stdout += chunk.toString("utf8");
|
|
37
35
|
});
|
|
38
36
|
child.once("error", (error) => {
|
|
39
37
|
clearTimeout(timeout);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { digestJson, } from "../application/JavaScriptReplayPlanning.js";
|
|
2
2
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
3
|
export const workerRequest = (prepared) => ({
|
|
4
|
-
schemaVersion: 1,
|
|
5
4
|
left: workerSide(prepared.publicPlan.left, prepared.leftSources),
|
|
6
5
|
...(prepared.publicPlan.right === undefined ||
|
|
7
6
|
prepared.rightSources === undefined
|
|
@@ -19,7 +18,7 @@ export const workerRequest = (prepared) => ({
|
|
|
19
18
|
limits: {
|
|
20
19
|
resultDepth: prepared.publicPlan.limits.result_depth,
|
|
21
20
|
resultNodes: prepared.publicPlan.limits.result_nodes,
|
|
22
|
-
exceptionBytes:
|
|
21
|
+
exceptionBytes: prepared.publicPlan.limits.output_bytes,
|
|
23
22
|
},
|
|
24
23
|
});
|
|
25
24
|
const workerSide = (side, sources) => ({
|
|
@@ -33,18 +32,21 @@ const workerSide = (side, sources) => ({
|
|
|
33
32
|
entryExport: side.entry_export,
|
|
34
33
|
});
|
|
35
34
|
export const commitOutcomes = (outcomes) => outcomes.map((outcome) => {
|
|
36
|
-
|
|
35
|
+
if (outcome.outcome === "return")
|
|
36
|
+
return {
|
|
37
|
+
case_id: outcome.case_id,
|
|
38
|
+
outcome: outcome.outcome,
|
|
39
|
+
value: jsonValueSchema.parse(outcome.value),
|
|
40
|
+
input_sha256: outcome.input_sha256,
|
|
41
|
+
output_sha256: digestJson(outcome.value),
|
|
42
|
+
truncated: false,
|
|
43
|
+
};
|
|
37
44
|
return {
|
|
38
45
|
case_id: outcome.case_id,
|
|
39
46
|
outcome: outcome.outcome,
|
|
40
|
-
|
|
41
|
-
? {}
|
|
42
|
-
: { value: jsonValueSchema.parse(outcome.value) }),
|
|
43
|
-
...(outcome.exception === undefined
|
|
44
|
-
? {}
|
|
45
|
-
: { exception: outcome.exception }),
|
|
47
|
+
exception: outcome.exception,
|
|
46
48
|
input_sha256: outcome.input_sha256,
|
|
47
|
-
output_sha256: digestJson(
|
|
49
|
+
output_sha256: digestJson(outcome.exception),
|
|
48
50
|
truncated: false,
|
|
49
51
|
};
|
|
50
52
|
});
|
|
@@ -61,16 +63,23 @@ export const compareOutcomes = (left, right) => left.map((item, index) => ({
|
|
|
61
63
|
}));
|
|
62
64
|
export const terminationResult = (options) => {
|
|
63
65
|
const { prepared, stderr, termination, cleanup, limitation } = options;
|
|
64
|
-
const outcomes =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
const outcomes = termination === "protocol_error"
|
|
67
|
+
? prepared.publicPlan.cases.map((item) => ({
|
|
68
|
+
case_id: item.case_id,
|
|
69
|
+
outcome: termination,
|
|
70
|
+
input_sha256: item.sha256,
|
|
71
|
+
output_sha256: null,
|
|
72
|
+
truncated: true,
|
|
73
|
+
}))
|
|
74
|
+
: prepared.publicPlan.cases.map((item) => ({
|
|
75
|
+
case_id: item.case_id,
|
|
76
|
+
outcome: termination,
|
|
77
|
+
input_sha256: item.sha256,
|
|
78
|
+
output_sha256: null,
|
|
79
|
+
truncated: false,
|
|
80
|
+
}));
|
|
71
81
|
const differential = prepared.publicPlan.right !== undefined;
|
|
72
82
|
return {
|
|
73
|
-
schema_version: 1,
|
|
74
83
|
plan_digest: prepared.publicPlan.plan_digest,
|
|
75
84
|
outcomes: [...outcomes, ...(differential ? outcomes : [])],
|
|
76
85
|
...(differential
|
|
@@ -16,12 +16,12 @@ export const boundedCollector = (maximum) => {
|
|
|
16
16
|
exceeded: () => overflow,
|
|
17
17
|
};
|
|
18
18
|
};
|
|
19
|
-
const collect = async (executable, arguments_
|
|
19
|
+
const collect = async (executable, arguments_) => new Promise((resolve, reject) => {
|
|
20
20
|
const child = spawn(executable, [...arguments_], {
|
|
21
21
|
stdio: ["ignore", "pipe", "pipe"],
|
|
22
22
|
});
|
|
23
|
-
const stdout =
|
|
24
|
-
const stderr =
|
|
23
|
+
const stdout = unboundedCollector();
|
|
24
|
+
const stderr = unboundedCollector();
|
|
25
25
|
const timeout = setTimeout(() => child.kill("SIGKILL"), 5_000);
|
|
26
26
|
timeout.unref();
|
|
27
27
|
child.stdout?.on("data", stdout.append);
|
|
@@ -37,7 +37,13 @@ const collect = async (executable, arguments_, maximum) => new Promise((resolve,
|
|
|
37
37
|
});
|
|
38
38
|
export const killUnit = async (systemctl, unit) => {
|
|
39
39
|
try {
|
|
40
|
-
await collect(systemctl, [
|
|
40
|
+
await collect(systemctl, [
|
|
41
|
+
"--user",
|
|
42
|
+
"kill",
|
|
43
|
+
"--kill-whom=all",
|
|
44
|
+
"--signal=SIGKILL",
|
|
45
|
+
unit,
|
|
46
|
+
]);
|
|
41
47
|
}
|
|
42
48
|
catch {
|
|
43
49
|
/* cleanup continues */
|
|
@@ -45,13 +51,19 @@ export const killUnit = async (systemctl, unit) => {
|
|
|
45
51
|
};
|
|
46
52
|
export const observeCleanup = async (systemctl, unit) => {
|
|
47
53
|
try {
|
|
48
|
-
const state = await collect(systemctl, [
|
|
54
|
+
const state = await collect(systemctl, [
|
|
55
|
+
"--user",
|
|
56
|
+
"show",
|
|
57
|
+
"--property=ActiveState",
|
|
58
|
+
"--value",
|
|
59
|
+
unit,
|
|
60
|
+
]);
|
|
49
61
|
const activeState = state.stdout.trim();
|
|
50
62
|
if (state.code !== 0 ||
|
|
51
63
|
activeState === "inactive" ||
|
|
52
64
|
activeState === "failed" ||
|
|
53
65
|
activeState.length === 0) {
|
|
54
|
-
await collect(systemctl, ["--user", "reset-failed", unit]
|
|
66
|
+
await collect(systemctl, ["--user", "reset-failed", unit]);
|
|
55
67
|
return { state: "complete", residual_resources: [] };
|
|
56
68
|
}
|
|
57
69
|
return { state: "incomplete", residual_resources: [unit] };
|
|
@@ -62,10 +74,23 @@ export const observeCleanup = async (systemctl, unit) => {
|
|
|
62
74
|
};
|
|
63
75
|
export const observeUnitResult = async (systemctl, unit) => {
|
|
64
76
|
try {
|
|
65
|
-
const result = await collect(systemctl, [
|
|
77
|
+
const result = await collect(systemctl, [
|
|
78
|
+
"--user",
|
|
79
|
+
"show",
|
|
80
|
+
"--property=Result",
|
|
81
|
+
"--value",
|
|
82
|
+
unit,
|
|
83
|
+
]);
|
|
66
84
|
return result.stdout.trim();
|
|
67
85
|
}
|
|
68
86
|
catch {
|
|
69
87
|
return "unknown";
|
|
70
88
|
}
|
|
71
89
|
};
|
|
90
|
+
const unboundedCollector = () => {
|
|
91
|
+
const chunks = [];
|
|
92
|
+
return {
|
|
93
|
+
append: (chunk) => chunks.push(chunk),
|
|
94
|
+
value: () => Buffer.concat(chunks).toString("utf8"),
|
|
95
|
+
};
|
|
96
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { mkdtemp, open, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { buildLinuxX64ReplaySeccomp } from "./LinuxSeccompPolicy.js";
|
|
5
|
+
/** Own a private seccomp file and descriptor until probe or execution cleanup. */
|
|
6
|
+
export const temporaryFilterHandle = async () => {
|
|
7
|
+
const directory = await mkdtemp(join(tmpdir(), "rea-replay-filter-"));
|
|
8
|
+
const path = join(directory, "seccomp.bpf");
|
|
9
|
+
try {
|
|
10
|
+
await writeFile(path, buildLinuxX64ReplaySeccomp(), { mode: 0o600 });
|
|
11
|
+
const handle = await open(path, "r");
|
|
12
|
+
return {
|
|
13
|
+
path,
|
|
14
|
+
handle,
|
|
15
|
+
close: async () => {
|
|
16
|
+
try {
|
|
17
|
+
await handle.close();
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
await rm(directory, { recursive: true, force: true });
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (cause) {
|
|
26
|
+
await rm(directory, { recursive: true, force: true });
|
|
27
|
+
throw cause;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
@@ -1,45 +1,48 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
const
|
|
3
|
-
.object({
|
|
2
|
+
const workerOutcomeFacts = {
|
|
4
3
|
case_id: z.string(),
|
|
5
|
-
outcome: z.enum(["return", "exception", "serialization_error", "denied"]),
|
|
6
|
-
value: z.json().optional(),
|
|
7
|
-
exception: z
|
|
8
|
-
.object({
|
|
9
|
-
name: z.string(),
|
|
10
|
-
message: z.string(),
|
|
11
|
-
stack: z.string().nullable(),
|
|
12
|
-
})
|
|
13
|
-
.strict()
|
|
14
|
-
.optional(),
|
|
15
4
|
input_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
16
5
|
output_sha256: z.null(),
|
|
17
6
|
truncated: z.literal(false),
|
|
7
|
+
};
|
|
8
|
+
const exceptionSchema = z
|
|
9
|
+
.object({
|
|
10
|
+
name: z.string(),
|
|
11
|
+
message: z.string(),
|
|
12
|
+
stack: z.string().nullable(),
|
|
13
|
+
})
|
|
14
|
+
.strict();
|
|
15
|
+
const workerOutcomeSchema = z.discriminatedUnion("outcome", [
|
|
16
|
+
z.strictObject({
|
|
17
|
+
...workerOutcomeFacts,
|
|
18
|
+
outcome: z.literal("return"),
|
|
19
|
+
value: z.json(),
|
|
20
|
+
}),
|
|
21
|
+
z.strictObject({
|
|
22
|
+
...workerOutcomeFacts,
|
|
23
|
+
outcome: z.enum(["exception", "serialization_error", "denied"]),
|
|
24
|
+
exception: z.object(exceptionSchema.shape).strict(),
|
|
25
|
+
}),
|
|
26
|
+
]);
|
|
27
|
+
const singleWorkerResponseSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
left: z.array(workerOutcomeSchema),
|
|
18
30
|
})
|
|
19
|
-
.strict()
|
|
20
|
-
|
|
21
|
-
if (value.outcome === "return" && value.value === undefined)
|
|
22
|
-
context.addIssue({ code: "custom", message: "Return value is missing" });
|
|
23
|
-
if (value.outcome !== "return" && value.exception === undefined)
|
|
24
|
-
context.addIssue({ code: "custom", message: "Exception is missing" });
|
|
25
|
-
if (value.outcome === "return" && value.exception !== undefined)
|
|
26
|
-
context.addIssue({ code: "custom", message: "Return has an exception" });
|
|
27
|
-
});
|
|
28
|
-
const workerResponseSchema = z
|
|
31
|
+
.strict();
|
|
32
|
+
const differentialWorkerResponseSchema = z
|
|
29
33
|
.object({
|
|
30
|
-
schema_version: z.literal(1),
|
|
31
34
|
left: z.array(workerOutcomeSchema),
|
|
32
|
-
right: z.array(workerOutcomeSchema)
|
|
35
|
+
right: z.array(workerOutcomeSchema),
|
|
33
36
|
})
|
|
34
37
|
.strict();
|
|
35
38
|
/** Strictly authenticate case ordering and commitments in worker output. */
|
|
36
|
-
export const parseReplayWorkerResponse = (rawResponse, cases,
|
|
37
|
-
const response =
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
export const parseReplayWorkerResponse = (rawResponse, cases, mode) => {
|
|
40
|
+
const response = mode === "single"
|
|
41
|
+
? singleWorkerResponseSchema.parse(rawResponse)
|
|
42
|
+
: differentialWorkerResponseSchema.parse(rawResponse);
|
|
40
43
|
validateOutcomeSequence(response.left, cases);
|
|
41
|
-
if (
|
|
42
|
-
validateOutcomeSequence(response.right, cases);
|
|
44
|
+
if (mode === "differential")
|
|
45
|
+
validateOutcomeSequence(differentialWorkerResponseSchema.parse(response).right, cases);
|
|
43
46
|
return response;
|
|
44
47
|
};
|
|
45
48
|
const validateOutcomeSequence = (outcomes, cases) => {
|