rea-agents 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -12,6 +12,27 @@ const reference = z.strictObject({
12
12
  indirect: z.boolean(),
13
13
  computed: z.boolean(),
14
14
  operand_index: z.number().int(),
15
+ source_address: z.string().min(1).nullable().optional(),
16
+ data: z.boolean().nullable().optional(),
17
+ read: z.boolean().nullable().optional(),
18
+ write: z.boolean().nullable().optional(),
19
+ primary: z
20
+ .boolean()
21
+ .nullable()
22
+ .optional()
23
+ .describe("Provider primary-reference status, not proof of literal addressing or a runtime access. Null or omission means unavailable."),
24
+ provenance: z
25
+ .string()
26
+ .min(1)
27
+ .nullable()
28
+ .optional()
29
+ .describe("Provider subsystem reporting this reference; null or omission means unavailable."),
30
+ source: z
31
+ .string()
32
+ .min(1)
33
+ .nullable()
34
+ .optional()
35
+ .describe("Provider reference origin, such as analysis, default, imported or user_defined; null or omission means unavailable."),
15
36
  });
16
37
  /** Provider-decoded facts for one instruction; operand tokens preserve their native ordering. */
17
38
  export const nativeInstructionSchema = z.strictObject({
@@ -4,6 +4,8 @@ const relatedType = z.strictObject({ address, type: z.string().nullable() });
4
4
  /** Runtime-format metadata recovered in an analysis image, with explicit inference boundaries. */
5
5
  export const nativeMetadataRecoverySchema = z.strictObject({
6
6
  format: z.literal("dotnet-nativeaot"),
7
+ /** Identifies parser-only facts without claiming Ghidra defined a DataType. */
8
+ source: z.enum(["analysis-database", "read-only-derived-overlay"]).optional(),
7
9
  status: z.enum(["complete", "partial"]),
8
10
  header_address: address,
9
11
  format_major: z.number().int().nonnegative(),
@@ -21,18 +23,25 @@ export const nativeMetadataRecoverySchema = z.strictObject({
21
23
  procedure_name: z.string().nullable(),
22
24
  basis: z.literal("method-table-pointer"),
23
25
  })),
24
- derived_memory: z.strictObject({
26
+ derived_memory: z
27
+ .strictObject({
25
28
  address,
26
29
  size_bytes: z.number().int().nonnegative(),
27
30
  sha256: z.string().regex(/^[a-f0-9]{64}$/u),
28
31
  file_offset: z.null(),
29
- }),
32
+ })
33
+ .nullable(),
34
+ truncated: z.boolean().optional(),
35
+ virtual_slots_omitted: z.number().int().nonnegative().optional(),
36
+ interfaces_omitted: z.number().int().nonnegative().optional(),
37
+ output_budget_bytes: z.number().int().nonnegative().optional(),
30
38
  diagnostics: z.array(z.string()),
31
39
  limitations: z.array(z.string()),
32
40
  });
33
41
  /** Discover a recovered runtime format and reusable type identities from the loaded image. */
34
42
  export const nativeMetadataRecoverySummarySchema = z.strictObject({
35
43
  format: z.literal("dotnet-nativeaot"),
44
+ analysis_mode: z.literal("read-only-derived-overlay").optional(),
36
45
  status: z.enum(["complete", "partial", "not_applicable"]),
37
46
  reason: z.string().nullable(),
38
47
  analysis_artifact_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
@@ -42,12 +51,76 @@ export const nativeMetadataRecoverySummarySchema = z.strictObject({
42
51
  format_minor: z.number().int().nonnegative().nullable(),
43
52
  method_tables: z.number().int().nonnegative(),
44
53
  types: z.array(relatedType),
45
- derived_memory: nativeMetadataRecoverySchema.shape.derived_memory.nullable(),
54
+ frozen_strings: z
55
+ .array(z.strictObject({ address, value: z.string() }))
56
+ .optional(),
57
+ truncated: z.boolean().optional(),
58
+ types_omitted: z.number().int().nonnegative().optional(),
59
+ frozen_strings_omitted: z.number().int().nonnegative().optional(),
60
+ output_budget_bytes: z.number().int().nonnegative().optional(),
61
+ derived_overlay: z
62
+ .strictObject({
63
+ address,
64
+ size_bytes: z.number().int().nonnegative(),
65
+ sha256: z.string().regex(/^[a-f0-9]{64}$/u),
66
+ })
67
+ .nullable()
68
+ .optional(),
69
+ derived_memory: nativeMetadataRecoverySchema.shape.derived_memory,
46
70
  coverage: z
47
71
  .strictObject({
48
- frozen_object_candidates: z.number().int().nonnegative(),
49
- frozen_objects_annotated: z.number().int().nonnegative(),
50
- basis: z.literal("rehydrated-pointer-candidates-and-committed-instance-types"),
72
+ frozen_object_candidates: z.number().int().nonnegative().optional(),
73
+ frozen_objects_annotated: z.number().int().nonnegative().optional(),
74
+ pointer_candidates_examined: z.number().int().nonnegative().optional(),
75
+ pointer_slots_examined: z.number().int().nonnegative().optional(),
76
+ scan_bytes_examined: z.number().int().nonnegative().optional(),
77
+ scan_bytes_omitted: z.number().int().nonnegative().optional(),
78
+ rtr_signature_scan_bytes_examined: z
79
+ .number()
80
+ .int()
81
+ .nonnegative()
82
+ .optional(),
83
+ rtr_signature_scan_bytes_omitted: z
84
+ .number()
85
+ .int()
86
+ .nonnegative()
87
+ .optional(),
88
+ method_table_validation_items_examined: z
89
+ .number()
90
+ .int()
91
+ .nonnegative()
92
+ .optional(),
93
+ work_units_examined: z.number().int().nonnegative().optional(),
94
+ method_tables_recovered: z.number().int().nonnegative().optional(),
95
+ frozen_string_candidates: z.number().int().nonnegative().optional(),
96
+ frozen_scan_bytes_examined: z.number().int().nonnegative().optional(),
97
+ frozen_scan_bytes_omitted: z.number().int().nonnegative().optional(),
98
+ frozen_string_data_bytes_examined: z
99
+ .number()
100
+ .int()
101
+ .nonnegative()
102
+ .optional(),
103
+ source_bytes_examined: z.number().int().nonnegative().optional(),
104
+ source_bytes_omitted: z.number().int().nonnegative().optional(),
105
+ source_byte_budget_bytes: z.number().int().nonnegative().optional(),
106
+ work_budget_units: z.number().int().nonnegative().optional(),
107
+ working_memory_budget_bytes: z.number().int().nonnegative().optional(),
108
+ working_memory_bytes_peak: z.number().int().nonnegative().optional(),
109
+ truncation_reason: z
110
+ .enum([
111
+ "source-byte-budget",
112
+ "work-unit-budget",
113
+ "working-memory-budget",
114
+ "response-budget",
115
+ ])
116
+ .optional(),
117
+ basis: z.enum([
118
+ "rehydrated-pointer-candidates-and-committed-instance-types",
119
+ "raw-image-pointer-scan",
120
+ "raw-image-and-rehydrated-pointer-scan",
121
+ "unsupported-layout",
122
+ "no-rtr-header",
123
+ ]),
51
124
  })
52
125
  .nullable(),
53
126
  diagnostics: z.array(z.string()),
@@ -0,0 +1,94 @@
1
+ import { z } from "zod";
2
+ const uint = z.number().int().min(0).max(0xffffffff);
3
+ const range = z.strictObject({ offset: uint, bytes: uint });
4
+ const identity = z.discriminatedUnion("kind", [
5
+ z.strictObject({ kind: z.literal("id"), id: uint }),
6
+ z.strictObject({
7
+ kind: z.literal("name"),
8
+ name: z.string(),
9
+ utf16le_hex: z.string().regex(/^(?:[0-9a-f]{4})*$/),
10
+ location: range,
11
+ }),
12
+ ]);
13
+ /** Complete bounded inspection of a caller-selected PE image, without execution. */
14
+ export const inspectPeResourcesInputSchema = z.strictObject({
15
+ path: z.string().min(1).describe("Absolute filesystem path to a PE image"),
16
+ max_file_bytes: z
17
+ .number()
18
+ .int()
19
+ .min(64)
20
+ .max(536870912)
21
+ .default(67108864)
22
+ .describe("Maximum stable artifact bytes to read (default 64 MiB)"),
23
+ max_entries: z
24
+ .number()
25
+ .int()
26
+ .min(1)
27
+ .max(65536)
28
+ .default(4096)
29
+ .describe("Maximum resource directory entries to examine; exceeding the budget fails without partial success"),
30
+ });
31
+ /** Original file/RVA locations and resource identities; icon edges are static relationships. */
32
+ export const peResourcesSchema = z.strictObject({
33
+ artifact: z.strictObject({
34
+ path: z.string().min(1),
35
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
36
+ bytes: uint,
37
+ }),
38
+ format: z.enum(["pe32", "pe32-plus"]),
39
+ machine: uint,
40
+ directory: z
41
+ .strictObject({
42
+ rva: uint,
43
+ location: range,
44
+ data_directory_location: range,
45
+ })
46
+ .nullable(),
47
+ directories: z.array(z.strictObject({
48
+ location: range,
49
+ characteristics: uint,
50
+ timestamp: uint,
51
+ major_version: uint,
52
+ minor_version: uint,
53
+ named_entries: uint,
54
+ id_entries: uint,
55
+ })),
56
+ resources: z.array(z.strictObject({
57
+ index: uint,
58
+ type: identity,
59
+ name: identity,
60
+ language: identity,
61
+ entry_locations: z.array(range).length(3),
62
+ data_entry_location: range,
63
+ code_page: uint,
64
+ reserved: uint,
65
+ payload: z.strictObject({
66
+ rva: uint,
67
+ location: range,
68
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
69
+ }),
70
+ })),
71
+ icon_groups: z.array(z.strictObject({
72
+ resource_index: uint,
73
+ images: z.array(z.strictObject({
74
+ location: range,
75
+ width: uint,
76
+ height: uint,
77
+ color_count: uint,
78
+ reserved: uint,
79
+ planes: uint,
80
+ bit_count: uint,
81
+ declared_bytes: uint,
82
+ resource_id: uint,
83
+ candidate_resource_indices: z.array(uint),
84
+ same_language_resource_index: uint.nullable(),
85
+ size_matches: z.boolean().nullable(),
86
+ })),
87
+ })),
88
+ coverage: z.strictObject({
89
+ status: z.literal("complete"),
90
+ examined_entries: uint,
91
+ resources: uint,
92
+ }),
93
+ limitations: z.array(z.string()),
94
+ });
@@ -0,0 +1,33 @@
1
+ /** Path-segment conventions. These are inferences, not observations of runtime behavior. */
2
+ const foldSegment = (segment) => segment.toLocaleLowerCase("en-US");
3
+ const REACT_NATIVE_SEGMENTS = new Set([
4
+ "react.framework",
5
+ "reactnative.framework",
6
+ "libreactnative.so",
7
+ "libreactnativejni.so",
8
+ "libhermes_executor.so",
9
+ "libhermes.so",
10
+ "hermes.framework",
11
+ ]);
12
+ const FLUTTER_SEGMENTS = new Set(["libflutter.so", "flutter.framework"]);
13
+ const UNITY_SEGMENTS = new Set(["libunity.so", "unityframework.framework"]);
14
+ /**
15
+ * A runtime family named by one filename or directory segment.
16
+ * Only recognized complete library and framework names establish a convention.
17
+ */
18
+ export const nativeRuntimeConvention = (path) => {
19
+ for (const segment of path.split("/")) {
20
+ const folded = foldSegment(segment);
21
+ if (REACT_NATIVE_SEGMENTS.has(folded))
22
+ return "react-native";
23
+ if (FLUTTER_SEGMENTS.has(folded))
24
+ return "flutter";
25
+ if (UNITY_SEGMENTS.has(folded))
26
+ return "unity";
27
+ }
28
+ return null;
29
+ };
30
+ /** Swift runtime libraries are `libswift*.dylib` segments, not every dynamic library. */
31
+ export const isSwiftRuntimeLibrary = (path) => path
32
+ .split("/")
33
+ .some((segment) => /^libswift.+\.dylib$/u.test(foldSegment(segment)));
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { jsonValueSchema } from "../jsonValue.js";
3
3
  import { normalizationSchema } from "./processScenario.js";
4
- import { collectProcessCaptureIssues } from "./processCaptureValidation.js";
4
+ import { collectProcessCaptureIssues, finalizationAgreementIssue, finalizationConsistencyIssue, finalizationManifestIssue, } from "./processCaptureValidation.js";
5
5
  import { filesystemCoverageSchema, processCaptureTruncationDetailsSchema, } from "./processCaptureCoverage.js";
6
6
  /** Capture collection whose members participate in global observation order. */
7
7
  export const PROCESS_CAPTURE_EVENT_COLLECTIONS = [
@@ -88,6 +88,40 @@ const processSettlementSchema = z.discriminatedUnion("state", [
88
88
  }),
89
89
  ]);
90
90
  const unverifiedCleanupProcessesSchema = z.array(z.strictObject({ pid: z.number().int().positive(), reason: z.string() }));
91
+ const processCaptureFinalizationSchema = z
92
+ .strictObject({
93
+ requested_ms: z.number().int().safe().positive(),
94
+ elapsed_ms: z.number().int().nonnegative().nullable(),
95
+ exit_code: z.number().int().nonnegative().nullable(),
96
+ signals: z
97
+ .array(z.strictObject({
98
+ signal: z.enum(["SIGTERM", "SIGKILL"]),
99
+ sent_at_ms: z.number().int().nonnegative(),
100
+ delivery: z.enum([
101
+ "signaled",
102
+ "gone",
103
+ "identity-changed",
104
+ "unverified",
105
+ ]),
106
+ reason: z.string().min(1).optional(),
107
+ }))
108
+ .min(1),
109
+ })
110
+ .superRefine((finalization, context) => {
111
+ if (finalization.exit_code !== null && finalization.elapsed_ms === null)
112
+ context.addIssue({
113
+ code: "custom",
114
+ path: ["exit_code"],
115
+ message: "finalization exit_code requires an observed exit",
116
+ });
117
+ for (const [index, attempt] of finalization.signals.entries())
118
+ if (attempt.reason !== undefined && attempt.delivery !== "unverified")
119
+ context.addIssue({
120
+ code: "custom",
121
+ path: ["signals", index, "reason"],
122
+ message: "finalization reason is only allowed for an unverified delivery",
123
+ });
124
+ });
91
125
  const processCaptureShapeSchema = z.strictObject({
92
126
  manifest: z.strictObject({
93
127
  rea_version: z.string().min(1),
@@ -145,6 +179,7 @@ const processCaptureShapeSchema = z.strictObject({
145
179
  code: z.number().int().nullable(),
146
180
  signal: z.number().int().nullable(),
147
181
  reason: z.enum(["exited", "timeout", "idle_timeout"]),
182
+ finalization: processCaptureFinalizationSchema.optional(),
148
183
  }),
149
184
  settlement: z.discriminatedUnion("state", [
150
185
  z.object({
@@ -221,7 +256,9 @@ const incompleteProcessCaptureObservationsSchema = z.strictObject({
221
256
  code: z.number().int().nullable(),
222
257
  signal: z.number().int().nullable(),
223
258
  reason: z.enum(["exited", "timeout", "idle_timeout", "cancelled"]),
259
+ finalization: processCaptureFinalizationSchema.optional(),
224
260
  })),
261
+ finalization: partialObservationFieldSchema(processCaptureFinalizationSchema).optional(),
225
262
  settlement: partialObservationFieldSchema(z.strictObject({
226
263
  state: z.enum(["quiesced", "alive_at_deadline", "unverifiable"]),
227
264
  elapsed_ms: z.number().int().nonnegative(),
@@ -265,6 +302,59 @@ export const partialProcessCaptureObservationSchema = z
265
302
  path: ["execution_failure"],
266
303
  message: "partial observations require incomplete cleanup or an execution failure",
267
304
  });
305
+ const observedExit = "capture" in partial
306
+ ? partial.capture.exit
307
+ : partial.observations.exit.state === "available"
308
+ ? partial.observations.exit.value
309
+ : undefined;
310
+ const observedFinalization = "observations" in partial &&
311
+ partial.observations.finalization?.state === "available"
312
+ ? partial.observations.finalization.value
313
+ : undefined;
314
+ const committedManifest = "capture" in partial
315
+ ? partial.capture.manifest
316
+ : partial.observations.manifest.state === "available"
317
+ ? partial.observations.manifest.value
318
+ : undefined;
319
+ const manifestFinalizationIssue = finalizationManifestIssue(committedManifest?.scenario, committedManifest?.comparison_contract);
320
+ const exitFinalizationIssue = manifestFinalizationIssue ??
321
+ (observedExit === undefined
322
+ ? undefined
323
+ : finalizationConsistencyIssue(observedExit, committedManifest?.scenario, committedManifest?.comparison_contract));
324
+ const incompleteFinalizationIssue = manifestFinalizationIssue ??
325
+ (observedFinalization === undefined
326
+ ? undefined
327
+ : finalizationConsistencyIssue(observedExit === undefined
328
+ ? undefined
329
+ : { reason: observedExit.reason, signal: observedExit.signal }, committedManifest?.scenario, committedManifest?.comparison_contract, { finalization: observedFinalization, allowNullElapsedMs: true }));
330
+ if (exitFinalizationIssue !== undefined)
331
+ context.addIssue({
332
+ code: "custom",
333
+ path: ["exit"],
334
+ message: exitFinalizationIssue,
335
+ });
336
+ if (incompleteFinalizationIssue !== undefined)
337
+ context.addIssue({
338
+ code: "custom",
339
+ path: ["finalization"],
340
+ message: incompleteFinalizationIssue,
341
+ });
342
+ const agreementIssue = finalizationAgreementIssue(observedExit?.finalization, observedFinalization);
343
+ if (agreementIssue !== undefined)
344
+ context.addIssue({
345
+ code: "custom",
346
+ path: ["finalization"],
347
+ message: agreementIssue,
348
+ });
349
+ if ("observations" in partial &&
350
+ partial.observations.exit.state === "unavailable" &&
351
+ observedFinalization !== undefined &&
352
+ observedFinalization?.elapsed_ms !== null)
353
+ context.addIssue({
354
+ code: "custom",
355
+ path: ["finalization"],
356
+ message: "finalization elapsed_ms must be null when the exit observation is unavailable",
357
+ });
268
358
  if ("observations" in partial) {
269
359
  const { observations } = partial;
270
360
  if (![
@@ -106,3 +106,27 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
106
106
  temporary_root: "removed",
107
107
  },
108
108
  };
109
+ const finalizedScenario = { ...scenario, finalization_ms: 1_500 };
110
+ const finalizedComparisonContract = { finalization_ms: 1_500 };
111
+ /** Valid capture of a timeout that finalized: SIGTERM delivered, exit observed. */
112
+ export const FINALIZED_PROCESS_CAPTURE_EXAMPLE = {
113
+ ...EMPTY_PROCESS_CAPTURE_EXAMPLE,
114
+ manifest: {
115
+ ...EMPTY_PROCESS_CAPTURE_EXAMPLE.manifest,
116
+ scenario: finalizedScenario,
117
+ comparison_contract: finalizedComparisonContract,
118
+ full_scenario_sha256: digestProcessCommitment(finalizedScenario),
119
+ comparison_contract_sha256: digestProcessCommitment(finalizedComparisonContract),
120
+ },
121
+ exit: {
122
+ code: null,
123
+ signal: 0,
124
+ reason: "timeout",
125
+ finalization: {
126
+ requested_ms: 1_500,
127
+ elapsed_ms: 12,
128
+ exit_code: 0,
129
+ signals: [{ signal: "SIGTERM", sent_at_ms: 0, delivery: "signaled" }],
130
+ },
131
+ },
132
+ };
@@ -64,6 +64,83 @@ const validateEventJournal = (capture, require) => {
64
64
  require(journal.length ===
65
65
  expectedSize, "event_journal", "nonempty journal must reference every captured observation");
66
66
  };
67
+ /**
68
+ * The committed comparison contract carries `finalization_ms` exactly when the
69
+ * committed scenario does, with the same value. Independent of the exit, so a
70
+ * partial capture with an unavailable exit is still checked.
71
+ */
72
+ export const finalizationManifestIssue = (committedScenario, committedComparison) => committedScenario !== undefined &&
73
+ committedComparison !== undefined &&
74
+ committedScenario["finalization_ms"] !==
75
+ committedComparison["finalization_ms"]
76
+ ? "comparison_contract finalization_ms must match the committed scenario"
77
+ : undefined;
78
+ /** Ensure incomplete exit and sibling finalization observations preserve one fact. */
79
+ export const finalizationAgreementIssue = (exitFinalization, observedFinalization) => exitFinalization !== undefined &&
80
+ observedFinalization !== undefined &&
81
+ JSON.stringify(exitFinalization) !== JSON.stringify(observedFinalization)
82
+ ? "exit finalization and finalization observation must agree"
83
+ : undefined;
84
+ /**
85
+ * Cross-field rule for `exit.finalization`, shared by complete and partial
86
+ * captures. Returns the violated rule, or undefined when the record is
87
+ * consistent.
88
+ */
89
+ export const finalizationConsistencyIssue = (exit, committedScenario, committedComparison, options) => {
90
+ const manifestIssue = finalizationManifestIssue(committedScenario, committedComparison);
91
+ if (manifestIssue !== undefined)
92
+ return manifestIssue;
93
+ const finalization = exit?.finalization ?? options?.finalization;
94
+ if (finalization === undefined) {
95
+ // A deadline that fired under a committed interval must have attempted
96
+ // finalization; cancellation before the deadline legitimately has none.
97
+ const committed = committedScenario?.["finalization_ms"];
98
+ return (exit?.reason === "timeout" || exit?.reason === "idle_timeout") &&
99
+ typeof committed === "number" &&
100
+ committed > 0
101
+ ? "a deadline exit under a committed finalization_ms requires finalization evidence"
102
+ : undefined;
103
+ }
104
+ if (exit?.reason === "exited")
105
+ return "finalization requires a deadline exit reason";
106
+ const first = finalization.signals[0];
107
+ if (first?.signal !== "SIGTERM")
108
+ return "finalization signals must start with SIGTERM";
109
+ const killIndexes = finalization.signals.flatMap(({ signal }, index) => signal === "SIGKILL" ? [index] : []);
110
+ if (killIndexes.length > 1 ||
111
+ (killIndexes[0] !== undefined &&
112
+ killIndexes[0] !== finalization.signals.length - 1))
113
+ return "finalization may contain at most one final SIGKILL";
114
+ if (!finalization.signals.every(({ sent_at_ms }, index) => {
115
+ const previous = finalization.signals[index - 1];
116
+ return previous === undefined || sent_at_ms >= previous.sent_at_ms;
117
+ }))
118
+ return "finalization signal attempt times must not decrease";
119
+ if (finalization.signals.filter(({ signal }) => signal === "SIGTERM").length !==
120
+ 1)
121
+ return "finalization must attempt SIGTERM exactly once";
122
+ const kill = finalization.signals.find(({ signal }) => signal === "SIGKILL");
123
+ if (kill !== undefined &&
124
+ kill.sent_at_ms < finalization.requested_ms &&
125
+ exit !== undefined &&
126
+ exit.reason !== "cancelled")
127
+ return "finalization SIGKILL cannot precede the requested interval";
128
+ if (finalization.elapsed_ms === null && options?.allowNullElapsedMs !== true)
129
+ return "finalization requires an observed elapsed_ms";
130
+ if (finalization.exit_code !== null &&
131
+ exit?.signal !== undefined &&
132
+ exit.signal !== null &&
133
+ exit.signal !== 0)
134
+ return "finalization exit_code requires an exit not caused by a signal";
135
+ if (finalization.elapsed_ms !== null &&
136
+ finalization.elapsed_ms <
137
+ (finalization.signals.at(-1)?.sent_at_ms ?? first.sent_at_ms))
138
+ return "finalization elapsed_ms cannot precede the last signal attempt";
139
+ if (committedScenario !== undefined &&
140
+ committedScenario["finalization_ms"] !== finalization.requested_ms)
141
+ return "finalization must match the committed finalization_ms";
142
+ return undefined;
143
+ };
67
144
  const validateLifecycle = (capture, require) => {
68
145
  require(capture.filesystem_checkpoints.map(({ name }) => name).join(",") ===
69
146
  "before,after_settlement", "filesystem_checkpoints", "capture must include initial and final filesystem snapshots");
@@ -73,6 +150,8 @@ const validateLifecycle = (capture, require) => {
73
150
  require(capture.exit.reason === "exited" ||
74
151
  capture.exit.code ===
75
152
  null, "exit", "deadline termination cannot declare a normal exit code");
153
+ const finalizationIssue = finalizationConsistencyIssue(capture.exit, capture.manifest.scenario, capture.manifest.comparison_contract);
154
+ require(finalizationIssue === undefined, "exit", finalizationIssue ?? "");
76
155
  };
77
156
  const validateCoverage = (capture, require) => {
78
157
  const details = capture.truncation_details;
@@ -2,6 +2,12 @@ import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
4
  const positiveBudget = z.number().int().safe().positive();
5
+ /**
6
+ * Maximum xterm backing cells for one visible-plus-scrollback buffer. Each
7
+ * xterm BufferLine stores three Uint32 words per cell (12 MB at this cap),
8
+ * before row objects, serialization strings, and retained frame copies.
9
+ */
10
+ export const PROCESS_TERMINAL_CELL_BUDGET = 1_000_000;
5
11
  const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
6
12
  const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
7
13
  const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
@@ -34,6 +40,7 @@ const environmentName = z
34
40
  const childProcessString = z
35
41
  .string()
36
42
  .regex(/^[^\x00]*$/u, "Values passed to operating-system APIs cannot contain NUL");
43
+ const fitsProcessTerminalCellBudget = (columns, rows, scrollback) => rows + scrollback <= Math.floor(PROCESS_TERMINAL_CELL_BUDGET / columns);
37
44
  export const normalizationSchema = z.object({
38
45
  paths: z.boolean(),
39
46
  pids: z.boolean(),
@@ -60,11 +67,17 @@ const committedScenarioEvents = (events, includeSensitiveInputLength) => events.
60
67
  }
61
68
  : event);
62
69
  /** Build the caller-selected scenario projection committed by process-capture Evidence. */
63
- export const processScenarioCommitment = (scenario, executableSha256) => ({
64
- ...scenario,
65
- events: committedScenarioEvents(scenario.events, true),
66
- executable_sha256: executableSha256 ?? null,
67
- });
70
+ export const processScenarioCommitment = (scenario, executableSha256) => {
71
+ // A zero interval is today's immediate kill; leaving it out keeps the
72
+ // committed identity of every scenario that predates the field unchanged.
73
+ const { finalization_ms: finalizationMs, ...committed } = scenario;
74
+ return {
75
+ ...committed,
76
+ ...(finalizationMs > 0 ? { finalization_ms: finalizationMs } : {}),
77
+ events: committedScenarioEvents(scenario.events, true),
78
+ executable_sha256: executableSha256 ?? null,
79
+ };
80
+ };
68
81
  /** Project observation settings shared by capture and reconstruction. */
69
82
  export const processComparisonContract = (scenario) => ({
70
83
  working_directory: scenario.working_directory,
@@ -79,11 +92,18 @@ export const processComparisonContract = (scenario) => ({
79
92
  timeout_ms: scenario.timeout_ms,
80
93
  idle_timeout_ms: scenario.idle_timeout_ms,
81
94
  settle_ms: scenario.settle_ms,
95
+ ...(scenario.finalization_ms > 0
96
+ ? { finalization_ms: scenario.finalization_ms }
97
+ : {}),
82
98
  limits: scenario.limits,
83
99
  normalization: scenario.normalization,
84
100
  ...(scenario.normalization.ports
85
101
  ? { port_normalization_version: "contextual-endpoints-v2" }
86
102
  : {}),
103
+ ...(scenario.normalization.patterns.length > 0
104
+ ? { pattern_normalization_version: "literal-replacements-v1" }
105
+ : {}),
106
+ rendered_line_format: "trailing-spaces-trimmed-v1",
87
107
  });
88
108
  /**
89
109
  * Boundary schema for one bounded process experiment.
@@ -102,8 +122,9 @@ export const processScenarioSchema = z
102
122
  .strictObject({
103
123
  columns: z.number().int().min(1).max(65_535).default(80),
104
124
  rows: z.number().int().min(1).max(65_535).default(24),
105
- scrollback: z.number().int().min(0).default(1_000),
125
+ scrollback: z.number().int().safe().nonnegative().default(1_000),
106
126
  })
127
+ .describe("The visible terminal and scrollback together must use at most 1,000,000 xterm renderer cells: columns × (rows + scrollback). Resize events use the same scrollback and limit.")
107
128
  .default({ columns: 80, rows: 24, scrollback: 1_000 }),
108
129
  events: z
109
130
  .array(z.discriminatedUnion("type", [
@@ -129,6 +150,13 @@ export const processScenarioSchema = z
129
150
  timeout_ms: positiveBudget.default(30_000),
130
151
  idle_timeout_ms: positiveBudget.default(30_000),
131
152
  settle_ms: z.number().int().safe().nonnegative().default(100),
153
+ finalization_ms: z
154
+ .number()
155
+ .int()
156
+ .safe()
157
+ .nonnegative()
158
+ .default(0)
159
+ .describe("Milliseconds a target may keep running after SIGTERM when timeout_ms or idle_timeout_ms fires, before SIGKILL; 0 sends SIGKILL immediately. Both signals reach the captured root only while its launch-time start identity still matches; cancellation ends the run at once."),
132
160
  limits: z
133
161
  .strictObject({
134
162
  output_bytes: positiveBudget.default(1_000_000),
@@ -169,6 +197,23 @@ export const processScenarioSchema = z
169
197
  }),
170
198
  })
171
199
  .superRefine((scenario, context) => {
200
+ // Each budget is a safe integer, but their sum is not checked anywhere
201
+ // else. BigInt keeps the comparison exact beyond the representable range.
202
+ const lifecycleBudget = BigInt(scenario.timeout_ms) +
203
+ BigInt(scenario.finalization_ms) +
204
+ BigInt(scenario.settle_ms);
205
+ if (lifecycleBudget > BigInt(Number.MAX_SAFE_INTEGER))
206
+ context.addIssue({
207
+ code: "custom",
208
+ message: `timeout_ms + finalization_ms + settle_ms must stay at or below ${String(Number.MAX_SAFE_INTEGER)} ms, the largest total exactly representable as a JavaScript number`,
209
+ path: ["timeout_ms"],
210
+ });
211
+ if (!fitsProcessTerminalCellBudget(scenario.terminal.columns, scenario.terminal.rows, scenario.terminal.scrollback))
212
+ context.addIssue({
213
+ code: "custom",
214
+ path: ["terminal"],
215
+ message: `terminal columns × (rows + scrollback) must not exceed ${String(PROCESS_TERMINAL_CELL_BUDGET)} renderer cells`,
216
+ });
172
217
  for (let index = 1; index < scenario.events.length; index += 1) {
173
218
  const event = scenario.events[index];
174
219
  const previous = scenario.events[index - 1];
@@ -180,7 +225,14 @@ export const processScenarioSchema = z
180
225
  });
181
226
  }
182
227
  }
183
- for (const event of scenario.events) {
228
+ for (const [index, event] of scenario.events.entries()) {
229
+ if (event.type === "resize" &&
230
+ !fitsProcessTerminalCellBudget(event.columns, event.rows, scenario.terminal.scrollback))
231
+ context.addIssue({
232
+ code: "custom",
233
+ path: ["events", index],
234
+ message: `resize event at ${String(event.at_ms)} ms exceeds the ${String(PROCESS_TERMINAL_CELL_BUDGET)}-cell renderer budget with the selected scrollback`,
235
+ });
184
236
  if (event.at_ms > scenario.timeout_ms) {
185
237
  context.addIssue({
186
238
  code: "custom",
@@ -2,7 +2,9 @@ import { parse } from "plist";
2
2
  /** The dictionary key REA results cannot carry: validation strips it. */
3
3
  const PROTOTYPE_KEY = "__proto__";
4
4
  /** Limitation for results whose source plist held `__proto__` entries. */
5
- export const omittedPrototypeKeysLimitation = (count) => `${String(count)} dictionary ${count === 1 ? "entry" : "entries"} keyed __proto__ ${count === 1 ? "was" : "were"} omitted because REA results cannot represent that key.`;
5
+ export const omittedPrototypeKeysLimitation = (count) => count === null
6
+ ? "Dictionary entries keyed __proto__ were omitted because REA results cannot represent that key."
7
+ : `${String(count)} dictionary ${count === 1 ? "entry" : "entries"} keyed __proto__ ${count === 1 ? "was" : "were"} omitted because REA results cannot represent that key.`;
6
8
  const withoutKey = (value, key) => {
7
9
  let omitted = 0;
8
10
  const strip = (item) => {