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
|
@@ -2,12 +2,13 @@ import { Cli, z } from "incur";
|
|
|
2
2
|
import { captureProcessScenarioFile, compareProcessEvidenceFiles, isProcessCliFailure, } from "../application/process/ProcessCli.js";
|
|
3
3
|
import { logCliCommand } from "../cliLogging.js";
|
|
4
4
|
import { CLI_COMMANDS } from "../cliCommandNames.js";
|
|
5
|
+
import { withCommandCancellation } from "./commandCancellation.js";
|
|
5
6
|
/** Register direct process capture and comparison commands. */
|
|
6
|
-
export const registerProcessCommands = (cli, logger, environment
|
|
7
|
+
export const registerProcessCommands = (cli, logger, environment) => {
|
|
7
8
|
cli.command(CLI_COMMANDS.captureProcess, {
|
|
8
9
|
description: "Capture one caller-selected process scenario",
|
|
9
10
|
args: z.object({ scenario: z.string().describe("Scenario JSON path") }),
|
|
10
|
-
run: ({ args }) => logCliCommand(logger, "capture-process", () => captureProcessScenarioFile(args.scenario, environment), isProcessCliFailure),
|
|
11
|
+
run: ({ args }) => withCommandCancellation((signal) => logCliCommand(logger, "capture-process", () => captureProcessScenarioFile(args.scenario, environment, signal), isProcessCliFailure)),
|
|
11
12
|
});
|
|
12
13
|
cli.command(CLI_COMMANDS.compareProcessCaptures, {
|
|
13
14
|
description: "Compare two process capture Evidence JSON files",
|
|
@@ -3,7 +3,8 @@ import { DOCTOR_PROVIDER_IDS, runDoctor, } from "../application/Doctor.js";
|
|
|
3
3
|
import { isSetupFailure, } from "../application/SetupTypes.js";
|
|
4
4
|
import { runSetup } from "../application/Setup.js";
|
|
5
5
|
import { systemSetupHost } from "../application/SetupHost.js";
|
|
6
|
-
import { isUninstallFailure, runUninstall } from "../application/Uninstall.js";
|
|
6
|
+
import { isUninstallFailure, runUninstall, systemUninstallHost, } from "../application/Uninstall.js";
|
|
7
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
7
8
|
import { isUpdateFailure, runUpdate } from "../application/Update.js";
|
|
8
9
|
import { systemUpdateHost } from "../application/UpdateRuntime.js";
|
|
9
10
|
import { confirmInteractiveSetup, renderInteractiveSetupResult, renderSetupProgress, } from "./interactiveSetup.js";
|
|
@@ -17,12 +18,12 @@ const supportedClientSchema = z
|
|
|
17
18
|
.string()
|
|
18
19
|
.refine((candidate) => supportedClientIds.some((name) => name === candidate), "Unsupported agent integration");
|
|
19
20
|
/** Register setup, doctor, uninstall, and update CLI commands. */
|
|
20
|
-
export const registerSetupCommands = (cli, logger) => {
|
|
21
|
-
registerSetupCommand(cli, logger);
|
|
22
|
-
registerDoctorCommand(cli, logger);
|
|
23
|
-
registerMaintenanceCommands(cli, logger);
|
|
21
|
+
export const registerSetupCommands = (cli, logger, environment) => {
|
|
22
|
+
registerSetupCommand(cli, logger, environment);
|
|
23
|
+
registerDoctorCommand(cli, logger, environment);
|
|
24
|
+
registerMaintenanceCommands(cli, logger, environment);
|
|
24
25
|
};
|
|
25
|
-
const registerSetupCommand = (cli, logger) => {
|
|
26
|
+
const registerSetupCommand = (cli, logger, environment) => {
|
|
26
27
|
cli.command(CLI_COMMANDS.setup, {
|
|
27
28
|
description: "Configure agent integrations and optional analysis providers",
|
|
28
29
|
outputPolicy: "agent-only",
|
|
@@ -57,10 +58,10 @@ const registerSetupCommand = (cli, logger) => {
|
|
|
57
58
|
.describe("Use sequential accessible setup prompts"),
|
|
58
59
|
}),
|
|
59
60
|
alias: { yes: "y" },
|
|
60
|
-
run: ({ options, formatExplicit }) => logCliCommand(logger, CLI_COMMANDS.setup, () => runSetupCommand({ options, formatExplicit }), isSetupFailure),
|
|
61
|
+
run: ({ options, formatExplicit }) => logCliCommand(logger, CLI_COMMANDS.setup, () => runSetupCommand({ options, formatExplicit }, environment), isSetupFailure),
|
|
61
62
|
});
|
|
62
63
|
};
|
|
63
|
-
const registerDoctorCommand = (cli, logger) => {
|
|
64
|
+
const registerDoctorCommand = (cli, logger, environment) => {
|
|
64
65
|
cli.command(CLI_COMMANDS.doctor, {
|
|
65
66
|
description: "Check whether REA is ready",
|
|
66
67
|
options: z.object({
|
|
@@ -78,10 +79,10 @@ const registerDoctorCommand = (cli, logger) => {
|
|
|
78
79
|
.optional()
|
|
79
80
|
.describe("Require the installed REA skill identity to be aligned"),
|
|
80
81
|
}),
|
|
81
|
-
run: ({ options }) => logCliCommand(logger, "doctor", () => runDoctor(options.target, createSystemDoctorHost(), doctorScope(options))),
|
|
82
|
+
run: ({ options }) => logCliCommand(logger, "doctor", () => runDoctor(options.target, createSystemDoctorHost(environment), doctorScope(options))),
|
|
82
83
|
});
|
|
83
84
|
};
|
|
84
|
-
const registerMaintenanceCommands = (cli, logger) => {
|
|
85
|
+
const registerMaintenanceCommands = (cli, logger, environment) => {
|
|
85
86
|
cli.command(CLI_COMMANDS.uninstall, {
|
|
86
87
|
description: "Remove REA-owned agent configuration and skill files",
|
|
87
88
|
options: z.object({
|
|
@@ -91,22 +92,22 @@ const registerMaintenanceCommands = (cli, logger) => {
|
|
|
91
92
|
.describe("Also remove REA caches and state"),
|
|
92
93
|
}),
|
|
93
94
|
alias: { purgeData: "purge-data" },
|
|
94
|
-
run: ({ options }) => logCliCommand(logger, "uninstall", () => runUninstall(options.purgeData), isUninstallFailure),
|
|
95
|
+
run: ({ options }) => logCliCommand(logger, "uninstall", () => runUninstall(options.purgeData, systemUninstallHost(homeDirectoryFromEnvironment(environment, process.platform), undefined, environment)), isUninstallFailure),
|
|
95
96
|
});
|
|
96
97
|
cli.command(CLI_COMMANDS.update, {
|
|
97
98
|
description: "Update this REA installation and verify the installed release",
|
|
98
|
-
run: ({ formatExplicit }) => logCliCommand(logger, CLI_COMMANDS.update, () => runUpdate(PRODUCT_IDENTITY.packageVersion, systemUpdateHost(), formatExplicit ? "structured" : "human"), isUpdateFailure),
|
|
99
|
+
run: ({ formatExplicit }) => logCliCommand(logger, CLI_COMMANDS.update, () => runUpdate(PRODUCT_IDENTITY.packageVersion, systemUpdateHost(undefined, undefined, environment), formatExplicit ? "structured" : "human"), isUpdateFailure),
|
|
99
100
|
});
|
|
100
101
|
};
|
|
101
|
-
const runSetupCommand = async (input) => {
|
|
102
|
+
const runSetupCommand = async (input, environment) => {
|
|
102
103
|
const { options } = input;
|
|
103
104
|
const interactive = setupIsInteractive(options, input.formatExplicit);
|
|
104
105
|
const hasExplicitScope = setupHasExplicitScope(options);
|
|
105
|
-
const result = await runSetup(setupRunOptions(input, interactive, hasExplicitScope), systemSetupHost(createSystemDoctorHost()), interactive
|
|
106
|
+
const result = await runSetup(setupRunOptions(input, interactive, hasExplicitScope), systemSetupHost(createSystemDoctorHost(environment), environment), interactive
|
|
106
107
|
? (actions, context) => confirmInteractiveSetup(actions, options.accessible, context)
|
|
107
108
|
: undefined);
|
|
108
109
|
if (interactive)
|
|
109
|
-
renderInteractiveSetupResult(result);
|
|
110
|
+
renderInteractiveSetupResult(result, environment);
|
|
110
111
|
return result;
|
|
111
112
|
};
|
|
112
113
|
const setupRunOptions = (input, interactive, hasExplicitScope) => {
|
|
@@ -1,18 +1,70 @@
|
|
|
1
|
+
import { constants } from "node:buffer";
|
|
1
2
|
import {} from "node:stream";
|
|
2
|
-
import { Filter } from "incur";
|
|
3
|
+
import { Cli, Filter } from "incur";
|
|
3
4
|
import { parseCliOutputArguments } from "../cliOutput.js";
|
|
4
|
-
import {
|
|
5
|
+
import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
|
|
6
|
+
import { projectAnalysisError, } from "../domain/analysisErrorProjection.js";
|
|
7
|
+
import { jsonOutputParts, writeJsonOutput } from "./jsonOutput.js";
|
|
8
|
+
const registeredCommands = Cli.toCommands;
|
|
9
|
+
/** Install formatting once, after registration, for every ordinary CLI result. */
|
|
10
|
+
export const streamCliCommandResults = (cli, output) => {
|
|
11
|
+
const commands = registeredCommands.get(cli);
|
|
12
|
+
if (commands !== undefined)
|
|
13
|
+
wrapCommands(commands, [], output);
|
|
14
|
+
};
|
|
15
|
+
const wrapCommands = (commands, parents, output) => {
|
|
16
|
+
for (const [name, entry] of commands) {
|
|
17
|
+
const path = [...parents, name];
|
|
18
|
+
if ("_group" in entry) {
|
|
19
|
+
wrapCommands(entry.commands, path, output);
|
|
20
|
+
if (entry.root !== undefined)
|
|
21
|
+
wrapCommand(entry.root, path.join(" "), output);
|
|
22
|
+
}
|
|
23
|
+
else if (!("_alias" in entry) && !("_fetch" in entry))
|
|
24
|
+
wrapCommand(entry, path.join(" "), output);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const wrapCommand = (command, name, output) => {
|
|
28
|
+
const run = command.run;
|
|
29
|
+
command.run = (context) => {
|
|
30
|
+
const started = performance.now();
|
|
31
|
+
const result = run(context);
|
|
32
|
+
// Generator results and Incur's sentinel responses retain their own protocol.
|
|
33
|
+
if (typeof result === "object" &&
|
|
34
|
+
result !== null &&
|
|
35
|
+
Symbol.asyncIterator in result)
|
|
36
|
+
return result;
|
|
37
|
+
return Promise.resolve(result).then(async (value) => {
|
|
38
|
+
if (typeof value === "object" &&
|
|
39
|
+
value !== null &&
|
|
40
|
+
Symbol.for("incur.sentinel") in value)
|
|
41
|
+
return value;
|
|
42
|
+
if (!(await output.write(value, {
|
|
43
|
+
command: name,
|
|
44
|
+
format: context.format,
|
|
45
|
+
duration: `${Math.round(performance.now() - started)}ms`,
|
|
46
|
+
})))
|
|
47
|
+
return value;
|
|
48
|
+
if (output.error !== undefined)
|
|
49
|
+
return context.error({
|
|
50
|
+
code: output.error.code,
|
|
51
|
+
message: output.error.message,
|
|
52
|
+
});
|
|
53
|
+
return undefined;
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
};
|
|
5
57
|
/** Preserve Incur's JSON controls while streaming the complete result. */
|
|
6
58
|
export const createStreamedCliJsonOutput = (arguments_, destination) => {
|
|
7
59
|
const options = parseCliOutputArguments(arguments_);
|
|
8
60
|
if (options.parseError ||
|
|
9
|
-
options.tokenCount ||
|
|
10
61
|
options.tokenWindow ||
|
|
11
62
|
(options.format !== "json" && options.format !== "jsonl"))
|
|
12
63
|
return undefined;
|
|
13
64
|
const format = options.format;
|
|
14
65
|
let handled = false;
|
|
15
66
|
let failed = false;
|
|
67
|
+
let error;
|
|
16
68
|
return {
|
|
17
69
|
get handled() {
|
|
18
70
|
return handled;
|
|
@@ -20,6 +72,9 @@ export const createStreamedCliJsonOutput = (arguments_, destination) => {
|
|
|
20
72
|
get failed() {
|
|
21
73
|
return failed;
|
|
22
74
|
},
|
|
75
|
+
get error() {
|
|
76
|
+
return error;
|
|
77
|
+
},
|
|
23
78
|
async write(value, metadata) {
|
|
24
79
|
if (metadata.format !== format)
|
|
25
80
|
return false;
|
|
@@ -30,6 +85,26 @@ export const createStreamedCliJsonOutput = (arguments_, destination) => {
|
|
|
30
85
|
command: metadata.command,
|
|
31
86
|
duration: metadata.duration,
|
|
32
87
|
};
|
|
88
|
+
if (options.tokenCount) {
|
|
89
|
+
// Incur/tokenx materialize the formatted value. Measure its UTF-16
|
|
90
|
+
// expansion before allowing that allocation, independently of UTF-8 bytes.
|
|
91
|
+
let characters = 0;
|
|
92
|
+
if (filtered !== undefined &&
|
|
93
|
+
filtered !== null &&
|
|
94
|
+
typeof filtered !== "function" &&
|
|
95
|
+
typeof filtered !== "symbol")
|
|
96
|
+
for (const part of jsonOutputParts(filtered, format))
|
|
97
|
+
characters += part.length;
|
|
98
|
+
characters = Math.max(0, characters - 1);
|
|
99
|
+
if (characters <= constants.MAX_STRING_LENGTH)
|
|
100
|
+
return false;
|
|
101
|
+
error = projectAnalysisError(new AnalysisResourceConstraintError(metadata.command, "memory", "Token counting requires a formatted string larger than the runtime permits.", {
|
|
102
|
+
formatted_characters: characters,
|
|
103
|
+
max_string_characters: constants.MAX_STRING_LENGTH,
|
|
104
|
+
}, {
|
|
105
|
+
remediationAction: "Remove --token-count to stream the complete JSON result, or narrow it with --filter-output.",
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
33
108
|
const document = options.fullOutput
|
|
34
109
|
? filtered === undefined
|
|
35
110
|
? { ok: true, meta }
|
|
@@ -44,7 +119,11 @@ export const createStreamedCliJsonOutput = (arguments_, destination) => {
|
|
|
44
119
|
// document from Incur's error formatter.
|
|
45
120
|
handled = true;
|
|
46
121
|
try {
|
|
47
|
-
await writeJsonOutput(
|
|
122
|
+
await writeJsonOutput(error === undefined
|
|
123
|
+
? document
|
|
124
|
+
: options.fullOutput
|
|
125
|
+
? { ok: false, error, meta }
|
|
126
|
+
: error, destination, format);
|
|
48
127
|
}
|
|
49
128
|
catch (cause) {
|
|
50
129
|
failed = true;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { z } from "incur";
|
|
2
|
-
import { runCapabilityStatus, runProviderAnalysis, runProviderStatus, } from "../composition/directAnalysis.js";
|
|
3
2
|
import { importReferenceSource } from "../application/ReferenceSourceImport.js";
|
|
4
3
|
import { projectReferenceSourceImportError } from "../application/ReferenceSourceImportTypes.js";
|
|
5
|
-
import { parseConfig } from "../config.js";
|
|
4
|
+
import { parseConfig } from "../config/parseConfig.js";
|
|
6
5
|
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
7
6
|
import { AnalysisInputError } from "../domain/analysisErrorCore.js";
|
|
8
7
|
import { projectInputIssues } from "../domain/inputIssueProjection.js";
|
|
@@ -14,10 +13,11 @@ import { CLI_COMMANDS } from "../cliCommandNames.js";
|
|
|
14
13
|
import { swiftSymbolsSchema } from "../contracts/native/nativeToolContracts.js";
|
|
15
14
|
import { isReferenceSourceImportCliFailure } from "./referenceSourceImportStatus.js";
|
|
16
15
|
import { registerNativeCallCommands } from "./nativeCallCommands.js";
|
|
17
|
-
export const registerUtilityCommands = (cli, logger, environment
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
export const registerUtilityCommands = (cli, logger, environment, analysis) => {
|
|
17
|
+
const { runProviderAnalysis } = analysis;
|
|
18
|
+
registerCapabilityCommands(cli, logger, analysis);
|
|
19
|
+
registerNativeCommands(cli, logger, runProviderAnalysis);
|
|
20
|
+
registerNativeCallCommands(cli, logger, runProviderAnalysis);
|
|
21
21
|
for (const [command, operation] of [
|
|
22
22
|
[CLI_COMMANDS.observeNativeUi, "observe_native_ui"],
|
|
23
23
|
[CLI_COMMANDS.captureNativeUiScenario, "capture_native_ui_scenario"],
|
|
@@ -97,7 +97,7 @@ const invalidNativeUiScenarioInput = (operation, issues) => ({
|
|
|
97
97
|
error: "Application workflow failed",
|
|
98
98
|
...projectAnalysisError(new AnalysisInputError(operation, undefined, issues)),
|
|
99
99
|
});
|
|
100
|
-
const registerCapabilityCommands = (cli, logger) => {
|
|
100
|
+
const registerCapabilityCommands = (cli, logger, { runSessionStatus }) => {
|
|
101
101
|
for (const command of [
|
|
102
102
|
CLI_COMMANDS.capabilities,
|
|
103
103
|
CLI_COMMANDS.providers,
|
|
@@ -106,13 +106,11 @@ const registerCapabilityCommands = (cli, logger) => {
|
|
|
106
106
|
description: command === "capabilities"
|
|
107
107
|
? "List provider capabilities and side effects"
|
|
108
108
|
: "List configured analysis providers",
|
|
109
|
-
run: () => logCliCommand(logger, command, () =>
|
|
110
|
-
? runProviderStatus(logger)
|
|
111
|
-
: runCapabilityStatus(logger)),
|
|
109
|
+
run: () => logCliCommand(logger, command, () => runSessionStatus(logger)),
|
|
112
110
|
});
|
|
113
111
|
}
|
|
114
112
|
};
|
|
115
|
-
const registerNativeCommands = (cli, logger) => {
|
|
113
|
+
const registerNativeCommands = (cli, logger, runProviderAnalysis) => {
|
|
116
114
|
for (const [command, tool] of [
|
|
117
115
|
[CLI_COMMANDS.inspectMacho, "inspect_macho"],
|
|
118
116
|
[CLI_COMMANDS.inspectSignature, "inspect_signature"],
|
|
@@ -147,7 +145,7 @@ const registerNativeCommands = (cli, logger) => {
|
|
|
147
145
|
run: ({ args }) => logCliCommand(logger, "demangle-swift", () => runProviderAnalysis(args.path, "demangle_swift", { symbols: args.symbols }, logger)),
|
|
148
146
|
});
|
|
149
147
|
};
|
|
150
|
-
const registerReferenceSourceCommand = (cli, logger, environment
|
|
148
|
+
const registerReferenceSourceCommand = (cli, logger, environment) => {
|
|
151
149
|
cli.command(CLI_COMMANDS.importReferenceSource, {
|
|
152
150
|
description: "Import a source tree as historical reference only",
|
|
153
151
|
args: z.object({
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "./process/snapshotEnvironment.js";
|
|
2
|
+
import { createDirectAnalysis } from "./composition/directAnalysis.js";
|
|
1
3
|
import { registerEvmCommands } from "./cli/evmCommands.js";
|
|
4
|
+
import { registerAnalysisViewCommands } from "./cli/analysisViewCommands.js";
|
|
2
5
|
import { registerBinaryDiagnosticsCommands } from "./cli/binaryDiagnosticsCommands.js";
|
|
3
6
|
import { Cli } from "incur";
|
|
4
7
|
import { createLogger, parseLogLevel } from "./logger.js";
|
|
@@ -25,12 +28,16 @@ import { registerBrowserScenarioCommands } from "./cliBrowserScenarioCommands.js
|
|
|
25
28
|
import { registerElectronCommands } from "./cli/electronCommands.js";
|
|
26
29
|
import { registerJavaScriptRuntimeObservationCommands } from "./cliJavaScriptRuntimeCommands.js";
|
|
27
30
|
import { registerApplicationCommands } from "./cli/applicationCommands.js";
|
|
31
|
+
import { presentOmittableDefaults } from "./cli/omittableDefaults.js";
|
|
32
|
+
import { streamCliCommandResults, } from "./cli/streamedJsonOutput.js";
|
|
28
33
|
/**
|
|
29
34
|
* Build the one-shot Incur CLI without starting Hopper at import time.
|
|
30
35
|
* Analysis commands acquire and close their own sessions; bare `mcp` and
|
|
31
36
|
* `--mcp` are intercepted by the executable dispatcher before this module loads.
|
|
32
37
|
*/
|
|
33
|
-
export const createCli = (
|
|
38
|
+
export const createCli = (selectedEnvironment = process.env, resultOutput) => {
|
|
39
|
+
const environment = snapshotEnvironment(selectedEnvironment);
|
|
40
|
+
const analysis = createDirectAnalysis(environment);
|
|
34
41
|
const logger = createLogger("cli", environment.REA_LOG_LEVEL === undefined
|
|
35
42
|
? "silent"
|
|
36
43
|
: parseLogLevel(environment.REA_LOG_LEVEL));
|
|
@@ -43,15 +50,16 @@ export const createCli = (environment = process.env, resultOutput) => {
|
|
|
43
50
|
},
|
|
44
51
|
sync: false,
|
|
45
52
|
});
|
|
46
|
-
registerSetupCommands(cli, logger);
|
|
47
|
-
registerCoreAnalysisCommands(cli, logger,
|
|
48
|
-
registerUtilityCommands(cli, logger, environment);
|
|
53
|
+
registerSetupCommands(cli, logger, environment);
|
|
54
|
+
registerCoreAnalysisCommands(cli, logger, analysis.runDirectAnalysis);
|
|
55
|
+
registerUtilityCommands(cli, logger, environment, analysis);
|
|
49
56
|
registerEvmCommands(cli, logger, environment);
|
|
50
|
-
registerArtifactCommands(cli, logger);
|
|
51
|
-
registerManagedCommands(cli, logger);
|
|
57
|
+
registerArtifactCommands(cli, logger, analysis.runProviderAnalysis);
|
|
58
|
+
registerManagedCommands(cli, logger, analysis.runProviderAnalysis);
|
|
52
59
|
registerAndroidCommands(cli, logger, environment);
|
|
53
60
|
registerFirmwareCommands(cli, logger, environment);
|
|
54
61
|
registerBinaryDiagnosticsCommands(cli, logger, environment);
|
|
62
|
+
registerAnalysisViewCommands(cli, logger);
|
|
55
63
|
registerEvidenceCommands(cli, logger);
|
|
56
64
|
registerProcessCommands(cli, logger, environment);
|
|
57
65
|
registerBrowserCommands(cli, logger);
|
|
@@ -62,9 +70,12 @@ export const createCli = (environment = process.env, resultOutput) => {
|
|
|
62
70
|
registerWebNetworkCaptureCommands(cli, logger, environment);
|
|
63
71
|
registerJavaScriptRecoveryCommands(cli, logger, environment);
|
|
64
72
|
registerAdvancedBrowserCommands(cli, logger);
|
|
65
|
-
registerBrowserScenarioCommands(cli, logger);
|
|
66
|
-
registerElectronCommands(cli, logger,
|
|
73
|
+
registerBrowserScenarioCommands(cli, logger, environment);
|
|
74
|
+
registerElectronCommands(cli, logger, environment);
|
|
67
75
|
registerJavaScriptRuntimeObservationCommands(cli, logger);
|
|
68
76
|
registerApplicationCommands(cli, logger);
|
|
77
|
+
presentOmittableDefaults(cli);
|
|
78
|
+
if (resultOutput !== undefined)
|
|
79
|
+
streamCliCommandResults(cli, resultOutput);
|
|
69
80
|
return cli;
|
|
70
81
|
};
|
|
@@ -11,7 +11,7 @@ import { projectInputIssues } from "./domain/inputIssueProjection.js";
|
|
|
11
11
|
import { browserScenarioSchema } from "./domain/browserScenario.js";
|
|
12
12
|
const OPERATION = "capture_browser_scenario";
|
|
13
13
|
/** Register the one-shot controlled browser scenario command. */
|
|
14
|
-
export const registerBrowserScenarioCommands = (cli, logger) => {
|
|
14
|
+
export const registerBrowserScenarioCommands = (cli, logger, environment) => {
|
|
15
15
|
cli.command(CLI_COMMANDS.captureBrowserScenario, {
|
|
16
16
|
description: "Run one bounded Playwright browser scenario and return Evidence",
|
|
17
17
|
args: z.object({
|
|
@@ -26,7 +26,7 @@ export const registerBrowserScenarioCommands = (cli, logger) => {
|
|
|
26
26
|
const scenario = browserScenarioSchema.safeParse(resolveCliJsonPaths(input.value, [["browser", "executable_path"]]));
|
|
27
27
|
if (!scenario.success)
|
|
28
28
|
return cliError(new AnalysisInputError(OPERATION, { cause: scenario.error }, projectInputIssues(scenario.error.issues, input.value)));
|
|
29
|
-
const result = await captureBrowserScenario(createBrowserScenarioProvider(), scenario.data);
|
|
29
|
+
const result = await captureBrowserScenario(createBrowserScenarioProvider(environment), scenario.data);
|
|
30
30
|
return result.ok ? result.value : cliError(result.error);
|
|
31
31
|
}),
|
|
32
32
|
});
|
package/dist/cliCommandNames.js
CHANGED
|
@@ -41,6 +41,7 @@ export const CLI_COMMANDS = Object.freeze({
|
|
|
41
41
|
inspectManagedArtifact: "inspect-managed-artifact",
|
|
42
42
|
inspectRecordedCrash: "inspect-recorded-crash",
|
|
43
43
|
inspectBinaryLayout: "inspect-binary-layout",
|
|
44
|
+
inspectAnalysisView: "inspect-analysis-view",
|
|
44
45
|
inspectFirmwareRegions: "inspect-firmware-regions",
|
|
45
46
|
extractFirmware: "extract-firmware",
|
|
46
47
|
inspectAndroidPackage: "inspect-android-package",
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { constants } from "node:buffer";
|
|
2
|
+
import { pipeline } from "node:stream/promises";
|
|
3
|
+
import { getHeapStatistics } from "node:v8";
|
|
4
|
+
import parser from "stream-json/parser.js";
|
|
5
|
+
import streamValues from "stream-json/streamers/stream-values.js";
|
|
6
|
+
import { withRegularFile } from "./application/RegularFileRead.js";
|
|
7
|
+
import { JSON_INPUT_RESOURCE_REMEDIATION, parseUtf8Json, } from "./application/Utf8JsonInput.js";
|
|
8
|
+
import { AnalysisInputError, AnalysisResourceConstraintError, } from "./domain/analysisErrorCore.js";
|
|
9
|
+
import { err, ok } from "./domain/result.js";
|
|
10
|
+
const READ_CHUNK_BYTES = 64 * 1024;
|
|
11
|
+
const PACKED_STRING_PART_CODE_UNITS = 64 * 1024;
|
|
12
|
+
// Retain native-parser speed for modest inputs while bounding its extra copies.
|
|
13
|
+
// This selects an implementation; larger files remain accepted through streaming.
|
|
14
|
+
const NATIVE_PARSE_READ_BUDGET = 8 * 1024 * 1024;
|
|
15
|
+
/** Parse strict UTF-8 JSON without requiring a whole-document string. */
|
|
16
|
+
export const readCliJsonFile = (path, operation, signal) => withRegularFile(path, async (handle, stats) => {
|
|
17
|
+
let found = false;
|
|
18
|
+
let value;
|
|
19
|
+
try {
|
|
20
|
+
const prefix = stats.size <= NATIVE_PARSE_READ_BUDGET
|
|
21
|
+
? await readPrefix(handle, stats.size + 1, signal)
|
|
22
|
+
: undefined;
|
|
23
|
+
if (prefix?.complete === true) {
|
|
24
|
+
const parsed = parseUtf8Json(prefix.bytes, operation, path, "cli-json-input");
|
|
25
|
+
return parsed.ok
|
|
26
|
+
? ok(parsed.value)
|
|
27
|
+
: err(invalidJson(operation, parsed.error, parsed.cause));
|
|
28
|
+
}
|
|
29
|
+
await pipeline(decodedChunks(handle, signal, prefix?.bytes), parser.asStream({
|
|
30
|
+
jsonStreaming: false,
|
|
31
|
+
streamValues: false,
|
|
32
|
+
packKeys: false,
|
|
33
|
+
packStrings: false,
|
|
34
|
+
}), packJsonStrings(operation, stats.size), streamValues.asStream(), async (rows) => {
|
|
35
|
+
for await (const row of rows) {
|
|
36
|
+
if (found ||
|
|
37
|
+
typeof row !== "object" ||
|
|
38
|
+
row === null ||
|
|
39
|
+
!("key" in row) ||
|
|
40
|
+
row.key !== 0 ||
|
|
41
|
+
!("value" in row))
|
|
42
|
+
throw new Error("Unexpected JSON parser result");
|
|
43
|
+
found = true;
|
|
44
|
+
value = row.value;
|
|
45
|
+
}
|
|
46
|
+
}, signal === undefined ? {} : { signal });
|
|
47
|
+
return found
|
|
48
|
+
? ok(value)
|
|
49
|
+
: err(invalidJson(operation, "JSON document is empty"));
|
|
50
|
+
}
|
|
51
|
+
catch (cause) {
|
|
52
|
+
if (cause instanceof AnalysisResourceConstraintError)
|
|
53
|
+
return err(cause);
|
|
54
|
+
if (cause instanceof TypeError &&
|
|
55
|
+
"code" in cause &&
|
|
56
|
+
cause.code === "ERR_ENCODING_INVALID_ENCODED_DATA")
|
|
57
|
+
return err(invalidJson(operation, "JSON input is not valid UTF-8", cause));
|
|
58
|
+
if (cause instanceof SyntaxError ||
|
|
59
|
+
(cause instanceof Error && cause.message.startsWith("Parser ")))
|
|
60
|
+
return err(invalidJson(operation, cause.message, cause));
|
|
61
|
+
if (cause instanceof Error &&
|
|
62
|
+
((cause instanceof RangeError &&
|
|
63
|
+
cause.message === "Invalid string length") ||
|
|
64
|
+
("code" in cause && cause.code === "ERR_STRING_TOO_LONG")))
|
|
65
|
+
return err(new AnalysisResourceConstraintError(operation, "memory", "An individual JSON string exceeds the runtime string limit", {
|
|
66
|
+
input_file_bytes: stats.size,
|
|
67
|
+
max_string_code_units: constants.MAX_STRING_LENGTH,
|
|
68
|
+
}, {
|
|
69
|
+
cause,
|
|
70
|
+
remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
|
|
71
|
+
}));
|
|
72
|
+
throw cause;
|
|
73
|
+
}
|
|
74
|
+
}, signal);
|
|
75
|
+
const packJsonStrings = (operation, inputFileBytes) => async function* (tokens) {
|
|
76
|
+
let kind;
|
|
77
|
+
let length = 0;
|
|
78
|
+
let value = "";
|
|
79
|
+
let parts = [];
|
|
80
|
+
let partLength = 0;
|
|
81
|
+
for await (const token of tokens) {
|
|
82
|
+
if (typeof token !== "object" || token === null || !("name" in token))
|
|
83
|
+
throw new Error("Unexpected JSON parser token");
|
|
84
|
+
switch (token.name) {
|
|
85
|
+
case "startKey":
|
|
86
|
+
case "startString":
|
|
87
|
+
kind = token.name === "startKey" ? "keyValue" : "stringValue";
|
|
88
|
+
break;
|
|
89
|
+
case "stringChunk":
|
|
90
|
+
if (kind === undefined ||
|
|
91
|
+
!("value" in token) ||
|
|
92
|
+
typeof token.value !== "string")
|
|
93
|
+
throw new Error("Unexpected JSON string fragment");
|
|
94
|
+
length += token.value.length;
|
|
95
|
+
if (length > constants.MAX_STRING_LENGTH)
|
|
96
|
+
throw new RangeError("Invalid string length");
|
|
97
|
+
parts.push(token.value);
|
|
98
|
+
partLength += token.value.length;
|
|
99
|
+
if (partLength >= PACKED_STRING_PART_CODE_UNITS) {
|
|
100
|
+
// The tokenizer emits short fragments. Coalesce them before retaining
|
|
101
|
+
// a string so millions of substring/rope nodes cannot exhaust the heap
|
|
102
|
+
// before the native string-length constraint can be reported.
|
|
103
|
+
requireStringAssemblyHeadroom(operation, inputFileBytes, length);
|
|
104
|
+
value += parts.join("");
|
|
105
|
+
parts = [];
|
|
106
|
+
partLength = 0;
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case "endKey":
|
|
110
|
+
case "endString":
|
|
111
|
+
if (kind === undefined)
|
|
112
|
+
throw new Error("Unexpected JSON string end");
|
|
113
|
+
requireStringAssemblyHeadroom(operation, inputFileBytes, length);
|
|
114
|
+
yield { name: kind, value: value + parts.join("") };
|
|
115
|
+
kind = undefined;
|
|
116
|
+
length = 0;
|
|
117
|
+
value = "";
|
|
118
|
+
parts = [];
|
|
119
|
+
partLength = 0;
|
|
120
|
+
break;
|
|
121
|
+
default:
|
|
122
|
+
yield token;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const requireStringAssemblyHeadroom = (operation, inputFileBytes, stringCodeUnits) => {
|
|
127
|
+
if (stringCodeUnits < PACKED_STRING_PART_CODE_UNITS)
|
|
128
|
+
return;
|
|
129
|
+
const heap = getHeapStatistics();
|
|
130
|
+
// Concatenation or key interning may flatten the retained rope. Reserve its
|
|
131
|
+
// UTF-16 representation and the next coalesced part before that allocation.
|
|
132
|
+
const requiredBytes = 2 * (stringCodeUnits + PACKED_STRING_PART_CODE_UNITS);
|
|
133
|
+
if (requiredBytes > heap.total_available_size)
|
|
134
|
+
throw new AnalysisResourceConstraintError(operation, "memory", "Insufficient heap headroom to assemble a complete JSON string", {
|
|
135
|
+
input_file_bytes: inputFileBytes,
|
|
136
|
+
string_code_units: stringCodeUnits,
|
|
137
|
+
string_assembly_headroom_bytes: requiredBytes,
|
|
138
|
+
available_heap_bytes: heap.total_available_size,
|
|
139
|
+
heap_size_limit_bytes: heap.heap_size_limit,
|
|
140
|
+
}, {
|
|
141
|
+
remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
async function* decodedChunks(handle, signal, prefix) {
|
|
145
|
+
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
146
|
+
if (prefix !== undefined)
|
|
147
|
+
for (let offset = 0; offset < prefix.length; offset += READ_CHUNK_BYTES) {
|
|
148
|
+
signal?.throwIfAborted();
|
|
149
|
+
yield decoder.decode(prefix.subarray(offset, offset + READ_CHUNK_BYTES), {
|
|
150
|
+
stream: true,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const bytes = Buffer.allocUnsafe(READ_CHUNK_BYTES);
|
|
154
|
+
while (true) {
|
|
155
|
+
signal?.throwIfAborted();
|
|
156
|
+
const read = await handle.read(bytes, 0, bytes.length, null);
|
|
157
|
+
signal?.throwIfAborted();
|
|
158
|
+
if (read.bytesRead === 0)
|
|
159
|
+
break;
|
|
160
|
+
yield decoder.decode(bytes.subarray(0, read.bytesRead), { stream: true });
|
|
161
|
+
}
|
|
162
|
+
yield decoder.decode();
|
|
163
|
+
}
|
|
164
|
+
const readPrefix = async (handle, size, signal) => {
|
|
165
|
+
const bytes = Buffer.allocUnsafe(size);
|
|
166
|
+
let offset = 0;
|
|
167
|
+
while (offset < bytes.length) {
|
|
168
|
+
signal?.throwIfAborted();
|
|
169
|
+
const read = await handle.read(bytes, offset, bytes.length - offset, null);
|
|
170
|
+
signal?.throwIfAborted();
|
|
171
|
+
if (read.bytesRead === 0)
|
|
172
|
+
return { bytes: bytes.subarray(0, offset), complete: true };
|
|
173
|
+
offset += read.bytesRead;
|
|
174
|
+
}
|
|
175
|
+
// The file grew after admission. Continue from this same handle, preserving
|
|
176
|
+
// the prefix already read rather than reopening or dropping its bytes.
|
|
177
|
+
return { bytes, complete: false };
|
|
178
|
+
};
|
|
179
|
+
const invalidJson = (operation, message, cause) => new AnalysisInputError(operation, cause === undefined ? undefined : { cause }, [{ path: [], reason: "invalid_format", expected: "JSON", message }]);
|