rea-agents 6.2.0 → 6.4.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 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- 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 +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- 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 +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- 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/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -32,6 +32,8 @@ export const inspectCall = (source, node, context) => {
|
|
|
32
32
|
addReference(context, { node, kind: "service-worker", specifier: first });
|
|
33
33
|
inspectEndpointCall(node, name, first, context);
|
|
34
34
|
inspectStorageCall(node, name, first, context);
|
|
35
|
+
if (first === "audio" || first === "video")
|
|
36
|
+
noteMediaElementPreloads(node, accumulator);
|
|
35
37
|
if (name.endsWith("loadFile") && first !== undefined)
|
|
36
38
|
addLocatedFinding(context, {
|
|
37
39
|
collection: accumulator.roles,
|
|
@@ -61,6 +63,18 @@ export const inspectCall = (source, node, context) => {
|
|
|
61
63
|
},
|
|
62
64
|
});
|
|
63
65
|
};
|
|
66
|
+
// Element factories such as jsx("audio", props) and createElement("video",
|
|
67
|
+
// props) carry the HTML media `preload` hint ("none", "metadata", "auto"),
|
|
68
|
+
// which never names an Electron preload script.
|
|
69
|
+
const noteMediaElementPreloads = (node, accumulator) => {
|
|
70
|
+
const props = node.arguments[1];
|
|
71
|
+
if (!t.isObjectExpression(props))
|
|
72
|
+
return;
|
|
73
|
+
for (const property of props.properties)
|
|
74
|
+
if (t.isObjectProperty(property) &&
|
|
75
|
+
semanticStaticPropertyName(property.key, property.computed) === "preload")
|
|
76
|
+
accumulator.mediaElementPreloads.add(property);
|
|
77
|
+
};
|
|
64
78
|
const requireCallSpecifier = (node, name, moduleRequireName) => {
|
|
65
79
|
if (name === "require" || name.endsWith(".require"))
|
|
66
80
|
return { specifier: argumentValue(node.arguments[0]) };
|
|
@@ -114,6 +128,12 @@ const inspectEndpointCall = (node, name, first, context) => {
|
|
|
114
128
|
mechanism: `call:${name}`,
|
|
115
129
|
});
|
|
116
130
|
};
|
|
131
|
+
/** Record tRPC procedures, tRPC link URLs and named GraphQL operations. */
|
|
132
|
+
export const inspectRpcNode = (node, context) => {
|
|
133
|
+
const rpc = context.rpcScan.inspect(node);
|
|
134
|
+
if (rpc !== undefined)
|
|
135
|
+
addEndpoint(context, { node, kind: "network", ...rpc });
|
|
136
|
+
};
|
|
117
137
|
export const inspectRouteProperty = (node, context) => {
|
|
118
138
|
const key = semanticStaticPropertyName(node.key, node.computed);
|
|
119
139
|
if ((key === "path" || key === "route") && t.isStringLiteral(node.value))
|
|
@@ -127,6 +147,8 @@ export const inspectRouteProperty = (node, context) => {
|
|
|
127
147
|
export const inspectRoleProperty = (node, context) => {
|
|
128
148
|
if (semanticStaticPropertyName(node.key, node.computed) !== "preload")
|
|
129
149
|
return;
|
|
150
|
+
if (context.accumulator.mediaElementPreloads.has(node))
|
|
151
|
+
return;
|
|
130
152
|
const path = staticPath(node.value);
|
|
131
153
|
if (path === undefined)
|
|
132
154
|
return;
|
|
@@ -213,13 +235,35 @@ export const addSourceMapDirectives = (source, comments, accumulator) => {
|
|
|
213
235
|
end === undefined ||
|
|
214
236
|
end === null)
|
|
215
237
|
continue;
|
|
216
|
-
const
|
|
217
|
-
if (
|
|
238
|
+
const commentSource = source.slice(start, end);
|
|
239
|
+
if (!(commentSource.startsWith("//") || commentSource.startsWith("/*")) ||
|
|
240
|
+
!(commentSource[2] === "#" || commentSource[2] === "@"))
|
|
241
|
+
continue;
|
|
242
|
+
// Single-class searches avoid regex backtracking over unbounded whitespace
|
|
243
|
+
// or inline URLs, which can exhaust the engine stack on two-byte strings.
|
|
244
|
+
const nameOffset = commentSource.slice(3).search(/\S/u);
|
|
245
|
+
if (nameOffset === -1)
|
|
246
|
+
continue;
|
|
247
|
+
const nameStart = 3 + nameOffset;
|
|
248
|
+
if (!commentSource.startsWith("sourceMappingURL", nameStart))
|
|
249
|
+
continue;
|
|
250
|
+
const nameEnd = nameStart + "sourceMappingURL".length;
|
|
251
|
+
const equalsOffset = commentSource.slice(nameEnd).search(/\S/u);
|
|
252
|
+
if (equalsOffset === -1)
|
|
253
|
+
continue;
|
|
254
|
+
const equalsStart = nameEnd + equalsOffset;
|
|
255
|
+
if (!commentSource.startsWith("=", equalsStart))
|
|
256
|
+
continue;
|
|
257
|
+
const urlOffset = commentSource.slice(equalsStart + 1).search(/\S/u);
|
|
258
|
+
if (urlOffset === -1)
|
|
218
259
|
continue;
|
|
219
|
-
const
|
|
220
|
-
|
|
260
|
+
const declaredStart = equalsStart + 1 + urlOffset;
|
|
261
|
+
const terminator = commentSource.slice(declaredStart).search(/[\s*]/u);
|
|
262
|
+
const declaredEnd = terminator === -1 ? commentSource.length : declaredStart + terminator;
|
|
263
|
+
if (declaredEnd === declaredStart)
|
|
221
264
|
continue;
|
|
222
|
-
const
|
|
265
|
+
const declared = commentSource.slice(declaredStart, declaredEnd);
|
|
266
|
+
const location = rangeForOffsets(source, start, start + declaredEnd);
|
|
223
267
|
addFindingOnce(accumulator, `source-map\0${declared}`, () => accumulator.sourceMaps.push({ declared_url: declared, location }));
|
|
224
268
|
}
|
|
225
269
|
};
|
|
@@ -76,7 +76,11 @@ export const addFindingOnce = (accumulator, key, add) => {
|
|
|
76
76
|
add();
|
|
77
77
|
};
|
|
78
78
|
/** Attach recovered bundle-module ownership to findings after traversal. */
|
|
79
|
-
export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) =>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
export const finalizeLocatedFindings = (values, modules) => values.map(({ offset, value }) => {
|
|
80
|
+
const module = modules.find(offset);
|
|
81
|
+
return {
|
|
82
|
+
...value,
|
|
83
|
+
module_key: module?.key ?? null,
|
|
84
|
+
...(module === undefined ? {} : { module_runtime: module.runtime }),
|
|
85
|
+
};
|
|
86
|
+
});
|
|
@@ -2,8 +2,8 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { posix } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import * as t from "@babel/types";
|
|
5
|
-
import { readExactJavaScriptLiteral, semanticStaticPropertyName, } from "./javascriptAstValues.js";
|
|
6
|
-
import {
|
|
5
|
+
import { readExactJavaScriptLiteral, semanticStaticPropertyName, unwrapJavaScriptExpression, } from "./javascriptAstValues.js";
|
|
6
|
+
import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrder.js";
|
|
7
7
|
/** Explicit result for source text that Babel cannot parse. */
|
|
8
8
|
export const failedJavaScriptStaticAnalysis = () => ({
|
|
9
9
|
parse_status: "failed",
|
|
@@ -67,8 +67,9 @@ const findChunkRuntime = (node) => {
|
|
|
67
67
|
pending.push(current.right, current.left);
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
const unwrapped = unwrapJavaScriptExpression(current).node;
|
|
71
|
+
if (unwrapped !== current)
|
|
72
|
+
pending.push(unwrapped);
|
|
72
73
|
}
|
|
73
74
|
return undefined;
|
|
74
75
|
};
|
|
@@ -102,26 +103,25 @@ export const staticArrayValues = (array) => {
|
|
|
102
103
|
const value = argumentValue(element);
|
|
103
104
|
return value === undefined ? [] : [value];
|
|
104
105
|
});
|
|
105
|
-
const values = [...new Set(staticValues)].sort(
|
|
106
|
+
const values = [...new Set(staticValues)].sort(compareUnicodeCodePoints);
|
|
106
107
|
return {
|
|
107
108
|
values,
|
|
108
109
|
unknown: array.elements.length - staticValues.length,
|
|
109
110
|
};
|
|
110
111
|
};
|
|
111
|
-
/** Resolve a path composed only from inert literal syntax. */
|
|
112
|
-
export const staticPath = (node) => staticPathAt(node);
|
|
113
112
|
/** Classify whether inert path syntax is a module specifier or file expression. */
|
|
114
113
|
export const staticPathResolutionContext = (node) => isFilesystemPathExpression(node)
|
|
115
114
|
? "filesystem-expression"
|
|
116
115
|
: "module-specifier";
|
|
117
|
-
|
|
116
|
+
/** Resolve a path composed only from inert literal syntax. */
|
|
117
|
+
export const staticPath = (node) => {
|
|
118
118
|
if (t.isStringLiteral(node))
|
|
119
119
|
return node.value;
|
|
120
120
|
if (t.isTemplateLiteral(node) && node.expressions.length === 0)
|
|
121
121
|
return stringValue(node);
|
|
122
122
|
if (t.isBinaryExpression(node, { operator: "+" })) {
|
|
123
|
-
const left =
|
|
124
|
-
const right =
|
|
123
|
+
const left = staticPath(node.left);
|
|
124
|
+
const right = staticPath(node.right);
|
|
125
125
|
return left === undefined || right === undefined
|
|
126
126
|
? undefined
|
|
127
127
|
: `${left}${right}`;
|
|
@@ -152,7 +152,7 @@ const staticCallPath = (node) => {
|
|
|
152
152
|
for (const argument of node.arguments) {
|
|
153
153
|
if (isDirectoryIdentity(argumentNode(argument)))
|
|
154
154
|
continue;
|
|
155
|
-
const value = t.isNode(argument) ?
|
|
155
|
+
const value = t.isNode(argument) ? staticPath(argument) : undefined;
|
|
156
156
|
if (value === undefined)
|
|
157
157
|
return undefined;
|
|
158
158
|
parts.push(value);
|
|
@@ -164,7 +164,7 @@ const staticFileUrlPath = (argument) => {
|
|
|
164
164
|
return undefined;
|
|
165
165
|
return isSourceFileUrl(argument)
|
|
166
166
|
? sourceRelativeFileUrlPath(argument)
|
|
167
|
-
:
|
|
167
|
+
: staticPath(argument);
|
|
168
168
|
};
|
|
169
169
|
/** Project a known source-relative URL through the actual file URL decoder. */
|
|
170
170
|
const sourceRelativeFileUrlPath = (node) => {
|
|
@@ -213,7 +213,7 @@ const staticResolvedPath = (node) => {
|
|
|
213
213
|
parts.push(null);
|
|
214
214
|
continue;
|
|
215
215
|
}
|
|
216
|
-
const value = t.isNode(argument) ?
|
|
216
|
+
const value = t.isNode(argument) ? staticPath(argument) : undefined;
|
|
217
217
|
// Validate every argument, including those before the last anchor.
|
|
218
218
|
if (value === undefined)
|
|
219
219
|
return undefined;
|
|
@@ -521,9 +521,20 @@ const pointForOffset = (source, offset) => {
|
|
|
521
521
|
/** Observe known bundler/framework marker strings without claiming dependency use. */
|
|
522
522
|
export const detectVendors = (source) => vendorPatterns.flatMap(({ name, patterns }) => patterns.some((pattern) => source.includes(pattern)) ? [name] : []);
|
|
523
523
|
/** Commit the static semantic content used to deduplicate registrations. */
|
|
524
|
-
export const registrationKey = (registration) =>
|
|
524
|
+
export const registrationKey = (registration) =>
|
|
525
|
+
// Collision-free tuple: chunk/module keys are variable-length source-derived
|
|
526
|
+
// lists, so NUL-joins would collapse ["a\0b"] with ["a", "b"].
|
|
527
|
+
compositeKey([
|
|
528
|
+
registration.runtime,
|
|
529
|
+
registration.chunk_keys,
|
|
530
|
+
String(registration.unknown_chunk_keys),
|
|
531
|
+
registration.modules.map(({ module_key: key, source_sha256: digest }) => [
|
|
532
|
+
key,
|
|
533
|
+
digest,
|
|
534
|
+
]),
|
|
535
|
+
]);
|
|
525
536
|
/** Sort values by a deterministic unique semantic key. */
|
|
526
|
-
export const sortedUnique = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) =>
|
|
537
|
+
export const sortedUnique = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => compareUnicodeCodePoints(key(left), key(right)));
|
|
527
538
|
/** Hash exact UTF-8 source text. */
|
|
528
539
|
export const sha256Text = (value) => createHash("sha256").update(value).digest("hex");
|
|
529
540
|
/** Recognized route-construction call suffixes. */
|
|
@@ -14,6 +14,7 @@ export const createJavaScriptAnalysisAccumulator = (sourceLength) => ({
|
|
|
14
14
|
utilityProcesses: [],
|
|
15
15
|
nativeAddonBindings: [],
|
|
16
16
|
moduleRangeIndex: new JavaScriptModuleRangeIndex(sourceLength),
|
|
17
|
+
mediaElementPreloads: new WeakSet(),
|
|
17
18
|
seen: new Set(),
|
|
18
19
|
visitedNodes: 0,
|
|
19
20
|
unknownFindings: 0,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
|
+
import { absenceClaimable } from "../comparisonSemantics.js";
|
|
4
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
3
5
|
import { SOURCE_TO_BUNDLE_SIGNAL_WEIGHTS, sourceToBundleComparisonResultSchema, } from "./sourceToBundleComparisonSchemas.js";
|
|
4
6
|
import { buildSourceToBundleCandidateIndex, candidateHasDigest, candidateIdsForSource, historicalSourceFiles, scoreSourceToBundleCandidate, sourceBearingNodes, } from "./sourceToBundleSignals.js";
|
|
5
7
|
/** Compare historical source files to static source-bearing application nodes. */
|
|
@@ -33,7 +35,7 @@ export const compareSourceToBundle = (input) => {
|
|
|
33
35
|
};
|
|
34
36
|
return sourceToBundleComparisonResultSchema.parse({
|
|
35
37
|
...semanticResult,
|
|
36
|
-
comparison_id: `stbc_${
|
|
38
|
+
comparison_id: `stbc_${digestCanonicalValue(semanticResult, "Source-to-bundle comparison")}`,
|
|
37
39
|
});
|
|
38
40
|
};
|
|
39
41
|
const projectComparison = (input) => {
|
|
@@ -218,7 +220,7 @@ const markMergedMappings = (input, items) => {
|
|
|
218
220
|
return { ...semantic, mapping_id: mappingId(input, semantic) };
|
|
219
221
|
});
|
|
220
222
|
};
|
|
221
|
-
const mappingId = (input, item) => `stbc_item_${
|
|
223
|
+
const mappingId = (input, item) => `stbc_item_${digestCanonicalValue({
|
|
222
224
|
reference_root_sha256: input.reference.root_sha256,
|
|
223
225
|
application_graph_id: input.application.graph.graph_id,
|
|
224
226
|
...item,
|
|
@@ -256,4 +258,4 @@ const comparisonLimitations = (factors) => uniqueSorted([
|
|
|
256
258
|
]);
|
|
257
259
|
const hasSignal = (candidate, kind) => candidate.signals.some((signal) => signal.kind === kind);
|
|
258
260
|
const compareCandidates = (left, right) => right.score - left.score ||
|
|
259
|
-
|
|
261
|
+
compareUnicodeCodePoints(left.current_node_id, right.current_node_id);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { compareUnicodeCodePoints, compositeKey, } from "../unicodeCodePointOrder.js";
|
|
3
3
|
import { SOURCE_TO_BUNDLE_SIGNAL_WEIGHTS, } from "./sourceToBundleComparisonSchemas.js";
|
|
4
4
|
import { isDigest } from "../digests.js";
|
|
5
5
|
const RELEVANT_NODE_KINDS = new Set([
|
|
@@ -24,11 +24,11 @@ const signalWeight = (kind) => {
|
|
|
24
24
|
/** Keep source-bearing application nodes in stable identifier order. */
|
|
25
25
|
export const sourceBearingNodes = (nodes) => nodes
|
|
26
26
|
.filter(({ kind }) => RELEVANT_NODE_KINDS.has(kind))
|
|
27
|
-
.sort((left, right) =>
|
|
27
|
+
.sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id));
|
|
28
28
|
/** Keep historical source files in stable path order. */
|
|
29
29
|
export const historicalSourceFiles = (graph) => graph.entries
|
|
30
30
|
.filter((entry) => entry.kind === "file" && entry.classifications.includes("source"))
|
|
31
|
-
.sort((left, right) =>
|
|
31
|
+
.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
|
|
32
32
|
/** Build deterministic candidate indices without assigning fuzzy matches. */
|
|
33
33
|
export const buildSourceToBundleCandidateIndex = (nodes) => {
|
|
34
34
|
const projections = nodes.map(projectCurrentNode);
|
|
@@ -65,7 +65,7 @@ export const candidateIdsForSource = (source, index) => {
|
|
|
65
65
|
for (const group of groups) {
|
|
66
66
|
if (group === undefined)
|
|
67
67
|
continue;
|
|
68
|
-
for (const nodeId of [...group].sort(
|
|
68
|
+
for (const nodeId of [...group].sort(compareUnicodeCodePoints)) {
|
|
69
69
|
if (seen.has(nodeId))
|
|
70
70
|
continue;
|
|
71
71
|
seen.add(nodeId);
|
|
@@ -166,7 +166,7 @@ const signal = (kind, sourceValue, currentValues) => ({
|
|
|
166
166
|
kind,
|
|
167
167
|
weight: signalWeight(kind),
|
|
168
168
|
source_value: sourceValue,
|
|
169
|
-
current_values: [...new Set(currentValues)].sort(
|
|
169
|
+
current_values: [...new Set(currentValues)].sort(compareUnicodeCodePoints),
|
|
170
170
|
});
|
|
171
171
|
const candidateConfidence = (signals) => {
|
|
172
172
|
const kinds = new Set(signals.map(({ kind }) => kind));
|
|
@@ -216,10 +216,10 @@ const normalizeCurrentPath = (raw) => {
|
|
|
216
216
|
};
|
|
217
217
|
const uniquePaths = (paths) => [
|
|
218
218
|
...new Map(paths.map((path) => [
|
|
219
|
-
|
|
219
|
+
compositeKey([path.kind, path.value, String(path.allowSuffix)]),
|
|
220
220
|
path,
|
|
221
221
|
])).values(),
|
|
222
|
-
].sort((left, right) =>
|
|
222
|
+
].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.kind, left.value]), compositeKey([right.kind, right.value])));
|
|
223
223
|
const pathSuffixes = (path) => {
|
|
224
224
|
const parts = path.split("/");
|
|
225
225
|
return parts.map((_, index) => parts.slice(index).join("/"));
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { localPathStringSchema } from "../localPath.js";
|
|
3
|
+
/**
|
|
4
|
+
* Caller intent for JEB-backed inspection, independent of the engine build.
|
|
5
|
+
*
|
|
6
|
+
* JEB resolves paths on the host running the JEB client that serves MCP; REA
|
|
7
|
+
* never launches the engine or opens the target itself.
|
|
8
|
+
*/
|
|
9
|
+
export const jebInputSchemas = {
|
|
10
|
+
inspect_jeb_client: z.strictObject({}),
|
|
11
|
+
open_jeb_project: z.strictObject({
|
|
12
|
+
path: localPathStringSchema.describe("Artifact file or existing .jdb2 project database, resolved by the running JEB client"),
|
|
13
|
+
}),
|
|
14
|
+
list_jeb_units: z.strictObject({
|
|
15
|
+
filter: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Wildcard filter matched against unit paths; '*' allowed"),
|
|
19
|
+
parent_unit_path: z
|
|
20
|
+
.string()
|
|
21
|
+
.min(1)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Restrict results to descendants of this unit path"),
|
|
24
|
+
index: z
|
|
25
|
+
.number()
|
|
26
|
+
.int()
|
|
27
|
+
.nonnegative()
|
|
28
|
+
.default(0)
|
|
29
|
+
.describe("Zero-based index of the first result to return"),
|
|
30
|
+
count: z
|
|
31
|
+
.number()
|
|
32
|
+
.int()
|
|
33
|
+
.min(1)
|
|
34
|
+
.max(100)
|
|
35
|
+
.default(100)
|
|
36
|
+
.describe("Maximum results to return; the engine protocol caps pages at 100"),
|
|
37
|
+
}),
|
|
38
|
+
decompile_jeb_item: z.strictObject({
|
|
39
|
+
unit_path: z
|
|
40
|
+
.string()
|
|
41
|
+
.min(1)
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("Target code unit; the engine's first code unit in the project when omitted"),
|
|
44
|
+
item_address: z
|
|
45
|
+
.string()
|
|
46
|
+
.min(1)
|
|
47
|
+
.describe("Type or method address within the unit, as listed by the engine"),
|
|
48
|
+
item_kind: z.enum(["type", "method"]).describe("Kind of item to decompile"),
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
/** Validate operation and input together so their types remain correlated. */
|
|
52
|
+
export const jebRequestSchema = z.discriminatedUnion("operation", [
|
|
53
|
+
z.strictObject({
|
|
54
|
+
operation: z.literal("inspect_jeb_client"),
|
|
55
|
+
input: jebInputSchemas.inspect_jeb_client,
|
|
56
|
+
}),
|
|
57
|
+
z.strictObject({
|
|
58
|
+
operation: z.literal("open_jeb_project"),
|
|
59
|
+
input: jebInputSchemas.open_jeb_project,
|
|
60
|
+
}),
|
|
61
|
+
z.strictObject({
|
|
62
|
+
operation: z.literal("list_jeb_units"),
|
|
63
|
+
input: jebInputSchemas.list_jeb_units,
|
|
64
|
+
}),
|
|
65
|
+
z.strictObject({
|
|
66
|
+
operation: z.literal("decompile_jeb_item"),
|
|
67
|
+
input: jebInputSchemas.decompile_jeb_item,
|
|
68
|
+
}),
|
|
69
|
+
]);
|
|
70
|
+
const engine = z.strictObject({
|
|
71
|
+
name: z.string().min(1),
|
|
72
|
+
version: z.string().nullable(),
|
|
73
|
+
endpoint: z.string().min(1),
|
|
74
|
+
gui_client: z.boolean().nullable(),
|
|
75
|
+
});
|
|
76
|
+
const unit = z.strictObject({
|
|
77
|
+
unit_path: z.string(),
|
|
78
|
+
unit_type: z.string(),
|
|
79
|
+
});
|
|
80
|
+
/** Portable JEB observations with explicit identity and coverage limitations. */
|
|
81
|
+
export const jebResultSchemas = {
|
|
82
|
+
inspect_jeb_client: z.strictObject({
|
|
83
|
+
engine,
|
|
84
|
+
startup_ts: z.number().int().nonnegative().nullable(),
|
|
85
|
+
message: z.string().nullable(),
|
|
86
|
+
}),
|
|
87
|
+
open_jeb_project: z.strictObject({
|
|
88
|
+
engine,
|
|
89
|
+
project_name: z.string().nullable(),
|
|
90
|
+
creation_datetime: z.string().nullable(),
|
|
91
|
+
input_files: z.array(z.strictObject({
|
|
92
|
+
file_name: z.string(),
|
|
93
|
+
file_size: z.number().int().nonnegative(),
|
|
94
|
+
contents_sha256_hash: z.string(),
|
|
95
|
+
})),
|
|
96
|
+
units: z.array(unit),
|
|
97
|
+
}),
|
|
98
|
+
list_jeb_units: z.strictObject({
|
|
99
|
+
engine,
|
|
100
|
+
filter: z.string().nullable(),
|
|
101
|
+
parent_unit_path: z.string().nullable(),
|
|
102
|
+
index: z.number().int().nonnegative(),
|
|
103
|
+
count: z.number().int().positive(),
|
|
104
|
+
units: z.array(unit),
|
|
105
|
+
coverage: z.enum(["complete", "partial"]),
|
|
106
|
+
}),
|
|
107
|
+
decompile_jeb_item: z.strictObject({
|
|
108
|
+
engine,
|
|
109
|
+
unit_path: z.string().nullable(),
|
|
110
|
+
item_address: z.string(),
|
|
111
|
+
item_kind: z.enum(["type", "method"]),
|
|
112
|
+
text: z.string(),
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/** Encode ordinary JSON as bounded string parts without a document-sized allocation. */
|
|
2
2
|
export function* jsonParts(value, pretty = false) {
|
|
3
|
-
yield* encodeValue(value, pretty,
|
|
3
|
+
yield* encodeValue(value, pretty, false);
|
|
4
4
|
}
|
|
5
5
|
/** Encode validated JSON with canonical key ordering without allocating the whole document. */
|
|
6
6
|
export function* canonicalJsonParts(value) {
|
|
7
|
-
yield* encodeValue(value, false,
|
|
7
|
+
yield* encodeValue(value, false, true);
|
|
8
8
|
}
|
|
9
9
|
/** Buffer JSON parts while preserving complete UTF-16 surrogate pairs. */
|
|
10
10
|
export function* bufferedJsonParts(parts) {
|
|
@@ -41,69 +41,123 @@ function* encodeString(value) {
|
|
|
41
41
|
}
|
|
42
42
|
yield '"';
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return;
|
|
56
|
-
|
|
44
|
+
/** Encoded text accumulated before it is yielded as one part. */
|
|
45
|
+
const PART_CHARACTERS = 16 * 1024;
|
|
46
|
+
const indentation = [];
|
|
47
|
+
const indent = (depth) => (indentation[depth] ??= `\n${" ".repeat(depth)}`);
|
|
48
|
+
/** Encoded text of a scalar, or undefined for a container or a long string. */
|
|
49
|
+
const scalarText = (value) => {
|
|
50
|
+
if (typeof value === "string")
|
|
51
|
+
return value.length <= 8192 ? JSON.stringify(value) : undefined;
|
|
52
|
+
if (value === null)
|
|
53
|
+
return "null";
|
|
54
|
+
if (typeof value === "boolean")
|
|
55
|
+
return String(value);
|
|
56
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
57
|
+
return String(value);
|
|
58
|
+
return undefined;
|
|
59
|
+
};
|
|
60
|
+
const openContainer = (value, depth, ancestors, canonical) => {
|
|
57
61
|
if (typeof value !== "object" || value === null)
|
|
58
62
|
throw new TypeError("JSON output requires ordinary JSON values");
|
|
59
63
|
if (ancestors.has(value))
|
|
60
64
|
throw new TypeError("JSON output contains a circular reference");
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
const array = Array.isArray(value);
|
|
66
|
+
if (!array && Object.prototype.toString.call(value) !== "[object Object]")
|
|
63
67
|
throw new TypeError("JSON output requires ordinary JSON objects");
|
|
64
68
|
ancestors.add(value);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
69
|
+
const keys = array ? undefined : Object.keys(value);
|
|
70
|
+
if (canonical)
|
|
71
|
+
keys?.sort();
|
|
72
|
+
const count = array ? value.length : (keys?.length ?? 0);
|
|
73
|
+
return { value, array, keys, count, depth, index: 0, written: 0 };
|
|
74
|
+
};
|
|
75
|
+
/** The next written member of a container, skipping values JSON omits. */
|
|
76
|
+
const nextMember = (frame) => {
|
|
77
|
+
while (frame.index < frame.count) {
|
|
78
|
+
const index = frame.index;
|
|
79
|
+
frame.index += 1;
|
|
80
|
+
if (frame.array)
|
|
81
|
+
return { key: undefined, item: Reflect.get(frame.value, index) };
|
|
82
|
+
const key = frame.keys?.[index];
|
|
83
|
+
if (key === undefined)
|
|
84
|
+
throw new TypeError("JSON object changed during serialization");
|
|
85
|
+
const item = Reflect.get(frame.value, key);
|
|
86
|
+
// Incur's filter can select inherited methods. Match native JSON's
|
|
87
|
+
// omission without eagerly reading the rest of a bounded result.
|
|
88
|
+
if (item !== undefined &&
|
|
89
|
+
typeof item !== "function" &&
|
|
90
|
+
typeof item !== "symbol")
|
|
91
|
+
return { key, item };
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Encode iteratively into bounded parts. Recursive `yield*` delegation passed
|
|
97
|
+
* every token through one generator frame per nesting level, which dominated
|
|
98
|
+
* the cost of writing large nested results.
|
|
99
|
+
*/
|
|
100
|
+
function* encodeValue(root, pretty, canonical) {
|
|
101
|
+
const ancestors = new Set();
|
|
102
|
+
const stack = [];
|
|
103
|
+
let buffer = "";
|
|
104
|
+
let pending = root;
|
|
105
|
+
let hasPending = true;
|
|
106
|
+
while (true) {
|
|
107
|
+
if (hasPending) {
|
|
108
|
+
hasPending = false;
|
|
109
|
+
const text = scalarText(pending);
|
|
110
|
+
if (text !== undefined)
|
|
111
|
+
buffer += text;
|
|
112
|
+
else if (typeof pending === "string") {
|
|
113
|
+
// A long string is split into surrogate-safe parts of its own.
|
|
114
|
+
if (buffer !== "")
|
|
115
|
+
yield buffer;
|
|
116
|
+
buffer = "";
|
|
117
|
+
yield* encodeString(pending);
|
|
78
118
|
}
|
|
79
119
|
else {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
item = Reflect.get(value, key);
|
|
84
|
-
// Incur's filter can select inherited methods. Match native JSON's
|
|
85
|
-
// omission without eagerly reading the rest of a bounded result.
|
|
86
|
-
if (item === undefined ||
|
|
87
|
-
typeof item === "function" ||
|
|
88
|
-
typeof item === "symbol")
|
|
89
|
-
continue;
|
|
120
|
+
const frame = openContainer(pending, stack.length, ancestors, canonical);
|
|
121
|
+
stack.push(frame);
|
|
122
|
+
buffer += frame.array ? "[" : "{";
|
|
90
123
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
124
|
+
}
|
|
125
|
+
if (buffer.length >= PART_CHARACTERS) {
|
|
126
|
+
yield buffer;
|
|
127
|
+
buffer = "";
|
|
128
|
+
}
|
|
129
|
+
const frame = stack.at(-1);
|
|
130
|
+
if (frame === undefined)
|
|
131
|
+
break;
|
|
132
|
+
const member = nextMember(frame);
|
|
133
|
+
if (member === undefined) {
|
|
134
|
+
if (pretty && frame.written > 0)
|
|
135
|
+
buffer += indent(frame.depth);
|
|
136
|
+
buffer += frame.array ? "]" : "}";
|
|
137
|
+
ancestors.delete(frame.value);
|
|
138
|
+
stack.pop();
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (frame.written > 0)
|
|
142
|
+
buffer += ",";
|
|
143
|
+
if (pretty)
|
|
144
|
+
buffer += indent(frame.depth + 1);
|
|
145
|
+
if (member.key !== undefined) {
|
|
146
|
+
const key = scalarText(member.key);
|
|
147
|
+
if (key !== undefined)
|
|
148
|
+
buffer += key;
|
|
149
|
+
else {
|
|
150
|
+
if (buffer !== "")
|
|
151
|
+
yield buffer;
|
|
152
|
+
buffer = "";
|
|
153
|
+
yield* encodeString(member.key);
|
|
98
154
|
}
|
|
99
|
-
|
|
100
|
-
written += 1;
|
|
155
|
+
buffer += pretty ? ": " : ":";
|
|
101
156
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
finally {
|
|
107
|
-
ancestors.delete(value);
|
|
157
|
+
frame.written += 1;
|
|
158
|
+
pending = member.item;
|
|
159
|
+
hasPending = true;
|
|
108
160
|
}
|
|
161
|
+
if (buffer !== "")
|
|
162
|
+
yield buffer;
|
|
109
163
|
}
|