rea-agents 6.1.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 +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- 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 +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- 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 +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- 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 +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- 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 +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- 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/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- 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.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- 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 +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -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 +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- 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 +5 -10
- 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 +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- 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/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- 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/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- 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 +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- 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/javascript/electronActiveObservation.js +26 -69
- 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/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -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/{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/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 +9 -3
- 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/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- 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 +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- 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 +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- 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 +13 -12
- 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 +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- 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/providerAdapterError.js +2 -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 +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- 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 +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- 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/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -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/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- 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/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- 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 +25 -14
- package/dist/server/createServer.js +49 -36
- 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 -3
- 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 -2
- 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 +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- 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 +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- 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 +16 -6
- 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/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnalysisError } from "./analysisErrorBase.js";
|
|
1
|
+
import { AnalysisError, } from "./analysisErrorBase.js";
|
|
2
2
|
/** Artifact inventory or extraction failed a typed safety boundary. */
|
|
3
3
|
export class ArtifactOperationError extends AnalysisError {
|
|
4
4
|
operation;
|
|
@@ -8,10 +8,10 @@ export class ArtifactOperationError extends AnalysisError {
|
|
|
8
8
|
_tag = "ArtifactOperationError";
|
|
9
9
|
constructor(operation, reason, artifactDetails,
|
|
10
10
|
/** The specific constraint that failed, such as the colliding path. */
|
|
11
|
-
detail) {
|
|
11
|
+
detail, options) {
|
|
12
12
|
super(artifactDetails === undefined
|
|
13
13
|
? `Artifact ${operation} failed: ${reason}`
|
|
14
|
-
: `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})
|
|
14
|
+
: `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`, options);
|
|
15
15
|
this.operation = operation;
|
|
16
16
|
this.reason = reason;
|
|
17
17
|
this.artifactDetails = artifactDetails;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -24,3 +24,52 @@ export const stripQueryAndFragment = (value) => value.split("#", 1)[0]?.split("?
|
|
|
24
24
|
export const admitsCanonicalPathSyntax = (value) => !value.includes("\0") &&
|
|
25
25
|
!value.includes("\\") &&
|
|
26
26
|
!/%(?:2e|2f|5c)/iu.test(value);
|
|
27
|
+
/** C0 controls and space, which the URL parser strips around its input. */
|
|
28
|
+
const isUrlTrimmed = (code) => code <= 0x20;
|
|
29
|
+
/**
|
|
30
|
+
* The URL text a browser parses from an HTML URL attribute: HTML strips
|
|
31
|
+
* surrounding ASCII whitespace, and the URL parser strips surrounding C0
|
|
32
|
+
* controls and spaces and removes every tab and newline.
|
|
33
|
+
*/
|
|
34
|
+
export const htmlUrlText = (value) => {
|
|
35
|
+
let start = 0;
|
|
36
|
+
let end = value.length;
|
|
37
|
+
while (start < end && isUrlTrimmed(value.charCodeAt(start)))
|
|
38
|
+
start += 1;
|
|
39
|
+
while (end > start && isUrlTrimmed(value.charCodeAt(end - 1)))
|
|
40
|
+
end -= 1;
|
|
41
|
+
return value.slice(start, end).replace(/[\t\n\r]/gu, "");
|
|
42
|
+
};
|
|
43
|
+
const UTF8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
44
|
+
const UTF8_ENCODER = new TextEncoder();
|
|
45
|
+
/**
|
|
46
|
+
* Percent-decode a URL path as the URL standard does: valid `%XX` sequences
|
|
47
|
+
* become bytes and any other `%` stays literal. Returns null when the bytes
|
|
48
|
+
* are not UTF-8 or include NUL, because no canonical artifact path can match
|
|
49
|
+
* them. Callers refuse encoded dot and separator bytes before decoding.
|
|
50
|
+
*/
|
|
51
|
+
export const percentDecodeUrlPath = (value) => {
|
|
52
|
+
if (!/%[0-9a-f]{2}/iu.test(value))
|
|
53
|
+
return value;
|
|
54
|
+
const bytes = [];
|
|
55
|
+
for (let index = 0; index < value.length;) {
|
|
56
|
+
const escape = value.slice(index, index + 3);
|
|
57
|
+
if (/^%[0-9a-f]{2}$/iu.test(escape)) {
|
|
58
|
+
bytes.push(Number.parseInt(escape.slice(1), 16));
|
|
59
|
+
index += 3;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const character = String.fromCodePoint(value.codePointAt(index) ?? 0);
|
|
63
|
+
bytes.push(...UTF8_ENCODER.encode(character));
|
|
64
|
+
index += character.length;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const decoded = UTF8.decode(new Uint8Array(bytes));
|
|
68
|
+
return decoded.includes("\0") ? null : decoded;
|
|
69
|
+
}
|
|
70
|
+
catch (cause) {
|
|
71
|
+
// Invalid UTF-8 cannot name an inventoried path.
|
|
72
|
+
void cause;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
@@ -7,32 +7,38 @@ import { mzWindowsHeaderOffset, parseDosMzHeader } from "./dosMz.js";
|
|
|
7
7
|
export const parseExecutableHeader = (bytes, hostArchitecture, fileSize = bytes.length) => {
|
|
8
8
|
if (bytes.length >= 4 &&
|
|
9
9
|
bytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
|
|
10
|
-
return parseElf(bytes);
|
|
10
|
+
return parseElf(bytes, fileSize);
|
|
11
11
|
if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a)
|
|
12
12
|
return parseMz(bytes, fileSize);
|
|
13
13
|
if (bytes.length < 8)
|
|
14
14
|
return err("truncated or unsupported binary header");
|
|
15
15
|
const magic = bytes.readUInt32BE(0);
|
|
16
16
|
if ([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe].includes(magic))
|
|
17
|
-
return parseThinMachO(bytes, magic);
|
|
17
|
+
return parseThinMachO(bytes, magic, fileSize);
|
|
18
18
|
if ([0xcafebabe, 0xbebafeca, 0xcafebabf, 0xbfbafeca].includes(magic))
|
|
19
|
-
return parseFatMachO(bytes, magic, hostArchitecture);
|
|
19
|
+
return parseFatMachO(bytes, magic, hostArchitecture, fileSize);
|
|
20
20
|
return err("unsupported binary format");
|
|
21
21
|
};
|
|
22
|
-
const parseThinMachO = (bytes, magic) => {
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const parseThinMachO = (bytes, magic, fileSize) => {
|
|
23
|
+
const is64 = magic === 0xfeedfacf || magic === 0xcffaedfe;
|
|
24
|
+
const headerSize = is64 ? 32 : 28;
|
|
25
|
+
if (bytes.length < headerSize)
|
|
26
|
+
return err(`truncated Mach-O header: a ${is64 ? 64 : 32}-bit header needs ${headerSize} bytes; the file has ${fileSize}`);
|
|
25
27
|
const little = magic === 0xcefaedfe || magic === 0xcffaedfe;
|
|
26
|
-
const
|
|
28
|
+
const read = (offset) => little ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset);
|
|
29
|
+
const architecture = machArchitecture(read(4));
|
|
27
30
|
if (architecture === undefined)
|
|
28
31
|
return err("unsupported Mach-O architecture");
|
|
32
|
+
const commandBytes = read(20);
|
|
33
|
+
if (headerSize + commandBytes > fileSize)
|
|
34
|
+
return err(`truncated Mach-O load commands: the header declares ${commandBytes} bytes after its ${headerSize}-byte header; the file has ${fileSize}`);
|
|
29
35
|
return ok({
|
|
30
36
|
format: "mach-o",
|
|
31
37
|
architecture,
|
|
32
38
|
availableArchitectures: [architecture],
|
|
33
39
|
});
|
|
34
40
|
};
|
|
35
|
-
const parseFatMachO = (bytes, magic, host) => {
|
|
41
|
+
const parseFatMachO = (bytes, magic, host, fileSize) => {
|
|
36
42
|
const little = magic === 0xbebafeca || magic === 0xbfbafeca;
|
|
37
43
|
const is64 = magic === 0xcafebabf || magic === 0xbfbafeca;
|
|
38
44
|
if (bytes.length < 8)
|
|
@@ -43,10 +49,24 @@ const parseFatMachO = (bytes, magic, host) => {
|
|
|
43
49
|
if (count === 0 || count > 128 || bytes.length < 8 + count * entrySize)
|
|
44
50
|
return err("truncated or invalid FAT architecture table");
|
|
45
51
|
const architectures = [];
|
|
52
|
+
const sliceEnds = new Map();
|
|
46
53
|
for (let index = 0; index < count; index += 1) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
const entry = 8 + index * entrySize;
|
|
55
|
+
const architecture = machArchitecture(read(entry));
|
|
56
|
+
if (architecture === undefined || architectures.includes(architecture))
|
|
57
|
+
continue;
|
|
58
|
+
architectures.push(architecture);
|
|
59
|
+
const offset = is64
|
|
60
|
+
? little
|
|
61
|
+
? bytes.readBigUInt64LE(entry + 8)
|
|
62
|
+
: bytes.readBigUInt64BE(entry + 8)
|
|
63
|
+
: BigInt(read(entry + 8));
|
|
64
|
+
const size = is64
|
|
65
|
+
? little
|
|
66
|
+
? bytes.readBigUInt64LE(entry + 16)
|
|
67
|
+
: bytes.readBigUInt64BE(entry + 16)
|
|
68
|
+
: BigInt(read(entry + 12));
|
|
69
|
+
sliceEnds.set(architecture, offset + size);
|
|
50
70
|
}
|
|
51
71
|
const preferred = host === "arm64"
|
|
52
72
|
? "arm64"
|
|
@@ -59,20 +79,26 @@ const parseFatMachO = (bytes, magic, host) => {
|
|
|
59
79
|
: undefined;
|
|
60
80
|
if (preferred === undefined || !architectures.includes(preferred))
|
|
61
81
|
return err(`FAT binary has no host-compatible ${host} architecture`);
|
|
82
|
+
const sliceEnd = sliceEnds.get(preferred) ?? 0n;
|
|
83
|
+
if (sliceEnd > BigInt(fileSize))
|
|
84
|
+
return err(`truncated FAT slice: the ${preferred} slice ends at byte ${sliceEnd}; the file has ${fileSize}`);
|
|
62
85
|
return ok({
|
|
63
86
|
format: "mach-o",
|
|
64
87
|
architecture: preferred,
|
|
65
88
|
availableArchitectures: architectures,
|
|
66
89
|
});
|
|
67
90
|
};
|
|
68
|
-
const parseElf = (bytes) => {
|
|
69
|
-
if (bytes.length <
|
|
91
|
+
const parseElf = (bytes, fileSize) => {
|
|
92
|
+
if (bytes.length < 6)
|
|
70
93
|
return err("truncated ELF header");
|
|
71
94
|
if (bytes[4] !== 1 && bytes[4] !== 2)
|
|
72
95
|
return err("unsupported ELF class");
|
|
73
96
|
const little = bytes[5] === 1;
|
|
74
97
|
if (!little && bytes[5] !== 2)
|
|
75
98
|
return err("unsupported ELF endianness");
|
|
99
|
+
const headerSize = bytes[4] === 1 ? 52 : 64;
|
|
100
|
+
if (bytes.length < headerSize)
|
|
101
|
+
return err(`truncated ELF header: an ELF${bytes[4] === 1 ? 32 : 64} header needs ${headerSize} bytes; the file has ${fileSize}`);
|
|
76
102
|
const machine = little ? bytes.readUInt16LE(18) : bytes.readUInt16BE(18);
|
|
77
103
|
const architecture = elfArchitecture(machine);
|
|
78
104
|
if (architecture === undefined)
|
|
@@ -1,41 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
import { compareWebCaptures
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
.describe("Later passive web-page capture."),
|
|
13
|
-
before_scenario: compareBrowserScenariosInputSchema.shape.before_scenario
|
|
14
|
-
.optional()
|
|
15
|
-
.describe("Earlier browser scenario capture."),
|
|
16
|
-
after_scenario: compareBrowserScenariosInputSchema.shape.after_scenario
|
|
17
|
-
.optional()
|
|
18
|
-
.describe("Later browser scenario capture."),
|
|
19
|
-
normalization: compareBrowserScenariosInputSchema.shape.normalization
|
|
20
|
-
.unwrap()
|
|
21
|
-
.optional()
|
|
22
|
-
.describe("Exact-literal normalization policy."),
|
|
23
|
-
})
|
|
24
|
-
.superRefine((input, context) => {
|
|
25
|
-
const passive = input.before !== undefined && input.after !== undefined;
|
|
26
|
-
const scenario = input.before_scenario !== undefined && input.after_scenario !== undefined;
|
|
27
|
-
const passiveFieldsPresent = input.before !== undefined || input.after !== undefined;
|
|
28
|
-
const scenarioFieldsPresent = input.before_scenario !== undefined ||
|
|
29
|
-
input.after_scenario !== undefined ||
|
|
30
|
-
input.normalization !== undefined;
|
|
31
|
-
if (passive && !scenarioFieldsPresent)
|
|
32
|
-
return;
|
|
33
|
-
if (scenario && !passiveFieldsPresent)
|
|
34
|
-
return;
|
|
35
|
-
context.addIssue({
|
|
36
|
-
code: "custom",
|
|
37
|
-
message: "Provide before and after passive captures, or before_scenario, after_scenario, and normalization; do not mix comparison types.",
|
|
38
|
-
});
|
|
2
|
+
import { compareBrowserScenarios } from "./browserScenarioDiff.js";
|
|
3
|
+
import { compareWebCaptures } from "./webCaptureDiff.js";
|
|
4
|
+
import { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
|
|
5
|
+
import { compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
|
|
6
|
+
/** Mutually exclusive passive and scenario capture comparison inputs. */
|
|
7
|
+
export const browserCaptureComparisonInputSchema = z.union([compareWebCapturesInputSchema, compareBrowserScenariosInputSchema], {
|
|
8
|
+
// Standard Schema clients expose the union message, not its branch errors.
|
|
9
|
+
error: (issue) => issue.code === "invalid_union"
|
|
10
|
+
? z.prettifyError(new z.ZodError(issue.errors.flat()))
|
|
11
|
+
: undefined,
|
|
39
12
|
});
|
|
40
13
|
/** Result from passive page or browser scenario comparison. */
|
|
41
14
|
export const browserCaptureComparisonSchema = z.union([
|
|
@@ -43,15 +16,6 @@ export const browserCaptureComparisonSchema = z.union([
|
|
|
43
16
|
webCaptureDiffSchema,
|
|
44
17
|
]);
|
|
45
18
|
/** Dispatch a parsed capture comparison to its pure domain comparator. */
|
|
46
|
-
export const compareBrowserCaptures = (input) =>
|
|
47
|
-
? compareBrowserScenarios(
|
|
48
|
-
|
|
49
|
-
normalization: input.normalization ?? { rules: [] },
|
|
50
|
-
})
|
|
51
|
-
: compareWebCaptures(toPassiveComparison(input));
|
|
52
|
-
const isScenarioComparison = (input) => input.before_scenario !== undefined && input.after_scenario !== undefined;
|
|
53
|
-
const toPassiveComparison = (input) => {
|
|
54
|
-
if (input.before === undefined || input.after === undefined)
|
|
55
|
-
throw new Error("Validated passive comparison is missing a capture");
|
|
56
|
-
return { before: input.before, after: input.after };
|
|
57
|
-
};
|
|
19
|
+
export const compareBrowserCaptures = (input) => "before_scenario" in input
|
|
20
|
+
? compareBrowserScenarios(input)
|
|
21
|
+
: compareWebCaptures(input);
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
/**
|
|
3
|
+
/** Resolved network content selection recorded by a capture. */
|
|
4
4
|
export const browserNetworkContentSelectionValuesSchema = z.strictObject({
|
|
5
|
+
request_body: z.boolean(),
|
|
6
|
+
response_body: z.boolean(),
|
|
7
|
+
header_values: z.boolean(),
|
|
8
|
+
});
|
|
9
|
+
/** Caller omission selects metadata alone; individual content facets remain optional. */
|
|
10
|
+
export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema
|
|
11
|
+
.extend({
|
|
5
12
|
request_body: z.boolean().default(false),
|
|
6
13
|
response_body: z.boolean().default(false),
|
|
7
14
|
header_values: z.boolean().default(false),
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema.default({
|
|
15
|
+
})
|
|
16
|
+
.default({
|
|
11
17
|
request_body: false,
|
|
12
18
|
response_body: false,
|
|
13
19
|
header_values: false,
|
|
@@ -81,9 +81,20 @@ const browserScriptSchema = z.object({
|
|
|
81
81
|
frame_id: z.string().nullable().default(null),
|
|
82
82
|
url: z.string(),
|
|
83
83
|
origin: z.string().nullable(),
|
|
84
|
-
cdp_hash: z
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
cdp_hash: z
|
|
85
|
+
.string()
|
|
86
|
+
.nullable()
|
|
87
|
+
.describe("Producer-reported script hash; null when unavailable."),
|
|
88
|
+
length: z
|
|
89
|
+
.number()
|
|
90
|
+
.int()
|
|
91
|
+
.min(0)
|
|
92
|
+
.nullable()
|
|
93
|
+
.describe("Producer-reported script length; null when unavailable."),
|
|
94
|
+
is_module: z
|
|
95
|
+
.boolean()
|
|
96
|
+
.nullable()
|
|
97
|
+
.describe("Producer-reported module classification; null when unavailable."),
|
|
87
98
|
language: z.string().nullable(),
|
|
88
99
|
source_map_url: z.string().nullable(),
|
|
89
100
|
resource_reconciliation: browserResourceReconciliationSchema,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { browserScenarioActionSchema, browserScenarioBrowserSchema, browserScenarioCaptureSchema, browserScenarioEnvironmentSchema, browserScenarioSecretSchema, browserScenarioStorageSchema, browserScenarioUrlSchema, } from "./browserScenarioValues.js";
|
|
3
|
-
export {} from "./browserScenarioValues.js";
|
|
4
3
|
export const browserScenarioInputSchema = z.strictObject({
|
|
5
4
|
browser: browserScenarioBrowserSchema.describe("Required launch/connect selection. Launch uses the selected executable and an owned temporary profile; connect uses one loopback CDP endpoint and target."),
|
|
6
5
|
start_url: browserScenarioUrlSchema.describe("Required initial HTTP(S) URL. Query values must be declared separately as public literals or secret references."),
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { browserNetworkContentSelectionValuesSchema } from "./browserNetworkEvidence.js";
|
|
3
3
|
import { browserScenarioCompletenessSchema, browserScenarioEventSchema, browserScenarioStepSchema, } from "./browserScenarioCaptureValues.js";
|
|
4
|
-
export { classifyBrowserScenarioCompleteness, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, } from "./browserScenarioCaptureValues.js";
|
|
5
4
|
/** Step-indexed browser scenario observation. */
|
|
6
5
|
export const browserScenarioCaptureSchema = z
|
|
7
6
|
.strictObject({
|
|
@@ -16,7 +15,7 @@ export const browserScenarioCaptureSchema = z
|
|
|
16
15
|
start_origin: z.string().min(1),
|
|
17
16
|
action_count: z.number().int().min(1),
|
|
18
17
|
secret_references: z.array(z.string().min(1)),
|
|
19
|
-
network_content: browserNetworkContentSelectionValuesSchema
|
|
18
|
+
network_content: browserNetworkContentSelectionValuesSchema,
|
|
20
19
|
}),
|
|
21
20
|
duration_ms: z.number().int().min(0),
|
|
22
21
|
steps: z.array(browserScenarioStepSchema).min(1),
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {} from "./browserScenarioCapture.js";
|
|
2
1
|
import { actionState, artifactEvidenceState, captured, eventEvidenceState, eventsFor, networkContentCoverageReason, screenshotProjection, } from "./browserScenarioDiffEvidence.js";
|
|
3
2
|
import { browserScenarioDiffSchema, } from "./browserScenarioDiffValues.js";
|
|
4
3
|
import { commitBrowserScenarioNormalization, digestNormalizedScenarioValue, } from "./browserScenarioNormalization.js";
|
|
5
|
-
export { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
|
|
6
4
|
/** Compare scenario steps by stable step ID and apply only committed literal rules. */
|
|
7
5
|
export const compareBrowserScenarios = (input) => {
|
|
8
6
|
const normalization = commitBrowserScenarioNormalization(input.normalization);
|
|
@@ -54,18 +54,6 @@ export const eventsFor = (capture, stepIndex) => {
|
|
|
54
54
|
export const networkContentCoverageReason = (before, after) => {
|
|
55
55
|
const left = before.scenario.network_content;
|
|
56
56
|
const right = after.scenario.network_content;
|
|
57
|
-
if (left === undefined || right === undefined) {
|
|
58
|
-
const events = [...before.events.items, ...after.events.items];
|
|
59
|
-
if (events.some((event) => event.kind === "network-content") ||
|
|
60
|
-
((left === undefined) !== (right === undefined) &&
|
|
61
|
-
events.some((event) => event.kind === "request" ||
|
|
62
|
-
event.kind === "response" ||
|
|
63
|
-
event.kind === "request-failed" ||
|
|
64
|
-
event.kind === "request-finished" ||
|
|
65
|
-
event.kind === "request-unfinished")))
|
|
66
|
-
return "Network content selection is unknown in a legacy capture; capture both sides with matching content selection.";
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
57
|
return left.request_body !== right.request_body ||
|
|
70
58
|
left.response_body !== right.response_body ||
|
|
71
59
|
left.header_values !== right.header_values
|
|
@@ -62,8 +62,8 @@ const normalizationInputSchema = z
|
|
|
62
62
|
});
|
|
63
63
|
/** Input for step-aligned comparison of two browser scenario captures. */
|
|
64
64
|
export const compareBrowserScenariosInputSchema = z.strictObject({
|
|
65
|
-
before_scenario: browserScenarioCaptureSchema.describe("Earlier complete capture_browser_scenario
|
|
66
|
-
after_scenario: browserScenarioCaptureSchema.describe("Later complete capture_browser_scenario
|
|
65
|
+
before_scenario: browserScenarioCaptureSchema.describe("Earlier complete normalized_result from capture_browser_scenario."),
|
|
66
|
+
after_scenario: browserScenarioCaptureSchema.describe("Later complete normalized_result from capture_browser_scenario."),
|
|
67
67
|
normalization: normalizationInputSchema
|
|
68
68
|
.default({ rules: [] })
|
|
69
69
|
.describe("Exact-literal rules committed in the comparison result."),
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
2
3
|
import { isAbsoluteLocalPath, localPathStringSchema } from "./localPath.js";
|
|
3
4
|
import { browserNetworkContentSelectionSchema } from "./browserNetworkEvidence.js";
|
|
4
5
|
import { browserEndpointSchema, browserOriginSchema, } from "./browserObservation.js";
|
|
5
|
-
export const scenarioIdentifierSchema = z
|
|
6
|
-
.string()
|
|
7
|
-
.regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
|
|
6
|
+
export const scenarioIdentifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
7
|
const browserExecutablePathSchema = localPathStringSchema.refine(isAbsoluteLocalPath, {
|
|
9
8
|
message: "executable_path must be an absolute local filesystem path (for example /opt/chromium/chrome or C:\\chromium\\chrome.exe)",
|
|
10
9
|
});
|
|
@@ -84,7 +83,7 @@ export const browserScenarioEnvironmentSchema = z
|
|
|
84
83
|
timezone: z
|
|
85
84
|
.string()
|
|
86
85
|
.min(1)
|
|
87
|
-
.regex(/^[A-Za-z0-9_
|
|
86
|
+
.regex(/^[A-Za-z0-9_+\x2d]+(?:\x2f[A-Za-z0-9_+\x2d]+)*$/u)
|
|
88
87
|
.default("UTC"),
|
|
89
88
|
color_scheme: z.enum(["light", "dark", "no-preference"]).default("light"),
|
|
90
89
|
reduced_motion: z.enum(["reduce", "no-preference"]).default("reduce"),
|
package/dist/domain/callPath.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { callPathInputSchema, callPathResultSchema, parseCallPathAddress, } from "./callPathSchemas.js";
|
|
2
2
|
import { parseFunctionEvidence, } from "./functionDossierEvidence.js";
|
|
3
|
-
export { callPathInputSchema, callPathResultSchema };
|
|
4
3
|
/** Minimal directed caller-to-callee adjacency for call-path search. */
|
|
5
4
|
class CallGraph {
|
|
6
5
|
successors = new Map();
|
|
@@ -112,8 +111,8 @@ const parseSnapshots = (groups) => {
|
|
|
112
111
|
const snapshots = new Map();
|
|
113
112
|
for (const group of groups) {
|
|
114
113
|
const snapshot = parseFunctionEvidence(group);
|
|
115
|
-
const address = normalizeAddress(snapshot.procedure.address);
|
|
116
|
-
for (const callee of snapshot.
|
|
114
|
+
const address = normalizeAddress(snapshot.dossier.procedure.address);
|
|
115
|
+
for (const callee of snapshot.dossier.callees)
|
|
117
116
|
normalizeAddress(callee.address);
|
|
118
117
|
if (snapshots.has(address))
|
|
119
118
|
throw new TypeError(`Duplicate function Evidence for ${address}`);
|
|
@@ -131,9 +130,9 @@ const assertCompatible = (snapshots) => {
|
|
|
131
130
|
snapshot.subject.format !== first.subject.format ||
|
|
132
131
|
snapshot.subject.architecture !== first.subject.architecture)
|
|
133
132
|
throw new TypeError("Call-path Evidence mixes artifact subjects");
|
|
134
|
-
if (snapshot.provider.id !== first.provider.id ||
|
|
135
|
-
snapshot.provider.name !== first.provider.name ||
|
|
136
|
-
snapshot.provider.version !== first.provider.version)
|
|
133
|
+
if (snapshot.evidence.provider.id !== first.evidence.provider.id ||
|
|
134
|
+
snapshot.evidence.provider.name !== first.evidence.provider.name ||
|
|
135
|
+
snapshot.evidence.provider.version !== first.evidence.provider.version)
|
|
137
136
|
throw new TypeError("Call-path Evidence mixes providers");
|
|
138
137
|
}
|
|
139
138
|
};
|
|
@@ -141,7 +140,7 @@ const createGraph = (snapshots) => {
|
|
|
141
140
|
const graph = new CallGraph();
|
|
142
141
|
for (const [address, snapshot] of snapshots) {
|
|
143
142
|
graph.mergeNode(address);
|
|
144
|
-
for (const callee of snapshot.
|
|
143
|
+
for (const callee of snapshot.dossier.callees) {
|
|
145
144
|
const calleeAddress = normalizeAddress(callee.address);
|
|
146
145
|
graph.mergeNode(calleeAddress);
|
|
147
146
|
graph.mergeDirectedEdge(address, calleeAddress);
|
|
@@ -249,7 +248,7 @@ const citePath = (addresses, snapshots) => {
|
|
|
249
248
|
(index > 0 ? snapshots.get(addresses[index - 1] ?? "") : undefined);
|
|
250
249
|
return {
|
|
251
250
|
address,
|
|
252
|
-
name: snapshot?.procedure.name ?? null,
|
|
251
|
+
name: snapshot?.dossier.procedure.name ?? null,
|
|
253
252
|
evidence_links: snapshotLinks(supporting),
|
|
254
253
|
};
|
|
255
254
|
});
|
|
@@ -267,7 +266,7 @@ const citePath = (addresses, snapshots) => {
|
|
|
267
266
|
const snapshotLinks = (snapshot) => {
|
|
268
267
|
if (snapshot === undefined)
|
|
269
268
|
throw new TypeError("Every call-path claim requires supporting Evidence");
|
|
270
|
-
return snapshot.evidence.
|
|
269
|
+
return [snapshot.evidence.evidence_id];
|
|
271
270
|
};
|
|
272
271
|
const uniqueEvidence = (snapshots) => [
|
|
273
272
|
...new Set([...snapshots].flatMap((snapshot) => snapshotLinks(snapshot))),
|
|
@@ -4,10 +4,10 @@ import { evidenceSchema } from "./evidence.js";
|
|
|
4
4
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
5
|
const addressSchema = z
|
|
6
6
|
.string()
|
|
7
|
-
.regex(/^(?:(?:[A-Za-z0-9._
|
|
7
|
+
.regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
|
|
8
8
|
const inputAddressSchema = z
|
|
9
9
|
.string()
|
|
10
|
-
.regex(/^(?:(?:[A-Za-z0-9._
|
|
10
|
+
.regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
|
|
11
11
|
.transform((address) => {
|
|
12
12
|
const separator = address.lastIndexOf(":") + 1;
|
|
13
13
|
const space = address
|
|
@@ -3,9 +3,9 @@ import { artifactComparisonResultSchema } from "./artifactComparison.js";
|
|
|
3
3
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
4
4
|
import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
|
|
5
5
|
import { evidenceSchema, parseEvidence } from "./evidence.js";
|
|
6
|
-
import { functionComparisonResultSchema } from "./
|
|
6
|
+
import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
|
|
7
7
|
import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
|
|
8
|
-
import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/
|
|
8
|
+
import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
|
|
9
9
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
10
10
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
11
11
|
/** Input for aggregating existing comparison Evidence. */
|
|
@@ -209,7 +209,7 @@ const functionFindings = (evidence) => {
|
|
|
209
209
|
dimension: dimension.dimension,
|
|
210
210
|
scope: "static_candidate",
|
|
211
211
|
status: dimension.status,
|
|
212
|
-
classification: dimension.status === "unknown"
|
|
212
|
+
classification: dimension.status === "unknown"
|
|
213
213
|
? "unresolved_branch"
|
|
214
214
|
: dimension.conclusion_kind,
|
|
215
215
|
limitations: dimension.limitations,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
4
5
|
import { createEvidenceCompletionLedger, evidenceCompletionRecordSchema, } from "./evidenceCompletionLedger.js";
|
|
5
6
|
import { digestSchema } from "./../domain/digests.js";
|
|
6
7
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
7
|
-
const identifierSchema = z.string().regex(
|
|
8
|
+
const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
9
|
const identitySchema = z.strictObject({
|
|
9
10
|
id: identifierSchema,
|
|
10
11
|
version: z.string().min(1),
|
|
@@ -2,6 +2,11 @@ import { AnalysisError, } from "./analysisErrorBase.js";
|
|
|
2
2
|
/** Runtime configuration could not be parsed safely. */
|
|
3
3
|
export class ConfigurationError extends AnalysisError {
|
|
4
4
|
_tag = "ConfigurationError";
|
|
5
|
+
settings;
|
|
6
|
+
constructor(message, options) {
|
|
7
|
+
super(message, options);
|
|
8
|
+
this.settings = (options?.settings ?? []).map(({ setting, constraint }) => ({ setting, constraint }));
|
|
9
|
+
}
|
|
5
10
|
}
|
|
6
11
|
/** No app or binary session exists for an analysis request. */
|
|
7
12
|
export class NoBinaryOpenError extends AnalysisError {
|
|
@@ -16,10 +21,17 @@ export class BinaryTargetError extends AnalysisError {
|
|
|
16
21
|
reason;
|
|
17
22
|
_tag = "BinaryTargetError";
|
|
18
23
|
constraint;
|
|
24
|
+
/** The OS read-permission code of the cause, when the host denied access. */
|
|
25
|
+
systemCode;
|
|
19
26
|
constructor(path, reason, options) {
|
|
20
27
|
super(`Cannot open artifact: ${reason}`, options);
|
|
21
28
|
this.path = path;
|
|
22
29
|
this.reason = reason;
|
|
23
30
|
this.constraint = options?.constraint;
|
|
31
|
+
this.systemCode = readPermissionCode(options?.cause);
|
|
24
32
|
}
|
|
25
33
|
}
|
|
34
|
+
const readPermissionCode = (cause) => {
|
|
35
|
+
const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
|
|
36
|
+
return code === "EACCES" || code === "EPERM" ? code : undefined;
|
|
37
|
+
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
5
|
+
import { evidenceSchema } from "./evidence.js";
|
|
5
6
|
import { evidenceBundleSchema } from "./evidenceBundle.js";
|
|
6
7
|
import { err, ok } from "./result.js";
|
|
7
8
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
8
9
|
const conformancePackageIdSchema = prefixedDigestSchema("cp");
|
|
9
|
-
const scenarioIdSchema = z.string().regex(
|
|
10
|
+
const scenarioIdSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
10
11
|
const scenarioManifestSchema = z.strictObject({
|
|
11
12
|
scenario_id: scenarioIdSchema,
|
|
12
13
|
name: z.string().min(1),
|
|
@@ -45,7 +46,7 @@ const shimPlanSchema = z.strictObject({
|
|
|
45
46
|
const expectedEvidenceSchema = z.strictObject({
|
|
46
47
|
scenario_id: scenarioIdSchema,
|
|
47
48
|
/** Expected evidence envelopes. */
|
|
48
|
-
envelopes: z.array(
|
|
49
|
+
envelopes: z.array(evidenceSchema),
|
|
49
50
|
/** Expected evidence bundle. */
|
|
50
51
|
bundle: evidenceBundleSchema.nullable(),
|
|
51
52
|
/** Required dimensions that must be present in the evidence. */
|