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
|
@@ -118,6 +118,8 @@ const replayTransitions = (scenario, run, observations, require) => {
|
|
|
118
118
|
while ((run.controls[controlIndex]?.after_capture_order ??
|
|
119
119
|
Number.MAX_SAFE_INTEGER) < observation.capture_order) {
|
|
120
120
|
const control = run.controls[controlIndex];
|
|
121
|
+
if (control === undefined)
|
|
122
|
+
break;
|
|
121
123
|
advanceControl(control, controlIndex);
|
|
122
124
|
controlIndex += 1;
|
|
123
125
|
}
|
|
@@ -125,6 +127,8 @@ const replayTransitions = (scenario, run, observations, require) => {
|
|
|
125
127
|
}
|
|
126
128
|
for (; controlIndex < run.controls.length; controlIndex += 1) {
|
|
127
129
|
const control = run.controls[controlIndex];
|
|
130
|
+
if (control === undefined)
|
|
131
|
+
break;
|
|
128
132
|
advanceControl(control, controlIndex);
|
|
129
133
|
}
|
|
130
134
|
require(transitionIndex ===
|
|
@@ -141,10 +145,11 @@ const validateControls = (run, observations, require) => {
|
|
|
141
145
|
require(control.sequence ===
|
|
142
146
|
index, `reactive_run.controls[${String(index)}].sequence`, "reactive control sequence must be contiguous");
|
|
143
147
|
require(admittedOrders.has(control.after_capture_order), `reactive_run.controls[${String(index)}].after_capture_order`, "reactive control cutoff must identify the last admitted observation");
|
|
148
|
+
const previous = run.controls.at(index - 1);
|
|
144
149
|
require(index === 0 ||
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
.after_capture_order, `reactive_run.controls[${String(index)}].after_capture_order`, "reactive control cutoffs must be ordered");
|
|
150
|
+
(previous !== undefined &&
|
|
151
|
+
control.after_capture_order >=
|
|
152
|
+
previous.after_capture_order), `reactive_run.controls[${String(index)}].after_capture_order`, "reactive control cutoffs must be ordered");
|
|
148
153
|
}
|
|
149
154
|
};
|
|
150
155
|
/** Validate one capture's reactive journal by replaying the production reducer. */
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { validateProcessCaptureReactiveRun } from "./processCaptureReactiveValidation.js";
|
|
2
2
|
import { replayMachineSchema } from "./replayMachine.js";
|
|
3
3
|
import { digestProcessCommitment } from "./processScenario.js";
|
|
4
|
-
const orderedTimestamps = (values) => values.every((value, index) =>
|
|
4
|
+
const orderedTimestamps = (values) => values.every((value, index) => {
|
|
5
|
+
const previous = values[index - 1];
|
|
6
|
+
return previous === undefined || value.at_ms >= previous.at_ms;
|
|
7
|
+
});
|
|
8
|
+
const transitionsAreContiguous = (previous, current) => previous !== undefined && previous.state_after === current.state_before;
|
|
5
9
|
const validateCommitments = (capture, require) => {
|
|
6
10
|
const { manifest } = capture;
|
|
7
11
|
require(manifest.scenario.executable_sha256 ===
|
|
@@ -82,12 +86,6 @@ const validateLifecycle = (capture, require) => {
|
|
|
82
86
|
require(capture.exit.reason === "exited" ||
|
|
83
87
|
capture.exit.code ===
|
|
84
88
|
null, "exit", "deadline termination cannot declare a normal exit code");
|
|
85
|
-
require(capture.settlement.state !== "quiesced" ||
|
|
86
|
-
capture.settlement.cleanup_outcome ===
|
|
87
|
-
"not_required", "settlement.cleanup_outcome", "quiesced settlement cannot require cleanup");
|
|
88
|
-
require(capture.settlement.state === "quiesced" ||
|
|
89
|
-
capture.settlement.cleanup_outcome !==
|
|
90
|
-
"not_required", "settlement.cleanup_outcome", "non-quiesced settlement must report cleanup");
|
|
91
89
|
};
|
|
92
90
|
const shimPlans = (capture) => capture.manifest.shim_plan.flatMap((shim) => typeof shim === "object" &&
|
|
93
91
|
shim !== null &&
|
|
@@ -192,13 +190,13 @@ const validateReplayEvents = (capture, require) => {
|
|
|
192
190
|
if (index === 0)
|
|
193
191
|
require(transition.state_before ===
|
|
194
192
|
machine?.initial_state, "replay_transitions", "first replay transition does not start at the declared initial state");
|
|
193
|
+
const previous = capture.replay_transitions[index - 1];
|
|
195
194
|
if (index > 0)
|
|
196
|
-
require(
|
|
197
|
-
transition.state_before, "replay_transitions", "replay transition states are not contiguous");
|
|
195
|
+
require(transitionsAreContiguous(previous, transition), "replay_transitions", "replay transition states are not contiguous");
|
|
198
196
|
}
|
|
199
197
|
};
|
|
200
198
|
/** Recompute v4 commitments and cross-field invariants without side effects. */
|
|
201
|
-
export const
|
|
199
|
+
export const collectProcessCaptureIssues = (capture) => {
|
|
202
200
|
const issues = [];
|
|
203
201
|
const require = (condition, path, message) => {
|
|
204
202
|
if (!condition)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import canonicalize from "canonicalize";
|
|
1
2
|
import { z } from "zod";
|
|
2
|
-
import { validateProcessCapture } from "./processCapture.js";
|
|
3
3
|
import { jsonValueSchema } from "./jsonValue.js";
|
|
4
4
|
import { compareProcessTraces, processTraceOutcomesDiffer, processTraceComparisonResultSchema, } from "./processTraceComparison.js";
|
|
5
5
|
import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
|
|
@@ -97,6 +97,10 @@ const filesystemObservations = (capture) => [
|
|
|
97
97
|
effects: capture.filesystem_effects,
|
|
98
98
|
},
|
|
99
99
|
];
|
|
100
|
+
const sameJsonValue = (left, right) => {
|
|
101
|
+
const encodedLeft = canonicalize(left);
|
|
102
|
+
return encodedLeft !== undefined && encodedLeft === canonicalize(right);
|
|
103
|
+
};
|
|
100
104
|
/** Canonical observations for one process-comparison dimension. */
|
|
101
105
|
export const processDimensionObservations = (capture, dimension) => {
|
|
102
106
|
switch (dimension) {
|
|
@@ -117,7 +121,7 @@ export const processDimensionObservations = (capture, dimension) => {
|
|
|
117
121
|
}
|
|
118
122
|
};
|
|
119
123
|
const classifyCollection = (left, right) => {
|
|
120
|
-
if (
|
|
124
|
+
if (sameJsonValue(left, right))
|
|
121
125
|
return "unchanged";
|
|
122
126
|
if (left.length === 0)
|
|
123
127
|
return "added";
|
|
@@ -141,7 +145,7 @@ const firstCollectionDivergence = (dimension, left, right) => {
|
|
|
141
145
|
for (let index = 0; index < length; index += 1) {
|
|
142
146
|
const leftValue = left[index] ?? null;
|
|
143
147
|
const rightValue = right[index] ?? null;
|
|
144
|
-
if (
|
|
148
|
+
if (sameJsonValue(leftValue, rightValue))
|
|
145
149
|
continue;
|
|
146
150
|
return {
|
|
147
151
|
status: "found",
|
|
@@ -164,15 +168,8 @@ const chooseFirstDivergence = (candidates) => {
|
|
|
164
168
|
})[0] ?? { status: "none" });
|
|
165
169
|
};
|
|
166
170
|
const assertComparable = (left, right, options) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
...validateProcessCapture(right),
|
|
170
|
-
];
|
|
171
|
-
if (invalid.length > 0)
|
|
172
|
-
throw new TypeError(`Invalid Process Capture v4: ${invalid[0].path}`);
|
|
173
|
-
if (left.schema_version !== right.schema_version ||
|
|
174
|
-
left.manifest.comparison_contract_sha256 !==
|
|
175
|
-
right.manifest.comparison_contract_sha256)
|
|
171
|
+
if (left.manifest.comparison_contract_sha256 !==
|
|
172
|
+
right.manifest.comparison_contract_sha256)
|
|
176
173
|
throw new TypeError("Process captures have incompatible comparison contracts");
|
|
177
174
|
if (options.maxCaptureAgeMs === undefined)
|
|
178
175
|
return;
|
|
@@ -239,8 +236,7 @@ const compareDimensions = (left, right, sameNormalization) => {
|
|
|
239
236
|
interaction: classify("interaction", left.interaction_events, right.interaction_events),
|
|
240
237
|
exit: hasUnknown(left, "exit") || hasUnknown(right, "exit")
|
|
241
238
|
? "unknown"
|
|
242
|
-
:
|
|
243
|
-
JSON.stringify({ exit: right.exit, settlement: right.settlement })
|
|
239
|
+
: sameJsonValue({ exit: left.exit, settlement: left.settlement }, { exit: right.exit, settlement: right.settlement })
|
|
244
240
|
? "unchanged"
|
|
245
241
|
: "changed",
|
|
246
242
|
filesystem: classify("filesystem", filesystemObservations(left), filesystemObservations(right)),
|
|
@@ -250,7 +246,7 @@ const compareDimensions = (left, right, sameNormalization) => {
|
|
|
250
246
|
};
|
|
251
247
|
};
|
|
252
248
|
/**
|
|
253
|
-
* Compare two
|
|
249
|
+
* Compare two process capture observations without treating absence as proof.
|
|
254
250
|
*
|
|
255
251
|
* Observed differences outrank residual unknowns. A capture may therefore be
|
|
256
252
|
* definitively changed in one dimension while completeness remains unknown.
|
|
@@ -266,7 +262,7 @@ export const compareProcessCaptures = (left, right, options = {}) => {
|
|
|
266
262
|
trace: compareProcessTraces(left, right, options.traceSpecification),
|
|
267
263
|
};
|
|
268
264
|
}
|
|
269
|
-
const sameNormalization =
|
|
265
|
+
const sameNormalization = sameJsonValue(left.normalization, right.normalization);
|
|
270
266
|
const exactDimensions = compareDimensions(left, right, sameNormalization);
|
|
271
267
|
const trace = options.traceSpecification === undefined
|
|
272
268
|
? undefined
|
|
@@ -52,14 +52,13 @@ export const createProcessObservation = (input) => ({
|
|
|
52
52
|
const atMilliseconds = (value) => {
|
|
53
53
|
if (typeof value !== "object" || value === null)
|
|
54
54
|
return null;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return candidate;
|
|
60
|
-
}
|
|
55
|
+
if ("at_ms" in value && isSafeMillisecond(value.at_ms))
|
|
56
|
+
return value.at_ms;
|
|
57
|
+
if ("dispatched_at_ms" in value && isSafeMillisecond(value.dispatched_at_ms))
|
|
58
|
+
return value.dispatched_at_ms;
|
|
61
59
|
return null;
|
|
62
60
|
};
|
|
61
|
+
const isSafeMillisecond = (value) => typeof value === "number" && Number.isSafeInteger(value);
|
|
63
62
|
/** Derive the stable capture-local identity for one normalized observation. */
|
|
64
63
|
export const processObservationSubject = (source, value) => {
|
|
65
64
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { comparableProcessObservationPayload } from "./processObservation.js";
|
|
3
|
-
|
|
4
|
-
const spendEvaluationWork = (budget, units) => {
|
|
5
|
-
if (units > budget.remaining)
|
|
6
|
-
return false;
|
|
7
|
-
budget.remaining -= units;
|
|
8
|
-
return true;
|
|
9
|
-
};
|
|
10
|
-
const noMatch = (overflow = false) => ({
|
|
11
|
-
matched: false,
|
|
3
|
+
const noMatch = () => ({
|
|
12
4
|
eventIds: [],
|
|
13
5
|
consumeIds: [],
|
|
14
6
|
lastOrder: -1,
|
|
15
|
-
|
|
7
|
+
matched: false,
|
|
16
8
|
});
|
|
17
9
|
const frontierOrder = (frontier, snapshot) => {
|
|
18
10
|
switch (frontier.kind) {
|
|
@@ -47,8 +39,6 @@ const matchEvent = (trigger, context) => {
|
|
|
47
39
|
const expected = canonicalJson(comparableProcessObservationPayload(trigger.exact, trigger.ignore_fields));
|
|
48
40
|
const matches = [];
|
|
49
41
|
for (const observation of eligibleObservations(trigger.since, context)) {
|
|
50
|
-
if (!spendEvaluationWork(context.budget, 1))
|
|
51
|
-
return noMatch(true);
|
|
52
42
|
if (observation.source === trigger.source &&
|
|
53
43
|
canonicalJson(comparableProcessObservationPayload(observation.payload, trigger.ignore_fields)) === expected)
|
|
54
44
|
matches.push(observation);
|
|
@@ -58,11 +48,10 @@ const matchEvent = (trigger, context) => {
|
|
|
58
48
|
return noMatch();
|
|
59
49
|
const eventIds = matches.map(({ event_id }) => event_id);
|
|
60
50
|
return {
|
|
61
|
-
matched: true,
|
|
62
51
|
eventIds,
|
|
63
52
|
consumeIds: trigger.consume ? eventIds : [],
|
|
64
53
|
lastOrder: matches.at(-1)?.capture_order ?? context.afterOrder,
|
|
65
|
-
|
|
54
|
+
matched: true,
|
|
66
55
|
};
|
|
67
56
|
};
|
|
68
57
|
const occurrenceRange = (haystack, needle, occurrence) => {
|
|
@@ -79,8 +68,6 @@ const occurrenceRange = (haystack, needle, occurrence) => {
|
|
|
79
68
|
const matchTerminalText = (trigger, context) => {
|
|
80
69
|
const chunks = [];
|
|
81
70
|
for (const observation of eligibleObservations(trigger.since, context)) {
|
|
82
|
-
if (!spendEvaluationWork(context.budget, 1))
|
|
83
|
-
return noMatch(true);
|
|
84
71
|
if (observation.source === "terminal_raw" &&
|
|
85
72
|
typeof observation.payload === "object" &&
|
|
86
73
|
observation.payload !== null &&
|
|
@@ -88,16 +75,6 @@ const matchTerminalText = (trigger, context) => {
|
|
|
88
75
|
typeof observation.payload["data"] === "string")
|
|
89
76
|
chunks.push({ observation, text: observation.payload["data"] });
|
|
90
77
|
}
|
|
91
|
-
let rawBytes = 0;
|
|
92
|
-
for (const { text } of chunks) {
|
|
93
|
-
if (text.length > PROCESS_REACTIVE_LIMITS.terminalMatchBytes)
|
|
94
|
-
return noMatch(true);
|
|
95
|
-
const bytes = Buffer.byteLength(text);
|
|
96
|
-
rawBytes += bytes;
|
|
97
|
-
if (rawBytes > PROCESS_REACTIVE_LIMITS.terminalMatchBytes ||
|
|
98
|
-
!spendEvaluationWork(context.budget, bytes))
|
|
99
|
-
return noMatch(true);
|
|
100
|
-
}
|
|
101
78
|
const range = occurrenceRange(chunks.map(({ text }) => text).join(""), trigger.literal, trigger.occurrence);
|
|
102
79
|
if (range === null)
|
|
103
80
|
return noMatch();
|
|
@@ -118,20 +95,32 @@ const matchTerminalText = (trigger, context) => {
|
|
|
118
95
|
.map(({ observation }) => observation);
|
|
119
96
|
const eventIds = matched.map(({ event_id }) => event_id);
|
|
120
97
|
return {
|
|
121
|
-
matched: true,
|
|
122
98
|
eventIds,
|
|
123
99
|
consumeIds: trigger.consume ? eventIds : [],
|
|
124
100
|
lastOrder: matched.at(-1)?.capture_order ?? context.afterOrder,
|
|
125
|
-
|
|
101
|
+
matched: true,
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
const mergeMatches = (matches) => {
|
|
105
|
+
const eventIds = new Set();
|
|
106
|
+
const consumeIds = new Set();
|
|
107
|
+
let lastOrder = -1;
|
|
108
|
+
let matched = true;
|
|
109
|
+
for (const match of matches) {
|
|
110
|
+
for (const eventId of match.eventIds)
|
|
111
|
+
eventIds.add(eventId);
|
|
112
|
+
for (const eventId of match.consumeIds)
|
|
113
|
+
consumeIds.add(eventId);
|
|
114
|
+
lastOrder = Math.max(lastOrder, match.lastOrder);
|
|
115
|
+
matched &&= match.matched;
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
eventIds: [...eventIds],
|
|
119
|
+
consumeIds: [...consumeIds],
|
|
120
|
+
lastOrder,
|
|
121
|
+
matched,
|
|
126
122
|
};
|
|
127
123
|
};
|
|
128
|
-
const mergeMatches = (matches) => ({
|
|
129
|
-
matched: matches.every(({ matched }) => matched),
|
|
130
|
-
eventIds: [...new Set(matches.flatMap(({ eventIds }) => eventIds))],
|
|
131
|
-
consumeIds: [...new Set(matches.flatMap(({ consumeIds }) => consumeIds))],
|
|
132
|
-
lastOrder: Math.max(-1, ...matches.map(({ lastOrder }) => lastOrder)),
|
|
133
|
-
overflow: matches.some(({ overflow }) => overflow),
|
|
134
|
-
});
|
|
135
124
|
const matchEarliestPrefix = (trigger, context) => {
|
|
136
125
|
for (const observation of context.snapshot.observations) {
|
|
137
126
|
if (observation.capture_order <= context.afterOrder)
|
|
@@ -143,7 +132,7 @@ const matchEarliestPrefix = (trigger, context) => {
|
|
|
143
132
|
...context,
|
|
144
133
|
upperOrder: observation.capture_order,
|
|
145
134
|
});
|
|
146
|
-
if (matched.matched
|
|
135
|
+
if (matched.matched)
|
|
147
136
|
return matched;
|
|
148
137
|
}
|
|
149
138
|
return noMatch();
|
|
@@ -158,9 +147,7 @@ const matchTrigger = (trigger, context) => {
|
|
|
158
147
|
if (trigger.kind === "any") {
|
|
159
148
|
const evaluated = trigger.triggers.map((child) => matchTrigger(child, context));
|
|
160
149
|
const matches = evaluated.filter(({ matched }) => matched);
|
|
161
|
-
return matches.length === 0
|
|
162
|
-
? noMatch(evaluated.some(({ overflow }) => overflow))
|
|
163
|
-
: mergeMatches(matches);
|
|
150
|
+
return matches.length === 0 ? noMatch() : mergeMatches(matches);
|
|
164
151
|
}
|
|
165
152
|
if (trigger.kind === "sequence") {
|
|
166
153
|
const matches = [];
|
|
@@ -171,7 +158,7 @@ const matchTrigger = (trigger, context) => {
|
|
|
171
158
|
afterOrder: cursor,
|
|
172
159
|
});
|
|
173
160
|
if (!matched.matched)
|
|
174
|
-
return noMatch(
|
|
161
|
+
return noMatch();
|
|
175
162
|
matches.push(matched);
|
|
176
163
|
cursor = matched.lastOrder;
|
|
177
164
|
}
|
|
@@ -194,17 +181,16 @@ const matchTrigger = (trigger, context) => {
|
|
|
194
181
|
...context,
|
|
195
182
|
afterOrder: cursor,
|
|
196
183
|
});
|
|
197
|
-
if (excess.matched
|
|
198
|
-
return noMatch(
|
|
184
|
+
if (excess.matched)
|
|
185
|
+
return noMatch();
|
|
199
186
|
}
|
|
200
187
|
if (matches.length < trigger.min)
|
|
201
|
-
return noMatch(
|
|
188
|
+
return noMatch();
|
|
202
189
|
return mergeMatches(matches);
|
|
203
190
|
};
|
|
204
|
-
/** Match one trigger
|
|
205
|
-
export const matchProcessReactiveTrigger = (trigger, snapshot
|
|
191
|
+
/** Match one trigger against every eligible retained observation. */
|
|
192
|
+
export const matchProcessReactiveTrigger = (trigger, snapshot) => matchTrigger(trigger, {
|
|
206
193
|
snapshot,
|
|
207
|
-
budget,
|
|
208
194
|
afterOrder: -1,
|
|
209
195
|
upperOrder: null,
|
|
210
196
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { matchProcessReactiveTrigger } from "./processReactiveMatching.js";
|
|
2
|
-
import {
|
|
2
|
+
import {} from "./processReactiveScenario.js";
|
|
3
3
|
export { commitProcessReactiveProposal } from "./processReactiveTransition.js";
|
|
4
4
|
const counterValue = (counters, id) => counters.find((counter) => counter.id === id)?.count ?? 0;
|
|
5
5
|
const observeInput = (snapshot, observation) => {
|
|
@@ -7,8 +7,7 @@ const observeInput = (snapshot, observation) => {
|
|
|
7
7
|
if (duplicate !== undefined)
|
|
8
8
|
return { kind: "invalid" };
|
|
9
9
|
const prior = snapshot.observations.at(-1);
|
|
10
|
-
if (
|
|
11
|
-
snapshot.observations.length >= PROCESS_REACTIVE_LIMITS.retainedObservations)
|
|
10
|
+
if (prior !== undefined && observation.capture_order <= prior.capture_order)
|
|
12
11
|
return { kind: "invalid" };
|
|
13
12
|
return {
|
|
14
13
|
kind: "new",
|
|
@@ -69,14 +68,11 @@ export const reduceProcessReactiveScenario = (scenario, snapshot, input) => {
|
|
|
69
68
|
const state = scenario.states.find(({ id }) => id === observed.active_state);
|
|
70
69
|
if (state === undefined)
|
|
71
70
|
return finishedDecision(observed, "target_lost");
|
|
72
|
-
const budget = { remaining: PROCESS_REACTIVE_LIMITS.evaluationWork };
|
|
73
71
|
const matches = state.on.map((transition) => ({
|
|
74
72
|
transition,
|
|
75
|
-
match: matchProcessReactiveTrigger(transition.when, observed
|
|
73
|
+
match: matchProcessReactiveTrigger(transition.when, observed),
|
|
76
74
|
uses: counterValue(observed.transition_uses, transition.id),
|
|
77
75
|
}));
|
|
78
|
-
if (matches.some(({ match }) => match.overflow))
|
|
79
|
-
return finishedDecision(observed, "capture_incomplete");
|
|
80
76
|
const evaluations = matches.map(({ transition, match, uses }) => ({
|
|
81
77
|
transition_id: transition.id,
|
|
82
78
|
status: uses >= transition.max_uses
|
|
@@ -89,7 +85,7 @@ export const reduceProcessReactiveScenario = (scenario, snapshot, input) => {
|
|
|
89
85
|
const eligible = matches.filter(({ transition, match, uses }) => match.matched && uses < transition.max_uses);
|
|
90
86
|
if (eligible.length === 0)
|
|
91
87
|
return { kind: "waiting", snapshot: observed, evaluations };
|
|
92
|
-
const minimumPriority =
|
|
88
|
+
const minimumPriority = eligible.reduce((minimum, { transition }) => Math.min(minimum, transition.priority), Number.POSITIVE_INFINITY);
|
|
93
89
|
const winners = eligible.filter(({ transition }) => transition.priority === minimumPriority);
|
|
94
90
|
if (winners.length !== 1)
|
|
95
91
|
return finishedDecision(observed, "ambiguous_match", evaluations);
|
|
@@ -3,34 +3,15 @@ import { jsonValueSchema } from "./jsonValue.js";
|
|
|
3
3
|
import { processObservationSourceSchema } from "./processObservation.js";
|
|
4
4
|
import { definitelyAvailableCheckpoints } from "./processReactiveCheckpointDataflow.js";
|
|
5
5
|
import { preflightProcessReactiveScenario } from "./processReactiveScenarioPreflight.js";
|
|
6
|
-
/**
|
|
6
|
+
/** Structural depth guard for recursive Zod parsing. */
|
|
7
7
|
export const PROCESS_REACTIVE_LIMITS = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
predicates: 64,
|
|
12
|
-
actions: 256,
|
|
13
|
-
actionsPerTransition: 16,
|
|
14
|
-
childrenPerComposite: 16,
|
|
15
|
-
stateVisits: 256,
|
|
16
|
-
transitionUses: 256,
|
|
17
|
-
repeat: 64,
|
|
18
|
-
retainedObservations: 256,
|
|
19
|
-
terminalMatchBytes: 65_536,
|
|
20
|
-
evaluationWork: 8_192,
|
|
21
|
-
jsonDepth: 20,
|
|
22
|
-
jsonNodes: 1_024,
|
|
23
|
-
runtimeMs: 300_000,
|
|
8
|
+
// Recursive Zod schemas need a practical stack guard, not a small tree quota.
|
|
9
|
+
triggerDepth: 256,
|
|
10
|
+
jsonDepth: 256,
|
|
24
11
|
};
|
|
25
|
-
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]
|
|
26
|
-
const checkpointNameSchema = z
|
|
27
|
-
|
|
28
|
-
.regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/u);
|
|
29
|
-
const positiveRuntime = z
|
|
30
|
-
.number()
|
|
31
|
-
.int()
|
|
32
|
-
.positive()
|
|
33
|
-
.max(PROCESS_REACTIVE_LIMITS.runtimeMs);
|
|
12
|
+
const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
|
|
13
|
+
const checkpointNameSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/u);
|
|
14
|
+
const positiveRuntime = z.number().int().safe().positive();
|
|
34
15
|
const frontierSchema = z.discriminatedUnion("kind", [
|
|
35
16
|
z.strictObject({ kind: z.literal("scenario_start") }),
|
|
36
17
|
z.strictObject({ kind: z.literal("state_entry") }),
|
|
@@ -51,7 +32,6 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
|
|
|
51
32
|
exact: jsonValueSchema,
|
|
52
33
|
ignore_fields: z
|
|
53
34
|
.array(ignoredFieldSchema)
|
|
54
|
-
.max(5)
|
|
55
35
|
.refine((values) => new Set(values).size === values.length, {
|
|
56
36
|
message: "ignored event fields must be unique",
|
|
57
37
|
}),
|
|
@@ -59,8 +39,8 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
|
|
|
59
39
|
consume: z.boolean(),
|
|
60
40
|
cardinality: z
|
|
61
41
|
.strictObject({
|
|
62
|
-
min: z.number().int().
|
|
63
|
-
max: z.number().int().
|
|
42
|
+
min: z.number().int().safe().positive(),
|
|
43
|
+
max: z.number().int().safe().positive(),
|
|
64
44
|
})
|
|
65
45
|
.refine(({ min, max }) => min <= max, {
|
|
66
46
|
message: "cardinality min must not exceed max",
|
|
@@ -70,40 +50,31 @@ const processReactiveTriggerSchema = z.lazy(() => z.discriminatedUnion("kind", [
|
|
|
70
50
|
kind: z.literal("terminal_text"),
|
|
71
51
|
view: z.literal("decoded"),
|
|
72
52
|
encoding: z.literal("utf8"),
|
|
73
|
-
literal: z.string().min(1)
|
|
53
|
+
literal: z.string().min(1),
|
|
74
54
|
case_sensitive: z.literal(true),
|
|
75
55
|
control_sequences: z.literal("include"),
|
|
76
|
-
occurrence: z.number().int().
|
|
56
|
+
occurrence: z.number().int().safe().positive(),
|
|
77
57
|
since: frontierSchema,
|
|
78
58
|
consume: z.boolean(),
|
|
79
59
|
}),
|
|
80
60
|
z.strictObject({
|
|
81
61
|
kind: z.literal("all"),
|
|
82
|
-
triggers: z
|
|
83
|
-
.array(processReactiveTriggerSchema)
|
|
84
|
-
.min(2)
|
|
85
|
-
.max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
|
|
62
|
+
triggers: z.array(processReactiveTriggerSchema).min(2),
|
|
86
63
|
}),
|
|
87
64
|
z.strictObject({
|
|
88
65
|
kind: z.literal("any"),
|
|
89
|
-
triggers: z
|
|
90
|
-
.array(processReactiveTriggerSchema)
|
|
91
|
-
.min(2)
|
|
92
|
-
.max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
|
|
66
|
+
triggers: z.array(processReactiveTriggerSchema).min(2),
|
|
93
67
|
}),
|
|
94
68
|
z.strictObject({
|
|
95
69
|
kind: z.literal("sequence"),
|
|
96
|
-
triggers: z
|
|
97
|
-
.array(processReactiveTriggerSchema)
|
|
98
|
-
.min(1)
|
|
99
|
-
.max(PROCESS_REACTIVE_LIMITS.childrenPerComposite),
|
|
70
|
+
triggers: z.array(processReactiveTriggerSchema).min(1),
|
|
100
71
|
}),
|
|
101
72
|
z
|
|
102
73
|
.strictObject({
|
|
103
74
|
kind: z.literal("repeat"),
|
|
104
75
|
trigger: processReactiveTriggerSchema,
|
|
105
|
-
min: z.number().int().
|
|
106
|
-
max: z.number().int().
|
|
76
|
+
min: z.number().int().safe().positive(),
|
|
77
|
+
max: z.number().int().safe().positive(),
|
|
107
78
|
})
|
|
108
79
|
.refine(({ min, max }) => min <= max, {
|
|
109
80
|
message: "repeat min must not exceed max",
|
|
@@ -120,13 +91,13 @@ const signalTargetSchema = z.discriminatedUnion("kind", [
|
|
|
120
91
|
const processReactiveActionSchema = z.discriminatedUnion("type", [
|
|
121
92
|
z.strictObject({
|
|
122
93
|
type: z.literal("send_input"),
|
|
123
|
-
data: z.string()
|
|
94
|
+
data: z.string(),
|
|
124
95
|
sensitive: z.boolean(),
|
|
125
96
|
}),
|
|
126
97
|
z.strictObject({
|
|
127
98
|
type: z.literal("resize"),
|
|
128
|
-
columns: z.number().int().
|
|
129
|
-
rows: z.number().int().
|
|
99
|
+
columns: z.number().int().positive(),
|
|
100
|
+
rows: z.number().int().positive(),
|
|
130
101
|
}),
|
|
131
102
|
z.strictObject({ type: z.literal("close_stdin") }),
|
|
132
103
|
z.strictObject({
|
|
@@ -142,42 +113,30 @@ const transitionTargetSchema = z.discriminatedUnion("kind", [
|
|
|
142
113
|
]);
|
|
143
114
|
const transitionSchema = z.strictObject({
|
|
144
115
|
id: identifierSchema,
|
|
145
|
-
priority: z.number().int().
|
|
146
|
-
max_uses: z
|
|
147
|
-
.number()
|
|
148
|
-
.int()
|
|
149
|
-
.positive()
|
|
150
|
-
.max(PROCESS_REACTIVE_LIMITS.transitionUses),
|
|
116
|
+
priority: z.number().int().safe().min(0),
|
|
117
|
+
max_uses: z.number().int().safe().positive(),
|
|
151
118
|
when: processReactiveTriggerSchema,
|
|
152
|
-
actions: z
|
|
153
|
-
.array(processReactiveActionSchema)
|
|
154
|
-
.max(PROCESS_REACTIVE_LIMITS.actionsPerTransition),
|
|
119
|
+
actions: z.array(processReactiveActionSchema),
|
|
155
120
|
target: transitionTargetSchema,
|
|
156
121
|
});
|
|
157
122
|
const stateSchema = z.strictObject({
|
|
158
123
|
id: identifierSchema,
|
|
159
|
-
max_visits: z
|
|
160
|
-
.number()
|
|
161
|
-
.int()
|
|
162
|
-
.positive()
|
|
163
|
-
.max(PROCESS_REACTIVE_LIMITS.stateVisits),
|
|
124
|
+
max_visits: z.number().int().safe().positive(),
|
|
164
125
|
deadline_ms: positiveRuntime,
|
|
165
|
-
on: z.array(transitionSchema).min(1)
|
|
126
|
+
on: z.array(transitionSchema).min(1),
|
|
166
127
|
});
|
|
167
128
|
const scenarioShapeSchema = z.strictObject({
|
|
168
|
-
version: z.literal(1),
|
|
169
129
|
initial_state: identifierSchema,
|
|
170
130
|
deadline_ms: positiveRuntime,
|
|
171
|
-
states: z.array(stateSchema).min(1)
|
|
131
|
+
states: z.array(stateSchema).min(1),
|
|
172
132
|
});
|
|
173
133
|
const measureTrigger = (trigger) => {
|
|
174
134
|
if (trigger.kind === "event" || trigger.kind === "terminal_text")
|
|
175
|
-
return { depth: 1
|
|
135
|
+
return { depth: 1 };
|
|
176
136
|
const children = trigger.kind === "repeat" ? [trigger.trigger] : trigger.triggers;
|
|
177
137
|
const measured = children.map(measureTrigger);
|
|
178
138
|
return {
|
|
179
|
-
depth: 1 +
|
|
180
|
-
predicates: measured.reduce((total, { predicates }) => total + predicates, 0),
|
|
139
|
+
depth: 1 + measured.reduce((maximum, { depth }) => Math.max(maximum, depth), 0),
|
|
181
140
|
};
|
|
182
141
|
};
|
|
183
142
|
const collectCheckpointFrontiers = (trigger) => {
|
|
@@ -218,15 +177,12 @@ const validateTriggerSemantics = (trigger, path, context) => {
|
|
|
218
177
|
};
|
|
219
178
|
const validateTransition = (input) => {
|
|
220
179
|
const { transition, validation, path, context } = input;
|
|
221
|
-
validation.transitions += 1;
|
|
222
|
-
validation.actions += transition.actions.length;
|
|
223
180
|
const measured = measureTrigger(transition.when);
|
|
224
|
-
validation.predicates += measured.predicates;
|
|
225
181
|
validateTriggerSemantics(transition.when, [...path, "when"], context);
|
|
226
182
|
if (measured.depth > PROCESS_REACTIVE_LIMITS.triggerDepth)
|
|
227
183
|
context.addIssue({
|
|
228
184
|
code: "custom",
|
|
229
|
-
message: "trigger nesting exceeds the
|
|
185
|
+
message: "trigger nesting exceeds the configured limit",
|
|
230
186
|
path: [...path, "when"],
|
|
231
187
|
});
|
|
232
188
|
if (validation.transitionIds.has(transition.id))
|
|
@@ -266,25 +222,6 @@ const validateTransition = (input) => {
|
|
|
266
222
|
validation.adjacency.get(input.stateId)?.add(transition.target.state);
|
|
267
223
|
};
|
|
268
224
|
const validateTotalsAndReferences = (scenario, validation, context) => {
|
|
269
|
-
for (const [count, limit, message] of [
|
|
270
|
-
[
|
|
271
|
-
validation.transitions,
|
|
272
|
-
PROCESS_REACTIVE_LIMITS.transitions,
|
|
273
|
-
"scenario has too many transitions",
|
|
274
|
-
],
|
|
275
|
-
[
|
|
276
|
-
validation.predicates,
|
|
277
|
-
PROCESS_REACTIVE_LIMITS.predicates,
|
|
278
|
-
"scenario has too many predicates",
|
|
279
|
-
],
|
|
280
|
-
[
|
|
281
|
-
validation.actions,
|
|
282
|
-
PROCESS_REACTIVE_LIMITS.actions,
|
|
283
|
-
"scenario has too many actions",
|
|
284
|
-
],
|
|
285
|
-
])
|
|
286
|
-
if (count > limit)
|
|
287
|
-
context.addIssue({ code: "custom", message, path: ["states"] });
|
|
288
225
|
const available = definitelyAvailableCheckpoints(scenario);
|
|
289
226
|
for (const reference of validation.checkpointReferences)
|
|
290
227
|
if (!available.get(reference.stateId)?.has(reference.name))
|
|
@@ -335,9 +272,6 @@ const validateScenarioGraph = (scenario, context) => {
|
|
|
335
272
|
checkpoints: new Set(),
|
|
336
273
|
checkpointReferences: [],
|
|
337
274
|
adjacency: new Map(stateIds.map((id) => [id, new Set()])),
|
|
338
|
-
transitions: 0,
|
|
339
|
-
predicates: 0,
|
|
340
|
-
actions: 0,
|
|
341
275
|
};
|
|
342
276
|
for (const [stateIndex, state] of scenario.states.entries()) {
|
|
343
277
|
if (state.deadline_ms > scenario.deadline_ms)
|