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,5 +1,4 @@
|
|
|
1
1
|
import { processCaptureSchema, } from "./processCapture.js";
|
|
2
|
-
import { z } from "zod";
|
|
3
2
|
const verifiedCaptures = new WeakSet();
|
|
4
3
|
const isVerifiedCapture = (capture) => verifiedCaptures.has(capture);
|
|
5
4
|
const attachProof = (capture) => {
|
|
@@ -8,41 +7,9 @@ const attachProof = (capture) => {
|
|
|
8
7
|
return capture;
|
|
9
8
|
throw new TypeError("Process Capture proof ownership failed");
|
|
10
9
|
};
|
|
11
|
-
const recordSchema = z.record(z.string(), z.unknown());
|
|
12
|
-
const LEGACY_EXECUTABLE_IDENTITY_REASON = "Legacy v3 capture did not distinguish selected and launch executable digests";
|
|
13
|
-
const migrateLegacyV3Capture = (input) => {
|
|
14
|
-
const capture = recordSchema.safeParse(input);
|
|
15
|
-
if (!capture.success)
|
|
16
|
-
return input;
|
|
17
|
-
const manifest = recordSchema.safeParse(capture.data.manifest);
|
|
18
|
-
if (!manifest.success)
|
|
19
|
-
return input;
|
|
20
|
-
if (manifest.data.provider_version !== "3" ||
|
|
21
|
-
"selected_executable_sha256" in manifest.data ||
|
|
22
|
-
"executable_identity" in manifest.data ||
|
|
23
|
-
"legacy_executable_sha256" in manifest.data)
|
|
24
|
-
return input;
|
|
25
|
-
const { executable_sha256 } = manifest.data;
|
|
26
|
-
if (typeof executable_sha256 !== "string" ||
|
|
27
|
-
!/^[a-f0-9]{64}$/u.test(executable_sha256))
|
|
28
|
-
return input;
|
|
29
|
-
return {
|
|
30
|
-
...capture.data,
|
|
31
|
-
manifest: {
|
|
32
|
-
...manifest.data,
|
|
33
|
-
selected_executable_sha256: null,
|
|
34
|
-
executable_sha256: null,
|
|
35
|
-
executable_identity: {
|
|
36
|
-
state: "unknown",
|
|
37
|
-
reason: LEGACY_EXECUTABLE_IDENTITY_REASON,
|
|
38
|
-
},
|
|
39
|
-
legacy_executable_sha256: executable_sha256,
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
10
|
/** Parse unknown input and reject invalid commitments or semantics. */
|
|
44
11
|
export const parseProcessCapture = (input) => {
|
|
45
|
-
const parsed = processCaptureSchema.safeParse(
|
|
12
|
+
const parsed = processCaptureSchema.safeParse(input);
|
|
46
13
|
if (parsed.success)
|
|
47
14
|
return attachProof(parsed.data);
|
|
48
15
|
const issues = parsed.error.issues.flatMap((issue) => issue.code === "custom"
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { digestProcessCommitment } from "./processScenario.js";
|
|
2
|
+
import { hasCaptureTruncation } from "./processCaptureCoverage.js";
|
|
2
3
|
const orderedTimestamps = (values) => values.every((value, index) => {
|
|
3
4
|
const previous = values[index - 1];
|
|
4
5
|
return previous === undefined || value.at_ms >= previous.at_ms;
|
|
5
6
|
});
|
|
6
7
|
const validateCommitments = (capture, require) => {
|
|
7
8
|
const { manifest } = capture;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
manifest.executable_sha256 === null &&
|
|
11
|
-
manifest.executable_identity.state === "unknown" &&
|
|
12
|
-
manifest.executable_identity.reason !== null &&
|
|
13
|
-
manifest.scenario.executable_sha256 ===
|
|
14
|
-
manifest.legacy_executable_sha256, "manifest.legacy_executable_sha256", "legacy executable digest must remain distinct from unknown selected and launch digests");
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
require(manifest.scenario.executable_sha256 ===
|
|
18
|
-
manifest.selected_executable_sha256, "manifest.selected_executable_sha256", "selected executable commitment does not match the scenario projection");
|
|
19
|
-
}
|
|
9
|
+
require(manifest.scenario.executable_sha256 ===
|
|
10
|
+
manifest.selected_executable_sha256, "manifest.selected_executable_sha256", "selected executable commitment does not match the scenario projection");
|
|
20
11
|
require(manifest.executable_identity.state === "path_metadata_unchanged"
|
|
21
12
|
? manifest.executable_sha256 === manifest.selected_executable_sha256 &&
|
|
22
13
|
manifest.executable_identity.reason === null
|
|
@@ -48,7 +39,7 @@ const validateOrdering = (capture, require) => {
|
|
|
48
39
|
require(orderedTimestamps(values), name, "timestamps must be ordered");
|
|
49
40
|
};
|
|
50
41
|
const validateEventJournal = (capture, require) => {
|
|
51
|
-
const journal = capture.event_journal
|
|
42
|
+
const journal = capture.event_journal;
|
|
52
43
|
if (journal.length === 0)
|
|
53
44
|
return;
|
|
54
45
|
const sizes = {
|
|
@@ -83,6 +74,82 @@ const validateLifecycle = (capture, require) => {
|
|
|
83
74
|
capture.exit.code ===
|
|
84
75
|
null, "exit", "deadline termination cannot declare a normal exit code");
|
|
85
76
|
};
|
|
77
|
+
const validateCoverage = (capture, require) => {
|
|
78
|
+
const details = capture.truncation_details;
|
|
79
|
+
if (details === undefined)
|
|
80
|
+
return;
|
|
81
|
+
require(details.process.retained_samples === capture.process_samples.length &&
|
|
82
|
+
details.process.retained_samples <= details.process.sample_limit &&
|
|
83
|
+
details.process.sampling_partial ===
|
|
84
|
+
(details.process.sample_limit_reached ||
|
|
85
|
+
details.process.sampling_failures > 0) &&
|
|
86
|
+
(details.process.sampling_failures === 0) ===
|
|
87
|
+
(details.process.first_sampling_failure ===
|
|
88
|
+
null), "truncation_details.process", "sampling coverage must agree with retained samples and observed failures");
|
|
89
|
+
require(capture.truncated ===
|
|
90
|
+
hasCaptureTruncation(details), "truncation_details", "aggregate truncation must match producer coverage");
|
|
91
|
+
for (const [name, retention, count, bytes] of [
|
|
92
|
+
[
|
|
93
|
+
"raw_terminal",
|
|
94
|
+
details.raw_terminal,
|
|
95
|
+
capture.frames.length,
|
|
96
|
+
capture.frames.reduce((total, frame) => total + Buffer.byteLength(frame.raw_data ?? frame.data), 0),
|
|
97
|
+
],
|
|
98
|
+
[
|
|
99
|
+
"rendered_terminal",
|
|
100
|
+
details.rendered_terminal,
|
|
101
|
+
capture.rendered_frames.length,
|
|
102
|
+
capture.rendered_frames.reduce((total, frame) => frame.lines.reduce((sum, line) => sum + Buffer.byteLength(line), total + Buffer.byteLength(frame.serialized_state)), 0),
|
|
103
|
+
],
|
|
104
|
+
]) {
|
|
105
|
+
// Whole frames are retained or omitted, so retained bytes are exactly the
|
|
106
|
+
// retained frames' bytes, and nothing is unretained when no frame was omitted.
|
|
107
|
+
require(retention.retained_frames === count &&
|
|
108
|
+
retention.observed_frames >= count &&
|
|
109
|
+
retention.retained_bytes === bytes &&
|
|
110
|
+
retention.observed_bytes >= retention.retained_bytes &&
|
|
111
|
+
(retention.observed_frames > count ||
|
|
112
|
+
retention.observed_bytes === retention.retained_bytes) &&
|
|
113
|
+
retention.retained_bytes <=
|
|
114
|
+
retention.budget_bytes, `truncation_details.${name}`, "retained observations and budget accounting do not agree");
|
|
115
|
+
}
|
|
116
|
+
for (const [name, coverage, files, checkpoint] of [
|
|
117
|
+
[
|
|
118
|
+
"filesystem_before",
|
|
119
|
+
details.filesystem_before,
|
|
120
|
+
capture.files_before,
|
|
121
|
+
capture.filesystem_checkpoints[0],
|
|
122
|
+
],
|
|
123
|
+
[
|
|
124
|
+
"filesystem_after",
|
|
125
|
+
details.filesystem_after,
|
|
126
|
+
capture.files_after,
|
|
127
|
+
capture.filesystem_checkpoints[1],
|
|
128
|
+
],
|
|
129
|
+
]) {
|
|
130
|
+
const unhashedFiles = new Map(files
|
|
131
|
+
.filter((file) => file.type === "file" && file.sha256 === null)
|
|
132
|
+
.map((file) => [file.path, file]));
|
|
133
|
+
require(coverage.hash_omissions.length === unhashedFiles.size &&
|
|
134
|
+
new Set(coverage.hash_omissions.map(({ path }) => path)).size ===
|
|
135
|
+
unhashedFiles.size &&
|
|
136
|
+
coverage.hash_omissions.every((omission) => unhashedFiles.get(omission.path)?.size === omission.size_bytes &&
|
|
137
|
+
omission.remaining_budget_bytes <= coverage.hash_budget_bytes), `truncation_details.${name}.hash_omissions`, "every retained regular file without a digest must have one matching omission reason");
|
|
138
|
+
require(coverage.hashed_bytes ===
|
|
139
|
+
files
|
|
140
|
+
.filter((file) => file.type === "file" && file.sha256 !== null)
|
|
141
|
+
.reduce((sum, file) => sum + file.size, 0) &&
|
|
142
|
+
coverage.hashed_bytes <= coverage.hash_budget_bytes &&
|
|
143
|
+
files.length <=
|
|
144
|
+
coverage.files_limit, `truncation_details.${name}`, "filesystem budget accounting does not match retained observations");
|
|
145
|
+
require(coverage.enumeration_truncated ===
|
|
146
|
+
coverage.enumeration_reasons.length > 0 &&
|
|
147
|
+
checkpoint?.truncated ===
|
|
148
|
+
(coverage.enumeration_truncated ||
|
|
149
|
+
coverage.hash_omissions.length >
|
|
150
|
+
0), `truncation_details.${name}`, "filesystem checkpoint truncation must match enumeration and digest coverage");
|
|
151
|
+
}
|
|
152
|
+
};
|
|
86
153
|
/** Recompute commitments and cross-field invariants without side effects. */
|
|
87
154
|
export const collectProcessCaptureIssues = (capture) => {
|
|
88
155
|
const issues = [];
|
|
@@ -94,5 +161,6 @@ export const collectProcessCaptureIssues = (capture) => {
|
|
|
94
161
|
validateOrdering(capture, require);
|
|
95
162
|
validateEventJournal(capture, require);
|
|
96
163
|
validateLifecycle(capture, require);
|
|
164
|
+
validateCoverage(capture, require);
|
|
97
165
|
return issues;
|
|
98
166
|
};
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
+
import { processSourceTruncated } from "./processCaptureCoverage.js";
|
|
4
|
+
import { comparableTerminalFrame } from "./processObservation.js";
|
|
5
|
+
import { AnalysisInputError } from "../analysisErrorCore.js";
|
|
3
6
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
4
|
-
import {
|
|
7
|
+
import {} from "./processTraceSpecification.js";
|
|
8
|
+
import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js";
|
|
5
9
|
import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
|
|
10
|
+
import { compareProcessTraces, processTraceOutcomesDiffer, } from "./processTraceComparison.js";
|
|
11
|
+
const OPERATION = "compare_process_captures";
|
|
6
12
|
/** Comparison classification that never equates incomplete evidence. */
|
|
7
13
|
export const comparisonStatusSchema = z.enum([
|
|
8
14
|
"unchanged",
|
|
@@ -70,7 +76,10 @@ export const processCaptureComparisonSchema = z
|
|
|
70
76
|
});
|
|
71
77
|
});
|
|
72
78
|
const terminalObservations = (capture) => [
|
|
73
|
-
...capture.frames.map((frame) => ({
|
|
79
|
+
...capture.frames.map((frame) => ({
|
|
80
|
+
kind: "raw",
|
|
81
|
+
...comparableTerminalFrame(frame),
|
|
82
|
+
})),
|
|
74
83
|
...capture.rendered_frames.map((frame) => ({
|
|
75
84
|
kind: "rendered",
|
|
76
85
|
...frame,
|
|
@@ -152,15 +161,47 @@ const chooseFirstDivergence = (candidates) => {
|
|
|
152
161
|
};
|
|
153
162
|
const assertComparable = (left, right, options) => {
|
|
154
163
|
if (left.manifest.comparison_contract_sha256 !==
|
|
155
|
-
right.manifest.comparison_contract_sha256)
|
|
156
|
-
|
|
164
|
+
right.manifest.comparison_contract_sha256) {
|
|
165
|
+
const fields = differingContractFields(left.manifest.comparison_contract, right.manifest.comparison_contract);
|
|
166
|
+
throw new AnalysisInputError(OPERATION, undefined, [
|
|
167
|
+
{
|
|
168
|
+
path: ["right"],
|
|
169
|
+
reason: "invalid_value",
|
|
170
|
+
message: `Process captures have incompatible comparison contracts${fields.length === 0 ? "" : `; these scenario fields differ: ${fields.join(", ")}`}. Capture both scenarios with the same values for these fields, then compare them.`,
|
|
171
|
+
expected: fields,
|
|
172
|
+
},
|
|
173
|
+
]);
|
|
174
|
+
}
|
|
157
175
|
if (options.maxCaptureAgeMs === undefined)
|
|
158
176
|
return;
|
|
159
177
|
const maxCaptureAgeMs = options.maxCaptureAgeMs;
|
|
160
178
|
const now = (options.now ?? Date.now)();
|
|
161
|
-
|
|
162
|
-
|
|
179
|
+
const stale = [
|
|
180
|
+
["left", left],
|
|
181
|
+
["right", right],
|
|
182
|
+
].flatMap(([side, { manifest }]) => {
|
|
183
|
+
const age = now - Date.parse(manifest.completed_at);
|
|
184
|
+
return age > maxCaptureAgeMs
|
|
185
|
+
? [
|
|
186
|
+
`${side} completed at ${manifest.completed_at} (${String(age)} ms ago)`,
|
|
187
|
+
]
|
|
188
|
+
: [];
|
|
189
|
+
});
|
|
190
|
+
if (stale.length > 0)
|
|
191
|
+
throw new AnalysisInputError(OPERATION, undefined, [
|
|
192
|
+
{
|
|
193
|
+
path: ["max_capture_age_ms"],
|
|
194
|
+
reason: "out_of_range",
|
|
195
|
+
message: `Process capture exceeds max_capture_age_ms ${String(maxCaptureAgeMs)}: ${stale.join("; ")}. Recapture the stale scenario or raise max_capture_age_ms.`,
|
|
196
|
+
},
|
|
197
|
+
]);
|
|
163
198
|
};
|
|
199
|
+
/** Name top-level contract fields whose canonical values differ. */
|
|
200
|
+
const differingContractFields = (left, right) => [...new Set([...Object.keys(left), ...Object.keys(right)])]
|
|
201
|
+
.filter((field) => !Object.hasOwn(left, field) ||
|
|
202
|
+
!Object.hasOwn(right, field) ||
|
|
203
|
+
canonicalize(left[field]) !== canonicalize(right[field]))
|
|
204
|
+
.sort();
|
|
164
205
|
const truncatedComparison = () => ({
|
|
165
206
|
status: "truncated",
|
|
166
207
|
terminal: "truncated",
|
|
@@ -207,19 +248,23 @@ const applyTraceVerdict = (dimensions, specification, trace, captures) => {
|
|
|
207
248
|
};
|
|
208
249
|
};
|
|
209
250
|
const compareDimensions = (left, right, sameNormalization) => {
|
|
210
|
-
const classify = (scope, leftValues, rightValues) => !sameNormalization ||
|
|
251
|
+
const classify = (scope, leftValues, rightValues, source) => !sameNormalization ||
|
|
252
|
+
hasUnknown(left, scope) ||
|
|
253
|
+
hasUnknown(right, scope) ||
|
|
254
|
+
processSourceTruncated(left, source) ||
|
|
255
|
+
processSourceTruncated(right, source)
|
|
211
256
|
? "unknown"
|
|
212
257
|
: classifyCollection(leftValues, rightValues);
|
|
213
258
|
return {
|
|
214
|
-
terminal: classify("terminal", terminalObservations(left), terminalObservations(right)),
|
|
215
|
-
interaction: classify("interaction", left.interaction_events, right.interaction_events),
|
|
259
|
+
terminal: classify("terminal", terminalObservations(left), terminalObservations(right), "terminal_rendered"),
|
|
260
|
+
interaction: classify("interaction", left.interaction_events, right.interaction_events, "interaction"),
|
|
216
261
|
exit: hasUnknown(left, "exit") || hasUnknown(right, "exit")
|
|
217
262
|
? "unknown"
|
|
218
263
|
: sameJsonValue({ exit: left.exit, settlement: left.settlement }, { exit: right.exit, settlement: right.settlement })
|
|
219
264
|
? "unchanged"
|
|
220
265
|
: "changed",
|
|
221
|
-
filesystem: classify("filesystem", filesystemObservations(left), filesystemObservations(right)),
|
|
222
|
-
process: classify("process", left.process_samples, right.process_samples),
|
|
266
|
+
filesystem: classify("filesystem", filesystemObservations(left), filesystemObservations(right), "filesystem"),
|
|
267
|
+
process: classify("process", left.process_samples, right.process_samples, "process"),
|
|
223
268
|
};
|
|
224
269
|
};
|
|
225
270
|
/**
|
|
@@ -230,7 +275,8 @@ const compareDimensions = (left, right, sameNormalization) => {
|
|
|
230
275
|
*/
|
|
231
276
|
export const compareProcessCaptures = (left, right, options = {}) => {
|
|
232
277
|
assertComparable(left, right, options);
|
|
233
|
-
if (left.truncated
|
|
278
|
+
if ((left.truncated && left.truncation_details === undefined) ||
|
|
279
|
+
(right.truncated && right.truncation_details === undefined)) {
|
|
234
280
|
const truncated = truncatedComparison();
|
|
235
281
|
return options.traceSpecification === undefined
|
|
236
282
|
? truncated
|
|
@@ -250,25 +296,32 @@ export const compareProcessCaptures = (left, right, options = {}) => {
|
|
|
250
296
|
left,
|
|
251
297
|
right,
|
|
252
298
|
]);
|
|
253
|
-
const divergenceCandidates = PROCESS_COMPARISON_DIMENSIONS.map((dimension) =>
|
|
299
|
+
const divergenceCandidates = PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension] === "unknown"
|
|
300
|
+
? null
|
|
301
|
+
: firstCollectionDivergence(dimension, processDimensionObservations(left, dimension), processDimensionObservations(right, dimension)));
|
|
254
302
|
const observedFirstDivergence = chooseFirstDivergence(divergenceCandidates.map((candidate) => candidate !== null &&
|
|
255
303
|
trace?.verdict === "equivalent" &&
|
|
256
304
|
dimensions[candidate.dimension] === "unchanged"
|
|
257
305
|
? null
|
|
258
306
|
: candidate));
|
|
259
|
-
const firstDivergence =
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
307
|
+
const firstDivergence = left.truncated || right.truncated
|
|
308
|
+
? {
|
|
309
|
+
status: "unknown",
|
|
310
|
+
reason: "Incomplete observations prevent locating the first divergence; unaffected dimensions retain their comparisons.",
|
|
311
|
+
}
|
|
312
|
+
: trace?.verdict === "equivalent" &&
|
|
313
|
+
deriveProcessComparisonStatus(PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension])) === "unchanged"
|
|
314
|
+
? { status: "none" }
|
|
315
|
+
: observedFirstDivergence.status === "found"
|
|
316
|
+
? observedFirstDivergence
|
|
317
|
+
: !sameNormalization ||
|
|
318
|
+
left.residual_unknowns.length > 0 ||
|
|
319
|
+
right.residual_unknowns.length > 0
|
|
320
|
+
? {
|
|
321
|
+
status: "unknown",
|
|
322
|
+
reason: "Residual unknowns prevent proving that no divergence occurred.",
|
|
323
|
+
}
|
|
324
|
+
: observedFirstDivergence;
|
|
272
325
|
const observedStatus = deriveProcessComparisonStatus(PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension]));
|
|
273
326
|
return {
|
|
274
327
|
status: observedStatus,
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
3
|
+
/** Project normalized PTY facts without source text used only for audit. */
|
|
4
|
+
export const comparableTerminalFrame = (frame) => ({
|
|
5
|
+
sequence: frame.sequence,
|
|
6
|
+
at_ms: frame.at_ms,
|
|
7
|
+
data: frame.data,
|
|
8
|
+
});
|
|
3
9
|
/** Process-capture observation families shared by live drivers and trace assertions. */
|
|
4
10
|
export const processObservationSourceSchema = z.enum([
|
|
5
11
|
"terminal_raw",
|
|
@@ -67,11 +73,13 @@ export const processObservationSubject = (source, value) => {
|
|
|
67
73
|
const projectedRecord = (capture, location) => {
|
|
68
74
|
const projected = (() => {
|
|
69
75
|
switch (location.collection) {
|
|
70
|
-
case "frames":
|
|
76
|
+
case "frames": {
|
|
77
|
+
const frame = capture.frames[location.index];
|
|
71
78
|
return {
|
|
72
79
|
source: "terminal_raw",
|
|
73
|
-
value:
|
|
80
|
+
value: frame === undefined ? undefined : comparableTerminalFrame(frame),
|
|
74
81
|
};
|
|
82
|
+
}
|
|
75
83
|
case "rendered_frames":
|
|
76
84
|
return {
|
|
77
85
|
source: "terminal_rendered",
|
|
@@ -4,17 +4,36 @@ import { z } from "zod";
|
|
|
4
4
|
const positiveBudget = z.number().int().safe().positive();
|
|
5
5
|
const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
|
|
6
6
|
const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
|
|
7
|
+
const ENVIRONMENT_NAME_CHARACTER = "[^=\\u0000]";
|
|
8
|
+
/**
|
|
9
|
+
* Nonempty environment names other than the reserved run identifier. The
|
|
10
|
+
* exclusion is spelled as a complement instead of a negative look-ahead,
|
|
11
|
+
* because RE2 and Rust schema validators reject look-around and would refuse
|
|
12
|
+
* every tool in the advertised catalog.
|
|
13
|
+
*/
|
|
14
|
+
const environmentNamePattern = (reserved) => {
|
|
15
|
+
// After the complete reserved name, at least one more character is needed.
|
|
16
|
+
let rest = `${ENVIRONMENT_NAME_CHARACTER}+`;
|
|
17
|
+
for (let index = reserved.length - 1; index >= 0; index -= 1) {
|
|
18
|
+
const character = reserved[index] ?? "";
|
|
19
|
+
// Diverge here, match the next reserved character, or (after a nonempty
|
|
20
|
+
// prefix) end the name early.
|
|
21
|
+
const choice = `[^=\\u0000${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
|
|
22
|
+
rest = index === 0 ? choice : `(?:${choice})?`;
|
|
23
|
+
}
|
|
24
|
+
return new RegExp(`^(?:${rest})$`, "u");
|
|
25
|
+
};
|
|
7
26
|
const environmentName = z
|
|
8
27
|
.string()
|
|
9
28
|
.min(1, "Environment names must not be empty")
|
|
10
|
-
.regex(
|
|
29
|
+
.regex(environmentNamePattern(reservedRunIdEnvironmentName), {
|
|
11
30
|
error: (issue) => issue.input === reservedRunIdEnvironmentName
|
|
12
31
|
? `${reservedRunIdEnvironmentName} is reserved by the process adapter`
|
|
13
32
|
: "Environment names cannot contain '=' or NUL",
|
|
14
33
|
});
|
|
15
34
|
const childProcessString = z
|
|
16
35
|
.string()
|
|
17
|
-
.regex(/^[^\
|
|
36
|
+
.regex(/^[^\u0000]*$/u, "Values passed to operating-system APIs cannot contain NUL");
|
|
18
37
|
export const normalizationSchema = z.object({
|
|
19
38
|
paths: z.boolean(),
|
|
20
39
|
pids: z.boolean(),
|
|
@@ -62,13 +81,16 @@ export const processComparisonContract = (scenario) => ({
|
|
|
62
81
|
settle_ms: scenario.settle_ms,
|
|
63
82
|
limits: scenario.limits,
|
|
64
83
|
normalization: scenario.normalization,
|
|
84
|
+
...(scenario.normalization.ports
|
|
85
|
+
? { port_normalization_version: "contextual-endpoints-v2" }
|
|
86
|
+
: {}),
|
|
65
87
|
});
|
|
66
88
|
/**
|
|
67
89
|
* Boundary schema for one bounded process experiment.
|
|
68
90
|
* Defaults are part of the evidence contract and must remain deterministic.
|
|
69
91
|
*/
|
|
70
92
|
export const processScenarioSchema = z
|
|
71
|
-
.
|
|
93
|
+
.strictObject({
|
|
72
94
|
executable: childProcessString.min(1),
|
|
73
95
|
arguments: z.array(childProcessString).default([]),
|
|
74
96
|
working_directory: childProcessString.default("."),
|
|
@@ -77,7 +99,7 @@ export const processScenarioSchema = z
|
|
|
77
99
|
.array(childProcessString.min(1))
|
|
78
100
|
.default([]),
|
|
79
101
|
terminal: z
|
|
80
|
-
.
|
|
102
|
+
.strictObject({
|
|
81
103
|
columns: z.number().int().min(1).max(65_535).default(80),
|
|
82
104
|
rows: z.number().int().min(1).max(65_535).default(24),
|
|
83
105
|
scrollback: z.number().int().min(0).default(1_000),
|
|
@@ -85,19 +107,19 @@ export const processScenarioSchema = z
|
|
|
85
107
|
.default({ columns: 80, rows: 24, scrollback: 1_000 }),
|
|
86
108
|
events: z
|
|
87
109
|
.array(z.discriminatedUnion("type", [
|
|
88
|
-
z.
|
|
110
|
+
z.strictObject({
|
|
89
111
|
...timedEventBase,
|
|
90
112
|
type: z.literal("input"),
|
|
91
113
|
data: z.string(),
|
|
92
114
|
sensitive: z.boolean().default(false),
|
|
93
115
|
}),
|
|
94
|
-
z.
|
|
116
|
+
z.strictObject({
|
|
95
117
|
...timedEventBase,
|
|
96
118
|
type: z.literal("resize"),
|
|
97
119
|
columns: z.number().int().min(1).max(65_535),
|
|
98
120
|
rows: z.number().int().min(1).max(65_535),
|
|
99
121
|
}),
|
|
100
|
-
z.
|
|
122
|
+
z.strictObject({
|
|
101
123
|
...timedEventBase,
|
|
102
124
|
type: z.literal("signal"),
|
|
103
125
|
signal: z.enum(["SIGINT", "SIGTERM", "SIGKILL"]),
|
|
@@ -108,7 +130,7 @@ export const processScenarioSchema = z
|
|
|
108
130
|
idle_timeout_ms: positiveBudget.default(30_000),
|
|
109
131
|
settle_ms: z.number().int().safe().nonnegative().default(100),
|
|
110
132
|
limits: z
|
|
111
|
-
.
|
|
133
|
+
.strictObject({
|
|
112
134
|
output_bytes: positiveBudget.default(1_000_000),
|
|
113
135
|
files: positiveBudget.default(10_000),
|
|
114
136
|
file_bytes: positiveBudget.default(10_000_000),
|
|
@@ -124,14 +146,16 @@ export const processScenarioSchema = z
|
|
|
124
146
|
filesystem_depth: 16,
|
|
125
147
|
}),
|
|
126
148
|
normalization: z
|
|
127
|
-
.
|
|
149
|
+
.strictObject({
|
|
128
150
|
paths: z.boolean().default(false),
|
|
129
151
|
pids: z.boolean().default(true),
|
|
130
152
|
ports: z.boolean().default(true),
|
|
131
153
|
time_bucket_ms: positiveBudget.default(10),
|
|
132
154
|
patterns: z
|
|
133
|
-
.array(z.
|
|
134
|
-
pattern: z
|
|
155
|
+
.array(z.strictObject({
|
|
156
|
+
pattern: z
|
|
157
|
+
.string()
|
|
158
|
+
.describe("Literal text to replace in captured output; not a regular expression."),
|
|
135
159
|
replacement: z.string(),
|
|
136
160
|
}))
|
|
137
161
|
.default([]),
|
|
@@ -144,7 +168,6 @@ export const processScenarioSchema = z
|
|
|
144
168
|
patterns: [],
|
|
145
169
|
}),
|
|
146
170
|
})
|
|
147
|
-
.strict()
|
|
148
171
|
.superRefine((scenario, context) => {
|
|
149
172
|
for (let index = 1; index < scenario.events.length; index += 1) {
|
|
150
173
|
const event = scenario.events[index];
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { evaluateProcessTraceSide, processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
|
|
2
2
|
import { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
|
|
3
|
-
export { processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
|
|
4
|
-
export { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
|
|
5
3
|
/** Compare two captures against an explicit finite trace language. */
|
|
6
4
|
export const compareProcessTraces = (left, right, specificationInput) => {
|
|
7
5
|
const specification = processTraceSpecificationSchema.parse(specificationInput);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { processSourceTruncated } from "./processCaptureCoverage.js";
|
|
2
3
|
import { processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
|
|
3
4
|
import { canonicalTraceJson, comparableTracePayload, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
|
|
4
|
-
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._
|
|
5
|
-
const locationSchema = processObservationLocationSchema;
|
|
5
|
+
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._\x2d]{0,63}$/u);
|
|
6
6
|
const matchedEventSchema = z.strictObject({
|
|
7
7
|
event_id: identifierSchema,
|
|
8
|
-
location:
|
|
8
|
+
location: processObservationLocationSchema,
|
|
9
9
|
});
|
|
10
10
|
const sideResultShape = {
|
|
11
11
|
satisfied_constraints: z.array(z.string()),
|
|
@@ -36,7 +36,7 @@ const diagnosticSchema = z.strictObject({
|
|
|
36
36
|
side: z.enum(["left", "right"]),
|
|
37
37
|
message: z.string(),
|
|
38
38
|
event_ids: z.array(identifierSchema),
|
|
39
|
-
locations: z.array(
|
|
39
|
+
locations: z.array(processObservationLocationSchema),
|
|
40
40
|
});
|
|
41
41
|
/** Structured verdict for one declared process trace language. */
|
|
42
42
|
export const processTraceComparisonResultSchema = z.strictObject({
|
|
@@ -56,11 +56,11 @@ const scopesFor = (sources) => new Set([...sources].map((source) => {
|
|
|
56
56
|
return "process";
|
|
57
57
|
return "interaction";
|
|
58
58
|
}));
|
|
59
|
-
const unknownSide = () => ({
|
|
59
|
+
const unknownSide = (rawTrace = []) => ({
|
|
60
60
|
status: "unknown",
|
|
61
61
|
matched_variant: null,
|
|
62
62
|
satisfied_constraints: [],
|
|
63
|
-
raw_trace:
|
|
63
|
+
raw_trace: rawTrace,
|
|
64
64
|
});
|
|
65
65
|
const failure = (input) => ({
|
|
66
66
|
result: {
|
|
@@ -102,7 +102,7 @@ const evaluateFiniteTrace = (ids, specification) => {
|
|
|
102
102
|
};
|
|
103
103
|
const collectRecords = (capture, sources) => {
|
|
104
104
|
const records = [];
|
|
105
|
-
for (const location of capture.event_journal
|
|
105
|
+
for (const location of capture.event_journal) {
|
|
106
106
|
const record = projectProcessObservation(capture, location);
|
|
107
107
|
if (record !== null && sources.has(record.source))
|
|
108
108
|
records.push({
|
|
@@ -296,10 +296,9 @@ const evaluateMatchedTrace = (trace, specification) => {
|
|
|
296
296
|
export const evaluateProcessTraceSide = (capture, specification) => {
|
|
297
297
|
const sources = new Set(specification.events.map(({ source }) => source));
|
|
298
298
|
const relevantScopes = scopesFor(sources);
|
|
299
|
-
|
|
300
|
-
capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope))
|
|
301
|
-
|
|
302
|
-
if ((capture.event_journal ?? []).length === 0)
|
|
299
|
+
const incomplete = [...sources].some((source) => processSourceTruncated(capture, source)) ||
|
|
300
|
+
capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope));
|
|
301
|
+
if (capture.event_journal.length === 0)
|
|
303
302
|
return {
|
|
304
303
|
result: unknownSide(),
|
|
305
304
|
diagnostic: {
|
|
@@ -310,6 +309,11 @@ export const evaluateProcessTraceSide = (capture, specification) => {
|
|
|
310
309
|
},
|
|
311
310
|
};
|
|
312
311
|
const matched = matchRecords(collectRecords(capture, sources), specification);
|
|
312
|
+
if (incomplete)
|
|
313
|
+
return {
|
|
314
|
+
result: unknownSide("rawTrace" in matched ? matched.rawTrace : matched.result.raw_trace),
|
|
315
|
+
diagnostic: null,
|
|
316
|
+
};
|
|
313
317
|
return "rawTrace" in matched
|
|
314
318
|
? evaluateMatchedTrace(matched, specification)
|
|
315
319
|
: matched;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
+
import { IDENTIFIER_PATTERN } from "../stringPatterns.js";
|
|
3
4
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
4
5
|
import { comparableProcessObservationPayload, processObservationSourceSchema, } from "./processObservation.js";
|
|
5
|
-
const identifierSchema = z.string().regex(
|
|
6
|
-
/** Process observation families admitted by a declared trace specification. */
|
|
7
|
-
export const processTraceSourceSchema = processObservationSourceSchema;
|
|
6
|
+
const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
7
|
const cardinalitySchema = z.discriminatedUnion("kind", [
|
|
9
8
|
z.strictObject({ kind: z.literal("required") }),
|
|
10
9
|
z.strictObject({ kind: z.literal("optional") }),
|
|
@@ -25,7 +24,7 @@ const cardinalitySchema = z.discriminatedUnion("kind", [
|
|
|
25
24
|
]);
|
|
26
25
|
const eventDeclarationSchema = z.strictObject({
|
|
27
26
|
id: identifierSchema,
|
|
28
|
-
source:
|
|
27
|
+
source: processObservationSourceSchema,
|
|
29
28
|
exact: jsonValueSchema,
|
|
30
29
|
ignore_fields: z
|
|
31
30
|
.array(z.enum([
|
|
@@ -39,7 +39,7 @@ const XML_ENTITIES = {
|
|
|
39
39
|
* Unicode stays as written: comments and CDATA may hold such text literally,
|
|
40
40
|
* and the XML decoder rejects it anywhere else.
|
|
41
41
|
*/
|
|
42
|
-
const decodeXmlText = (text) => text.replace(/&(?:#x([\da-f]+)|#(\d+)|([a-z]+));/giu, (entity, hex, decimal, name) => {
|
|
42
|
+
export const decodeXmlText = (text) => text.replace(/&(?:#x([\da-f]+)|#(\d+)|([a-z]+));/giu, (entity, hex, decimal, name) => {
|
|
43
43
|
const codePoint = hex !== undefined
|
|
44
44
|
? parseInt(hex, 16)
|
|
45
45
|
: decimal !== undefined
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Decode BOM-aware XML plist text with fatal byte validation. */
|
|
2
|
+
export const decodeXmlPlistText = (bytes) => {
|
|
3
|
+
const encoding = bytes[0] === 0xff && bytes[1] === 0xfe
|
|
4
|
+
? "utf-16le"
|
|
5
|
+
: bytes[0] === 0xfe && bytes[1] === 0xff
|
|
6
|
+
? "utf-16be"
|
|
7
|
+
: "utf-8";
|
|
8
|
+
const text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
|
|
9
|
+
const declaration = /^<\?xml\s[^?]*\bencoding\s*=\s*["']([^"']+)["']/u.exec(text)?.[1];
|
|
10
|
+
const declared = declaration?.toLowerCase();
|
|
11
|
+
if (declared !== undefined &&
|
|
12
|
+
!["utf-8", "utf-16", "utf-16le", "utf-16be"].includes(declared))
|
|
13
|
+
throw new TypeError(`Unsupported XML encoding declaration: ${declaration}. Supported encodings are UTF-8 and BOM-marked UTF-16 in either byte order.`);
|
|
14
|
+
if (declared !== undefined &&
|
|
15
|
+
declared !== encoding &&
|
|
16
|
+
!(encoding !== "utf-8" && declared === "utf-16"))
|
|
17
|
+
throw new TypeError("XML encoding declaration disagrees with its bytes");
|
|
18
|
+
return text;
|
|
19
|
+
};
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { AnalysisError } from "./analysisErrorBase.js";
|
|
1
|
+
import { AnalysisError, } from "./analysisErrorBase.js";
|
|
2
2
|
/** A provider adapter failed outside its more precise typed variants. */
|
|
3
3
|
export class ProviderAdapterError extends AnalysisError {
|
|
4
4
|
providerId;
|
|
5
5
|
operation;
|
|
6
6
|
_tag = "ProviderAdapterError";
|
|
7
|
+
userMessage;
|
|
7
8
|
diagnostics;
|
|
8
9
|
constructor(providerId, operation, options = {}) {
|
|
9
10
|
super(`Provider ${providerId} adapter failed during ${operation}`, options);
|
|
10
11
|
this.providerId = providerId;
|
|
11
12
|
this.operation = operation;
|
|
13
|
+
this.userMessage = options.userMessage;
|
|
12
14
|
this.diagnostics =
|
|
13
15
|
options.diagnostics === undefined
|
|
14
16
|
? undefined
|