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
|
@@ -6,10 +6,10 @@ import { join } from "node:path";
|
|
|
6
6
|
import { promisify } from "node:util";
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
9
|
+
import { downloadHopperPackage, HOPPER_DOWNLOAD_BYTES, } from "./HopperDownload.js";
|
|
9
10
|
const execFileAsync = promisify(execFile);
|
|
10
11
|
const RELEASES_URL = "https://www.hopperapp.com/include/files-api.php?request=releases&public=true";
|
|
11
12
|
const DOWNLOAD_PREFIX = "https://www.hopperapp.com:443/downloader/public/";
|
|
12
|
-
const MAX_PACKAGE_BYTES = 100_000_000;
|
|
13
13
|
const BUNDLE_IDENTIFIER = "com.cryptic-apps.hopper-web-4";
|
|
14
14
|
/** Stable network and command effects disclosed before macOS Hopper setup. */
|
|
15
15
|
export const macHopperInstallDisclosure = {
|
|
@@ -25,173 +25,195 @@ export const macHopperInstallDisclosure = {
|
|
|
25
25
|
export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost(homeDirectoryFromEnvironment(process.env, process.platform), process.env)) => {
|
|
26
26
|
let temporary;
|
|
27
27
|
let mounted = false;
|
|
28
|
+
let result;
|
|
28
29
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
30
|
+
result = await (async () => {
|
|
31
|
+
const metadata = await host.download(RELEASES_URL);
|
|
32
|
+
if (!metadata.ok)
|
|
33
|
+
return { status: "failed", reason: "release_metadata" };
|
|
34
|
+
const parsed = releasesSchema.safeParse(parseJson(metadata.bytes));
|
|
35
|
+
if (!parsed.success)
|
|
36
|
+
return { status: "failed", reason: "release_metadata" };
|
|
37
|
+
const release = parsed.data["OS X"];
|
|
38
|
+
if (!release.filename.startsWith(DOWNLOAD_PREFIX))
|
|
39
|
+
return { status: "failed", reason: "release_metadata" };
|
|
40
|
+
const archive = await host.download(release.filename);
|
|
41
|
+
if (!archive.ok)
|
|
42
|
+
return { status: "failed", reason: "download" };
|
|
43
|
+
if (!integrityMatches(archive.bytes, release))
|
|
44
|
+
return { status: "failed", reason: "integrity" };
|
|
45
|
+
const destination = host.destination();
|
|
46
|
+
const destinationExists = await host.destinationExists(destination);
|
|
47
|
+
if (destinationExists && options.replaceExisting !== true)
|
|
48
|
+
return { status: "failed", reason: "destination_exists" };
|
|
49
|
+
temporary = await host.createTemporaryDirectory();
|
|
50
|
+
const packagePath = join(temporary, "hopper.dmg");
|
|
51
|
+
const mountPath = join(temporary, "mounted");
|
|
52
|
+
await host.createMountDirectory(mountPath);
|
|
53
|
+
await host.writePackage(packagePath, archive.bytes);
|
|
54
|
+
if (!(await host.mount(packagePath, mountPath)))
|
|
55
|
+
return { status: "failed", reason: "mount" };
|
|
56
|
+
mounted = true;
|
|
57
|
+
const source = await host.appBundle(mountPath);
|
|
58
|
+
if (source === undefined || !(await host.validBundle(source)))
|
|
59
|
+
return { status: "failed", reason: "bundle" };
|
|
60
|
+
const stage = `${destination}.rea-stage`;
|
|
61
|
+
if (!(await host.installBundle(source, destination, stage, destinationExists)))
|
|
62
|
+
return { status: "failed", reason: "copy" };
|
|
63
|
+
const launcherPath = join(destination, "Contents/MacOS/hopper");
|
|
64
|
+
if (!(await host.launcherReady(launcherPath)))
|
|
65
|
+
return { status: "failed", reason: "launcher_missing" };
|
|
66
|
+
await host.openApplication(destination);
|
|
67
|
+
return { status: "installed", launcherPath };
|
|
68
|
+
})();
|
|
66
69
|
}
|
|
67
70
|
catch (cause) {
|
|
68
71
|
// Install-stage failures share the download reason; the stage is cleaned below.
|
|
69
72
|
void cause;
|
|
70
|
-
|
|
73
|
+
result = { status: "failed", reason: "download" };
|
|
71
74
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
let cleanupFailure;
|
|
76
|
+
if (temporary !== undefined) {
|
|
77
|
+
const temporaryPath = temporary;
|
|
78
|
+
const mountPath = join(temporary, "mounted");
|
|
79
|
+
const cleanup = async () => {
|
|
80
|
+
if (mounted) {
|
|
76
81
|
await host.unmount(mountPath);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
};
|
|
81
|
-
/** Compose installer paths and subprocesses from one selected caller context. */
|
|
82
|
-
export const systemMacHopperInstallHost = (homeDirectory, environment) => ({
|
|
83
|
-
download: downloadPackage,
|
|
84
|
-
createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-mac-")),
|
|
85
|
-
createMountDirectory: (path) => mkdir(path),
|
|
86
|
-
writePackage: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
|
|
87
|
-
async mount(packagePath, mountPath) {
|
|
88
|
-
return commandSucceeds("hdiutil", [
|
|
89
|
-
"attach",
|
|
90
|
-
"-readonly",
|
|
91
|
-
"-nobrowse",
|
|
92
|
-
"-mountpoint",
|
|
93
|
-
mountPath,
|
|
94
|
-
packagePath,
|
|
95
|
-
], environment);
|
|
96
|
-
},
|
|
97
|
-
async unmount(mountPath) {
|
|
98
|
-
await commandSucceeds("hdiutil", ["detach", mountPath, "-force"], environment);
|
|
99
|
-
},
|
|
100
|
-
async appBundle(mountPath) {
|
|
101
|
-
const entries = await readdir(mountPath, { withFileTypes: true });
|
|
102
|
-
const app = entries.find((entry) => entry.isDirectory() && /^Hopper.*\.app$/iu.test(entry.name));
|
|
103
|
-
return app === undefined ? undefined : join(mountPath, app.name);
|
|
104
|
-
},
|
|
105
|
-
async validBundle(appPath) {
|
|
106
|
-
if (!(await commandSucceeds("codesign", ["--verify", "--deep", "--strict", appPath], environment)))
|
|
107
|
-
return false;
|
|
108
|
-
try {
|
|
109
|
-
const identifier = (await execFileAsync("/usr/libexec/PlistBuddy", [
|
|
110
|
-
"-c",
|
|
111
|
-
"Print :CFBundleIdentifier",
|
|
112
|
-
join(appPath, "Contents/Info.plist"),
|
|
113
|
-
], { env: environment })).stdout.trim();
|
|
114
|
-
return identifier === BUNDLE_IDENTIFIER;
|
|
115
|
-
}
|
|
116
|
-
catch (cause) {
|
|
117
|
-
// best-effort cleanup: optional bundle probing; unreadable means invalid.
|
|
118
|
-
void cause;
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
async destinationExists(path) {
|
|
82
|
+
mounted = false;
|
|
83
|
+
}
|
|
84
|
+
await host.cleanup(temporaryPath);
|
|
85
|
+
};
|
|
123
86
|
try {
|
|
124
|
-
await
|
|
125
|
-
return true;
|
|
87
|
+
await cleanup();
|
|
126
88
|
}
|
|
127
89
|
catch (cause) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return false;
|
|
90
|
+
cleanupFailure = `Hopper DMG cleanup failed: ${failureMessage(cause)}`;
|
|
91
|
+
host.retainCleanup?.(cleanup);
|
|
131
92
|
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
93
|
+
}
|
|
94
|
+
return cleanupFailure === undefined ? result : { ...result, cleanupFailure };
|
|
95
|
+
};
|
|
96
|
+
/** Compose installer paths and subprocesses from one selected caller context. */
|
|
97
|
+
export const systemMacHopperInstallHost = (homeDirectory, environment) => {
|
|
98
|
+
const pendingCleanup = new Set();
|
|
99
|
+
return {
|
|
100
|
+
download: downloadHopperPackage,
|
|
101
|
+
createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-mac-")),
|
|
102
|
+
createMountDirectory: (path) => mkdir(path),
|
|
103
|
+
writePackage: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
|
|
104
|
+
async mount(packagePath, mountPath) {
|
|
105
|
+
return commandSucceeds("hdiutil", [
|
|
106
|
+
"attach",
|
|
107
|
+
"-readonly",
|
|
108
|
+
"-nobrowse",
|
|
109
|
+
"-mountpoint",
|
|
110
|
+
mountPath,
|
|
111
|
+
packagePath,
|
|
112
|
+
], environment);
|
|
113
|
+
},
|
|
114
|
+
async unmount(mountPath) {
|
|
115
|
+
if (!(await commandSucceeds("hdiutil", ["detach", mountPath, "-force"], environment)))
|
|
116
|
+
throw new Error(`hdiutil detach failed for ${JSON.stringify(mountPath)}`);
|
|
117
|
+
},
|
|
118
|
+
async appBundle(mountPath) {
|
|
119
|
+
const entries = await readdir(mountPath, { withFileTypes: true });
|
|
120
|
+
const app = entries.find((entry) => entry.isDirectory() && /^Hopper.*\.app$/iu.test(entry.name));
|
|
121
|
+
return app === undefined ? undefined : join(mountPath, app.name);
|
|
122
|
+
},
|
|
123
|
+
async validBundle(appPath) {
|
|
124
|
+
if (!(await commandSucceeds("codesign", ["--verify", "--deep", "--strict", appPath], environment)))
|
|
125
|
+
return false;
|
|
126
|
+
try {
|
|
127
|
+
const identifier = (await execFileAsync("/usr/libexec/PlistBuddy", [
|
|
128
|
+
"-c",
|
|
129
|
+
"Print :CFBundleIdentifier",
|
|
130
|
+
join(appPath, "Contents/Info.plist"),
|
|
131
|
+
], { env: environment })).stdout.trim();
|
|
132
|
+
return identifier === BUNDLE_IDENTIFIER;
|
|
133
|
+
}
|
|
134
|
+
catch (cause) {
|
|
135
|
+
// best-effort cleanup: optional bundle probing; unreadable means invalid.
|
|
136
|
+
void cause;
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
async destinationExists(path) {
|
|
141
|
+
try {
|
|
142
|
+
await access(path);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
catch (cause) {
|
|
146
|
+
// best-effort cleanup: optional existence probing; absence means missing.
|
|
147
|
+
void cause;
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
async installBundle(source, destination, stage, replaceExisting) {
|
|
152
|
+
const previous = `${stage}-previous`;
|
|
153
|
+
try {
|
|
154
|
+
await mkdir(join(homeDirectory, "Applications"), { recursive: true });
|
|
155
|
+
await rm(stage, { recursive: true, force: true });
|
|
145
156
|
await rm(previous, { recursive: true, force: true });
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
157
|
+
await execFileAsync("ditto", [source, stage], { env: environment });
|
|
158
|
+
await access(join(stage, "Contents/MacOS/hopper"));
|
|
159
|
+
if (replaceExisting)
|
|
160
|
+
await rename(destination, previous);
|
|
161
|
+
await rename(stage, destination);
|
|
162
|
+
if (replaceExisting)
|
|
163
|
+
await rm(previous, { recursive: true, force: true });
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
catch (cause) {
|
|
167
|
+
// Install failure rolls back below; the false return reports it.
|
|
168
|
+
void cause;
|
|
169
|
+
await rm(stage, { recursive: true, force: true });
|
|
170
|
+
if (replaceExisting) {
|
|
171
|
+
try {
|
|
172
|
+
await rename(previous, destination);
|
|
173
|
+
}
|
|
174
|
+
catch (rollbackCause) {
|
|
175
|
+
// The original destination was not moved, or rollback is impossible.
|
|
176
|
+
void rollbackCause;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
async launcherReady(path) {
|
|
183
|
+
try {
|
|
184
|
+
await access(path);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
catch (cause) {
|
|
188
|
+
// best-effort cleanup: optional launcher probing; absence means not ready.
|
|
189
|
+
void cause;
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
async openApplication(path) {
|
|
194
|
+
await execFileAsync("open", [path], { env: environment });
|
|
195
|
+
},
|
|
196
|
+
cleanup: (path) => rm(path, { recursive: true, force: true }),
|
|
197
|
+
retainCleanup: (cleanup) => pendingCleanup.add(cleanup),
|
|
198
|
+
async close() {
|
|
199
|
+
let failure;
|
|
200
|
+
for (const cleanup of pendingCleanup) {
|
|
153
201
|
try {
|
|
154
|
-
await
|
|
202
|
+
await cleanup();
|
|
203
|
+
pendingCleanup.delete(cleanup);
|
|
155
204
|
}
|
|
156
|
-
catch (
|
|
157
|
-
|
|
158
|
-
void rollbackCause;
|
|
205
|
+
catch (cause) {
|
|
206
|
+
failure ??= `Hopper DMG cleanup remains incomplete: ${failureMessage(cause)}`;
|
|
159
207
|
}
|
|
160
208
|
}
|
|
161
|
-
return
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
try {
|
|
166
|
-
await access(path);
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
catch (cause) {
|
|
170
|
-
// best-effort cleanup: optional launcher probing; absence means not ready.
|
|
171
|
-
void cause;
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
async openApplication(path) {
|
|
176
|
-
await execFileAsync("open", [path], { env: environment });
|
|
177
|
-
},
|
|
178
|
-
cleanup: (path) => rm(path, { recursive: true, force: true }),
|
|
179
|
-
destination: () => join(homeDirectory, "Applications/Hopper Disassembler.app"),
|
|
180
|
-
});
|
|
181
|
-
const downloadPackage = async (url) => {
|
|
182
|
-
const response = await fetch(url, {
|
|
183
|
-
headers: { accept: "application/json", "user-agent": "rea-installer" },
|
|
184
|
-
signal: AbortSignal.timeout(120_000),
|
|
185
|
-
});
|
|
186
|
-
const length = Number(response.headers.get("content-length") ?? "0");
|
|
187
|
-
if (length > MAX_PACKAGE_BYTES)
|
|
188
|
-
return { ok: false, bytes: new Uint8Array() };
|
|
189
|
-
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
190
|
-
return { ok: response.ok && bytes.byteLength <= MAX_PACKAGE_BYTES, bytes };
|
|
209
|
+
return failure;
|
|
210
|
+
},
|
|
211
|
+
destination: () => join(homeDirectory, "Applications/Hopper Disassembler.app"),
|
|
212
|
+
};
|
|
191
213
|
};
|
|
192
214
|
const parseJson = (bytes) => JSON.parse(new TextDecoder().decode(bytes));
|
|
193
215
|
const integrityMatches = (bytes, release) => bytes.byteLength === Number(release.file_length) &&
|
|
194
|
-
bytes.byteLength <=
|
|
216
|
+
bytes.byteLength <= HOPPER_DOWNLOAD_BYTES &&
|
|
195
217
|
createHash("sha1").update(bytes).digest("hex") === release.file_hash;
|
|
196
218
|
const commandSucceeds = async (command, args, environment) => {
|
|
197
219
|
try {
|
|
@@ -204,6 +226,7 @@ const commandSucceeds = async (command, args, environment) => {
|
|
|
204
226
|
return false;
|
|
205
227
|
}
|
|
206
228
|
};
|
|
229
|
+
const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
207
230
|
const releaseSchema = z.object({
|
|
208
231
|
filename: z.string().url(),
|
|
209
232
|
file_length: z.string().regex(/^\d+$/u),
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { err, ok } from "../domain/result.js";
|
|
2
|
+
/**
|
|
3
|
+
* Read ELF32 MIPS ABI declarations from the caller's already-open file.
|
|
4
|
+
* Inspect both typed tables (not section names), including records beyond the
|
|
5
|
+
* initial header probe. A missing record is unknown, not a default FP ABI.
|
|
6
|
+
* The caller supplies its cancellation check so its tagged error is preserved.
|
|
7
|
+
*/
|
|
8
|
+
export const readMipsElfAbiFlags = async (handle, metadata, checkCancelled) => {
|
|
9
|
+
checkCancelled();
|
|
10
|
+
if (metadata.elfClass !== 32)
|
|
11
|
+
return err("MIPS ABI record inspection currently supports ELF32 only");
|
|
12
|
+
const fileSize = (await handle.stat()).size;
|
|
13
|
+
checkCancelled();
|
|
14
|
+
const read = async (offset, length, label) => {
|
|
15
|
+
checkCancelled();
|
|
16
|
+
if (!Number.isSafeInteger(fileSize) ||
|
|
17
|
+
offset < 0 ||
|
|
18
|
+
length < 0 ||
|
|
19
|
+
offset > fileSize - length)
|
|
20
|
+
return err(`MIPS ${label} lies outside the file`);
|
|
21
|
+
const bytes = Buffer.alloc(length);
|
|
22
|
+
let total = 0;
|
|
23
|
+
while (total < length) {
|
|
24
|
+
checkCancelled();
|
|
25
|
+
const observed = await handle.read(bytes, total, length - total, offset + total);
|
|
26
|
+
checkCancelled();
|
|
27
|
+
if (observed.bytesRead === 0)
|
|
28
|
+
return err(`truncated MIPS ${label}`);
|
|
29
|
+
total += observed.bytesRead;
|
|
30
|
+
}
|
|
31
|
+
return ok(bytes);
|
|
32
|
+
};
|
|
33
|
+
const header = await read(0, 52, "ELF32 header");
|
|
34
|
+
if (!header.ok)
|
|
35
|
+
return header;
|
|
36
|
+
const bytes = header.value;
|
|
37
|
+
const little = metadata.byteOrder === "little";
|
|
38
|
+
const u16 = (data, offset) => little ? data.readUInt16LE(offset) : data.readUInt16BE(offset);
|
|
39
|
+
const u32 = (data, offset) => little ? data.readUInt32LE(offset) : data.readUInt32BE(offset);
|
|
40
|
+
if (bytes.toString("hex", 0, 4) !== "7f454c46" ||
|
|
41
|
+
bytes[4] !== 1 ||
|
|
42
|
+
bytes[5] !== (little ? 1 : 2) ||
|
|
43
|
+
u16(bytes, 18) !== 8 ||
|
|
44
|
+
u16(bytes, 16) !== metadata.type ||
|
|
45
|
+
u32(bytes, 36) !== metadata.flags)
|
|
46
|
+
return err("MIPS ELF header no longer matches the resolved identity");
|
|
47
|
+
if (bytes[6] !== 1 || u32(bytes, 20) !== 1 || u16(bytes, 40) !== 52)
|
|
48
|
+
return err("invalid MIPS ELF32 version or header size");
|
|
49
|
+
const tables = [
|
|
50
|
+
{
|
|
51
|
+
label: "program header table",
|
|
52
|
+
offset: u32(bytes, 28),
|
|
53
|
+
count: u16(bytes, 44),
|
|
54
|
+
stride: u16(bytes, 42),
|
|
55
|
+
entrySize: 32,
|
|
56
|
+
typeOffset: 0,
|
|
57
|
+
dataOffset: 4,
|
|
58
|
+
sizeOffset: 16,
|
|
59
|
+
recordType: 0x70000003, // PT_MIPS_ABIFLAGS
|
|
60
|
+
optional: false,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
label: "section header table",
|
|
64
|
+
offset: u32(bytes, 32),
|
|
65
|
+
count: u16(bytes, 48),
|
|
66
|
+
stride: u16(bytes, 46),
|
|
67
|
+
entrySize: 40,
|
|
68
|
+
typeOffset: 4,
|
|
69
|
+
dataOffset: 16,
|
|
70
|
+
sizeOffset: 20,
|
|
71
|
+
recordType: 0x7000002a, // SHT_MIPS_ABIFLAGS
|
|
72
|
+
optional: true,
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
// Extended numbering needs a separate section-zero reader. Refuse it rather
|
|
76
|
+
// than silently treating an unexamined table as having no ABI declarations.
|
|
77
|
+
if (u16(bytes, 44) === 0xffff || u16(bytes, 48) >= 0xff00)
|
|
78
|
+
return err("extended or reserved MIPS ELF table numbering is unsupported");
|
|
79
|
+
let record;
|
|
80
|
+
const limitations = [];
|
|
81
|
+
for (const table of tables) {
|
|
82
|
+
if (table.count === 0) {
|
|
83
|
+
if (table.offset !== 0)
|
|
84
|
+
return err(`unsupported extended or inconsistent MIPS ${table.label}`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (table.offset < 52 || table.stride !== table.entrySize)
|
|
88
|
+
return err(`invalid MIPS ${table.label} offset or entry size`);
|
|
89
|
+
const count = table.optional
|
|
90
|
+
? Math.min(table.count, Math.max(0, Math.floor((fileSize - table.offset) / table.entrySize)))
|
|
91
|
+
: table.count;
|
|
92
|
+
if (count < table.count)
|
|
93
|
+
limitations.push(`MIPS ${table.label} at file offset ${table.offset} extends beyond the captured file: examined ${count} of ${table.count} complete headers. ABI declarations in unavailable headers remain unknown.`);
|
|
94
|
+
if (count === 0)
|
|
95
|
+
continue;
|
|
96
|
+
// Counts are bounded by the ELF16 fields and strides by their exact ELF32
|
|
97
|
+
// structure sizes. Never allocate according to an untrusted section size.
|
|
98
|
+
const contents = await read(table.offset, count * table.entrySize, table.label);
|
|
99
|
+
if (!contents.ok)
|
|
100
|
+
return contents;
|
|
101
|
+
let found = false;
|
|
102
|
+
for (let i = 0; i < count; i += 1) {
|
|
103
|
+
checkCancelled();
|
|
104
|
+
const position = i * table.entrySize;
|
|
105
|
+
if (u32(contents.value, position + table.typeOffset) !== table.recordType)
|
|
106
|
+
continue;
|
|
107
|
+
if (found)
|
|
108
|
+
return err(`duplicate MIPS ABI records in ${table.label}`);
|
|
109
|
+
found = true;
|
|
110
|
+
const offset = u32(contents.value, position + table.dataOffset);
|
|
111
|
+
const size = u32(contents.value, position + table.sizeOffset);
|
|
112
|
+
if (size !== 24)
|
|
113
|
+
return err("unsupported MIPS ABI record size; expected 24 bytes");
|
|
114
|
+
const candidate = await read(offset, 24, "ABI record");
|
|
115
|
+
if (!candidate.ok)
|
|
116
|
+
return candidate;
|
|
117
|
+
if (record !== undefined && !record.equals(candidate.value))
|
|
118
|
+
return err("conflicting MIPS program/section ABI declarations");
|
|
119
|
+
record = candidate.value;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (record === undefined)
|
|
123
|
+
return ok({ abiFlags: null, limitations });
|
|
124
|
+
// Preserve declarations verbatim, including unknown versions/values. Provider
|
|
125
|
+
// admission, not parsing, decides which interpretations have been verified.
|
|
126
|
+
const abiFlags = {
|
|
127
|
+
version: u16(record, 0),
|
|
128
|
+
isaLevel: record.readUInt8(2),
|
|
129
|
+
isaRevision: record.readUInt8(3),
|
|
130
|
+
gprSize: record.readUInt8(4),
|
|
131
|
+
cpr1Size: record.readUInt8(5),
|
|
132
|
+
cpr2Size: record.readUInt8(6),
|
|
133
|
+
fpAbi: record.readUInt8(7),
|
|
134
|
+
isaExtension: u32(record, 8),
|
|
135
|
+
ases: u32(record, 12),
|
|
136
|
+
flags1: u32(record, 16),
|
|
137
|
+
flags2: u32(record, 20),
|
|
138
|
+
};
|
|
139
|
+
return ok({ abiFlags, limitations });
|
|
140
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AnalysisCancelledError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { createEvidence } from "../domain/evidence.js";
|
|
4
|
+
import { jsonObjectSchema } from "../domain/jsonValue.js";
|
|
5
|
+
import { err, ok } from "../domain/result.js";
|
|
6
|
+
/**
|
|
7
|
+
* Shared CLI/MCP admission, execution, and Evidence composition for
|
|
8
|
+
* single-request providers. The caller retains its operation vocabulary and
|
|
9
|
+
* confidence; this normalizes cancellation, input validation, and Evidence
|
|
10
|
+
* assembly once instead of per provider.
|
|
11
|
+
*/
|
|
12
|
+
export const executeProviderOperation = async (operation, input, options, schema, provider, confidence) => {
|
|
13
|
+
if (options?.signal?.aborted === true)
|
|
14
|
+
return err(new AnalysisCancelledError(operation));
|
|
15
|
+
const request = schema.safeParse({ operation, input });
|
|
16
|
+
if (!request.success)
|
|
17
|
+
return err(new AnalysisInputError(operation, { cause: request.error }));
|
|
18
|
+
const executed = await provider.execute(request.data, options);
|
|
19
|
+
if (!executed.ok)
|
|
20
|
+
return executed;
|
|
21
|
+
const execution = executed.value;
|
|
22
|
+
return ok(createEvidence(execution.subject ?? undefined, execution.provider, {
|
|
23
|
+
operation,
|
|
24
|
+
parameters: jsonObjectSchema.parse(request.data.input),
|
|
25
|
+
result: execution.result,
|
|
26
|
+
rawResult: execution.rawResult,
|
|
27
|
+
limitations: execution.limitations,
|
|
28
|
+
locations: execution.locations,
|
|
29
|
+
confidence,
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
@@ -29,7 +29,12 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
|
|
|
29
29
|
].includes(evidence.operation))
|
|
30
30
|
return;
|
|
31
31
|
try {
|
|
32
|
-
const
|
|
32
|
+
const parsed = parseApplicationGraphEvidence(evidence);
|
|
33
|
+
if (!parsed.ok) {
|
|
34
|
+
limitations.add(`Application Evidence ${evidence.evidence_id} could not generate candidates because it failed graph validation.`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const source = parsed.value;
|
|
33
38
|
for (const node of source.graph.nodes) {
|
|
34
39
|
const candidatePolicy = applicationObligationPolicy(node.kind);
|
|
35
40
|
if (candidatePolicy === undefined) {
|
|
@@ -49,11 +54,18 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
|
|
|
49
54
|
authorityReferences: reference,
|
|
50
55
|
}));
|
|
51
56
|
}
|
|
52
|
-
if (source.semanticGraph !== null)
|
|
57
|
+
if (source.semanticGraph !== null) {
|
|
58
|
+
const evidenceContexts = new Map(source.semanticGraph.evidence_contexts.map((context) => [
|
|
59
|
+
context.context_id,
|
|
60
|
+
context,
|
|
61
|
+
]));
|
|
53
62
|
for (const node of source.semanticGraph.nodes) {
|
|
54
63
|
const candidatePolicy = semanticObligationPolicy(node.kind);
|
|
55
64
|
if (candidatePolicy === undefined)
|
|
56
65
|
continue;
|
|
66
|
+
const evidenceContext = evidenceContexts.get(node.evidence.context_id);
|
|
67
|
+
if (evidenceContext === undefined)
|
|
68
|
+
throw new TypeError("Semantic evidence reference names an absent context");
|
|
57
69
|
addCandidate(candidates, generatedCandidate({
|
|
58
70
|
key: `semantic:${node.node_id}:${candidatePolicy.family}`,
|
|
59
71
|
title: node.label ?? `${node.kind} semantic boundary`,
|
|
@@ -63,10 +75,11 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
|
|
|
63
75
|
semanticNodeId: node.node_id,
|
|
64
76
|
location: `semantic-graph:${source.semanticGraph.graph_id}/nodes/${node.node_id}`,
|
|
65
77
|
authorityReferences: [
|
|
66
|
-
graphReference(evidence, records,
|
|
78
|
+
graphReference(evidence, records, evidenceContext, `${source.semanticGraph.graph_id}/node/${node.node_id}`),
|
|
67
79
|
],
|
|
68
80
|
}));
|
|
69
81
|
}
|
|
82
|
+
}
|
|
70
83
|
if (source.graph.coverage.status !== "complete")
|
|
71
84
|
limitations.add(`Application graph ${source.graph.graph_id} coverage is ${source.graph.coverage.status}; omitted candidates remain unknown.`);
|
|
72
85
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
+
import { canonicalJson } from "../domain/comparisonSemantics.js";
|
|
4
|
+
import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
|
|
3
5
|
export const obligationLedgerCoverage = (incomplete) => ({
|
|
4
6
|
status: incomplete ? "partial" : "complete",
|
|
5
7
|
});
|
|
@@ -64,7 +66,7 @@ export const obligationLedgerStatus = (obligations) => {
|
|
|
64
66
|
return "unknown";
|
|
65
67
|
return requiredOpen.length === 0 ? "ready" : "open";
|
|
66
68
|
};
|
|
67
|
-
export const obligationEdgeOrder = (left, right) =>
|
|
69
|
+
export const obligationEdgeOrder = (left, right) => compareUnicodeCodePoints(canonicalJson(left), canonicalJson(right));
|
|
68
70
|
export const digestObligationLedgerValue = (value) => {
|
|
69
71
|
const encoded = canonicalize(value);
|
|
70
72
|
if (encoded === undefined)
|