rea-agents 3.1.0 → 3.2.1
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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- 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/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- 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/CapabilityInventory.js +10 -15
- 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 +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- 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 +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- 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/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- 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 +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- 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 +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- 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 -96
- 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 +19 -45
- 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 -93
- 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/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- 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 +15 -24
- 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 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- 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 +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- 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 +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- 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 +0 -54
- 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 +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- 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 +2 -2
- 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 +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- 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 +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- 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 -54
- package/dist/domain/appleApplication.js +24 -67
- 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 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- 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 +20 -19
- package/dist/domain/callPath.js +47 -167
- 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 +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- 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 +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- 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 +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- 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 +68 -75
- 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 +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- 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 +2 -7
- 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 +1 -5
- 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/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- 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 +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- 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 +36 -38
- 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 +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- 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 +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- 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 +33 -73
- 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 -41
- 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 +4 -12
- 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 +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- 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 +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- 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/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- 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 +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- 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 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- 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 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- 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
|
@@ -86,12 +86,6 @@ const validateLifecycle = (capture, require) => {
|
|
|
86
86
|
require(capture.exit.reason === "exited" ||
|
|
87
87
|
capture.exit.code ===
|
|
88
88
|
null, "exit", "deadline termination cannot declare a normal exit code");
|
|
89
|
-
require(capture.settlement.state !== "quiesced" ||
|
|
90
|
-
capture.settlement.cleanup_outcome ===
|
|
91
|
-
"not_required", "settlement.cleanup_outcome", "quiesced settlement cannot require cleanup");
|
|
92
|
-
require(capture.settlement.state === "quiesced" ||
|
|
93
|
-
capture.settlement.cleanup_outcome !==
|
|
94
|
-
"not_required", "settlement.cleanup_outcome", "non-quiesced settlement must report cleanup");
|
|
95
89
|
};
|
|
96
90
|
const shimPlans = (capture) => capture.manifest.shim_plan.flatMap((shim) => typeof shim === "object" &&
|
|
97
91
|
shim !== null &&
|
|
@@ -202,7 +196,7 @@ const validateReplayEvents = (capture, require) => {
|
|
|
202
196
|
}
|
|
203
197
|
};
|
|
204
198
|
/** Recompute v4 commitments and cross-field invariants without side effects. */
|
|
205
|
-
export const
|
|
199
|
+
export const collectProcessCaptureIssues = (capture) => {
|
|
206
200
|
const issues = [];
|
|
207
201
|
const require = (condition, path, message) => {
|
|
208
202
|
if (!condition)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { validateProcessCapture } from "./processCapture.js";
|
|
4
3
|
import { jsonValueSchema } from "./jsonValue.js";
|
|
5
4
|
import { compareProcessTraces, processTraceOutcomesDiffer, processTraceComparisonResultSchema, } from "./processTraceComparison.js";
|
|
6
5
|
import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
|
|
@@ -169,16 +168,8 @@ const chooseFirstDivergence = (candidates) => {
|
|
|
169
168
|
})[0] ?? { status: "none" });
|
|
170
169
|
};
|
|
171
170
|
const assertComparable = (left, right, options) => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
...validateProcessCapture(right),
|
|
175
|
-
];
|
|
176
|
-
const firstInvalid = invalid.at(0);
|
|
177
|
-
if (firstInvalid !== undefined)
|
|
178
|
-
throw new TypeError(`Invalid Process Capture v4: ${firstInvalid.path}`);
|
|
179
|
-
if (left.schema_version !== right.schema_version ||
|
|
180
|
-
left.manifest.comparison_contract_sha256 !==
|
|
181
|
-
right.manifest.comparison_contract_sha256)
|
|
171
|
+
if (left.manifest.comparison_contract_sha256 !==
|
|
172
|
+
right.manifest.comparison_contract_sha256)
|
|
182
173
|
throw new TypeError("Process captures have incompatible comparison contracts");
|
|
183
174
|
if (options.maxCaptureAgeMs === undefined)
|
|
184
175
|
return;
|
|
@@ -255,7 +246,7 @@ const compareDimensions = (left, right, sameNormalization) => {
|
|
|
255
246
|
};
|
|
256
247
|
};
|
|
257
248
|
/**
|
|
258
|
-
* Compare two
|
|
249
|
+
* Compare two process capture observations without treating absence as proof.
|
|
259
250
|
*
|
|
260
251
|
* Observed differences outrank residual unknowns. A capture may therefore be
|
|
261
252
|
* definitively changed in one dimension while completeness remains unknown.
|
|
@@ -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,26 +95,31 @@ 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,
|
|
126
102
|
};
|
|
127
103
|
};
|
|
128
104
|
const mergeMatches = (matches) => {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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,
|
|
133
122
|
};
|
|
134
|
-
return matches.every(({ matched }) => matched)
|
|
135
|
-
? { ...base, matched: true, overflow: false }
|
|
136
|
-
: {
|
|
137
|
-
...base,
|
|
138
|
-
matched: false,
|
|
139
|
-
overflow: matches.some(({ overflow }) => overflow),
|
|
140
|
-
};
|
|
141
123
|
};
|
|
142
124
|
const matchEarliestPrefix = (trigger, context) => {
|
|
143
125
|
for (const observation of context.snapshot.observations) {
|
|
@@ -150,7 +132,7 @@ const matchEarliestPrefix = (trigger, context) => {
|
|
|
150
132
|
...context,
|
|
151
133
|
upperOrder: observation.capture_order,
|
|
152
134
|
});
|
|
153
|
-
if (matched.matched
|
|
135
|
+
if (matched.matched)
|
|
154
136
|
return matched;
|
|
155
137
|
}
|
|
156
138
|
return noMatch();
|
|
@@ -165,9 +147,7 @@ const matchTrigger = (trigger, context) => {
|
|
|
165
147
|
if (trigger.kind === "any") {
|
|
166
148
|
const evaluated = trigger.triggers.map((child) => matchTrigger(child, context));
|
|
167
149
|
const matches = evaluated.filter(({ matched }) => matched);
|
|
168
|
-
return matches.length === 0
|
|
169
|
-
? noMatch(evaluated.some(({ overflow }) => overflow))
|
|
170
|
-
: mergeMatches(matches);
|
|
150
|
+
return matches.length === 0 ? noMatch() : mergeMatches(matches);
|
|
171
151
|
}
|
|
172
152
|
if (trigger.kind === "sequence") {
|
|
173
153
|
const matches = [];
|
|
@@ -178,7 +158,7 @@ const matchTrigger = (trigger, context) => {
|
|
|
178
158
|
afterOrder: cursor,
|
|
179
159
|
});
|
|
180
160
|
if (!matched.matched)
|
|
181
|
-
return noMatch(
|
|
161
|
+
return noMatch();
|
|
182
162
|
matches.push(matched);
|
|
183
163
|
cursor = matched.lastOrder;
|
|
184
164
|
}
|
|
@@ -201,17 +181,16 @@ const matchTrigger = (trigger, context) => {
|
|
|
201
181
|
...context,
|
|
202
182
|
afterOrder: cursor,
|
|
203
183
|
});
|
|
204
|
-
if (excess.matched
|
|
205
|
-
return noMatch(
|
|
184
|
+
if (excess.matched)
|
|
185
|
+
return noMatch();
|
|
206
186
|
}
|
|
207
187
|
if (matches.length < trigger.min)
|
|
208
|
-
return noMatch(
|
|
188
|
+
return noMatch();
|
|
209
189
|
return mergeMatches(matches);
|
|
210
190
|
};
|
|
211
|
-
/** Match one trigger
|
|
212
|
-
export const matchProcessReactiveTrigger = (trigger, snapshot
|
|
191
|
+
/** Match one trigger against every eligible retained observation. */
|
|
192
|
+
export const matchProcessReactiveTrigger = (trigger, snapshot) => matchTrigger(trigger, {
|
|
213
193
|
snapshot,
|
|
214
|
-
budget,
|
|
215
194
|
afterOrder: -1,
|
|
216
195
|
upperOrder: null,
|
|
217
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)
|
|
@@ -7,24 +7,18 @@ const reject = (context, message) => {
|
|
|
7
7
|
const inspectJsonValue = (value, context, limits) => {
|
|
8
8
|
const pending = [{ value, depth: 1 }];
|
|
9
9
|
const seen = new WeakSet();
|
|
10
|
-
let nodes = 0;
|
|
11
10
|
while (pending.length > 0) {
|
|
12
11
|
const current = pending.pop();
|
|
13
12
|
if (current === undefined)
|
|
14
13
|
break;
|
|
15
|
-
nodes += 1;
|
|
16
|
-
if (nodes > limits.jsonNodes)
|
|
17
|
-
return reject(context, "event exact JSON exceeds the v1 node limit");
|
|
18
14
|
if (current.depth > limits.jsonDepth)
|
|
19
|
-
return reject(context, "event exact JSON exceeds the
|
|
15
|
+
return reject(context, "event exact JSON exceeds the configured depth limit");
|
|
20
16
|
if (typeof current.value !== "object" || current.value === null)
|
|
21
17
|
continue;
|
|
22
18
|
if (seen.has(current.value))
|
|
23
19
|
return reject(context, "event exact JSON must not contain cycles");
|
|
24
20
|
seen.add(current.value);
|
|
25
21
|
if (Array.isArray(current.value)) {
|
|
26
|
-
if (current.value.length + nodes > limits.jsonNodes)
|
|
27
|
-
return reject(context, "event exact JSON exceeds the v1 node limit");
|
|
28
22
|
for (const child of current.value)
|
|
29
23
|
pending.push({ value: child, depth: current.depth + 1 });
|
|
30
24
|
continue;
|
|
@@ -34,8 +28,6 @@ const inspectJsonValue = (value, context, limits) => {
|
|
|
34
28
|
for (const key in current.value) {
|
|
35
29
|
if (!Object.hasOwn(current.value, key))
|
|
36
30
|
continue;
|
|
37
|
-
if (nodes + pending.length >= limits.jsonNodes)
|
|
38
|
-
return reject(context, "event exact JSON exceeds the v1 node limit");
|
|
39
31
|
pending.push({
|
|
40
32
|
value: current.value[key],
|
|
41
33
|
depth: current.depth + 1,
|
|
@@ -44,17 +36,11 @@ const inspectJsonValue = (value, context, limits) => {
|
|
|
44
36
|
}
|
|
45
37
|
return true;
|
|
46
38
|
};
|
|
47
|
-
const collectTriggerRoots = (states
|
|
39
|
+
const collectTriggerRoots = (states) => {
|
|
48
40
|
const pending = [];
|
|
49
|
-
let transitions = 0;
|
|
50
41
|
for (const stateValue of states) {
|
|
51
42
|
if (!isUnknownRecord(stateValue) || !Array.isArray(stateValue["on"]))
|
|
52
43
|
continue;
|
|
53
|
-
transitions += stateValue["on"].length;
|
|
54
|
-
if (transitions > limits.transitions) {
|
|
55
|
-
reject(context, "scenario has too many transitions");
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
44
|
for (const transitionValue of stateValue["on"])
|
|
59
45
|
if (isUnknownRecord(transitionValue))
|
|
60
46
|
pending.push({ value: transitionValue["when"], depth: 1 });
|
|
@@ -73,24 +59,17 @@ const enqueueTriggerChildren = (trigger, depth, traversal) => {
|
|
|
73
59
|
const children = trigger["triggers"];
|
|
74
60
|
if (!Array.isArray(children))
|
|
75
61
|
return true;
|
|
76
|
-
if (children.length > traversal.limits.childrenPerComposite)
|
|
77
|
-
return reject(traversal.context, "trigger group has too many children");
|
|
78
62
|
for (const child of children)
|
|
79
63
|
traversal.pending.push({ value: child, depth: depth + 1 });
|
|
80
64
|
return true;
|
|
81
65
|
};
|
|
82
66
|
const inspectTriggerTree = (pending, context, limits) => {
|
|
83
|
-
let nodes = 0;
|
|
84
|
-
const maximumNodes = limits.predicates * limits.triggerDepth;
|
|
85
67
|
while (pending.length > 0) {
|
|
86
68
|
const current = pending.pop();
|
|
87
69
|
if (current === undefined)
|
|
88
70
|
break;
|
|
89
|
-
nodes += 1;
|
|
90
|
-
if (nodes > maximumNodes)
|
|
91
|
-
return reject(context, "trigger tree exceeds the v1 limit");
|
|
92
71
|
if (current.depth > limits.triggerDepth)
|
|
93
|
-
return reject(context, "trigger nesting exceeds the
|
|
72
|
+
return reject(context, "trigger nesting exceeds the configured limit");
|
|
94
73
|
if (isUnknownRecord(current.value) &&
|
|
95
74
|
current.value["kind"] === "event" &&
|
|
96
75
|
!inspectJsonValue(current.value["exact"], context, limits))
|
|
@@ -109,12 +88,8 @@ const inspectTriggerTree = (pending, context, limits) => {
|
|
|
109
88
|
export const preflightProcessReactiveScenario = (input, context, limits) => {
|
|
110
89
|
if (!isUnknownRecord(input) || !Array.isArray(input["states"]))
|
|
111
90
|
return input;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return z.NEVER;
|
|
115
|
-
}
|
|
116
|
-
const pending = collectTriggerRoots(input["states"], context, limits);
|
|
117
|
-
if (pending === null || !inspectTriggerTree(pending, context, limits))
|
|
91
|
+
const pending = collectTriggerRoots(input["states"]);
|
|
92
|
+
if (!inspectTriggerTree(pending, context, limits))
|
|
118
93
|
return z.NEVER;
|
|
119
94
|
return input;
|
|
120
95
|
};
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
const createTransitionRecord = (input) => {
|
|
2
|
+
const state = {
|
|
3
|
+
sequence: input.sequence,
|
|
4
|
+
transition_id: input.transition.id,
|
|
5
|
+
state_before: input.stateBefore,
|
|
6
|
+
trigger_event_ids: input.triggerEventIds,
|
|
7
|
+
action_event_ids: input.effectResults.map(({ observation }) => observation.event_id),
|
|
8
|
+
action_types: input.transition.actions.map(({ type }) => type),
|
|
9
|
+
};
|
|
10
|
+
return input.transition.target.kind === "finish"
|
|
11
|
+
? {
|
|
12
|
+
...state,
|
|
13
|
+
state_after: null,
|
|
14
|
+
outcome: input.transition.target.outcome,
|
|
15
|
+
}
|
|
16
|
+
: {
|
|
17
|
+
...state,
|
|
18
|
+
state_after: input.transition.target.state,
|
|
19
|
+
outcome: null,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
1
22
|
const counterValue = (counters, id) => counters.find((counter) => counter.id === id)?.count ?? 0;
|
|
2
23
|
const incrementCounter = (counters, id) => {
|
|
3
24
|
let found = false;
|
|
@@ -13,22 +34,15 @@ const incrementCounter = (counters, id) => {
|
|
|
13
34
|
const applyProcessReactiveTransition = (input) => {
|
|
14
35
|
if (input.effectResults.length !== input.transition.actions.length)
|
|
15
36
|
throw new TypeError("Reactive transition effects do not match the admitted actions");
|
|
16
|
-
const
|
|
17
|
-
? input.transition.target.outcome
|
|
18
|
-
: null;
|
|
19
|
-
const stateAfter = input.transition.target.kind === "goto"
|
|
20
|
-
? input.transition.target.state
|
|
21
|
-
: null;
|
|
22
|
-
const record = {
|
|
37
|
+
const record = createTransitionRecord({
|
|
23
38
|
sequence: input.snapshot.transitions.length,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
};
|
|
39
|
+
stateBefore: input.snapshot.active_state,
|
|
40
|
+
transition: input.transition,
|
|
41
|
+
triggerEventIds: input.triggerEventIds,
|
|
42
|
+
effectResults: input.effectResults,
|
|
43
|
+
});
|
|
44
|
+
const outcome = record.outcome;
|
|
45
|
+
const stateAfter = record.state_after;
|
|
32
46
|
const consumed = new Set(input.snapshot.consumed_event_ids);
|
|
33
47
|
for (const eventId of input.consumeEventIds)
|
|
34
48
|
consumed.add(eventId);
|
|
@@ -45,10 +59,8 @@ const applyProcessReactiveTransition = (input) => {
|
|
|
45
59
|
});
|
|
46
60
|
}
|
|
47
61
|
const completedCaptureOrder = Math.max(input.observation.capture_order, ...input.effectResults.map(({ observation }) => observation.capture_order));
|
|
48
|
-
|
|
62
|
+
const nextState = {
|
|
49
63
|
...input.snapshot,
|
|
50
|
-
status: outcome === null ? "running" : "finished",
|
|
51
|
-
outcome,
|
|
52
64
|
active_state: stateAfter ?? input.snapshot.active_state,
|
|
53
65
|
state_entry_capture_order: stateAfter === null
|
|
54
66
|
? input.snapshot.state_entry_capture_order
|
|
@@ -61,6 +73,9 @@ const applyProcessReactiveTransition = (input) => {
|
|
|
61
73
|
checkpoints,
|
|
62
74
|
transitions: [...input.snapshot.transitions, record],
|
|
63
75
|
};
|
|
76
|
+
let next = outcome === null
|
|
77
|
+
? { ...nextState, status: "running", outcome: null }
|
|
78
|
+
: { ...nextState, status: "finished", outcome };
|
|
64
79
|
if (stateAfter !== null) {
|
|
65
80
|
const nextState = input.scenario.states.find(({ id }) => id === stateAfter);
|
|
66
81
|
if (nextState === undefined ||
|