rea-agents 6.1.0 → 6.3.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 +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- 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/android/AndroidAnalysisService.js +1 -1
- 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 +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- 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 +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- 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 +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- 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 +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- 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 +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- 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 +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- 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/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- 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 +7 -7
- 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/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- 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/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- 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/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -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/android/androidPartialObservation.js +36 -0
- 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 +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- 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/browserCompleteness.js +3 -2
- 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/browserScenarioCaptureValues.js +2 -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/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- 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 +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- 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 +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- 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 +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- 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/filesystem/RegularFile.js +41 -0
- 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 +105 -36
- 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 +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- 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 +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- 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 +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- 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/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- 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 +6 -6
- 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 +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- 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 +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- 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/registerManagedTools.js +7 -4
- 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 +32 -41
- 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 +19 -19
- 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 +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- 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 +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- 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/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
3
|
+
/** Project normalized PTY facts without source text used only for audit. */
|
|
4
|
+
export const comparableTerminalFrame = (frame) => ({
|
|
5
|
+
sequence: frame.sequence,
|
|
6
|
+
at_ms: frame.at_ms,
|
|
7
|
+
data: frame.data,
|
|
8
|
+
});
|
|
3
9
|
/** Process-capture observation families shared by live drivers and trace assertions. */
|
|
4
10
|
export const processObservationSourceSchema = z.enum([
|
|
5
11
|
"terminal_raw",
|
|
@@ -67,11 +73,13 @@ export const processObservationSubject = (source, value) => {
|
|
|
67
73
|
const projectedRecord = (capture, location) => {
|
|
68
74
|
const projected = (() => {
|
|
69
75
|
switch (location.collection) {
|
|
70
|
-
case "frames":
|
|
76
|
+
case "frames": {
|
|
77
|
+
const frame = capture.frames[location.index];
|
|
71
78
|
return {
|
|
72
79
|
source: "terminal_raw",
|
|
73
|
-
value:
|
|
80
|
+
value: frame === undefined ? undefined : comparableTerminalFrame(frame),
|
|
74
81
|
};
|
|
82
|
+
}
|
|
75
83
|
case "rendered_frames":
|
|
76
84
|
return {
|
|
77
85
|
source: "terminal_rendered",
|
|
@@ -4,17 +4,36 @@ import { z } from "zod";
|
|
|
4
4
|
const positiveBudget = z.number().int().safe().positive();
|
|
5
5
|
const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
|
|
6
6
|
const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
|
|
7
|
+
const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
|
|
8
|
+
/**
|
|
9
|
+
* Nonempty environment names other than the reserved run identifier. The
|
|
10
|
+
* exclusion is spelled as a complement instead of a negative look-ahead,
|
|
11
|
+
* because RE2 and Rust schema validators reject look-around and would refuse
|
|
12
|
+
* every tool in the advertised catalog.
|
|
13
|
+
*/
|
|
14
|
+
const environmentNamePattern = (reserved) => {
|
|
15
|
+
// After the complete reserved name, at least one more character is needed.
|
|
16
|
+
let rest = `${ENVIRONMENT_NAME_CHARACTER}+`;
|
|
17
|
+
for (let index = reserved.length - 1; index >= 0; index -= 1) {
|
|
18
|
+
const character = reserved[index] ?? "";
|
|
19
|
+
// Diverge here, match the next reserved character, or (after a nonempty
|
|
20
|
+
// prefix) end the name early.
|
|
21
|
+
const choice = `[^=\\x00${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
|
|
22
|
+
rest = index === 0 ? choice : `(?:${choice})?`;
|
|
23
|
+
}
|
|
24
|
+
return new RegExp(`^(?:${rest})$`, "u");
|
|
25
|
+
};
|
|
7
26
|
const environmentName = z
|
|
8
27
|
.string()
|
|
9
28
|
.min(1, "Environment names must not be empty")
|
|
10
|
-
.regex(
|
|
29
|
+
.regex(environmentNamePattern(reservedRunIdEnvironmentName), {
|
|
11
30
|
error: (issue) => issue.input === reservedRunIdEnvironmentName
|
|
12
31
|
? `${reservedRunIdEnvironmentName} is reserved by the process adapter`
|
|
13
32
|
: "Environment names cannot contain '=' or NUL",
|
|
14
33
|
});
|
|
15
34
|
const childProcessString = z
|
|
16
35
|
.string()
|
|
17
|
-
.regex(/^[^\
|
|
36
|
+
.regex(/^[^\x00]*$/u, "Values passed to operating-system APIs cannot contain NUL");
|
|
18
37
|
export const normalizationSchema = z.object({
|
|
19
38
|
paths: z.boolean(),
|
|
20
39
|
pids: z.boolean(),
|
|
@@ -62,6 +81,9 @@ export const processComparisonContract = (scenario) => ({
|
|
|
62
81
|
settle_ms: scenario.settle_ms,
|
|
63
82
|
limits: scenario.limits,
|
|
64
83
|
normalization: scenario.normalization,
|
|
84
|
+
...(scenario.normalization.ports
|
|
85
|
+
? { port_normalization_version: "contextual-endpoints-v2" }
|
|
86
|
+
: {}),
|
|
65
87
|
});
|
|
66
88
|
/**
|
|
67
89
|
* Boundary schema for one bounded process experiment.
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { evaluateProcessTraceSide, processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
|
|
2
2
|
import { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
|
|
3
|
-
export { processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
|
|
4
|
-
export { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
|
|
5
3
|
/** Compare two captures against an explicit finite trace language. */
|
|
6
4
|
export const compareProcessTraces = (left, right, specificationInput) => {
|
|
7
5
|
const specification = processTraceSpecificationSchema.parse(specificationInput);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const
|
|
2
|
+
import { processSourceTruncated } from "./processCaptureCoverage.js";
|
|
3
|
+
import { comparableProcessObservationPayload, processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
|
|
4
|
+
import { canonicalTraceJson, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
|
|
5
|
+
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._\x2d]{0,63}$/u);
|
|
6
6
|
const matchedEventSchema = z.strictObject({
|
|
7
7
|
event_id: identifierSchema,
|
|
8
|
-
location:
|
|
8
|
+
location: processObservationLocationSchema,
|
|
9
9
|
});
|
|
10
10
|
const sideResultShape = {
|
|
11
11
|
satisfied_constraints: z.array(z.string()),
|
|
@@ -36,7 +36,7 @@ const diagnosticSchema = z.strictObject({
|
|
|
36
36
|
side: z.enum(["left", "right"]),
|
|
37
37
|
message: z.string(),
|
|
38
38
|
event_ids: z.array(identifierSchema),
|
|
39
|
-
locations: z.array(
|
|
39
|
+
locations: z.array(processObservationLocationSchema),
|
|
40
40
|
});
|
|
41
41
|
/** Structured verdict for one declared process trace language. */
|
|
42
42
|
export const processTraceComparisonResultSchema = z.strictObject({
|
|
@@ -56,11 +56,11 @@ const scopesFor = (sources) => new Set([...sources].map((source) => {
|
|
|
56
56
|
return "process";
|
|
57
57
|
return "interaction";
|
|
58
58
|
}));
|
|
59
|
-
const unknownSide = () => ({
|
|
59
|
+
const unknownSide = (rawTrace = []) => ({
|
|
60
60
|
status: "unknown",
|
|
61
61
|
matched_variant: null,
|
|
62
62
|
satisfied_constraints: [],
|
|
63
|
-
raw_trace:
|
|
63
|
+
raw_trace: rawTrace,
|
|
64
64
|
});
|
|
65
65
|
const failure = (input) => ({
|
|
66
66
|
result: {
|
|
@@ -102,7 +102,7 @@ const evaluateFiniteTrace = (ids, specification) => {
|
|
|
102
102
|
};
|
|
103
103
|
const collectRecords = (capture, sources) => {
|
|
104
104
|
const records = [];
|
|
105
|
-
for (const location of capture.event_journal
|
|
105
|
+
for (const location of capture.event_journal) {
|
|
106
106
|
const record = projectProcessObservation(capture, location);
|
|
107
107
|
if (record !== null && sources.has(record.source))
|
|
108
108
|
records.push({
|
|
@@ -121,10 +121,10 @@ const matchRecords = (records, specification) => {
|
|
|
121
121
|
for (const event of specification.events) {
|
|
122
122
|
const ignoredFields = event.ignore_fields ?? [];
|
|
123
123
|
ignoredFieldsBySource.set(event.source, ignoredFields);
|
|
124
|
-
eventsByKey.set(`${event.source}\0${canonicalTraceJson(
|
|
124
|
+
eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`, event);
|
|
125
125
|
}
|
|
126
126
|
for (const record of records) {
|
|
127
|
-
const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(
|
|
127
|
+
const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableProcessObservationPayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
|
|
128
128
|
if (match === undefined)
|
|
129
129
|
return failure({
|
|
130
130
|
kind: "predicate",
|
|
@@ -296,10 +296,9 @@ const evaluateMatchedTrace = (trace, specification) => {
|
|
|
296
296
|
export const evaluateProcessTraceSide = (capture, specification) => {
|
|
297
297
|
const sources = new Set(specification.events.map(({ source }) => source));
|
|
298
298
|
const relevantScopes = scopesFor(sources);
|
|
299
|
-
|
|
300
|
-
capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope))
|
|
301
|
-
|
|
302
|
-
if ((capture.event_journal ?? []).length === 0)
|
|
299
|
+
const incomplete = [...sources].some((source) => processSourceTruncated(capture, source)) ||
|
|
300
|
+
capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope));
|
|
301
|
+
if (capture.event_journal.length === 0)
|
|
303
302
|
return {
|
|
304
303
|
result: unknownSide(),
|
|
305
304
|
diagnostic: {
|
|
@@ -310,6 +309,11 @@ export const evaluateProcessTraceSide = (capture, specification) => {
|
|
|
310
309
|
},
|
|
311
310
|
};
|
|
312
311
|
const matched = matchRecords(collectRecords(capture, sources), specification);
|
|
312
|
+
if (incomplete)
|
|
313
|
+
return {
|
|
314
|
+
result: unknownSide("rawTrace" in matched ? matched.rawTrace : matched.result.raw_trace),
|
|
315
|
+
diagnostic: null,
|
|
316
|
+
};
|
|
313
317
|
return "rawTrace" in matched
|
|
314
318
|
? evaluateMatchedTrace(matched, specification)
|
|
315
319
|
: matched;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
+
import { IDENTIFIER_PATTERN } from "../stringPatterns.js";
|
|
3
4
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
4
5
|
import { comparableProcessObservationPayload, processObservationSourceSchema, } from "./processObservation.js";
|
|
5
|
-
const identifierSchema = z.string().regex(
|
|
6
|
-
/** Process observation families admitted by a declared trace specification. */
|
|
7
|
-
export const processTraceSourceSchema = processObservationSourceSchema;
|
|
6
|
+
const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
7
|
const cardinalitySchema = z.discriminatedUnion("kind", [
|
|
9
8
|
z.strictObject({ kind: z.literal("required") }),
|
|
10
9
|
z.strictObject({ kind: z.literal("optional") }),
|
|
@@ -25,7 +24,7 @@ const cardinalitySchema = z.discriminatedUnion("kind", [
|
|
|
25
24
|
]);
|
|
26
25
|
const eventDeclarationSchema = z.strictObject({
|
|
27
26
|
id: identifierSchema,
|
|
28
|
-
source:
|
|
27
|
+
source: processObservationSourceSchema,
|
|
29
28
|
exact: jsonValueSchema,
|
|
30
29
|
ignore_fields: z
|
|
31
30
|
.array(z.enum([
|
|
@@ -87,8 +86,6 @@ export const canonicalTraceJson = (value) => {
|
|
|
87
86
|
throw new TypeError("Trace specification contains a non-JSON value");
|
|
88
87
|
return serialized;
|
|
89
88
|
};
|
|
90
|
-
/** Remove only explicitly declared schedule metadata before exact matching. */
|
|
91
|
-
export const comparableTracePayload = (value, ignoredFields = []) => comparableProcessObservationPayload(value, ignoredFields);
|
|
92
89
|
export const processTraceCardinalityBounds = (cardinality) => {
|
|
93
90
|
switch (cardinality.kind) {
|
|
94
91
|
case "required":
|
|
@@ -353,7 +350,7 @@ export const processTraceSpecificationSchema = specificationShapeSchema.superRef
|
|
|
353
350
|
message: "exact payload must omit every ignored schedule field",
|
|
354
351
|
path: ["events", index, "exact"],
|
|
355
352
|
});
|
|
356
|
-
const predicate = `${event.source}\0${canonicalTraceJson(
|
|
353
|
+
const predicate = `${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`;
|
|
357
354
|
if (predicates.has(predicate))
|
|
358
355
|
context.addIssue({
|
|
359
356
|
code: "custom",
|
|
@@ -4,11 +4,13 @@ export class ProviderAdapterError extends AnalysisError {
|
|
|
4
4
|
providerId;
|
|
5
5
|
operation;
|
|
6
6
|
_tag = "ProviderAdapterError";
|
|
7
|
+
userMessage;
|
|
7
8
|
diagnostics;
|
|
8
9
|
constructor(providerId, operation, options = {}) {
|
|
9
10
|
super(`Provider ${providerId} adapter failed during ${operation}`, options);
|
|
10
11
|
this.providerId = providerId;
|
|
11
12
|
this.operation = operation;
|
|
13
|
+
this.userMessage = options.userMessage;
|
|
12
14
|
this.diagnostics =
|
|
13
15
|
options.diagnostics === undefined
|
|
14
16
|
? undefined
|
|
@@ -7,8 +7,12 @@ export class ProviderCleanupError extends ProviderAdapterError {
|
|
|
7
7
|
constructor(providerId, resources, diagnostics,
|
|
8
8
|
/** Identify the operation owning these resources; binary callers retain their default. */
|
|
9
9
|
options) {
|
|
10
|
-
const { operation = "close_binary", ...errorOptions } = options ?? {};
|
|
11
|
-
super(providerId, operation, {
|
|
10
|
+
const { operation = "close_binary", partialObservation, ...errorOptions } = options ?? {};
|
|
11
|
+
super(providerId, operation, {
|
|
12
|
+
...errorOptions,
|
|
13
|
+
...(partialObservation === undefined ? {} : { partialObservation }),
|
|
14
|
+
diagnostics,
|
|
15
|
+
});
|
|
12
16
|
this.cleanupResources = [...resources];
|
|
13
17
|
}
|
|
14
18
|
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { evidenceBundleSchema, parseEvidenceBundle } from "./evidenceBundle.js";
|
|
5
6
|
import { evaluateReconstructionClaims, evaluateReconstructionPackageProofs, evaluateReconstructionSurfaces, evaluateReconstructionCoverageRisks, recommendedReconstructionProbes, } from "./reconstructionCoverageEvaluation.js";
|
|
6
7
|
import { digestSchema } from "./../domain/digests.js";
|
|
7
8
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
9
|
+
import { offsetDateTimeSchema } from "./offsetDateTime.js";
|
|
8
10
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
9
|
-
const stableIdSchema = z
|
|
11
|
+
const stableIdSchema = z
|
|
12
|
+
.string()
|
|
13
|
+
.regex(/^[A-Za-z][A-Za-z0-9._:\x2f\x2d]{0,199}$/u);
|
|
10
14
|
const boundedTextSchema = z.string().trim().min(1);
|
|
11
15
|
const authoritySchema = z.enum([
|
|
12
16
|
"observed",
|
|
@@ -86,7 +90,7 @@ const verifierContractSchema = verifierContractBaseSchema.extend({
|
|
|
86
90
|
const verifierResultSchema = z.strictObject({
|
|
87
91
|
verifier_id: stableIdSchema,
|
|
88
92
|
contract_sha256: digestSchema,
|
|
89
|
-
observed_at:
|
|
93
|
+
observed_at: offsetDateTimeSchema,
|
|
90
94
|
status: z.enum([
|
|
91
95
|
"pass",
|
|
92
96
|
"fail",
|
|
@@ -312,7 +316,7 @@ const closureStatus = (reasons) => {
|
|
|
312
316
|
return "unknown";
|
|
313
317
|
return "partial";
|
|
314
318
|
};
|
|
315
|
-
const reasonOrder = (left, right) =>
|
|
319
|
+
const reasonOrder = (left, right) => compareUnicodeCodePoints(compositeKey([left.code, left.subject_id]), compositeKey([right.code, right.subject_id]));
|
|
316
320
|
const digest = (value) => {
|
|
317
321
|
const encoded = canonicalize(value);
|
|
318
322
|
if (encoded === undefined)
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { STABLE_IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
2
3
|
import { evidenceBundleSchema } from "./evidenceBundle.js";
|
|
3
4
|
import { digestSchema } from "./../domain/digests.js";
|
|
4
5
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
6
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
6
|
-
const stableIdSchema = z.string().regex(
|
|
7
|
+
const stableIdSchema = z.string().regex(STABLE_IDENTIFIER_PATTERN);
|
|
7
8
|
const textSchema = z.string().trim().min(1);
|
|
8
9
|
export const obligationStatusSchema = z.enum([
|
|
9
10
|
"unowned",
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { STABLE_IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
2
3
|
import { evidenceBundleSchema } from "./evidenceBundle.js";
|
|
3
4
|
import { reconstructionObligationLedgerSchema } from "./reconstructionObligationLedgerSchemas.js";
|
|
4
5
|
import { digestSchema } from "./../domain/digests.js";
|
|
5
6
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
6
7
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
7
|
-
const stableIdSchema = z.string().regex(
|
|
8
|
+
const stableIdSchema = z.string().regex(STABLE_IDENTIFIER_PATTERN);
|
|
8
9
|
const boundedTextSchema = z.string().trim().min(1);
|
|
9
10
|
export const readinessStatusSchema = z.enum([
|
|
10
11
|
"pass",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
2
|
+
import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
|
|
2
3
|
/** Select the latest revision of each residual unknown. */
|
|
3
4
|
export const reconstructionUnknownHeads = (revisions) => {
|
|
4
5
|
const heads = new Map();
|
|
@@ -44,7 +45,7 @@ export const reconstructionClaimUnknowns = (heads, comparisonId, sourceIds) => {
|
|
|
44
45
|
const unknown = heads.get(id);
|
|
45
46
|
return unknown === undefined ? [] : [unknown];
|
|
46
47
|
})
|
|
47
|
-
.sort((left, right) => left.unknown_id
|
|
48
|
+
.sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id));
|
|
48
49
|
};
|
|
49
50
|
/** Aggregate deterministic probes for unresolved claims. */
|
|
50
51
|
export const reconstructionProbes = (results, heads) => {
|
|
@@ -57,7 +58,7 @@ export const reconstructionProbes = (results, heads) => {
|
|
|
57
58
|
const probes = unknowns.flatMap(({ recommended_probes: items }) => items);
|
|
58
59
|
const candidates = probes.length > 0 ? probes : [defaultProbe(result.kind)];
|
|
59
60
|
for (const probe of candidates) {
|
|
60
|
-
const key =
|
|
61
|
+
const key = compositeKey([probe.operation, probe.rationale]);
|
|
61
62
|
const current = output.get(key) ?? {
|
|
62
63
|
...probe,
|
|
63
64
|
claim_ids: [],
|
|
@@ -71,7 +72,7 @@ export const reconstructionProbes = (results, heads) => {
|
|
|
71
72
|
output.set(key, current);
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
const sorted = [...output.values()].sort((left, right) =>
|
|
75
|
+
const sorted = [...output.values()].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.operation, left.rationale]), compositeKey([right.operation, right.rationale])));
|
|
75
76
|
return sorted;
|
|
76
77
|
};
|
|
77
78
|
const defaultProbe = (kind) => kind === "behavioral"
|
|
@@ -4,16 +4,17 @@ import { z } from "zod";
|
|
|
4
4
|
import { artifactComparisonResultSchema } from "./artifactComparison.js";
|
|
5
5
|
import { artifactInventoryResultSchema } from "./artifactGraph.js";
|
|
6
6
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
7
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
7
8
|
import { comparisonSourceEvidenceSides } from "./comparisonSourceEvidence.js";
|
|
8
9
|
import { parseEvidence } from "./evidence.js";
|
|
9
10
|
import { parseEvidenceBundle } from "./evidenceBundle.js";
|
|
10
|
-
import { functionComparisonResultSchema } from "./
|
|
11
|
+
import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
|
|
11
12
|
import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
|
|
12
13
|
import { functionDossierSchema } from "./hopperValues.js";
|
|
13
|
-
import { deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema,
|
|
14
|
+
import { deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
|
|
15
|
+
import { parseProcessCapture } from "./process/processCaptureParsing.js";
|
|
14
16
|
import { reconstructionClaimResultSchema, reconstructionSpecificationSchema, reconstructionVerificationResultSchema, } from "./reconstructionVerificationSchemas.js";
|
|
15
17
|
import { reconstructionClaimUnknowns, reconstructionProbes, reconstructionUnknownHeads, } from "./reconstructionUnknowns.js";
|
|
16
|
-
export { reconstructionVerificationInputSchema, reconstructionVerificationResultSchema, } from "./reconstructionVerificationSchemas.js";
|
|
17
18
|
const providers = {
|
|
18
19
|
behavioral: {
|
|
19
20
|
operation: "compare_process_captures",
|
|
@@ -42,7 +43,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
|
|
|
42
43
|
const heads = reconstructionUnknownHeads(bundle.unknowns);
|
|
43
44
|
const results = specification.claims
|
|
44
45
|
.map((claim) => evaluateClaim(claim, records, heads))
|
|
45
|
-
.sort((left, right) => left.claim_id
|
|
46
|
+
.sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id));
|
|
46
47
|
const failed = count(results, "fail");
|
|
47
48
|
const unresolved = count(results, "unknown");
|
|
48
49
|
const probes = reconstructionProbes(results, heads);
|
|
@@ -51,7 +52,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
|
|
|
51
52
|
status: failed > 0 ? "fail" : unresolved > 0 ? "unknown" : "pass",
|
|
52
53
|
specification_sha256: digest({
|
|
53
54
|
...specification,
|
|
54
|
-
claims: [...specification.claims].sort((left, right) => left.claim_id
|
|
55
|
+
claims: [...specification.claims].sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id)),
|
|
55
56
|
}),
|
|
56
57
|
summary: {
|
|
57
58
|
total: results.length,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
2
3
|
import { digestSchema } from "./../domain/digests.js";
|
|
3
4
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
4
5
|
import { PROCESS_COMPARISON_DIMENSIONS } from "./process/processComparison.js";
|
|
5
6
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
6
7
|
const unknownIdSchema = prefixedDigestSchema("unk");
|
|
7
|
-
const claimIdSchema = z.string().regex(
|
|
8
|
+
const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
9
|
const titleSchema = z.string().trim().min(1);
|
|
9
10
|
const verificationStatusSchema = z.enum(["pass", "fail", "unknown"]);
|
|
10
11
|
const commonClaim = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import {
|
|
3
|
+
import { canonicalJson } from "./comparisonSemantics.js";
|
|
4
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
4
5
|
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
5
6
|
import { digestSchema } from "./../domain/digests.js";
|
|
6
7
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
@@ -66,26 +67,27 @@ const sourceDirectorySchema = z.strictObject({
|
|
|
66
67
|
const symlinkTargetSchema = z
|
|
67
68
|
.string()
|
|
68
69
|
.min(1)
|
|
69
|
-
.refine((target) => target
|
|
70
|
-
isPortableAbsoluteSymlinkTarget(target) ||
|
|
70
|
+
.refine((target) => isPortableAbsoluteSymlinkTarget(target) ||
|
|
71
71
|
(!target.startsWith("/") &&
|
|
72
72
|
!target.includes("\\") &&
|
|
73
73
|
posix.normalize(target) === target), "Expected a normalized POSIX symlink target");
|
|
74
74
|
const isPortableAbsoluteSymlinkTarget = (target) => target.startsWith("/") ||
|
|
75
75
|
/^[A-Za-z]:[\\/]/u.test(target) ||
|
|
76
76
|
/^\\\\[^\\/]+[\\/][^\\/]+/u.test(target);
|
|
77
|
-
const sourceSymlinkSchema = z.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"internal",
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"
|
|
87
|
-
|
|
88
|
-
|
|
77
|
+
const sourceSymlinkSchema = z.union([
|
|
78
|
+
z.strictObject({
|
|
79
|
+
...entryBaseShape,
|
|
80
|
+
kind: z.literal("symlink"),
|
|
81
|
+
target: symlinkTargetSchema,
|
|
82
|
+
target_state: z.enum(["internal", "external", "missing"]),
|
|
83
|
+
}),
|
|
84
|
+
z.strictObject({
|
|
85
|
+
...entryBaseShape,
|
|
86
|
+
kind: z.literal("symlink"),
|
|
87
|
+
target: z.null(),
|
|
88
|
+
target_state: z.enum(["unreadable", "unknown"]),
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
89
91
|
const sourceEntrySchema = z.union([
|
|
90
92
|
sourceFileSchema,
|
|
91
93
|
sourceDirectorySchema,
|
|
@@ -108,8 +110,6 @@ const exclusionSchema = z.strictObject({
|
|
|
108
110
|
reason: z.enum([
|
|
109
111
|
"configured-secret",
|
|
110
112
|
"symlink-escape",
|
|
111
|
-
"size-limit",
|
|
112
|
-
"inventory-limit",
|
|
113
113
|
"unreadable",
|
|
114
114
|
"caller-excluded",
|
|
115
115
|
]),
|
|
@@ -152,7 +152,7 @@ const graphShape = {
|
|
|
152
152
|
caller: z
|
|
153
153
|
.string()
|
|
154
154
|
.min(1)
|
|
155
|
-
.regex(/^[\w
|
|
155
|
+
.regex(/^[\w .:@\x2f+\x2d]+$/u),
|
|
156
156
|
}),
|
|
157
157
|
limitations: z.array(boundedTextSchema),
|
|
158
158
|
};
|
|
@@ -232,13 +232,11 @@ const checkSymlinks = (graph, paths, context) => {
|
|
|
232
232
|
for (const [index, entry] of graph.entries.entries()) {
|
|
233
233
|
if (entry.kind !== "symlink")
|
|
234
234
|
continue;
|
|
235
|
+
if (entry.target === null)
|
|
236
|
+
continue;
|
|
235
237
|
const absolute = isPortableAbsoluteSymlinkTarget(entry.target);
|
|
236
|
-
if ((entry.target_state === "external" &&
|
|
237
|
-
entry.
|
|
238
|
-
!absolute) ||
|
|
239
|
-
(entry.target_state === "internal" &&
|
|
240
|
-
(entry.target === "<outside-root>" || absolute)) ||
|
|
241
|
-
(entry.target_state === "missing" && entry.target === "<outside-root>"))
|
|
238
|
+
if ((entry.target_state === "external" && !absolute) ||
|
|
239
|
+
(entry.target_state === "internal" && absolute))
|
|
242
240
|
context.addIssue({
|
|
243
241
|
code: "custom",
|
|
244
242
|
message: "Symlink target path does not match its target state",
|
|
@@ -332,7 +330,7 @@ const rootCommitment = (entries, exclusions) => ({
|
|
|
332
330
|
}),
|
|
333
331
|
exclusions,
|
|
334
332
|
});
|
|
335
|
-
const computeRootSha256 = (entries, exclusions) =>
|
|
333
|
+
const computeRootSha256 = (entries, exclusions) => digestCanonicalValue(rootCommitment(entries, exclusions), "Reference source graph");
|
|
336
334
|
/** Build and internally commit a normalized historical source graph. */
|
|
337
335
|
export const createHistoricalSourceGraph = (input) => {
|
|
338
336
|
const parsed = historicalSourceGraphInputSchema.parse(input);
|
|
@@ -344,7 +342,7 @@ export const createHistoricalSourceGraph = (input) => {
|
|
|
344
342
|
/** Parse a graph and reject stale or caller-invented root commitments. */
|
|
345
343
|
export const parseHistoricalSourceGraph = (input) => historicalSourceGraphSchema.parse(input);
|
|
346
344
|
/** Compute a deterministic graph commitment containing no absolute root path. */
|
|
347
|
-
export const computeHistoricalSourceGraphSha256 = (input) =>
|
|
345
|
+
export const computeHistoricalSourceGraphSha256 = (input) => digestCanonicalValue(parseHistoricalSourceGraph(input), "Reference source graph");
|
|
348
346
|
/** Build a deterministic, relocation-independent manifest for a source graph. */
|
|
349
347
|
export const createHistoricalSourceManifest = (input) => {
|
|
350
348
|
const graph = parseHistoricalSourceGraph(input);
|
|
@@ -359,14 +357,15 @@ export const createHistoricalSourceManifest = (input) => {
|
|
|
359
357
|
};
|
|
360
358
|
return historicalSourceManifestBaseSchema.parse({
|
|
361
359
|
...semantic,
|
|
362
|
-
manifest_id: `hsm_${
|
|
360
|
+
manifest_id: `hsm_${digestCanonicalValue(semantic, "Reference source graph")}`,
|
|
363
361
|
});
|
|
364
362
|
};
|
|
365
363
|
/** Parse and verify a historical source manifest's semantic identifier. */
|
|
366
364
|
export const parseHistoricalSourceManifest = (input) => {
|
|
367
365
|
const manifest = historicalSourceManifestBaseSchema.parse(input);
|
|
368
366
|
const { manifest_id: manifestId, ...semantic } = manifest;
|
|
369
|
-
if (`hsm_${
|
|
367
|
+
if (`hsm_${digestCanonicalValue(semantic, "Reference source graph")}` !==
|
|
368
|
+
manifestId)
|
|
370
369
|
throw new TypeError("Historical source manifest identifier does not match");
|
|
371
370
|
return manifest;
|
|
372
371
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { parse } from "@babel/parser";
|
|
2
|
-
import {
|
|
2
|
+
import { traverseJavaScriptAst } from "./javascript/javascriptSemanticTraversal.js";
|
|
3
|
+
import { parserPluginsForPath } from "./javascript/javascriptSourceParser.js";
|
|
4
|
+
import { isCallExpression, isExportAllDeclaration, isExportNamedDeclaration, isIdentifier, isImport, isImportDeclaration, isImportExpression, isMemberExpression, isStringLiteral, isTSExternalModuleReference, isTSImportEqualsDeclaration, isTSModuleDeclaration, } from "@babel/types";
|
|
3
5
|
const codeSourceLanguages = new Set(["JavaScript", "TypeScript", "JSX", "TSX"]);
|
|
4
6
|
const safeModuleName = (node) => {
|
|
5
7
|
if (isStringLiteral(node))
|
|
@@ -112,40 +114,18 @@ const isRequireCallee = (callee) => {
|
|
|
112
114
|
}
|
|
113
115
|
return false;
|
|
114
116
|
};
|
|
115
|
-
const isImportCallee = (callee) => isImport(callee);
|
|
116
|
-
const collectModuleExpressions = (node, targets) => {
|
|
117
|
-
if (node === null || node === undefined)
|
|
118
|
-
return;
|
|
119
|
-
if (typeof node !== "object")
|
|
120
|
-
return;
|
|
121
|
-
if (Array.isArray(node)) {
|
|
122
|
-
for (const item of node)
|
|
123
|
-
collectModuleExpressions(item, targets);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (!isNode(node))
|
|
127
|
-
return;
|
|
128
|
-
if (isCallExpression(node) || isImportExpression(node)) {
|
|
129
|
-
targets.push(node);
|
|
130
|
-
}
|
|
131
|
-
for (const value of Object.values(node)) {
|
|
132
|
-
if (value !== null &&
|
|
133
|
-
value !== undefined &&
|
|
134
|
-
typeof value === "object" &&
|
|
135
|
-
!isSourceLocation(value)) {
|
|
136
|
-
collectModuleExpressions(value, targets);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
const isSourceLocation = (value) => typeof value === "object" &&
|
|
141
|
-
value !== null &&
|
|
142
|
-
"start" in value &&
|
|
143
|
-
"end" in value &&
|
|
144
|
-
!("type" in value);
|
|
145
117
|
const extractRequireAndDynamicImports = (body, from_path, relationships) => {
|
|
118
|
+
// Single traversal owner: iterative, VISITOR_KEYS-gated, no recursion over
|
|
119
|
+
// loc/comment objects. Survives deeply nested generated member chains that
|
|
120
|
+
// overflowed the previous hand-rolled Object.values walker.
|
|
146
121
|
const expressions = [];
|
|
147
122
|
for (const statement of body)
|
|
148
|
-
|
|
123
|
+
traverseJavaScriptAst(statement, {
|
|
124
|
+
enter: (node) => {
|
|
125
|
+
if (isCallExpression(node) || isImportExpression(node))
|
|
126
|
+
expressions.push(node);
|
|
127
|
+
},
|
|
128
|
+
});
|
|
149
129
|
for (const call of expressions) {
|
|
150
130
|
if (isImportExpression(call)) {
|
|
151
131
|
const specifier = safeModuleName(call.source);
|
|
@@ -171,7 +151,7 @@ const extractRequireAndDynamicImports = (body, from_path, relationships) => {
|
|
|
171
151
|
}
|
|
172
152
|
continue;
|
|
173
153
|
}
|
|
174
|
-
if (
|
|
154
|
+
if (isImport(call.callee) && isModuleExpression(first)) {
|
|
175
155
|
const result = moduleSpecifierFromExpression(first);
|
|
176
156
|
if (result !== undefined) {
|
|
177
157
|
appendRelationship(relationships, {
|
|
@@ -185,17 +165,11 @@ const extractRequireAndDynamicImports = (body, from_path, relationships) => {
|
|
|
185
165
|
}
|
|
186
166
|
};
|
|
187
167
|
const parseWithBabel = (path, source, language) => {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
dts: path.endsWith(".d.ts") ||
|
|
194
|
-
path.endsWith(".d.mts") ||
|
|
195
|
-
path.endsWith(".d.cts"),
|
|
196
|
-
},
|
|
197
|
-
]);
|
|
198
|
-
}
|
|
168
|
+
// Single parser-mode owner: path-driven plugins (dts/JSX/mts) shared with
|
|
169
|
+
// the semantic pipeline. `language` only gates non-JS/TS callers upstream;
|
|
170
|
+
// TypeScript syntax must parse identically here and in semantic analysis.
|
|
171
|
+
void language;
|
|
172
|
+
const plugins = parserPluginsForPath(path);
|
|
199
173
|
try {
|
|
200
174
|
const ast = parse(source, {
|
|
201
175
|
sourceType: "unambiguous",
|
|
@@ -218,7 +192,22 @@ const parseWithBabel = (path, source, language) => {
|
|
|
218
192
|
export const parseReferenceSourceImports = (path, bytes, language) => {
|
|
219
193
|
if (language !== null && !codeSourceLanguages.has(language))
|
|
220
194
|
return { relationships: [], parse_failures: [] };
|
|
221
|
-
|
|
195
|
+
let source;
|
|
196
|
+
try {
|
|
197
|
+
source = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return {
|
|
201
|
+
relationships: [],
|
|
202
|
+
parse_failures: [
|
|
203
|
+
{
|
|
204
|
+
path,
|
|
205
|
+
parser: "utf-8",
|
|
206
|
+
reason: "Source bytes are not valid UTF-8; import targets were not parsed.",
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
222
211
|
const { ast, reasons } = parseWithBabel(path, source, language);
|
|
223
212
|
const parseFailures = reasons.map((reason) => ({
|
|
224
213
|
path,
|