rea-agents 6.0.0 → 6.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 +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { evidenceSchema
|
|
4
|
+
import { evidenceSchema } from "../evidence.js";
|
|
5
5
|
import { createJavaScriptApplicationGraph, javascriptApplicationGraphSchema, } from "../javascript/javascriptApplicationGraph.js";
|
|
6
6
|
import { managedArtifactInspectionSchema, managedMemberInspectionSchema, managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
|
|
7
7
|
import { assessManagedGraphOmissions, managedGraphEvidenceCoverage, managedGraphResultCoverage, } from "./managedApplicationGraphCoverage.js";
|
|
8
8
|
import { addArtifactNode, addArtifactIdentityNodes, addBoundaryNodes, addMemberNodes, } from "./managedApplicationGraphNodes.js";
|
|
9
9
|
import { digestSchema } from "../digests.js";
|
|
10
10
|
import { prefixedDigestSchema } from "../digests.js";
|
|
11
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
11
12
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
12
13
|
const textSchema = z.string().min(1);
|
|
13
14
|
/** Authenticated managed Evidence records projected into the application graph. */
|
|
@@ -121,20 +122,14 @@ export const projectManagedApplicationGraph = (input) => {
|
|
|
121
122
|
const parseManagedInputs = (input) => ({
|
|
122
123
|
artifact: input.managed_artifact === undefined
|
|
123
124
|
? null
|
|
124
|
-
:
|
|
125
|
+
: parseManagedInspectionEvidence(input.managed_artifact, "inspect_managed_artifact", managedArtifactInspectionSchema),
|
|
125
126
|
members: input.managed_members === undefined
|
|
126
127
|
? null
|
|
127
|
-
:
|
|
128
|
+
: parseManagedInspectionEvidence(input.managed_members, "inspect_managed_members", managedMemberInspectionSchema),
|
|
128
129
|
boundaries: input.managed_native_boundaries === undefined
|
|
129
130
|
? null
|
|
130
|
-
:
|
|
131
|
+
: parseManagedInspectionEvidence(input.managed_native_boundaries, "inspect_managed_native_boundaries", managedNativeBoundaryInspectionSchema),
|
|
131
132
|
});
|
|
132
|
-
const parseManagedEvidence = (rawEvidence, operation, schema) => {
|
|
133
|
-
const evidence = parseEvidence(rawEvidence);
|
|
134
|
-
if (evidence.operation !== operation)
|
|
135
|
-
throw new TypeError(`Evidence operation is not ${operation}`);
|
|
136
|
-
return { evidence, result: schema.parse(evidence.normalized_result) };
|
|
137
|
-
};
|
|
138
133
|
const chooseArtifact = (parsed) => {
|
|
139
134
|
const result = parsed.artifact?.result ??
|
|
140
135
|
parsed.members?.result ??
|
|
@@ -164,6 +159,11 @@ const projectionLimitations = (parsed, omissions) => [
|
|
|
164
159
|
"Managed member Evidence was not supplied; type, method, and field nodes are absent.",
|
|
165
160
|
]
|
|
166
161
|
: []),
|
|
162
|
+
...(parsed.artifact === null
|
|
163
|
+
? [
|
|
164
|
+
"Managed artifact Evidence was not supplied; assembly identity observations are absent.",
|
|
165
|
+
]
|
|
166
|
+
: []),
|
|
167
167
|
...(parsed.boundaries === null
|
|
168
168
|
? [
|
|
169
169
|
"Managed native-boundary Evidence was not supplied; P/Invoke and native-implementation nodes are absent.",
|
|
@@ -413,7 +413,8 @@ export const managedNativeBoundaryInspectionSchema = z.object({
|
|
|
413
413
|
requires_artifact_sha256: digestSchema,
|
|
414
414
|
requires_mvid: cliMetadataGuidSchema.nullable(),
|
|
415
415
|
}),
|
|
416
|
-
cli_native: z
|
|
416
|
+
cli_native: z
|
|
417
|
+
.object({
|
|
417
418
|
il_only: z.boolean(),
|
|
418
419
|
requires_32bit: z.boolean(),
|
|
419
420
|
strong_name_signed: z.boolean(),
|
|
@@ -421,7 +422,8 @@ export const managedNativeBoundaryInspectionSchema = z.object({
|
|
|
421
422
|
ready_to_run_signature: z.boolean(),
|
|
422
423
|
managed_native_header_rva: z.number().int().min(0).max(0xffff_ffff),
|
|
423
424
|
managed_native_header_size: z.number().int().min(0).max(0xffff_ffff),
|
|
424
|
-
})
|
|
425
|
+
})
|
|
426
|
+
.nullable(),
|
|
425
427
|
module_refs: z.array(managedModuleReferenceSchema),
|
|
426
428
|
pinvoke_imports: z.array(managedNativeImportSchema),
|
|
427
429
|
native_implementations: z.array(managedNativeImplementationSchema),
|
|
@@ -429,8 +431,8 @@ export const managedNativeBoundaryInspectionSchema = z.object({
|
|
|
429
431
|
module_ref_count: z.number().int().min(0),
|
|
430
432
|
pinvoke_import_count: z.number().int().min(0),
|
|
431
433
|
native_implementation_count: z.number().int().min(0),
|
|
432
|
-
ready_to_run: z.boolean(),
|
|
433
|
-
mixed_mode_or_native_header: z.boolean(),
|
|
434
|
+
ready_to_run: z.boolean().nullable(),
|
|
435
|
+
mixed_mode_or_native_header: z.boolean().nullable(),
|
|
434
436
|
}),
|
|
435
437
|
coverage: z.object({
|
|
436
438
|
state: z.enum(["complete", "partial", "unavailable"]),
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseEvidence } from "../evidence.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse managed inspection Evidence and bind its artifact to any available subject.
|
|
4
|
+
* A null subject remains valid and means there is no digest to cross-check.
|
|
5
|
+
*/
|
|
6
|
+
export const parseManagedInspectionEvidence = (rawEvidence, operation, schema) => {
|
|
7
|
+
const evidence = parseEvidence(rawEvidence);
|
|
8
|
+
if (evidence.operation !== operation)
|
|
9
|
+
throw new TypeError(`Evidence operation is not ${operation}`);
|
|
10
|
+
const result = schema.parse(evidence.normalized_result);
|
|
11
|
+
const artifactSha256 = result.artifact.sha256;
|
|
12
|
+
const subjectSha256 = evidence.subject?.digest.sha256;
|
|
13
|
+
if (subjectSha256 !== undefined && artifactSha256 !== subjectSha256)
|
|
14
|
+
throw new TypeError(`Managed Evidence ${operation} (${evidence.evidence_id}) subject SHA-256 ${subjectSha256} does not match normalized artifact SHA-256 ${artifactSha256}`);
|
|
15
|
+
return { evidence, result };
|
|
16
|
+
};
|
|
@@ -165,18 +165,12 @@ export const managedMemberComparisonResultSchema = z.strictObject({
|
|
|
165
165
|
});
|
|
166
166
|
/** Compare managed members with constrained exact and structural identities. */
|
|
167
167
|
export const compareManagedMembers = (left, right) => {
|
|
168
|
-
const leftCoverage = {
|
|
169
|
-
sourceComplete: left.result.coverage.state === "complete",
|
|
170
|
-
};
|
|
171
|
-
const rightCoverage = {
|
|
172
|
-
sourceComplete: right.result.coverage.state === "complete",
|
|
173
|
-
};
|
|
174
168
|
const { methodMatches, fieldMatches } = keyMembers(left, right);
|
|
175
169
|
const itemContext = {
|
|
176
170
|
leftEvidenceId: left.evidenceId,
|
|
177
171
|
rightEvidenceId: right.evidenceId,
|
|
178
|
-
leftComplete:
|
|
179
|
-
rightComplete:
|
|
172
|
+
leftComplete: left.result.metadata.status === "complete",
|
|
173
|
+
rightComplete: right.result.metadata.status === "complete",
|
|
180
174
|
};
|
|
181
175
|
const methodItems = buildMethodItems(methodMatches, itemContext);
|
|
182
176
|
const fieldItems = buildFieldItems(fieldMatches, itemContext);
|
|
@@ -212,4 +206,3 @@ export const compareManagedMembers = (left, right) => {
|
|
|
212
206
|
};
|
|
213
207
|
return managedMemberComparisonResultSchema.parse(result);
|
|
214
208
|
};
|
|
215
|
-
export { parseManagedMemberEvidence } from "./managedMemberComparisonMatch.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import { parseEvidence } from "../evidence.js";
|
|
4
3
|
import { managedMemberInspectionSchema, } from "./managedArtifact.js";
|
|
4
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
5
5
|
export const sha256 = (value) => {
|
|
6
6
|
const serialized = canonicalize(value);
|
|
7
7
|
if (serialized === undefined)
|
|
@@ -10,9 +10,7 @@ export const sha256 = (value) => {
|
|
|
10
10
|
};
|
|
11
11
|
const keyMethod = (item) => ({
|
|
12
12
|
item,
|
|
13
|
-
exactKey: item.
|
|
14
|
-
item.body.status === "present" &&
|
|
15
|
-
item.body.normalized_il_sha256 !== null
|
|
13
|
+
exactKey: item.body.status === "present" && item.body.normalized_il_sha256 !== null
|
|
16
14
|
? stableKey([
|
|
17
15
|
"method-exact",
|
|
18
16
|
item.signature.raw_sha256,
|
|
@@ -173,11 +171,9 @@ export const keyMembers = (left, right) => ({
|
|
|
173
171
|
fieldMatches: matchFields(left.result.fields.map(keyField), right.result.fields.map(keyField)),
|
|
174
172
|
});
|
|
175
173
|
export const parseManagedMemberEvidence = (evidence) => {
|
|
176
|
-
const parsed =
|
|
177
|
-
if (parsed.operation !== "inspect_managed_members")
|
|
178
|
-
throw new TypeError("Evidence operation is not inspect_managed_members");
|
|
174
|
+
const parsed = parseManagedInspectionEvidence(evidence, "inspect_managed_members", managedMemberInspectionSchema);
|
|
179
175
|
return {
|
|
180
|
-
evidenceId: parsed.evidence_id,
|
|
181
|
-
result:
|
|
176
|
+
evidenceId: parsed.evidence.evidence_id,
|
|
177
|
+
result: parsed.result,
|
|
182
178
|
};
|
|
183
179
|
};
|
|
@@ -1,27 +1,19 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import { parseEvidence } from "../evidence.js";
|
|
4
3
|
import { managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
|
|
4
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
5
5
|
import { managedNativeVerificationResultSchema, } from "./managedNativeVerificationSchemas.js";
|
|
6
6
|
import { buildVerificationResult, collectNativeSymbols, verifyPinvoke, } from "./managedNativeVerificationMatch.js";
|
|
7
|
-
export { managedNativeVerificationInputSchema, } from "./managedNativeVerificationSchemas.js";
|
|
8
|
-
export { managedNativeVerificationResultSchema };
|
|
9
7
|
const sha256 = (value) => {
|
|
10
8
|
const serialized = canonicalize(value);
|
|
11
9
|
if (serialized === undefined)
|
|
12
10
|
throw new TypeError("Managed/native verification canonicalization failed");
|
|
13
11
|
return createHash("sha256").update(serialized).digest("hex");
|
|
14
12
|
};
|
|
15
|
-
const
|
|
16
|
-
const managedEvidence = parseEvidence(input.managed_boundaries);
|
|
17
|
-
if (managedEvidence.operation !== "inspect_managed_native_boundaries")
|
|
18
|
-
throw new TypeError("Evidence operation is not inspect_managed_native_boundaries");
|
|
19
|
-
return managedNativeBoundaryInspectionSchema.parse(managedEvidence.normalized_result);
|
|
20
|
-
};
|
|
13
|
+
const parseManagedBoundary = (input) => parseManagedInspectionEvidence(input.managed_boundaries, "inspect_managed_native_boundaries", managedNativeBoundaryInspectionSchema);
|
|
21
14
|
/** Verify managed P/Invoke declarations against authenticated native Evidence. */
|
|
22
15
|
export const verifyManagedNativeBoundaries = (input) => {
|
|
23
|
-
const managed =
|
|
24
|
-
const managedEvidence = parseEvidence(input.managed_boundaries);
|
|
16
|
+
const { evidence: managedEvidence, result: managed } = parseManagedBoundary(input);
|
|
25
17
|
const native = collectNativeSymbols(input.native_observations);
|
|
26
18
|
const verifiedPinvokes = managed.pinvoke_imports.map((item) => verifyPinvoke({
|
|
27
19
|
item,
|
|
@@ -71,16 +71,22 @@ const sameSymbolName = (expected, native) => expected ===
|
|
|
71
71
|
: native.name);
|
|
72
72
|
const normalizeModule = (value) => basename(value)
|
|
73
73
|
.toLowerCase()
|
|
74
|
-
.replace(/^lib/u, "")
|
|
75
74
|
.replace(/\.(dll|dylib|so|node|exe)$/u, "");
|
|
75
|
+
const nativeModuleIdentities = (value) => {
|
|
76
|
+
const filename = basename(value).toLowerCase();
|
|
77
|
+
const stem = normalizeModule(filename);
|
|
78
|
+
const identities = new Set([stem]);
|
|
79
|
+
if (/\.(dylib|so)$/u.test(filename) && stem.startsWith("lib"))
|
|
80
|
+
identities.add(stem.slice("lib".length));
|
|
81
|
+
return identities;
|
|
82
|
+
};
|
|
76
83
|
const moduleCompatible = (scope, symbol) => {
|
|
77
84
|
if (scope === null)
|
|
78
85
|
return true;
|
|
79
86
|
const expected = normalizeModule(scope);
|
|
80
87
|
return [symbol.module_name, symbol.module_path]
|
|
81
88
|
.filter((value) => value !== null)
|
|
82
|
-
.
|
|
83
|
-
.some((value) => value === expected);
|
|
89
|
+
.some((value) => nativeModuleIdentities(value).has(expected));
|
|
84
90
|
};
|
|
85
91
|
const candidateNames = (managed) => {
|
|
86
92
|
const names = new Set([managed.import_name]);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { CANONICAL_BASE64_PATTERN } from "../stringPatterns.js";
|
|
2
3
|
const unsignedHex = z.string().regex(/^0x(?:0|[1-9a-f][0-9a-f]{0,15})$/);
|
|
3
4
|
const index = z.number().int().nonnegative();
|
|
4
5
|
const scalar = z.union([z.string(), z.number().int()]);
|
|
5
6
|
const range = z.strictObject({ offset: unsignedHex, bytes: unsignedHex });
|
|
6
|
-
const canonicalBase64 = z
|
|
7
|
-
.string()
|
|
8
|
-
.regex(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$/);
|
|
7
|
+
const canonicalBase64 = z.string().regex(CANONICAL_BASE64_PATTERN);
|
|
9
8
|
const name = z.strictObject({
|
|
10
9
|
display: z.string(),
|
|
11
10
|
bytes_base64: canonicalBase64.nullable(),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -71,7 +71,7 @@ const inferredJumpTableSchema = z
|
|
|
71
71
|
dispatch_address: z.string().min(1),
|
|
72
72
|
data_sources: z.array(jumpTableDataSourceSchema),
|
|
73
73
|
mappings: z.array(jumpTableMappingSchema),
|
|
74
|
-
default_targets: z.array(jumpTableDefaultTargetSchema)
|
|
74
|
+
default_targets: z.array(jumpTableDefaultTargetSchema),
|
|
75
75
|
limitations: z.array(z.string()),
|
|
76
76
|
})
|
|
77
77
|
.strict();
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { localPathStringSchema } from "../localPath.js";
|
|
2
3
|
const hexSchema = z.string().regex(/^0x[0-9a-f]+$/u);
|
|
3
|
-
|
|
4
|
-
const objcName = z
|
|
4
|
+
const nativeString = z
|
|
5
5
|
.string()
|
|
6
|
+
.regex(/^[^\u0000]*$/u, "Native launch and breakpoint strings cannot contain NUL");
|
|
7
|
+
/** Objective-C class names and selectors never contain spaces or brackets. */
|
|
8
|
+
const objcName = nativeString
|
|
6
9
|
.min(1)
|
|
7
|
-
.regex(/^[^\s
|
|
10
|
+
.regex(/^[^\s\x5b\x5d]+$/u, "Use the bare name without spaces or brackets");
|
|
8
11
|
const functionBreakpoint = {
|
|
9
12
|
kind: z.literal("function"),
|
|
10
|
-
name:
|
|
11
|
-
.string()
|
|
13
|
+
name: nativeString
|
|
12
14
|
.min(1)
|
|
13
15
|
.describe("Exact symbol name, such as `open`, a C++ or mangled Swift symbol, or `-[NSString length]`."),
|
|
14
16
|
};
|
|
@@ -20,8 +22,7 @@ const objcMethodBreakpoint = {
|
|
|
20
22
|
export const nativeCallBreakpointSchema = z.discriminatedUnion("kind", [
|
|
21
23
|
z.strictObject({
|
|
22
24
|
...functionBreakpoint,
|
|
23
|
-
module:
|
|
24
|
-
.string()
|
|
25
|
+
module: nativeString
|
|
25
26
|
.min(1)
|
|
26
27
|
.optional()
|
|
27
28
|
.describe("Image file name that defines the symbol, such as `libsystem_kernel.dylib`; omit to match every image."),
|
|
@@ -40,15 +41,17 @@ export const nativeCallBreakpointSchema = z.discriminatedUnion("kind", [
|
|
|
40
41
|
*/
|
|
41
42
|
export const nativeCallObservationInputSchema = z.strictObject({
|
|
42
43
|
breakpoints: z.array(nativeCallBreakpointSchema).min(1),
|
|
43
|
-
arguments: z.array(
|
|
44
|
+
arguments: z.array(nativeString).default([]),
|
|
44
45
|
environment: z
|
|
45
46
|
.record(z
|
|
46
47
|
.string()
|
|
47
48
|
.min(1)
|
|
48
|
-
.regex(/^[^=\
|
|
49
|
+
.regex(/^[^=\u0000]+$/u, "Environment names cannot contain '=' or NUL"), z
|
|
50
|
+
.string()
|
|
51
|
+
.regex(/^[^\u0000]*$/u, "Environment values cannot contain NUL"))
|
|
49
52
|
.default({})
|
|
50
53
|
.describe("Overrides on top of the environment REA runs with."),
|
|
51
|
-
working_directory:
|
|
54
|
+
working_directory: localPathStringSchema.optional(),
|
|
52
55
|
duration_ms: z
|
|
53
56
|
.number()
|
|
54
57
|
.int()
|
|
@@ -100,10 +103,13 @@ export const nativeCallEventSchema = z.strictObject({
|
|
|
100
103
|
registers: z.array(z.strictObject({ name: z.string(), value: hexSchema })),
|
|
101
104
|
backtrace: z.array(nativeCodeLocationSchema),
|
|
102
105
|
});
|
|
103
|
-
|
|
106
|
+
/** Retained native output with explicit stream completeness and byte counts. */
|
|
107
|
+
export const nativeCapturedOutputSchema = z.strictObject({
|
|
104
108
|
text: z.string(),
|
|
109
|
+
/** Bytes observed by the bridge, not a total when complete is false. */
|
|
105
110
|
bytes: z.number().int().nonnegative(),
|
|
106
111
|
truncated: z.boolean(),
|
|
112
|
+
complete: z.boolean(),
|
|
107
113
|
});
|
|
108
114
|
/** Observed calls, the process lifecycle, and breakpoint resolution. */
|
|
109
115
|
export const nativeCallObservationResultSchema = z.strictObject({
|
|
@@ -112,7 +118,21 @@ export const nativeCallObservationResultSchema = z.strictObject({
|
|
|
112
118
|
sha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
113
119
|
architecture: z.string(),
|
|
114
120
|
arguments: z.array(z.string()),
|
|
121
|
+
environment: z.record(z.string(), z.string()),
|
|
115
122
|
working_directory: z.string().nullable(),
|
|
123
|
+
launch_identity: z.strictObject({
|
|
124
|
+
/** A pathname hash does not verify the bytes mapped into the process. */
|
|
125
|
+
loaded_image_sha256: z.null(),
|
|
126
|
+
file_device: z.string().nullable(),
|
|
127
|
+
file_inode: z.string().nullable(),
|
|
128
|
+
selected_file_sha256: z
|
|
129
|
+
.string()
|
|
130
|
+
.regex(/^[0-9a-f]{64}$/u)
|
|
131
|
+
.nullable(),
|
|
132
|
+
module_path: z.string().nullable(),
|
|
133
|
+
module_uuid: z.string().nullable(),
|
|
134
|
+
stable: z.boolean(),
|
|
135
|
+
}),
|
|
116
136
|
}),
|
|
117
137
|
debugger: z.strictObject({
|
|
118
138
|
path: z.string(),
|
|
@@ -126,14 +146,15 @@ export const nativeCallObservationResultSchema = z.strictObject({
|
|
|
126
146
|
"duration-elapsed",
|
|
127
147
|
"event-limit",
|
|
128
148
|
"stop-limit",
|
|
149
|
+
"resource-limit",
|
|
129
150
|
]),
|
|
130
151
|
exit_status: z.number().int().nullable(),
|
|
131
152
|
exit_description: z.string().nullable(),
|
|
132
153
|
/** REA confirmed the process is gone when observation ended. */
|
|
133
154
|
terminated: z.boolean(),
|
|
134
155
|
elapsed_ms: z.number().nonnegative(),
|
|
135
|
-
stdout:
|
|
136
|
-
stderr:
|
|
156
|
+
stdout: nativeCapturedOutputSchema,
|
|
157
|
+
stderr: nativeCapturedOutputSchema,
|
|
137
158
|
/** Signal and exception stops LLDB reported; the process continued past each. */
|
|
138
159
|
other_stops: z.array(z.string()),
|
|
139
160
|
}),
|
|
@@ -157,6 +178,9 @@ export const nativeCallObservationResultSchema = z.strictObject({
|
|
|
157
178
|
coverage: z.strictObject({
|
|
158
179
|
status: z.enum(["complete", "partial"]),
|
|
159
180
|
event_limit_reached: z.boolean(),
|
|
181
|
+
resource_limit_reached: z.boolean(),
|
|
182
|
+
/** Aggregate breakpoint-location metadata exhausted its retained-byte budget. */
|
|
183
|
+
breakpoint_locations_truncated: z.boolean().optional(),
|
|
160
184
|
/** Requests that matched no code in any image loaded while observing. */
|
|
161
185
|
unresolved_breakpoints: z.array(z.number().int().nonnegative()),
|
|
162
186
|
}),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { nativeCallEventSchema, nativeCapturedOutputSchema, } from "./nativeCallObservation.js";
|
|
3
|
+
/** Native call evidence retained when observation fails before a full result. */
|
|
4
|
+
export const nativeCallPartialObservationSchema = z.strictObject({
|
|
5
|
+
kind: z.literal("native-call-observation"),
|
|
6
|
+
target: z.strictObject({
|
|
7
|
+
path: z.string(),
|
|
8
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
9
|
+
architecture: z.string(),
|
|
10
|
+
arguments: z.array(z.string()),
|
|
11
|
+
environment: z.record(z.string(), z.string()),
|
|
12
|
+
working_directory: z.string().nullable(),
|
|
13
|
+
}),
|
|
14
|
+
process: z.strictObject({
|
|
15
|
+
pid: z.number().int().positive().nullable(),
|
|
16
|
+
stdout: nativeCapturedOutputSchema.nullable(),
|
|
17
|
+
stderr: nativeCapturedOutputSchema.nullable(),
|
|
18
|
+
other_stops: z.array(z.string()),
|
|
19
|
+
}),
|
|
20
|
+
debugger: z.strictObject({ version: z.string().nullable() }),
|
|
21
|
+
events: z.array(nativeCallEventSchema),
|
|
22
|
+
coverage: z.strictObject({
|
|
23
|
+
status: z.literal("partial"),
|
|
24
|
+
reason: z.enum([
|
|
25
|
+
"cancelled",
|
|
26
|
+
"timeout",
|
|
27
|
+
"tracer-failure",
|
|
28
|
+
"capture-failure",
|
|
29
|
+
"cleanup-failure",
|
|
30
|
+
]),
|
|
31
|
+
}),
|
|
32
|
+
limitations: z.array(z.string()),
|
|
33
|
+
});
|
|
@@ -54,6 +54,13 @@ export const nativeInstructionSchema = z.strictObject({
|
|
|
54
54
|
conditional: z.boolean(),
|
|
55
55
|
computed: z.boolean(),
|
|
56
56
|
direct_destinations: z.array(z.string()),
|
|
57
|
+
classification_evidence: z
|
|
58
|
+
.array(z.strictObject({
|
|
59
|
+
source: z.string().min(1),
|
|
60
|
+
value: z.string().min(1),
|
|
61
|
+
}))
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("Observed provider facts used to classify flow; older captures or other providers may omit them."),
|
|
57
64
|
}),
|
|
58
65
|
references: z.array(reference),
|
|
59
66
|
limitations: z.array(z.string()),
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { CANONICAL_BASE64_PATTERN } from "../stringPatterns.js";
|
|
2
3
|
import { recordedNoteCoverageIssues } from "./recordedCrashNoteCoverage.js";
|
|
3
4
|
const hex = z.string().regex(/^0x(?:0|[1-9a-f][0-9a-f]{0,15})$/);
|
|
4
5
|
const index = z.number().int().nonnegative();
|
|
5
6
|
const signed32 = z.number().int().min(-2147483648).max(2147483647);
|
|
6
|
-
const base64 = z
|
|
7
|
-
.string()
|
|
8
|
-
.regex(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$/);
|
|
7
|
+
const base64 = z.string().regex(CANONICAL_BASE64_PATTERN);
|
|
9
8
|
const range = z.strictObject({ offset: hex, bytes: hex });
|
|
10
9
|
const diagnostics = z.strictObject({
|
|
11
10
|
stdout: z.string(),
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* ISO-8601 date-time that requires an explicit UTC offset.
|
|
4
|
+
*
|
|
5
|
+
* `z.string().datetime({ offset: true })` emits Zod's offset class as `[+-]`.
|
|
6
|
+
* Annex B and `u` mode accept that, but ECMA-262 `v` mode rejects the
|
|
7
|
+
* unescaped `-`, so any tool whose schema carries the pattern is unusable for a
|
|
8
|
+
* client that compiles advertised patterns — schema compilation happens before
|
|
9
|
+
* arguments are supplied, so the whole tools request fails rather than one call.
|
|
10
|
+
*
|
|
11
|
+
* The accepted set is identical to the Zod validator; only the offset class
|
|
12
|
+
* escapes `-`, as `\x2d`, because an escaped `-` inside a character class is
|
|
13
|
+
* removed by `oxlint --fix` as a useless escape.
|
|
14
|
+
*/
|
|
15
|
+
export const offsetDateTimeSchema = z
|
|
16
|
+
.string()
|
|
17
|
+
.regex(/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|(?:[+\x2d](?:[01]\d|2[0-3]):[0-5]\d)))$/u, "Use an ISO-8601 date-time with an explicit UTC offset");
|
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
3
3
|
import { normalizationSchema } from "./processScenario.js";
|
|
4
4
|
import { collectProcessCaptureIssues } from "./processCaptureValidation.js";
|
|
5
|
-
|
|
5
|
+
import { processCaptureTruncationDetailsSchema, } from "./processCaptureCoverage.js";
|
|
6
6
|
/** Capture collection whose members participate in global observation order. */
|
|
7
7
|
export const PROCESS_CAPTURE_EVENT_COLLECTIONS = [
|
|
8
8
|
"frames",
|
|
@@ -59,6 +59,13 @@ const fileEffectSchema = z.discriminatedUnion("status", [
|
|
|
59
59
|
before: fileStateSchema,
|
|
60
60
|
after: fileStateSchema,
|
|
61
61
|
}),
|
|
62
|
+
z.object({
|
|
63
|
+
path: z.string(),
|
|
64
|
+
status: z.literal("unknown"),
|
|
65
|
+
before: fileStateSchema.nullable(),
|
|
66
|
+
after: fileStateSchema.nullable(),
|
|
67
|
+
reason: z.string().min(1),
|
|
68
|
+
}),
|
|
62
69
|
]);
|
|
63
70
|
/** Exact serialized shape of a process capture. */
|
|
64
71
|
const processSettlementSchema = z.discriminatedUnion("state", [
|
|
@@ -73,6 +80,7 @@ const processSettlementSchema = z.discriminatedUnion("state", [
|
|
|
73
80
|
cleanup_outcome: z.enum(["cleaned", "failed"]),
|
|
74
81
|
}),
|
|
75
82
|
]);
|
|
83
|
+
const unverifiedCleanupProcessesSchema = z.array(z.strictObject({ pid: z.number().int().positive(), reason: z.string() }));
|
|
76
84
|
const processCaptureShapeSchema = z.strictObject({
|
|
77
85
|
manifest: z.strictObject({
|
|
78
86
|
rea_version: z.string().min(1),
|
|
@@ -94,10 +102,6 @@ const processCaptureShapeSchema = z.strictObject({
|
|
|
94
102
|
.string()
|
|
95
103
|
.regex(/^[a-f0-9]{64}$/u)
|
|
96
104
|
.nullable(),
|
|
97
|
-
legacy_executable_sha256: z
|
|
98
|
-
.string()
|
|
99
|
-
.regex(/^[a-f0-9]{64}$/u)
|
|
100
|
-
.optional(),
|
|
101
105
|
executable_identity: z.strictObject({
|
|
102
106
|
state: z.enum(["path_metadata_unchanged", "unknown"]),
|
|
103
107
|
reason: z.string().nullable(),
|
|
@@ -109,6 +113,7 @@ const processCaptureShapeSchema = z.strictObject({
|
|
|
109
113
|
sequence: z.number().int().nonnegative(),
|
|
110
114
|
at_ms: z.number().int().nonnegative(),
|
|
111
115
|
data: z.string(),
|
|
116
|
+
raw_data: z.string().optional(),
|
|
112
117
|
})),
|
|
113
118
|
rendered_frames: z.array(z.object({
|
|
114
119
|
sequence: z.number().int().nonnegative(),
|
|
@@ -161,17 +166,16 @@ const processCaptureShapeSchema = z.strictObject({
|
|
|
161
166
|
effects: z.array(fileEffectSchema),
|
|
162
167
|
truncated: z.boolean(),
|
|
163
168
|
})),
|
|
164
|
-
event_journal: z
|
|
165
|
-
.array(z.object({
|
|
169
|
+
event_journal: z.array(z.object({
|
|
166
170
|
capture_order: z.number().int().nonnegative(),
|
|
167
171
|
collection: z.enum(PROCESS_CAPTURE_EVENT_COLLECTIONS),
|
|
168
172
|
index: z.number().int().nonnegative(),
|
|
169
|
-
}))
|
|
170
|
-
.default([]),
|
|
173
|
+
})),
|
|
171
174
|
files_before: z.array(fileStateSchema),
|
|
172
175
|
files_after: z.array(fileStateSchema),
|
|
173
176
|
filesystem_effects: z.array(fileEffectSchema),
|
|
174
177
|
truncated: z.boolean(),
|
|
178
|
+
truncation_details: processCaptureTruncationDetailsSchema.optional(),
|
|
175
179
|
limitations: z.array(z.string()),
|
|
176
180
|
residual_unknowns: z.array(z.object({
|
|
177
181
|
scope: z.enum([
|
|
@@ -189,11 +193,13 @@ const processCaptureShapeSchema = z.strictObject({
|
|
|
189
193
|
cleanup: z.object({
|
|
190
194
|
owned_process_group: z.literal("verified"),
|
|
191
195
|
temporary_root: z.literal("removed"),
|
|
196
|
+
unverified_processes: unverifiedCleanupProcessesSchema.optional(),
|
|
192
197
|
}),
|
|
193
198
|
});
|
|
194
199
|
const processCleanupResourceSchema = z.strictObject({
|
|
195
200
|
state: z.enum(["cleaned", "failed", "unverified", "not_required"]),
|
|
196
201
|
reason: z.string().nullable(),
|
|
202
|
+
unverified_processes: unverifiedCleanupProcessesSchema.optional(),
|
|
197
203
|
});
|
|
198
204
|
const partialObservationFieldSchema = (value) => z.discriminatedUnion("state", [
|
|
199
205
|
z.strictObject({ state: z.literal("available"), value }),
|
|
@@ -244,18 +250,19 @@ const completedCaptureObservationSchema = z.strictObject({
|
|
|
244
250
|
const incompleteCaptureObservationSchema = z.strictObject({
|
|
245
251
|
observations: incompleteProcessCaptureObservationsSchema,
|
|
246
252
|
});
|
|
247
|
-
/** Validated, non-comparable process observations attached to cleanup errors. */
|
|
253
|
+
/** Validated, non-comparable process observations attached to execution or cleanup errors. */
|
|
248
254
|
export const partialProcessCaptureObservationSchema = z
|
|
249
255
|
.union([
|
|
250
256
|
completedCaptureObservationSchema.extend(partialObservationMetadataSchema.shape),
|
|
251
257
|
incompleteCaptureObservationSchema.extend(partialObservationMetadataSchema.shape),
|
|
252
258
|
])
|
|
253
259
|
.superRefine((partial, context) => {
|
|
254
|
-
|
|
260
|
+
const cleanupIncomplete = Object.values(partial.cleanup).some(({ state }) => state === "failed" || state === "unverified");
|
|
261
|
+
if (!cleanupIncomplete && partial.execution_failure === null)
|
|
255
262
|
context.addIssue({
|
|
256
263
|
code: "custom",
|
|
257
|
-
path: ["
|
|
258
|
-
message: "partial observations require incomplete
|
|
264
|
+
path: ["execution_failure"],
|
|
265
|
+
message: "partial observations require incomplete cleanup or an execution failure",
|
|
259
266
|
});
|
|
260
267
|
if ("observations" in partial) {
|
|
261
268
|
const { observations } = partial;
|
|
@@ -311,6 +318,4 @@ export const processCaptureSchema = processCaptureShapeSchema
|
|
|
311
318
|
message: issue.message,
|
|
312
319
|
});
|
|
313
320
|
})
|
|
314
|
-
.describe("The capture must preserve its canonical scenario, comparison, and normalization SHA-256 commitments; ordered capture timestamps and contiguous sequence numbers; before and final filesystem snapshots with truncation propagated; and exit-code consistency with deadline termination.
|
|
315
|
-
export { parseProcessCapture } from "./processCaptureParsing.js";
|
|
316
|
-
export { compareProcessCaptures, comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./processComparison.js";
|
|
321
|
+
.describe("The capture must preserve its canonical scenario, comparison, and normalization SHA-256 commitments; ordered capture timestamps and contiguous sequence numbers; before and final filesystem snapshots with truncation propagated; and exit-code consistency with deadline termination. The event journal is required; empty journals are valid. A non-empty journal must reference every captured observation exactly once with unique in-range references. These cross-field invariants are checked by REA after capture.");
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const byteRetentionSchema = z.strictObject({
|
|
3
|
+
budget_bytes: z.number().int().nonnegative(),
|
|
4
|
+
observed_bytes: z.number().int().nonnegative(),
|
|
5
|
+
retained_bytes: z.number().int().nonnegative(),
|
|
6
|
+
observed_frames: z.number().int().nonnegative(),
|
|
7
|
+
retained_frames: z.number().int().nonnegative(),
|
|
8
|
+
});
|
|
9
|
+
/** Filesystem enumeration and whole-file digest coverage for one checkpoint. */
|
|
10
|
+
export const filesystemCoverageSchema = z.strictObject({
|
|
11
|
+
files_limit: z.number().int().nonnegative(),
|
|
12
|
+
depth_limit: z.number().int().nonnegative(),
|
|
13
|
+
enumeration_truncated: z.boolean(),
|
|
14
|
+
enumeration_reasons: z.array(z.enum(["files_limit", "depth_limit", "identity_changed"])),
|
|
15
|
+
hash_budget_bytes: z.number().int().nonnegative(),
|
|
16
|
+
hashed_bytes: z.number().int().nonnegative(),
|
|
17
|
+
hash_omissions: z.array(z.strictObject({
|
|
18
|
+
path: z.string(),
|
|
19
|
+
size_bytes: z.number().int().nonnegative(),
|
|
20
|
+
remaining_budget_bytes: z.number().int().nonnegative(),
|
|
21
|
+
reason: z.enum(["file_bytes_budget", "file_changed_or_short_read"]),
|
|
22
|
+
})),
|
|
23
|
+
});
|
|
24
|
+
/** Actual budget accounting; rendered bytes count state and visible lines, not JSON. */
|
|
25
|
+
export const processCaptureTruncationDetailsSchema = z.strictObject({
|
|
26
|
+
raw_terminal: byteRetentionSchema.describe("UTF-8 bytes of original PTY chunks; whole chunks are retained or omitted."),
|
|
27
|
+
rendered_terminal: byteRetentionSchema.describe("Cumulative UTF-8 bytes of serialized state plus visible lines, evaluated from retained PTY input; whole frames are retained or omitted."),
|
|
28
|
+
filesystem_before: filesystemCoverageSchema,
|
|
29
|
+
filesystem_after: filesystemCoverageSchema,
|
|
30
|
+
process: z.strictObject({
|
|
31
|
+
sample_limit: z.number().int().nonnegative(),
|
|
32
|
+
sampling_partial: z.boolean(),
|
|
33
|
+
retained_samples: z.number().int().nonnegative(),
|
|
34
|
+
sample_limit_reached: z.boolean(),
|
|
35
|
+
sampling_failures: z.number().int().nonnegative(),
|
|
36
|
+
first_sampling_failure: z.string().nullable(),
|
|
37
|
+
coverage: z.literal("sampled"),
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
const omitted = (retention) => retention.observed_frames > retention.retained_frames;
|
|
41
|
+
const filesystemTruncated = (coverage) => coverage.enumeration_truncated || coverage.hash_omissions.length > 0;
|
|
42
|
+
/** Derive the legacy aggregate flag from independent producer observations. */
|
|
43
|
+
export const hasCaptureTruncation = (details) => omitted(details.raw_terminal) ||
|
|
44
|
+
omitted(details.rendered_terminal) ||
|
|
45
|
+
filesystemTruncated(details.filesystem_before) ||
|
|
46
|
+
filesystemTruncated(details.filesystem_after) ||
|
|
47
|
+
details.process.sampling_partial;
|
|
48
|
+
/** Older truncated captures lack enough information to localize missing observations. */
|
|
49
|
+
export const processSourceTruncated = (capture, source) => {
|
|
50
|
+
const details = capture.truncation_details;
|
|
51
|
+
if (details === undefined)
|
|
52
|
+
return capture.truncated;
|
|
53
|
+
switch (source) {
|
|
54
|
+
case "terminal_raw":
|
|
55
|
+
return omitted(details.raw_terminal);
|
|
56
|
+
case "terminal_rendered":
|
|
57
|
+
return (omitted(details.raw_terminal) || omitted(details.rendered_terminal));
|
|
58
|
+
case "filesystem":
|
|
59
|
+
return (filesystemTruncated(details.filesystem_before) ||
|
|
60
|
+
filesystemTruncated(details.filesystem_after));
|
|
61
|
+
case "process":
|
|
62
|
+
return details.process.sampling_partial;
|
|
63
|
+
case "interaction":
|
|
64
|
+
case "lifecycle":
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { digestProcessCommitment } from "./
|
|
1
|
+
import { digestProcessCommitment } from "./processScenario.js";
|
|
2
2
|
const normalization = {
|
|
3
3
|
paths: true,
|
|
4
4
|
pids: true,
|
|
@@ -51,6 +51,7 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
|
|
|
51
51
|
truncated: false,
|
|
52
52
|
},
|
|
53
53
|
],
|
|
54
|
+
event_journal: [],
|
|
54
55
|
files_before: [],
|
|
55
56
|
files_after: [],
|
|
56
57
|
filesystem_effects: [],
|