rea-agents 3.1.0 → 3.2.1
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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -10,11 +10,10 @@ const EXTENSIONS = [
|
|
|
10
10
|
".html",
|
|
11
11
|
".node",
|
|
12
12
|
];
|
|
13
|
-
const MAX_PACKAGE_DEPTH = 4;
|
|
14
13
|
const NODE_BUILTINS = new Set(builtinModules.map((name) => name.replace(/^node:/u, "")));
|
|
15
14
|
/** Resolve one declaration under its exact syntax/metadata context. */
|
|
16
|
-
export const resolveArtifactPathByContext = (input) =>
|
|
17
|
-
const
|
|
15
|
+
export const resolveArtifactPathByContext = (input) => resolvePackagePath(input, new Set());
|
|
16
|
+
const resolvePackagePath = (input, packageChain) => {
|
|
18
17
|
const rejected = rejectDeclaration(input);
|
|
19
18
|
if (rejected !== null)
|
|
20
19
|
return rejected;
|
|
@@ -24,23 +23,21 @@ const resolveAtDepth = (input, packageDepth) => {
|
|
|
24
23
|
const confined = confineCandidate(input, candidate);
|
|
25
24
|
if (typeof confined !== "string")
|
|
26
25
|
return confined;
|
|
27
|
-
const resolved = resolveCandidate(input, confined,
|
|
28
|
-
return outcome(input, resolved
|
|
26
|
+
const resolved = resolveCandidate(input, confined, packageChain);
|
|
27
|
+
return outcome(input, resolved);
|
|
29
28
|
};
|
|
30
29
|
const rejectDeclaration = (input) => {
|
|
31
30
|
const declared = input.declaredPath;
|
|
32
31
|
if (declared.length === 0)
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
return outcome(input, "rejected", null, [
|
|
36
|
-
"The declared path exceeds the 4096-character resolution bound.",
|
|
32
|
+
return unresolvedOutcome(input, "rejected", [
|
|
33
|
+
"The declared path is empty.",
|
|
37
34
|
]);
|
|
38
35
|
if (declared.includes("\0") || declared.includes("\\"))
|
|
39
|
-
return
|
|
36
|
+
return unresolvedOutcome(input, "rejected", [
|
|
40
37
|
"NUL and backslash path syntax are not admitted for canonical artifact paths.",
|
|
41
38
|
]);
|
|
42
39
|
if (/%(?:2e|2f|5c)/iu.test(declared))
|
|
43
|
-
return
|
|
40
|
+
return unresolvedOutcome(input, "rejected", [
|
|
44
41
|
"Encoded dot or separator bytes are rejected before artifact path resolution.",
|
|
45
42
|
]);
|
|
46
43
|
return null;
|
|
@@ -57,14 +54,14 @@ const contextualCandidate = (input) => {
|
|
|
57
54
|
if (fileUrl !== undefined)
|
|
58
55
|
return fileUrl;
|
|
59
56
|
if (hasScheme(declared))
|
|
60
|
-
return
|
|
57
|
+
return unresolvedOutcome(input, "external", [
|
|
61
58
|
"URL and Node builtin schemes are outside static artifact module resolution.",
|
|
62
59
|
]);
|
|
63
60
|
if (!declared.startsWith(".") && !declared.startsWith("/"))
|
|
64
61
|
return bareModuleCandidate(input, declared);
|
|
65
62
|
}
|
|
66
63
|
else if (hasScheme(declared))
|
|
67
|
-
return
|
|
64
|
+
return unresolvedOutcome(input, "external", [
|
|
68
65
|
"URL schemes are outside this local artifact path context.",
|
|
69
66
|
]);
|
|
70
67
|
const relative = declared.startsWith("/") ? declared.slice(1) : declared;
|
|
@@ -77,11 +74,11 @@ const bareModuleCandidate = (input, declared) => {
|
|
|
77
74
|
if (packageName === null ||
|
|
78
75
|
NODE_BUILTINS.has(packageName) ||
|
|
79
76
|
declared.startsWith("#"))
|
|
80
|
-
return
|
|
77
|
+
return unresolvedOutcome(input, "external", [
|
|
81
78
|
"The bare specifier is a Node builtin, package import map, or invalid package name.",
|
|
82
79
|
]);
|
|
83
80
|
if (declared !== packageName)
|
|
84
|
-
return
|
|
81
|
+
return unresolvedOutcome(input, "external", [
|
|
85
82
|
"Bare package subpaths remain unresolved unless an exact package-exports subpath model is available.",
|
|
86
83
|
]);
|
|
87
84
|
const source = input.files.get(input.sourcePath);
|
|
@@ -94,7 +91,7 @@ const bareModuleCandidate = (input, declared) => {
|
|
|
94
91
|
break;
|
|
95
92
|
directory = posix.dirname(directory);
|
|
96
93
|
}
|
|
97
|
-
return
|
|
94
|
+
return unresolvedOutcome(input, "external", [
|
|
98
95
|
"No matching bare package was inventoried in an enclosing node_modules directory.",
|
|
99
96
|
]);
|
|
100
97
|
};
|
|
@@ -115,7 +112,7 @@ const hasContainerCandidate = (files, candidate, containerSha256) => [...directC
|
|
|
115
112
|
const htmlCandidate = (input) => {
|
|
116
113
|
const declared = stripQueryAndFragment(input.declaredPath);
|
|
117
114
|
if (hasScheme(declared))
|
|
118
|
-
return
|
|
115
|
+
return unresolvedOutcome(input, "external", [
|
|
119
116
|
"External HTML references are not mapped to local artifact assets.",
|
|
120
117
|
]);
|
|
121
118
|
if (declared.startsWith("/"))
|
|
@@ -124,7 +121,7 @@ const htmlCandidate = (input) => {
|
|
|
124
121
|
if (base === undefined || base === null || base === "")
|
|
125
122
|
return posix.join(posix.dirname(input.sourcePath), declared);
|
|
126
123
|
if (hasScheme(base))
|
|
127
|
-
return
|
|
124
|
+
return unresolvedOutcome(input, "external", [
|
|
128
125
|
"The document base href is external, so its script reference is not a local artifact path.",
|
|
129
126
|
]);
|
|
130
127
|
const basePath = base.startsWith("/")
|
|
@@ -138,12 +135,12 @@ const confineCandidate = (input, candidate) => {
|
|
|
138
135
|
if (normalized === ".." ||
|
|
139
136
|
normalized.startsWith("../") ||
|
|
140
137
|
normalized.startsWith("/"))
|
|
141
|
-
return
|
|
138
|
+
return unresolvedOutcome(input, "rejected", [
|
|
142
139
|
"The resolved candidate escapes the canonical artifact root.",
|
|
143
140
|
]);
|
|
144
141
|
return normalized === "." ? "" : normalized;
|
|
145
142
|
};
|
|
146
|
-
const resolveCandidate = (input, candidate,
|
|
143
|
+
const resolveCandidate = (input, candidate, packageChain) => {
|
|
147
144
|
const source = input.files.get(input.sourcePath);
|
|
148
145
|
for (const path of directCandidates(candidate)) {
|
|
149
146
|
const target = input.files.get(path);
|
|
@@ -152,14 +149,6 @@ const resolveCandidate = (input, candidate, packageDepth) => {
|
|
|
152
149
|
target.container_sha256 === source.container_sha256))
|
|
153
150
|
return { resolvedPath: path, status: "resolved", limitations: [] };
|
|
154
151
|
}
|
|
155
|
-
if (packageDepth >= MAX_PACKAGE_DEPTH)
|
|
156
|
-
return {
|
|
157
|
-
resolvedPath: null,
|
|
158
|
-
status: "unavailable",
|
|
159
|
-
limitations: [
|
|
160
|
-
`Directory package resolution exceeded its ${String(MAX_PACKAGE_DEPTH)}-package recursion bound.`,
|
|
161
|
-
],
|
|
162
|
-
};
|
|
163
152
|
const packagePath = posix.join(candidate, "package.json");
|
|
164
153
|
const packageFile = input.files.get(packagePath);
|
|
165
154
|
if (packageFile === undefined ||
|
|
@@ -174,28 +163,42 @@ const resolveCandidate = (input, candidate, packageDepth) => {
|
|
|
174
163
|
`Directory package metadata ${packagePath} was inventoried but its text is unavailable: ${packageFile.text.reason}.`,
|
|
175
164
|
],
|
|
176
165
|
};
|
|
166
|
+
if (packageChain.has(packagePath))
|
|
167
|
+
return {
|
|
168
|
+
resolvedPath: null,
|
|
169
|
+
status: "unavailable",
|
|
170
|
+
limitations: [
|
|
171
|
+
`Directory package entrypoint cycle includes ${packagePath}.`,
|
|
172
|
+
],
|
|
173
|
+
};
|
|
177
174
|
const main = packageEntry(packageFile.text.value, input.moduleKind);
|
|
178
175
|
if (main.status === "invalid")
|
|
179
176
|
return {
|
|
180
177
|
resolvedPath: null,
|
|
181
178
|
status: "unavailable",
|
|
182
179
|
limitations: [
|
|
183
|
-
`Directory package metadata ${packagePath} is not valid
|
|
180
|
+
`Directory package metadata ${packagePath} is not valid package JSON.`,
|
|
184
181
|
],
|
|
185
182
|
};
|
|
186
183
|
if (main.status === "missing")
|
|
187
184
|
return notFoundCandidate();
|
|
188
|
-
const nested =
|
|
185
|
+
const nested = resolvePackagePath({
|
|
189
186
|
declaredPath: main.value,
|
|
190
187
|
sourcePath: packagePath,
|
|
191
188
|
context: "package-entrypoint",
|
|
192
189
|
files: input.files,
|
|
193
|
-
},
|
|
194
|
-
return
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
190
|
+
}, new Set([...packageChain, packagePath]));
|
|
191
|
+
return nested.resolution_status === "resolved"
|
|
192
|
+
? {
|
|
193
|
+
resolvedPath: nested.resolved_path,
|
|
194
|
+
status: nested.resolution_status,
|
|
195
|
+
limitations: nested.limitations,
|
|
196
|
+
}
|
|
197
|
+
: {
|
|
198
|
+
resolvedPath: null,
|
|
199
|
+
status: nested.resolution_status,
|
|
200
|
+
limitations: nested.limitations,
|
|
201
|
+
};
|
|
199
202
|
};
|
|
200
203
|
const directCandidates = (candidate) => [
|
|
201
204
|
candidate,
|
|
@@ -216,7 +219,7 @@ const packageEntry = (text, moduleKind) => {
|
|
|
216
219
|
const entry = preferred.find((candidate) => candidate !== undefined);
|
|
217
220
|
if (entry === undefined)
|
|
218
221
|
return { status: "missing" };
|
|
219
|
-
return
|
|
222
|
+
return packagePathValue(entry);
|
|
220
223
|
}
|
|
221
224
|
catch {
|
|
222
225
|
return { status: "invalid" };
|
|
@@ -224,25 +227,25 @@ const packageEntry = (text, moduleKind) => {
|
|
|
224
227
|
};
|
|
225
228
|
const packageExport = (value, moduleKind) => {
|
|
226
229
|
if (typeof value === "string")
|
|
227
|
-
return
|
|
230
|
+
return packagePathValue(value);
|
|
228
231
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
229
232
|
return { status: "invalid" };
|
|
230
233
|
const root = Reflect.get(value, ".") ?? value;
|
|
231
234
|
if (typeof root === "string")
|
|
232
|
-
return
|
|
235
|
+
return packagePathValue(root);
|
|
233
236
|
if (typeof root !== "object" || root === null || Array.isArray(root))
|
|
234
237
|
return { status: "invalid" };
|
|
235
238
|
const condition = Reflect.get(root, moduleKind ?? "default") ?? Reflect.get(root, "default");
|
|
236
|
-
return
|
|
239
|
+
return packagePathValue(condition);
|
|
237
240
|
};
|
|
238
|
-
const
|
|
241
|
+
const packagePathValue = (value) => typeof value === "string" && value.length > 0
|
|
239
242
|
? { status: "value", value }
|
|
240
243
|
: { status: "invalid" };
|
|
241
244
|
const notFoundCandidate = () => ({
|
|
242
245
|
resolvedPath: null,
|
|
243
246
|
status: "not-found",
|
|
244
247
|
limitations: [
|
|
245
|
-
"No
|
|
248
|
+
"No extension, directory package, or index candidate exists in the inventoried artifact container.",
|
|
246
249
|
],
|
|
247
250
|
});
|
|
248
251
|
const hasScheme = (value) => /^[A-Za-z][A-Za-z+.-]*:/u.test(value);
|
|
@@ -260,10 +263,19 @@ const fileUrlPath = (value) => {
|
|
|
260
263
|
}
|
|
261
264
|
};
|
|
262
265
|
const stripQueryAndFragment = (value) => value.split("#", 1)[0]?.split("?", 1)[0] ?? "";
|
|
263
|
-
const outcome = (input,
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
266
|
+
const outcome = (input, resolution) => resolution.status === "resolved"
|
|
267
|
+
? {
|
|
268
|
+
declared_path: input.declaredPath,
|
|
269
|
+
resolution_context: input.context,
|
|
270
|
+
resolved_path: resolution.resolvedPath,
|
|
271
|
+
resolution_status: resolution.status,
|
|
272
|
+
limitations: resolution.limitations,
|
|
273
|
+
}
|
|
274
|
+
: {
|
|
275
|
+
declared_path: input.declaredPath,
|
|
276
|
+
resolution_context: input.context,
|
|
277
|
+
resolved_path: null,
|
|
278
|
+
resolution_status: resolution.status,
|
|
279
|
+
limitations: resolution.limitations,
|
|
280
|
+
};
|
|
281
|
+
const unresolvedOutcome = (input, status, limitations) => outcome(input, { resolvedPath: null, status, limitations });
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
-
import { performance } from "node:perf_hooks";
|
|
3
2
|
import { AsarArtifactReader } from "../artifacts/AsarArtifactReader.js";
|
|
4
3
|
import { ArtifactReaderFailure, } from "../artifacts/ArtifactReader.js";
|
|
5
4
|
import { DirectoryArtifactReader } from "../artifacts/DirectoryArtifactReader.js";
|
|
6
5
|
import { analyzeJavaScriptArtifactFiles } from "./JavaScriptArtifactAnalysis.js";
|
|
7
6
|
import { readJavaScriptArtifactFiles } from "./JavaScriptArtifactFiles.js";
|
|
8
7
|
import { buildJavaScriptArtifactGraph } from "./JavaScriptArtifactGraphBuilder.js";
|
|
9
|
-
import {
|
|
8
|
+
import { javascriptArtifactReconstructionInputSchema, } from "./JavaScriptArtifactReconstructionInput.js";
|
|
10
9
|
import { scanCanonicalArtifactInventory } from "./ArtifactInventory.js";
|
|
11
10
|
import { summarizeElectronBoundaries } from "./ElectronBoundaryAnalysis.js";
|
|
12
11
|
import { buildJavaScriptSemanticGraph } from "./JavaScriptSemanticGraphBuilder.js";
|
|
@@ -16,15 +15,15 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal) => {
|
|
|
16
15
|
abortIfNeeded(signal);
|
|
17
16
|
const path = await realpath(input.input_path);
|
|
18
17
|
const format = await resolveFormat(path, input);
|
|
19
|
-
const snapshot = await scanCanonicalArtifactInventory(path,
|
|
18
|
+
const snapshot = await scanCanonicalArtifactInventory(path, { signal });
|
|
20
19
|
if (snapshot.manifest.root_format !== format)
|
|
21
20
|
throw new ArtifactReaderFailure("format", `Artifact inventory classified ${path} as ${snapshot.manifest.root_format}, not ${format}`);
|
|
22
21
|
const reader = createReader(path, format);
|
|
23
22
|
try {
|
|
24
|
-
const files = await readJavaScriptArtifactFiles(reader, snapshot,
|
|
25
|
-
const analysis = analyzeJavaScriptArtifactFiles(files
|
|
23
|
+
const files = await readJavaScriptArtifactFiles(reader, snapshot, signal);
|
|
24
|
+
const analysis = analyzeJavaScriptArtifactFiles(files);
|
|
26
25
|
abortIfNeeded(signal);
|
|
27
|
-
const graph = buildJavaScriptArtifactGraph(snapshot, files, analysis
|
|
26
|
+
const graph = buildJavaScriptArtifactGraph(snapshot, files, analysis);
|
|
28
27
|
const semanticGraph = buildJavaScriptSemanticGraph({
|
|
29
28
|
rootArtifactSha256: snapshot.manifest.root_sha256,
|
|
30
29
|
applicationGraph: graph,
|
|
@@ -42,11 +41,7 @@ export const reconstructJavaScriptArtifact = async (rawInput, signal) => {
|
|
|
42
41
|
statistics: {
|
|
43
42
|
relevant_files: files.files.length,
|
|
44
43
|
nested_asar_containers: files.containers.length,
|
|
45
|
-
text_files_selected: files.text_files_selected,
|
|
46
44
|
text_bytes_read: files.text_bytes_read,
|
|
47
|
-
omitted_text_files: files.omitted_text_files,
|
|
48
|
-
limit_omitted_text_files: files.limit_omitted_text_files,
|
|
49
|
-
policy_filtered_text_files: files.policy_filtered_text_files,
|
|
50
45
|
invalid_utf8_files: files.invalid_utf8_files,
|
|
51
46
|
parsed_javascript_files: analysis.files.filter(({ javascript }) => javascript !== null).length,
|
|
52
47
|
visited_ast_nodes: analysis.visited_ast_nodes,
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
/** Local ASAR/directory reconstruction request with explicit source-map authority. */
|
|
2
|
+
/** Local ASAR/directory reconstruction request. */
|
|
4
3
|
export const javascriptArtifactReconstructionInputSchema = z.strictObject({
|
|
5
|
-
input_path: z.string().min(1)
|
|
4
|
+
input_path: z.string().min(1),
|
|
6
5
|
format: z.enum(["auto", "asar", "directory"]).default("auto"),
|
|
7
|
-
source_map_read_approved: z.boolean().default(false),
|
|
8
|
-
limits: javascriptApplicationAnalysisLimitsSchema.default(JAVASCRIPT_APPLICATION_ANALYSIS_DEFAULT_LIMITS),
|
|
9
|
-
});
|
|
10
|
-
/** Project reconstruction limits into the shared artifact traversal policy. */
|
|
11
|
-
export const artifactLimitsForReconstruction = (input) => ({
|
|
12
|
-
maxEntries: input.limits.max_entries,
|
|
13
|
-
maxTotalBytes: input.limits.max_total_artifact_bytes,
|
|
14
|
-
maxEntryBytes: input.limits.max_artifact_entry_bytes,
|
|
15
|
-
maxCompressionRatio: input.limits.max_compression_ratio,
|
|
16
|
-
maxDepth: input.limits.max_depth,
|
|
17
|
-
maxPathBytes: input.limits.max_path_bytes,
|
|
18
6
|
});
|
|
@@ -26,13 +26,13 @@ export const analyzeJavaScriptJsonModule = (file) => {
|
|
|
26
26
|
const keys = typeof value === "object" && value !== null && !Array.isArray(value)
|
|
27
27
|
? Object.keys(value).sort(compareCodePoints)
|
|
28
28
|
: [];
|
|
29
|
-
const retained = keys
|
|
29
|
+
const retained = keys;
|
|
30
30
|
return {
|
|
31
31
|
path: file.path,
|
|
32
32
|
sha256: file.sha256,
|
|
33
33
|
status: "included",
|
|
34
34
|
top_level_keys: retained,
|
|
35
|
-
omitted_top_level_keys:
|
|
35
|
+
omitted_top_level_keys: 0,
|
|
36
36
|
limitation: null,
|
|
37
37
|
};
|
|
38
38
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
|
+
import { completeApplicationCoverage, partialApplicationCoverage, } from "../domain/javascriptApplicationEvidenceSchemas.js";
|
|
2
3
|
import { addAstContainsEdge, artifactLocalIdentity, } from "./JavaScriptArtifactGraphContext.js";
|
|
3
|
-
import { astObservationEvidence,
|
|
4
|
-
import { resolveArtifactPathByContext } from "./JavaScriptArtifactPathResolution.js";
|
|
4
|
+
import { astObservationEvidence, staticInferenceEvidence, } from "./JavaScriptArtifactGraphEvidence.js";
|
|
5
|
+
import { resolveArtifactPathByContext, } from "./JavaScriptArtifactPathResolution.js";
|
|
5
6
|
import { projectJavaScriptExportReturnShapes } from "./JavaScriptReturnShapeProjection.js";
|
|
6
7
|
/** Create one path-scoped source-module identity for every analyzed source file. */
|
|
7
8
|
export const addJavaScriptSourceModules = (context) => {
|
|
@@ -14,7 +15,7 @@ export const addJavaScriptSourceModules = (context) => {
|
|
|
14
15
|
const exports = semantic.ir.moduleLinks
|
|
15
16
|
.flatMap(({ exportedName }) => exportedName === null ? [] : [exportedName])
|
|
16
17
|
.sort(compareCodePoints);
|
|
17
|
-
const retainedExports = [...new Set(exports)]
|
|
18
|
+
const retainedExports = [...new Set(exports)];
|
|
18
19
|
const source = context.accumulator.addNode({
|
|
19
20
|
kind: "javascript-module",
|
|
20
21
|
identity: artifactLocalIdentity(file.sha256, "source-module", `${file.container_sha256}:${file.path}`),
|
|
@@ -30,7 +31,7 @@ export const addJavaScriptSourceModules = (context) => {
|
|
|
30
31
|
import_relationships: semantic.ir.moduleLinks.filter(({ kind }) => kind === "import" || kind === "require").length,
|
|
31
32
|
export_relationships: exports.length,
|
|
32
33
|
export_names: retainedExports,
|
|
33
|
-
omitted_export_names:
|
|
34
|
+
omitted_export_names: 0,
|
|
34
35
|
},
|
|
35
36
|
evidence: astObservationEvidence({
|
|
36
37
|
sha256: file.sha256,
|
|
@@ -161,25 +162,25 @@ const resolveModuleTarget = (input, specifier) => {
|
|
|
161
162
|
? "require"
|
|
162
163
|
: "import",
|
|
163
164
|
});
|
|
164
|
-
|
|
165
|
-
const file = path === null ? undefined : input.context.filesByPath.get(path);
|
|
166
|
-
const node = path === null
|
|
167
|
-
? undefined
|
|
168
|
-
: (input.context.sourceModuleNodes.get(path) ??
|
|
169
|
-
input.context.fileNodes.get(path));
|
|
170
|
-
if (path !== null && file !== undefined && node !== undefined)
|
|
165
|
+
if (resolution.resolution_status !== "resolved")
|
|
171
166
|
return {
|
|
172
|
-
node,
|
|
173
|
-
path,
|
|
174
|
-
file,
|
|
175
|
-
status:
|
|
167
|
+
node: unresolvedModuleNode(input, specifier, resolution.resolution_status),
|
|
168
|
+
path: null,
|
|
169
|
+
file: null,
|
|
170
|
+
status: resolution.resolution_status,
|
|
176
171
|
limitations: resolution.limitations,
|
|
177
172
|
};
|
|
173
|
+
const path = resolution.resolved_path;
|
|
174
|
+
const file = input.context.filesByPath.get(path);
|
|
175
|
+
const node = input.context.sourceModuleNodes.get(path) ??
|
|
176
|
+
input.context.fileNodes.get(path);
|
|
177
|
+
if (file === undefined || node === undefined)
|
|
178
|
+
throw new TypeError(`Resolved artifact path ${path} is absent from its graph context.`);
|
|
178
179
|
return {
|
|
179
|
-
node
|
|
180
|
-
path
|
|
181
|
-
file
|
|
182
|
-
status:
|
|
180
|
+
node,
|
|
181
|
+
path,
|
|
182
|
+
file,
|
|
183
|
+
status: "resolved",
|
|
183
184
|
limitations: resolution.limitations,
|
|
184
185
|
};
|
|
185
186
|
};
|
|
@@ -243,14 +244,9 @@ const relationshipEvidence = (input, operation, limitations, confidence = "high"
|
|
|
243
244
|
limitations: [...input.semantic.ir.limitations, ...limitations],
|
|
244
245
|
});
|
|
245
246
|
const semanticCoverage = (semantic) => {
|
|
246
|
-
const limits = Object.entries(semantic.limits).map(([name, value]) => ({
|
|
247
|
-
name: `semantic-${camelToKebab(name)}`,
|
|
248
|
-
value,
|
|
249
|
-
unit: "items",
|
|
250
|
-
}));
|
|
251
247
|
if (semantic.ir.coverage.status === "complete")
|
|
252
|
-
return
|
|
253
|
-
return
|
|
248
|
+
return completeApplicationCoverage();
|
|
249
|
+
return partialApplicationCoverage([], semantic.ir.coverage.omittedCount);
|
|
254
250
|
};
|
|
255
251
|
const moduleFormat = (path, ir) => {
|
|
256
252
|
const extension = posix.extname(path).toLowerCase();
|
|
@@ -282,5 +278,4 @@ const jsonStatus = (file) => {
|
|
|
282
278
|
const isExportLink = (link) => link.kind === "export" ||
|
|
283
279
|
link.kind === "re-export" ||
|
|
284
280
|
link.kind === "commonjs-export";
|
|
285
|
-
const camelToKebab = (value) => value.replaceAll(/([a-z])([A-Z])/gu, "$1-$2").toLowerCase();
|
|
286
281
|
const compareCodePoints = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
@@ -11,8 +11,14 @@ const REPLAY_POLICY_DOCUMENT = Object.freeze({
|
|
|
11
11
|
resource_manager: "systemd-user-cgroup-v2",
|
|
12
12
|
nested_user_namespaces: false,
|
|
13
13
|
});
|
|
14
|
+
const assertReplayManifestWithinProtocolLimit = (input) => {
|
|
15
|
+
if (new TextEncoder().encode(JSON.stringify(input)).byteLength >
|
|
16
|
+
input.limits.protocol_bytes)
|
|
17
|
+
throw new RangeError("Replay plan input exceeds its protocol byte limit");
|
|
18
|
+
};
|
|
14
19
|
/** Read, normalize, and content-address every input to one replay experiment. */
|
|
15
20
|
export const prepareReplayPlan = async (input, policy, host) => {
|
|
21
|
+
assertReplayManifestWithinProtocolLimit(input);
|
|
16
22
|
const cases = replayCases(input).map((item) => ({
|
|
17
23
|
...item,
|
|
18
24
|
sha256: digestJson(item.arguments),
|
|
@@ -34,7 +40,6 @@ export const prepareReplayPlan = async (input, policy, host) => {
|
|
|
34
40
|
: prepareSide(input.right, input.limits.module_bytes, host),
|
|
35
41
|
]);
|
|
36
42
|
const withoutDigest = {
|
|
37
|
-
schema_version: 1,
|
|
38
43
|
policy_version: REPLAY_POLICY_VERSION,
|
|
39
44
|
policy_sha256: digestJson(REPLAY_POLICY_DOCUMENT),
|
|
40
45
|
network: "none",
|
|
@@ -70,14 +75,13 @@ export const prepareReplayPlan = async (input, policy, host) => {
|
|
|
70
75
|
"Perform no host filesystem writes and expose no host or external network",
|
|
71
76
|
...(input.reproducer_export === undefined
|
|
72
77
|
? []
|
|
73
|
-
: ["Write one
|
|
78
|
+
: ["Write one reproducer after sandbox cleanup"]),
|
|
74
79
|
],
|
|
75
80
|
reproducer_export: input.reproducer_export === undefined
|
|
76
81
|
? null
|
|
77
82
|
: {
|
|
78
83
|
path: input.reproducer_export.path,
|
|
79
84
|
include_sources: input.reproducer_export.include_sources,
|
|
80
|
-
authority: "evidence_write",
|
|
81
85
|
},
|
|
82
86
|
};
|
|
83
87
|
const publicPlan = {
|
|
@@ -105,6 +109,8 @@ const prepareSide = async (side, maximumBytes, host) => {
|
|
|
105
109
|
if (remaining <= 0)
|
|
106
110
|
throw new RangeError("Replay module bytes exceed the aggregate limit");
|
|
107
111
|
const source = await host.readSource(module.path, remaining);
|
|
112
|
+
if (source.bytes.byteLength > remaining)
|
|
113
|
+
throw new RangeError("Replay module bytes exceed the aggregate limit");
|
|
108
114
|
totalBytes += source.bytes.byteLength;
|
|
109
115
|
loaded.push({ module, source });
|
|
110
116
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { projectPermissionFailure } from "./PermissionFailure.js";
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
import writeFileAtomic from "write-file-atomic";
|
|
3
4
|
import { controlledReplayInputSchema, replayExecutionResultSchema, controlledReplayOutputSchema, replayEvidenceSchema, } from "../domain/javascriptReplay.js";
|
|
4
|
-
import { AnalysisCapabilityUnavailableError, AnalysisCancelledError, AnalysisInputError, AnalysisProtocolError,
|
|
5
|
+
import { AnalysisCapabilityUnavailableError, AnalysisCancelledError, AnalysisInputError, AnalysisProtocolError, ReplayPlanStaleError, } from "../domain/errors.js";
|
|
5
6
|
import { createEvidence } from "../domain/evidence.js";
|
|
6
7
|
import { projectInputIssues } from "../domain/inputIssueProjection.js";
|
|
7
8
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
@@ -36,7 +37,7 @@ export const runControlledReplayValidated = async (dependencies, input, options
|
|
|
36
37
|
}));
|
|
37
38
|
if (input.plan_digest !== prepared.value.publicPlan.plan_digest)
|
|
38
39
|
return err(new ReplayPlanStaleError(input.plan_digest, prepared.value.publicPlan.plan_digest));
|
|
39
|
-
const exportContext = await authorizeReproducerExport(
|
|
40
|
+
const exportContext = await authorizeReproducerExport(input);
|
|
40
41
|
if (!exportContext.ok)
|
|
41
42
|
return exportContext;
|
|
42
43
|
const executed = await executeValidatedReplay({
|
|
@@ -69,11 +70,7 @@ const authorizeReplay = async (dependencies, policy, input, signal) => {
|
|
|
69
70
|
? await dependencies.authority.explain(request, "read")
|
|
70
71
|
: await dependencies.authority.authorize(request, "read");
|
|
71
72
|
if (!authorized.ok)
|
|
72
|
-
return err(authorized.error
|
|
73
|
-
? authorized.error
|
|
74
|
-
: new AnalysisProtocolError(authorized.error.message, {
|
|
75
|
-
cause: authorized.error,
|
|
76
|
-
}));
|
|
73
|
+
return err(projectPermissionFailure(authorized.error));
|
|
77
74
|
return ok(policy);
|
|
78
75
|
};
|
|
79
76
|
const prepareValidatedReplay = async (dependencies, policy, input, signal) => {
|
|
@@ -86,33 +83,11 @@ const prepareValidatedReplay = async (dependencies, policy, input, signal) => {
|
|
|
86
83
|
return err(new AnalysisCapabilityUnavailableError("rea-javascript-replay", OPERATION, cause instanceof Error ? cause.message : "replay planning failed"));
|
|
87
84
|
}
|
|
88
85
|
};
|
|
89
|
-
const authorizeReproducerExport =
|
|
86
|
+
const authorizeReproducerExport = (input) => {
|
|
90
87
|
if (input.reproducer_export === undefined)
|
|
91
88
|
return ok(undefined);
|
|
92
|
-
if (authority === undefined)
|
|
93
|
-
return err(new AnalysisCapabilityUnavailableError("rea-javascript-replay", OPERATION, "JavaScript replay permission policy is not configured"));
|
|
94
|
-
const exportAuthorized = await authority.authorize({
|
|
95
|
-
capability: "evidence_write",
|
|
96
|
-
roots: [input.reproducer_export.path],
|
|
97
|
-
executables: [],
|
|
98
|
-
environment_names: [],
|
|
99
|
-
network: "none",
|
|
100
|
-
mount: false,
|
|
101
|
-
operation_identity: `${OPERATION}:reproducer:${prepared.publicPlan.plan_digest}`,
|
|
102
|
-
}, "write");
|
|
103
|
-
if (!exportAuthorized.ok)
|
|
104
|
-
return err(exportAuthorized.error instanceof PermissionRequiredError
|
|
105
|
-
? exportAuthorized.error
|
|
106
|
-
: new AnalysisProtocolError(exportAuthorized.error.message, {
|
|
107
|
-
cause: exportAuthorized.error,
|
|
108
|
-
}));
|
|
109
|
-
const canonicalExportPath = exportAuthorized.value.request.roots[0];
|
|
110
|
-
if (canonicalExportPath !== input.reproducer_export.path)
|
|
111
|
-
return err(new AnalysisInputError(`${OPERATION}:reproducer_export:path`, {
|
|
112
|
-
cause: new TypeError(`Use the canonical reproducer path: ${canonicalExportPath ?? "unavailable"}`),
|
|
113
|
-
}));
|
|
114
89
|
return ok({
|
|
115
|
-
path:
|
|
90
|
+
path: input.reproducer_export.path,
|
|
116
91
|
includeSources: input.reproducer_export.include_sources === true,
|
|
117
92
|
});
|
|
118
93
|
};
|
|
@@ -151,7 +126,6 @@ const applyReproducerExport = async (executed, exportContext, prepared) => {
|
|
|
151
126
|
if (exportContext === undefined || executed.cleanup.state !== "complete")
|
|
152
127
|
return executed;
|
|
153
128
|
const manifest = {
|
|
154
|
-
schema_version: 1,
|
|
155
129
|
plan: prepared.publicPlan,
|
|
156
130
|
result: executed,
|
|
157
131
|
sources: exportContext.includeSources
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
2
|
+
import { partialApplicationCoverage, truncatedApplicationCoverage, } from "../domain/javascriptApplicationEvidenceSchemas.js";
|
|
2
3
|
import { flattenSemanticReturnValue } from "../domain/javascriptSemanticReturns.js";
|
|
3
|
-
import { partialReconstructionCoverage } from "./JavaScriptArtifactGraphEvidence.js";
|
|
4
|
-
const MAX_PROJECTED_RETURN_SHAPES = 32;
|
|
5
|
-
const MAX_PROJECTED_RETURN_FIELDS = 64;
|
|
6
|
-
const MAX_PROJECTED_PROPERTY_COVERAGE = 64;
|
|
7
4
|
/** Project one exact export/callable link into shallow bounded graph values. */
|
|
8
5
|
export const projectJavaScriptExportReturnShapes = (input) => {
|
|
9
6
|
if (input.link.callableId === null || input.link.exportedName === null)
|
|
@@ -19,26 +16,13 @@ export const projectJavaScriptExportReturnShapes = (input) => {
|
|
|
19
16
|
const complete = input.baseCoverage.status === "complete" &&
|
|
20
17
|
callable.returnCoverage.status === "complete" &&
|
|
21
18
|
projectionOmitted === 0;
|
|
19
|
+
const limits = input.baseCoverage.limits;
|
|
20
|
+
const omitted = semanticOmitted === null ? null : semanticOmitted + projectionOmitted;
|
|
22
21
|
const coverage = complete
|
|
23
22
|
? input.baseCoverage
|
|
24
|
-
:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
name: "return-shape-sites",
|
|
28
|
-
value: MAX_PROJECTED_RETURN_SHAPES,
|
|
29
|
-
unit: "items",
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
name: "return-shape-fields",
|
|
33
|
-
value: MAX_PROJECTED_RETURN_FIELDS,
|
|
34
|
-
unit: "items",
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: "return-shape-property-coverage",
|
|
38
|
-
value: MAX_PROJECTED_PROPERTY_COVERAGE,
|
|
39
|
-
unit: "items",
|
|
40
|
-
},
|
|
41
|
-
], semanticOmitted === null ? null : semanticOmitted + projectionOmitted, callable.returnCoverage.status === "truncated" || projectionOmitted > 0);
|
|
23
|
+
: projectionOmitted > 0
|
|
24
|
+
? truncatedApplicationCoverage(limits, omitted)
|
|
25
|
+
: partialApplicationCoverage(limits, omitted);
|
|
42
26
|
const limitations = [
|
|
43
27
|
...input.ir.limitations,
|
|
44
28
|
"Return shapes are inferred from inert syntax and do not prove runtime behavior.",
|
|
@@ -47,9 +31,6 @@ export const projectJavaScriptExportReturnShapes = (input) => {
|
|
|
47
31
|
"No direct return value was retained; runtime return behavior remains unknown.",
|
|
48
32
|
]
|
|
49
33
|
: []),
|
|
50
|
-
...(projectionOmitted > 0
|
|
51
|
-
? ["Return-shape graph projection reached explicit retention limits."]
|
|
52
|
-
: []),
|
|
53
34
|
];
|
|
54
35
|
return {
|
|
55
36
|
properties: jsonObjectSchema.parse({
|
|
@@ -76,25 +57,14 @@ export const projectJavaScriptExportReturnShapes = (input) => {
|
|
|
76
57
|
};
|
|
77
58
|
};
|
|
78
59
|
const projectReturnSites = (callable) => {
|
|
79
|
-
|
|
80
|
-
let retainedCoverage = 0;
|
|
81
|
-
let omittedFields = 0;
|
|
82
|
-
let omittedCoverage = 0;
|
|
83
|
-
const retainedSites = callable.returnSites.slice(0, MAX_PROJECTED_RETURN_SHAPES);
|
|
60
|
+
const retainedSites = callable.returnSites;
|
|
84
61
|
const shapes = retainedSites.map((site) => {
|
|
85
62
|
const flattened = flattenSemanticReturnValue(site.value);
|
|
86
|
-
const
|
|
87
|
-
const fields = flattened.fields.slice(0, remainingFields).map((field) => ({
|
|
63
|
+
const fields = flattened.fields.map((field) => ({
|
|
88
64
|
...field,
|
|
89
65
|
value: jsonValueSchema.parse(field.value),
|
|
90
66
|
}));
|
|
91
|
-
|
|
92
|
-
omittedFields += flattened.fields.length - fields.length;
|
|
93
|
-
const remainingCoverage = Math.max(0, MAX_PROJECTED_PROPERTY_COVERAGE - retainedCoverage);
|
|
94
|
-
const propertyCoverage = flattened.propertyCoverage.slice(0, remainingCoverage);
|
|
95
|
-
retainedCoverage += propertyCoverage.length;
|
|
96
|
-
omittedCoverage +=
|
|
97
|
-
flattened.propertyCoverage.length - propertyCoverage.length;
|
|
67
|
+
const propertyCoverage = flattened.propertyCoverage;
|
|
98
68
|
return {
|
|
99
69
|
source_range: site.location,
|
|
100
70
|
value_status: site.value.status,
|
|
@@ -104,8 +74,8 @@ const projectReturnSites = (callable) => {
|
|
|
104
74
|
});
|
|
105
75
|
return {
|
|
106
76
|
shapes,
|
|
107
|
-
omittedSites:
|
|
108
|
-
omittedFields,
|
|
109
|
-
omittedCoverage,
|
|
77
|
+
omittedSites: 0,
|
|
78
|
+
omittedFields: 0,
|
|
79
|
+
omittedCoverage: 0,
|
|
110
80
|
};
|
|
111
81
|
};
|