rea-agents 3.0.0 → 3.2.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,31 +1,16 @@
|
|
|
1
|
+
import { createStoreFileLock, removeStaleStoreFileLock, } from "./StoreFileLock.js";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
3
|
import { constants } from "node:fs";
|
|
3
|
-
import { lstat, mkdir, open,
|
|
4
|
+
import { lstat, mkdir, open, realpath, } from "node:fs/promises";
|
|
4
5
|
import { dirname } from "node:path";
|
|
5
6
|
import { setTimeout as delay } from "node:timers/promises";
|
|
6
7
|
import writeFileAtomic from "write-file-atomic";
|
|
7
8
|
import { z } from "zod";
|
|
9
|
+
import { PERMISSION_CAPABILITIES, } from "../domain/permissionPolicy.js";
|
|
8
10
|
import { err, ok } from "../domain/result.js";
|
|
9
11
|
const grantSchema = z.object({
|
|
10
12
|
grant_id: z.string().min(1),
|
|
11
|
-
capability: z.enum(
|
|
12
|
-
"process_capture",
|
|
13
|
-
"browser_observe",
|
|
14
|
-
"browser_automate",
|
|
15
|
-
"electron_observe",
|
|
16
|
-
"evidence_read",
|
|
17
|
-
"evidence_write",
|
|
18
|
-
"investigation_input",
|
|
19
|
-
"investigation_workspace_read",
|
|
20
|
-
"investigation_workspace_write",
|
|
21
|
-
"snapshot_read",
|
|
22
|
-
"snapshot_write",
|
|
23
|
-
"artifact_extract",
|
|
24
|
-
"native_mount",
|
|
25
|
-
"reference_read",
|
|
26
|
-
"javascript_replay",
|
|
27
|
-
"managed_runtime",
|
|
28
|
-
]),
|
|
13
|
+
capability: z.enum(PERMISSION_CAPABILITIES),
|
|
29
14
|
roots: z.array(z.string()),
|
|
30
15
|
executables: z.array(z.string()),
|
|
31
16
|
environment_names: z.array(z.string()),
|
|
@@ -37,10 +22,9 @@ const grantSchema = z.object({
|
|
|
37
22
|
expires_at: z.iso.datetime().nullable(),
|
|
38
23
|
});
|
|
39
24
|
const storeSchema = z.object({
|
|
40
|
-
schema_version: z.literal(1),
|
|
41
25
|
project_id: z.string().regex(/^project_[a-f0-9]{64}$/u),
|
|
42
26
|
project_root: z.string(),
|
|
43
|
-
grants: z.array(grantSchema)
|
|
27
|
+
grants: z.array(grantSchema),
|
|
44
28
|
});
|
|
45
29
|
/** Owner-only project policy persistence failure. */
|
|
46
30
|
export class ProjectPermissionStoreError extends Error {
|
|
@@ -109,7 +93,6 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
|
|
|
109
93
|
if (!project.ok)
|
|
110
94
|
return project;
|
|
111
95
|
const candidate = storeSchema.safeParse({
|
|
112
|
-
schema_version: 1,
|
|
113
96
|
project_id: project.value.id,
|
|
114
97
|
project_root: project.value.root,
|
|
115
98
|
grants,
|
|
@@ -118,26 +101,38 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
|
|
|
118
101
|
return err(new ProjectPermissionStoreError("invalid", { cause: candidate.error }));
|
|
119
102
|
if (process.getuid === undefined)
|
|
120
103
|
return err(new ProjectPermissionStoreError("not_owner_only"));
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
catch (cause) {
|
|
136
|
-
return err(new ProjectPermissionStoreError("io", { cause }));
|
|
137
|
-
}
|
|
104
|
+
return withPermissionStoreLock(path, () => writePreparedPermissionStore(path, projectRoot, candidate.data));
|
|
105
|
+
};
|
|
106
|
+
const writePreparedPermissionStore = async (path, projectRoot, candidate) => {
|
|
107
|
+
await writeFileAtomic(path, `${JSON.stringify(candidate, null, 2)}\n`, {
|
|
108
|
+
encoding: "utf8",
|
|
109
|
+
mode: 0o600,
|
|
110
|
+
});
|
|
111
|
+
const verified = await readProjectPermissionStore(path, projectRoot);
|
|
112
|
+
if (!verified.ok)
|
|
113
|
+
return verified;
|
|
114
|
+
if (verified.value === null ||
|
|
115
|
+
JSON.stringify(verified.value) !== JSON.stringify(candidate))
|
|
116
|
+
return err(new ProjectPermissionStoreError("invalid"));
|
|
117
|
+
return ok(candidate);
|
|
138
118
|
};
|
|
139
119
|
/** Revoke one grant while serializing the complete read-modify-write cycle. */
|
|
140
|
-
export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => {
|
|
120
|
+
export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => withPermissionStoreLock(path, async () => {
|
|
121
|
+
const current = await readProjectPermissionStore(path, projectRoot);
|
|
122
|
+
if (!current.ok)
|
|
123
|
+
return current;
|
|
124
|
+
if (current.value === null)
|
|
125
|
+
return ok(false);
|
|
126
|
+
const retained = current.value.grants.filter(({ grant_id }) => grant_id !== grantId);
|
|
127
|
+
if (retained.length === current.value.grants.length)
|
|
128
|
+
return ok(false);
|
|
129
|
+
const written = await writePreparedPermissionStore(path, projectRoot, {
|
|
130
|
+
...current.value,
|
|
131
|
+
grants: retained,
|
|
132
|
+
});
|
|
133
|
+
return written.ok ? ok(true) : written;
|
|
134
|
+
});
|
|
135
|
+
const withPermissionStoreLock = async (path, action) => {
|
|
141
136
|
let lock;
|
|
142
137
|
try {
|
|
143
138
|
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
@@ -145,34 +140,26 @@ export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) =
|
|
|
145
140
|
if (!acquired.ok)
|
|
146
141
|
return acquired;
|
|
147
142
|
lock = acquired.value;
|
|
148
|
-
|
|
149
|
-
if (!current.ok)
|
|
150
|
-
return current;
|
|
151
|
-
const grants = current.value?.grants ?? [];
|
|
152
|
-
const retained = grants.filter(({ grant_id }) => grant_id !== grantId);
|
|
153
|
-
if (retained.length === grants.length)
|
|
154
|
-
return ok(false);
|
|
155
|
-
const written = await writeProjectPermissionStore(path, projectRoot, retained);
|
|
156
|
-
return written.ok ? ok(true) : written;
|
|
143
|
+
return await action();
|
|
157
144
|
}
|
|
158
145
|
catch (cause) {
|
|
159
146
|
return err(new ProjectPermissionStoreError("io", { cause }));
|
|
160
147
|
}
|
|
161
148
|
finally {
|
|
162
149
|
if (lock !== undefined)
|
|
163
|
-
await
|
|
150
|
+
await lock.release();
|
|
164
151
|
}
|
|
165
152
|
};
|
|
166
153
|
const acquirePermissionStoreLock = async (destination) => {
|
|
167
154
|
const path = `${destination}.lock`;
|
|
168
155
|
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
169
156
|
try {
|
|
170
|
-
return ok(await
|
|
157
|
+
return ok(await createStoreFileLock(path));
|
|
171
158
|
}
|
|
172
159
|
catch (cause) {
|
|
173
160
|
if (!isAlreadyExists(cause))
|
|
174
161
|
return err(new ProjectPermissionStoreError("io", { cause }));
|
|
175
|
-
if (await
|
|
162
|
+
if (await removeStaleStoreFileLock(path))
|
|
176
163
|
continue;
|
|
177
164
|
if (attempt === 99)
|
|
178
165
|
return err(new ProjectPermissionStoreError("locked", { cause }));
|
|
@@ -181,49 +168,6 @@ const acquirePermissionStoreLock = async (destination) => {
|
|
|
181
168
|
}
|
|
182
169
|
return err(new ProjectPermissionStoreError("locked"));
|
|
183
170
|
};
|
|
184
|
-
const createPermissionStoreLock = async (path) => {
|
|
185
|
-
const handle = await open(path, "wx", 0o600);
|
|
186
|
-
try {
|
|
187
|
-
await handle.writeFile(`${String(process.pid)}\n`, "utf8");
|
|
188
|
-
await handle.sync();
|
|
189
|
-
return { path, handle };
|
|
190
|
-
}
|
|
191
|
-
catch (cause) {
|
|
192
|
-
await handle.close().catch(() => undefined);
|
|
193
|
-
await unlink(path).catch(() => undefined);
|
|
194
|
-
throw cause;
|
|
195
|
-
}
|
|
196
|
-
};
|
|
197
|
-
const removeStalePermissionStoreLock = async (path) => {
|
|
198
|
-
try {
|
|
199
|
-
const metadata = await lstat(path);
|
|
200
|
-
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 32)
|
|
201
|
-
return false;
|
|
202
|
-
const encoded = (await readFile(path, "utf8")).trim();
|
|
203
|
-
if (!/^[1-9][0-9]{0,9}$/u.test(encoded))
|
|
204
|
-
return false;
|
|
205
|
-
if (processIsAlive(Number(encoded)))
|
|
206
|
-
return false;
|
|
207
|
-
await unlink(path);
|
|
208
|
-
return true;
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
const processIsAlive = (pid) => {
|
|
215
|
-
try {
|
|
216
|
-
process.kill(pid, 0);
|
|
217
|
-
return true;
|
|
218
|
-
}
|
|
219
|
-
catch (cause) {
|
|
220
|
-
return errorCode(cause) !== "ESRCH";
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
const releasePermissionStoreLock = async (lock) => {
|
|
224
|
-
await lock.handle.close().catch(() => undefined);
|
|
225
|
-
await unlink(lock.path).catch(() => undefined);
|
|
226
|
-
};
|
|
227
171
|
const isNotFound = (cause) => errorCode(cause) === "ENOENT";
|
|
228
172
|
const openPrivateStore = async (path) => {
|
|
229
173
|
let handle;
|
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
const addressSchema = z.string().regex(/^0x[0-9a-f]+$/iu);
|
|
3
3
|
const identitySchema = z.object({ address: addressSchema, name: z.string() });
|
|
4
|
-
|
|
5
|
-
items: z.array(z.unknown()),
|
|
6
|
-
total: z.number().int().min(0).nullable(),
|
|
7
|
-
returned: z.number().int().min(0),
|
|
8
|
-
truncated: z.boolean(),
|
|
9
|
-
next_offset: z.number().int().min(0).nullable(),
|
|
10
|
-
});
|
|
11
|
-
/** Extract a real address from the provider's exact procedure page. */
|
|
4
|
+
/** Extract one real procedure address from the complete inline inventory. */
|
|
12
5
|
export const firstProcedureAddress = (input) => {
|
|
13
|
-
const
|
|
14
|
-
.object({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
limit: z.number().int().min(1),
|
|
18
|
-
total: z.number().int().min(1),
|
|
19
|
-
next_offset: z.number().int().min(0).nullable(),
|
|
20
|
-
has_more: z.boolean(),
|
|
21
|
-
})
|
|
22
|
-
.parse(input);
|
|
23
|
-
const first = page.items[0];
|
|
6
|
+
const first = z
|
|
7
|
+
.array(z.object({ address: addressSchema }))
|
|
8
|
+
.min(1)
|
|
9
|
+
.parse(input)[0];
|
|
24
10
|
if (first === undefined)
|
|
25
|
-
throw new TypeError("Procedure
|
|
11
|
+
throw new TypeError("Procedure inventory was empty");
|
|
26
12
|
return first.address;
|
|
27
13
|
};
|
|
28
14
|
/** Reject two target paths that resolve to the same binary content. */
|
|
@@ -44,7 +30,7 @@ export const requirePseudocode = (input, operation) => {
|
|
|
44
30
|
throw new TypeError(`${operation} returned an embedded failure: ${input}`);
|
|
45
31
|
return input;
|
|
46
32
|
};
|
|
47
|
-
/** Validate
|
|
33
|
+
/** Validate a complete Hopper function dossier semantically. */
|
|
48
34
|
export const requireFunctionDossier = (input, expectedAddress) => {
|
|
49
35
|
const value = objectValue(input, "analyze_function returned no function dossier");
|
|
50
36
|
const procedure = identitySchema.parse(value.procedure);
|
|
@@ -52,22 +38,19 @@ export const requireFunctionDossier = (input, expectedAddress) => {
|
|
|
52
38
|
throw new TypeError("analyze_function returned the wrong procedure");
|
|
53
39
|
if (procedure.name.trim().length === 0)
|
|
54
40
|
throw new TypeError("analyze_function omitted the procedure name");
|
|
55
|
-
|
|
41
|
+
requirePseudocode(value.pseudocode, "analyze_function");
|
|
56
42
|
for (const field of COLLECTION_FIELDS)
|
|
57
|
-
|
|
43
|
+
list(value, field);
|
|
58
44
|
for (const field of ["callers", "callees"])
|
|
59
|
-
z.array(identitySchema).parse(
|
|
60
|
-
validateBlocks(
|
|
61
|
-
validateInstructionScan(value.instruction_scan);
|
|
45
|
+
z.array(identitySchema).parse(list(value, field));
|
|
46
|
+
validateBlocks(list(value, "basic_blocks"));
|
|
62
47
|
return value;
|
|
63
48
|
};
|
|
64
49
|
/** Reject a structurally valid dossier that omits fixture-proven semantics. */
|
|
65
50
|
export const requireFunctionDossierOracle = (input, oracle) => {
|
|
66
51
|
const value = requireFunctionDossier(input, oracle.procedure_address);
|
|
67
52
|
if (oracle.callee_address !== undefined) {
|
|
68
|
-
const callees = z
|
|
69
|
-
.array(identitySchema)
|
|
70
|
-
.parse(collectionSchema.parse(value.callees).items);
|
|
53
|
+
const callees = z.array(identitySchema).parse(list(value, "callees"));
|
|
71
54
|
if (!callees.some(({ address }) => address === oracle.callee_address))
|
|
72
55
|
throw new TypeError("analyze_function omitted the expected fixture callee");
|
|
73
56
|
const references = z
|
|
@@ -75,14 +58,12 @@ export const requireFunctionDossierOracle = (input, oracle) => {
|
|
|
75
58
|
source_address: addressSchema,
|
|
76
59
|
target_address: addressSchema,
|
|
77
60
|
}))
|
|
78
|
-
.parse(
|
|
61
|
+
.parse(list(value, "outgoing_references"));
|
|
79
62
|
if (!references.some(({ target_address }) => target_address === oracle.callee_address))
|
|
80
63
|
throw new TypeError("analyze_function omitted the expected fixture reference");
|
|
81
64
|
}
|
|
82
65
|
if (oracle.caller_address !== undefined) {
|
|
83
|
-
const callers = z
|
|
84
|
-
.array(identitySchema)
|
|
85
|
-
.parse(collectionSchema.parse(value.callers).items);
|
|
66
|
+
const callers = z.array(identitySchema).parse(list(value, "callers"));
|
|
86
67
|
if (!callers.some(({ address }) => address === oracle.caller_address))
|
|
87
68
|
throw new TypeError("analyze_function omitted the expected fixture caller");
|
|
88
69
|
}
|
|
@@ -97,19 +78,18 @@ export const requireFunctionDossierOracle = (input, oracle) => {
|
|
|
97
78
|
kind: z.enum(["comment", "inline"]),
|
|
98
79
|
text: z.string(),
|
|
99
80
|
}))
|
|
100
|
-
.parse(
|
|
81
|
+
.parse(list(value, "comments"));
|
|
101
82
|
if (!comments.some(({ address, kind, text }) => address === oracle.procedure_address &&
|
|
102
83
|
kind === "comment" &&
|
|
103
84
|
text === oracle.comment))
|
|
104
85
|
throw new TypeError("analyze_function omitted the verifier comment");
|
|
105
86
|
}
|
|
106
|
-
if (oracle.require_assembly === true &&
|
|
107
|
-
collectionSchema.parse(value.assembly).items.length === 0)
|
|
87
|
+
if (oracle.require_assembly === true && list(value, "assembly").length === 0)
|
|
108
88
|
throw new TypeError("analyze_function omitted fixture assembly");
|
|
109
89
|
if (oracle.require_cfg_successor) {
|
|
110
90
|
const blocks = z
|
|
111
91
|
.array(z.object({ successors: z.array(addressSchema) }))
|
|
112
|
-
.parse(
|
|
92
|
+
.parse(list(value, "basic_blocks"));
|
|
113
93
|
if (!blocks.some(({ successors }) => successors.length > 0))
|
|
114
94
|
throw new TypeError("analyze_function omitted a real CFG successor");
|
|
115
95
|
}
|
|
@@ -125,12 +105,10 @@ const referenceEdgeSchema = z.object({
|
|
|
125
105
|
target_address: addressSchema,
|
|
126
106
|
});
|
|
127
107
|
const requireReferencedValue = (dossier, field, expected, normalize) => {
|
|
128
|
-
const values = z
|
|
129
|
-
.array(referencedValueSchema)
|
|
130
|
-
.parse(collectionSchema.parse(dossier[field]).items);
|
|
108
|
+
const values = z.array(referencedValueSchema).parse(list(dossier, field));
|
|
131
109
|
const references = z
|
|
132
110
|
.array(referenceEdgeSchema)
|
|
133
|
-
.parse(
|
|
111
|
+
.parse(list(dossier, "outgoing_references"));
|
|
134
112
|
const found = values.some(({ address, value, source_address: sourceAddress }) => normalize(value) === expected &&
|
|
135
113
|
references.some(({ source_address, target_address }) => source_address === sourceAddress && target_address === address));
|
|
136
114
|
if (!found)
|
|
@@ -154,36 +132,12 @@ const COLLECTION_FIELDS = [
|
|
|
154
132
|
"referenced_names",
|
|
155
133
|
"basic_blocks",
|
|
156
134
|
];
|
|
157
|
-
const
|
|
158
|
-
const pseudocode = z
|
|
159
|
-
.object({
|
|
160
|
-
text: z.string(),
|
|
161
|
-
returned_chars: z.number().int().min(0),
|
|
162
|
-
total_chars: z.number().int().min(0),
|
|
163
|
-
})
|
|
164
|
-
.parse(input);
|
|
165
|
-
const text = requirePseudocode(pseudocode.text, "analyze_function");
|
|
166
|
-
if (pseudocode.returned_chars !== [...text].length ||
|
|
167
|
-
pseudocode.total_chars < pseudocode.returned_chars)
|
|
168
|
-
throw new TypeError("analyze_function returned inconsistent pseudocode bounds");
|
|
169
|
-
};
|
|
170
|
-
const validateCollection = (input, field) => {
|
|
171
|
-
const collection = collectionSchema.parse(input);
|
|
172
|
-
if (collection.returned !== collection.items.length)
|
|
173
|
-
throw new TypeError(`analyze_function returned an invalid ${field} result`);
|
|
174
|
-
};
|
|
135
|
+
const list = (value, field) => z.array(z.unknown()).parse(value[field]);
|
|
175
136
|
const validateBlocks = (items) => {
|
|
176
137
|
for (const block of items)
|
|
177
138
|
if (!Array.isArray(objectValue(block, "Invalid basic block").successors))
|
|
178
139
|
throw new TypeError("analyze_function omitted CFG successor evidence");
|
|
179
140
|
};
|
|
180
|
-
const validateInstructionScan = (input) => {
|
|
181
|
-
const scan = z
|
|
182
|
-
.object({ scanned: z.number().int().min(0), truncated: z.boolean() })
|
|
183
|
-
.parse(input);
|
|
184
|
-
if (scan.scanned === 0 && !scan.truncated)
|
|
185
|
-
throw new TypeError("analyze_function omitted instruction scan limitations");
|
|
186
|
-
};
|
|
187
141
|
const objectValue = (input, message) => {
|
|
188
142
|
const parsed = z.record(z.string(), z.unknown()).safeParse(input);
|
|
189
143
|
if (!parsed.success)
|
|
@@ -1,69 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisInputError } from "../domain/errors.js";
|
|
3
|
+
import { evaluateReconstructionClosure, reconstructionCoverageDataSchema, } from "../domain/reconstructionCoverage.js";
|
|
3
4
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
4
|
-
import { evaluateReconstructionClosure, reconstructionCoverageWorkspaceSchema, } from "../domain/reconstructionCoverage.js";
|
|
5
5
|
import { err, ok } from "../domain/result.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const isAborted = (signal) => signal?.aborted === true;
|
|
10
|
-
export const reconstructionCoverageCommitInputSchema = z.strictObject({
|
|
11
|
-
approved: z.literal(true),
|
|
12
|
-
workspace_path: z.string().min(1).max(4_096),
|
|
13
|
-
expected_revision: z.number().int().min(1).nullable(),
|
|
14
|
-
workspace: reconstructionCoverageWorkspaceSchema,
|
|
6
|
+
export const reconstructionCoverageEvaluationInputSchema = z.strictObject({
|
|
7
|
+
coverage: reconstructionCoverageDataSchema,
|
|
8
|
+
boundary_id: z.string().min(1),
|
|
15
9
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
export const reconstructionCoverageCommitOutputSchema = z.strictObject({
|
|
21
|
-
workspace_path: z.string(),
|
|
22
|
-
bytes: z.number().int().min(0),
|
|
23
|
-
workspace_id: z.string().regex(/^rcw_[a-f0-9]{64}$/u),
|
|
24
|
-
revision: z.number().int().min(1),
|
|
25
|
-
revision_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
26
|
-
evidence_records: z.number().int().min(0),
|
|
27
|
-
});
|
|
28
|
-
/** Commit one caller-approved canonical reconstruction coverage CAS revision. */
|
|
29
|
-
export const commitReconstructionCoverage = async (rawInput, policy, options = {}) => {
|
|
30
|
-
const parsed = reconstructionCoverageCommitInputSchema.safeParse(rawInput);
|
|
31
|
-
if (!parsed.success)
|
|
32
|
-
return err(new AnalysisInputError(COMMIT_OPERATION, { cause: parsed.error }));
|
|
33
|
-
if (isAborted(options.signal))
|
|
34
|
-
return err(new AnalysisCancelledError(COMMIT_OPERATION));
|
|
35
|
-
const written = await writeReconstructionCoverageWorkspace(parsed.data.workspace, parsed.data.workspace_path, parsed.data.expected_revision, policy);
|
|
36
|
-
if (!written.ok)
|
|
37
|
-
return written;
|
|
38
|
-
return ok(jsonValueSchema.parse({
|
|
39
|
-
workspace_path: written.value.path,
|
|
40
|
-
bytes: written.value.bytes,
|
|
41
|
-
workspace_id: parsed.data.workspace.workspace_id,
|
|
42
|
-
revision: parsed.data.workspace.revision,
|
|
43
|
-
revision_sha256: parsed.data.workspace.revision_sha256,
|
|
44
|
-
evidence_records: parsed.data.workspace.evidence_bundle.records.length,
|
|
45
|
-
}));
|
|
46
|
-
};
|
|
47
|
-
/** Read one coverage revision and evaluate a named fail-closed boundary. */
|
|
48
|
-
export const queryReconstructionCoverage = async (rawInput, policy, nowEpochMs, options = {}) => {
|
|
49
|
-
const parsed = reconstructionCoverageQueryInputSchema.safeParse(rawInput);
|
|
10
|
+
/** Evaluate inline reconstruction coverage against a named boundary. */
|
|
11
|
+
export const evaluateReconstructionCoverage = (rawInput, nowEpochMs = Date.now()) => {
|
|
12
|
+
const parsed = reconstructionCoverageEvaluationInputSchema.safeParse(rawInput);
|
|
50
13
|
if (!parsed.success)
|
|
51
|
-
return err(new AnalysisInputError(
|
|
52
|
-
|
|
53
|
-
return err(new AnalysisCancelledError(QUERY_OPERATION));
|
|
54
|
-
const loaded = await readReconstructionCoverageWorkspace(parsed.data.workspace_path, policy);
|
|
55
|
-
if (!loaded.ok)
|
|
56
|
-
return loaded;
|
|
57
|
-
if (loaded.value === null)
|
|
58
|
-
return err(new AnalysisInputError(QUERY_OPERATION, {
|
|
59
|
-
cause: new TypeError("Reconstruction coverage workspace does not exist"),
|
|
14
|
+
return err(new AnalysisInputError("evaluate_reconstruction_coverage", {
|
|
15
|
+
cause: parsed.error,
|
|
60
16
|
}));
|
|
61
|
-
if (isAborted(options.signal))
|
|
62
|
-
return err(new AnalysisCancelledError(QUERY_OPERATION));
|
|
63
17
|
try {
|
|
64
|
-
return ok(jsonValueSchema.parse(evaluateReconstructionClosure(
|
|
18
|
+
return ok(jsonValueSchema.parse(evaluateReconstructionClosure(parsed.data.coverage, parsed.data.boundary_id, nowEpochMs)));
|
|
65
19
|
}
|
|
66
20
|
catch (cause) {
|
|
67
|
-
return err(new AnalysisInputError(
|
|
21
|
+
return err(new AnalysisInputError("evaluate_reconstruction_coverage", { cause }));
|
|
68
22
|
}
|
|
69
23
|
};
|
|
@@ -42,7 +42,7 @@ export const proofAuthoritySatisfies = (actual, required) => {
|
|
|
42
42
|
export const evidenceAuthoritySupportsProof = (evidence, authority, expected) => {
|
|
43
43
|
if (evidence.confidence !== "observed" ||
|
|
44
44
|
!proofEvidenceAuthorities[authority].includes(evidence.authority) ||
|
|
45
|
-
evidence.predicate_type !== "rea.reconstruction-proof
|
|
45
|
+
evidence.predicate_type !== "rea.reconstruction-proof" ||
|
|
46
46
|
evidence.operation !== "verify_reconstruction_obligations")
|
|
47
47
|
return false;
|
|
48
48
|
const result = evidence.normalized_result;
|
|
@@ -67,6 +67,6 @@ export const evidenceSupportsOriginalAuthority = (evidence, authority) => {
|
|
|
67
67
|
return ["controlled-replay", "external-service"].includes(evidence.authority);
|
|
68
68
|
if (authority === "process")
|
|
69
69
|
return (evidence.operation === "capture_process_scenario" &&
|
|
70
|
-
evidence.predicate_type === "rea.process-capture
|
|
70
|
+
evidence.predicate_type === "rea.process-capture");
|
|
71
71
|
return evidence.authority === "external-service";
|
|
72
72
|
};
|
|
@@ -73,7 +73,7 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
|
|
|
73
73
|
};
|
|
74
74
|
const deriveProcessCandidate = (evidence, candidates, limitations) => {
|
|
75
75
|
if (evidence.operation !== "capture_process_scenario" ||
|
|
76
|
-
evidence.predicate_type !== "rea.process-capture
|
|
76
|
+
evidence.predicate_type !== "rea.process-capture")
|
|
77
77
|
return;
|
|
78
78
|
try {
|
|
79
79
|
const capture = parseProcessCapture(evidence.normalized_result);
|
|
@@ -146,7 +146,7 @@ const deriveProcessCandidate = (evidence, candidates, limitations) => {
|
|
|
146
146
|
const generatedCandidate = ({ key, title, policy: candidatePolicy, artifactSha256, applicationNodeId, semanticNodeId, location, authorityReferences, }) => ({
|
|
147
147
|
obligation_id: obligationId(key),
|
|
148
148
|
obligation_version: 1,
|
|
149
|
-
title
|
|
149
|
+
title,
|
|
150
150
|
origin: "generated",
|
|
151
151
|
application_layer: candidatePolicy.applicationLayer,
|
|
152
152
|
family: candidatePolicy.family,
|
|
@@ -218,7 +218,7 @@ const graphReference = (envelope, records, graphEvidence, location) => {
|
|
|
218
218
|
};
|
|
219
219
|
const reviewedEvidenceState = (evidence) => {
|
|
220
220
|
if (evidence.operation === "capture_process_scenario" &&
|
|
221
|
-
evidence.predicate_type === "rea.process-capture
|
|
221
|
+
evidence.predicate_type === "rea.process-capture" &&
|
|
222
222
|
evidence.confidence === "observed")
|
|
223
223
|
return "observed";
|
|
224
224
|
if (evidence.authority === "external-service" &&
|
|
@@ -255,7 +255,7 @@ const sourceState = (references) => {
|
|
|
255
255
|
return "unknown";
|
|
256
256
|
};
|
|
257
257
|
const uniqueBy = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => key(left).localeCompare(key(right)));
|
|
258
|
-
const obligationId = (key) => `obl_${digest({ schema: "
|
|
258
|
+
const obligationId = (key) => `obl_${digest({ schema: "ReconstructionObligation", key })}`;
|
|
259
259
|
const digest = (value) => {
|
|
260
260
|
const encoded = canonicalize(value);
|
|
261
261
|
if (encoded === undefined)
|
|
@@ -4,12 +4,11 @@ import { evidenceAuthoritySupportsProof, evidenceSupportsOriginalAuthority, proo
|
|
|
4
4
|
import { addObligationDiagnostic as addDiagnostic, contradictionDiagnostics, groupManifestBindings, groupManifestContradictions, hasObligationDiagnostic as hasDiagnostic, uniqueObligationDiagnostics as uniqueDiagnostics, } from "./ReconstructionObligationLedgerDiagnostics.js";
|
|
5
5
|
import { originalCaseDiagnostics, originalCasesFor, } from "./ReconstructionObligationOriginalCases.js";
|
|
6
6
|
import { digestObligationLedgerValue, obligationLedgerCoverage, obligationEdgeOrder, obligationLedgerEvidenceLinks, obligationLedgerStatus, obligationReports, summarizeObligations, } from "./ReconstructionObligationLedgerProjection.js";
|
|
7
|
-
export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest,
|
|
7
|
+
export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest, generationLimitations, }) => {
|
|
8
8
|
const bundle = parseEvidenceBundle(bundleInput);
|
|
9
9
|
const allCandidates = [...candidatesInput].sort((left, right) => left.obligation_id.localeCompare(right.obligation_id));
|
|
10
10
|
const orphanManifestIds = findOrphanManifestIds(allCandidates, manifest);
|
|
11
|
-
const candidates = allCandidates
|
|
12
|
-
const omittedCount = allCandidates.length - candidates.length;
|
|
11
|
+
const candidates = allCandidates;
|
|
13
12
|
const context = createEvaluationContext(candidates, bundle, manifest);
|
|
14
13
|
const obligations = applyDependencyDiagnostics(candidates.map((candidate) => evaluateObligation(candidate, context)), context);
|
|
15
14
|
const ownershipGraph = obligations
|
|
@@ -30,8 +29,8 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
|
|
|
30
29
|
})))
|
|
31
30
|
.sort(obligationEdgeOrder);
|
|
32
31
|
const evidenceLinks = obligationLedgerEvidenceLinks(obligations, manifest);
|
|
33
|
-
const limitations = ledgerLimitations(generationLimitations, allCandidates.length,
|
|
34
|
-
const coverage = obligationLedgerCoverage(
|
|
32
|
+
const limitations = ledgerLimitations(generationLimitations, allCandidates.length, orphanManifestIds);
|
|
33
|
+
const coverage = obligationLedgerCoverage(limitations.length > 0);
|
|
35
34
|
const semantic = {
|
|
36
35
|
coverage,
|
|
37
36
|
summary: summarizeObligations(obligations),
|
|
@@ -42,22 +41,21 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
|
|
|
42
41
|
evidence_links: evidenceLinks,
|
|
43
42
|
limitations,
|
|
44
43
|
};
|
|
45
|
-
const evaluatedStatus = obligationLedgerStatus(obligations
|
|
44
|
+
const evaluatedStatus = obligationLedgerStatus(obligations);
|
|
46
45
|
const status = evaluatedStatus === "failed"
|
|
47
46
|
? evaluatedStatus
|
|
48
47
|
: limitations.length > 0
|
|
49
48
|
? "unknown"
|
|
50
49
|
: evaluatedStatus;
|
|
51
50
|
const closureDigest = digestObligationLedgerValue({
|
|
52
|
-
schema: "
|
|
51
|
+
schema: "ReconstructionObligationClosure",
|
|
53
52
|
status,
|
|
54
53
|
...semantic,
|
|
55
54
|
});
|
|
56
55
|
return reconstructionObligationLedgerSchema.parse({
|
|
57
56
|
schema: "ReconstructionObligationLedger",
|
|
58
|
-
schema_version: 1,
|
|
59
57
|
ledger_id: `rol_${digestObligationLedgerValue({
|
|
60
|
-
schema: "
|
|
58
|
+
schema: "ReconstructionObligationLedger",
|
|
61
59
|
evidence_ids: bundle.records.map(({ evidence_id: id }) => id),
|
|
62
60
|
obligation_ids: obligations.map(({ obligation_id: id }) => id),
|
|
63
61
|
closure_digest: closureDigest,
|
|
@@ -82,7 +80,7 @@ const findOrphanManifestIds = (candidates, manifest) => {
|
|
|
82
80
|
].filter((obligationId) => !candidateIds.has(obligationId))),
|
|
83
81
|
].sort();
|
|
84
82
|
};
|
|
85
|
-
const ledgerLimitations = (generationLimitations, candidateCount,
|
|
83
|
+
const ledgerLimitations = (generationLimitations, candidateCount, orphanManifestIds) => [
|
|
86
84
|
...new Set([
|
|
87
85
|
...generationLimitations,
|
|
88
86
|
...(candidateCount === 0
|
|
@@ -90,11 +88,6 @@ const ledgerLimitations = (generationLimitations, candidateCount, omittedCount,
|
|
|
90
88
|
"No reconstruction obligations were derived; closure cannot be claimed.",
|
|
91
89
|
]
|
|
92
90
|
: []),
|
|
93
|
-
...(omittedCount > 0
|
|
94
|
-
? [
|
|
95
|
-
`${String(omittedCount)} obligation candidates were omitted by max_obligations; closure is unknown.`,
|
|
96
|
-
]
|
|
97
|
-
: []),
|
|
98
91
|
...(orphanManifestIds.length > 0
|
|
99
92
|
? [
|
|
100
93
|
`Manifest entries reference unknown obligations: ${orphanManifestIds.join(", ")}.`,
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
export const obligationLedgerCoverage = (
|
|
3
|
+
export const obligationLedgerCoverage = (incomplete) => ({
|
|
4
4
|
status: incomplete ? "partial" : "complete",
|
|
5
|
-
truncated: omittedCount > 0,
|
|
6
|
-
omitted_count: omittedCount,
|
|
7
|
-
max_obligations: maxObligations,
|
|
8
5
|
});
|
|
9
6
|
export const summarizeObligations = (obligations) => ({
|
|
10
7
|
total: obligations.length,
|
|
@@ -56,15 +53,14 @@ export const obligationLedgerEvidenceLinks = (obligations, manifest) => [
|
|
|
56
53
|
...manifest.contradictions.flatMap(({ evidence_ids: ids }) => ids),
|
|
57
54
|
]),
|
|
58
55
|
].sort();
|
|
59
|
-
export const obligationLedgerStatus = (obligations
|
|
56
|
+
export const obligationLedgerStatus = (obligations) => {
|
|
60
57
|
if (obligations.length === 0)
|
|
61
58
|
return "unknown";
|
|
62
59
|
const requiredOpen = obligations.filter(({ required, status }) => required && status !== "verified");
|
|
63
60
|
if (requiredOpen.some(({ status, diagnostics }) => status === "contradicted" ||
|
|
64
61
|
hasDiagnostic(diagnostics, "verifier-failed")))
|
|
65
62
|
return "failed";
|
|
66
|
-
if (
|
|
67
|
-
requiredOpen.some(({ status }) => status === "unknown"))
|
|
63
|
+
if (requiredOpen.some(({ status }) => status === "unknown"))
|
|
68
64
|
return "unknown";
|
|
69
65
|
return requiredOpen.length === 0 ? "ready" : "open";
|
|
70
66
|
};
|