rea-agents 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +24 -23
  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/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -56,6 +56,49 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
56
56
  files_after: [],
57
57
  filesystem_effects: [],
58
58
  truncated: false,
59
+ truncation_details: {
60
+ raw_terminal: {
61
+ budget_bytes: 1_000_000,
62
+ observed_bytes: 0,
63
+ retained_bytes: 0,
64
+ observed_frames: 0,
65
+ retained_frames: 0,
66
+ },
67
+ rendered_terminal: {
68
+ budget_bytes: 1_000_000,
69
+ observed_bytes: 0,
70
+ retained_bytes: 0,
71
+ observed_frames: 0,
72
+ retained_frames: 0,
73
+ },
74
+ filesystem_before: {
75
+ files_limit: 10_000,
76
+ depth_limit: 16,
77
+ enumeration_truncated: false,
78
+ enumeration_reasons: [],
79
+ hash_budget_bytes: 10_000_000,
80
+ hashed_bytes: 0,
81
+ hash_omissions: [],
82
+ },
83
+ filesystem_after: {
84
+ files_limit: 10_000,
85
+ depth_limit: 16,
86
+ enumeration_truncated: false,
87
+ enumeration_reasons: [],
88
+ hash_budget_bytes: 10_000_000,
89
+ hashed_bytes: 0,
90
+ hash_omissions: [],
91
+ },
92
+ process: {
93
+ sample_limit: 1_000,
94
+ sampling_partial: false,
95
+ retained_samples: 0,
96
+ sample_limit_reached: false,
97
+ sampling_failures: 0,
98
+ first_sampling_failure: null,
99
+ coverage: "sampled",
100
+ },
101
+ },
59
102
  limitations: [],
60
103
  residual_unknowns: [],
61
104
  cleanup: {
@@ -63,3 +106,27 @@ export const EMPTY_PROCESS_CAPTURE_EXAMPLE = {
63
106
  temporary_root: "removed",
64
107
  },
65
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,11 +150,11 @@ 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;
79
- if (details === undefined)
80
- return;
81
158
  require(details.process.retained_samples === capture.process_samples.length &&
82
159
  details.process.retained_samples <= details.process.sample_limit &&
83
160
  details.process.sampling_partial ===
@@ -134,7 +211,10 @@ const validateCoverage = (capture, require) => {
134
211
  new Set(coverage.hash_omissions.map(({ path }) => path)).size ===
135
212
  unhashedFiles.size &&
136
213
  coverage.hash_omissions.every((omission) => unhashedFiles.get(omission.path)?.size === omission.size_bytes &&
137
- omission.remaining_budget_bytes <= coverage.hash_budget_bytes), `truncation_details.${name}.hash_omissions`, "every retained regular file without a digest must have one matching omission reason");
214
+ omission.remaining_budget_bytes <= coverage.hash_budget_bytes &&
215
+ (omission.reason === "file_unavailable"
216
+ ? omission.system_code !== null
217
+ : omission.system_code === null)), `truncation_details.${name}.hash_omissions`, "every retained regular file without a digest must have one matching omission reason");
138
218
  require(coverage.hashed_bytes ===
139
219
  files
140
220
  .filter((file) => file.type === "file" && file.sha256 !== null)
@@ -202,19 +202,6 @@ const differingContractFields = (left, right) => [...new Set([...Object.keys(lef
202
202
  !Object.hasOwn(right, field) ||
203
203
  canonicalize(left[field]) !== canonicalize(right[field]))
204
204
  .sort();
205
- const truncatedComparison = () => ({
206
- status: "truncated",
207
- terminal: "truncated",
208
- interaction: "truncated",
209
- exit: "truncated",
210
- filesystem: "truncated",
211
- process: "truncated",
212
- first_divergence: {
213
- status: "unknown",
214
- reason: "At least one capture is truncated.",
215
- },
216
- limitations: ["At least one capture is truncated."],
217
- });
218
205
  const applyTraceVerdict = (dimensions, specification, trace, captures) => {
219
206
  const traceShowsDifference = processTraceOutcomesDiffer(trace);
220
207
  const traceStatus = trace.verdict === "unknown"
@@ -275,16 +262,6 @@ const compareDimensions = (left, right, sameNormalization) => {
275
262
  */
276
263
  export const compareProcessCaptures = (left, right, options = {}) => {
277
264
  assertComparable(left, right, options);
278
- if ((left.truncated && left.truncation_details === undefined) ||
279
- (right.truncated && right.truncation_details === undefined)) {
280
- const truncated = truncatedComparison();
281
- return options.traceSpecification === undefined
282
- ? truncated
283
- : {
284
- ...truncated,
285
- trace: compareProcessTraces(left, right, options.traceSpecification),
286
- };
287
- }
288
265
  const sameNormalization = sameJsonValue(left.normalization, right.normalization);
289
266
  const exactDimensions = compareDimensions(left, right, sameNormalization);
290
267
  const trace = options.traceSpecification === undefined
@@ -2,9 +2,15 @@ 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
- const ENVIRONMENT_NAME_CHARACTER = "[^=\\u0000]";
13
+ const ENVIRONMENT_NAME_CHARACTER = "[^=\\x00]";
8
14
  /**
9
15
  * Nonempty environment names other than the reserved run identifier. The
10
16
  * exclusion is spelled as a complement instead of a negative look-ahead,
@@ -18,7 +24,7 @@ const environmentNamePattern = (reserved) => {
18
24
  const character = reserved[index] ?? "";
19
25
  // Diverge here, match the next reserved character, or (after a nonempty
20
26
  // prefix) end the name early.
21
- const choice = `[^=\\u0000${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
27
+ const choice = `[^=\\x00${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
22
28
  rest = index === 0 ? choice : `(?:${choice})?`;
23
29
  }
24
30
  return new RegExp(`^(?:${rest})$`, "u");
@@ -33,7 +39,8 @@ const environmentName = z
33
39
  });
34
40
  const childProcessString = z
35
41
  .string()
36
- .regex(/^[^\u0000]*$/u, "Values passed to operating-system APIs cannot contain NUL");
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",
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { processSourceTruncated } from "./processCaptureCoverage.js";
3
- import { processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
4
- import { canonicalTraceJson, comparableTracePayload, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
3
+ import { comparableProcessObservationPayload, processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
4
+ import { canonicalTraceJson, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
5
5
  const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._\x2d]{0,63}$/u);
6
6
  const matchedEventSchema = z.strictObject({
7
7
  event_id: identifierSchema,
@@ -121,10 +121,10 @@ const matchRecords = (records, specification) => {
121
121
  for (const event of specification.events) {
122
122
  const ignoredFields = event.ignore_fields ?? [];
123
123
  ignoredFieldsBySource.set(event.source, ignoredFields);
124
- eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableTracePayload(event.exact, ignoredFields))}`, event);
124
+ eventsByKey.set(`${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`, event);
125
125
  }
126
126
  for (const record of records) {
127
- const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableTracePayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
127
+ const match = eventsByKey.get(`${record.source}\0${canonicalTraceJson(comparableProcessObservationPayload(record.payload, ignoredFieldsBySource.get(record.source)))}`);
128
128
  if (match === undefined)
129
129
  return failure({
130
130
  kind: "predicate",
@@ -86,8 +86,6 @@ export const canonicalTraceJson = (value) => {
86
86
  throw new TypeError("Trace specification contains a non-JSON value");
87
87
  return serialized;
88
88
  };
89
- /** Remove only explicitly declared schedule metadata before exact matching. */
90
- export const comparableTracePayload = (value, ignoredFields = []) => comparableProcessObservationPayload(value, ignoredFields);
91
89
  export const processTraceCardinalityBounds = (cardinality) => {
92
90
  switch (cardinality.kind) {
93
91
  case "required":
@@ -352,7 +350,7 @@ export const processTraceSpecificationSchema = specificationShapeSchema.superRef
352
350
  message: "exact payload must omit every ignored schedule field",
353
351
  path: ["events", index, "exact"],
354
352
  });
355
- const predicate = `${event.source}\0${canonicalTraceJson(comparableTracePayload(event.exact, ignoredFields))}`;
353
+ const predicate = `${event.source}\0${canonicalTraceJson(comparableProcessObservationPayload(event.exact, ignoredFields))}`;
356
354
  if (predicates.has(predicate))
357
355
  context.addIssue({
358
356
  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) => {
@@ -7,8 +7,12 @@ export class ProviderCleanupError extends ProviderAdapterError {
7
7
  constructor(providerId, resources, diagnostics,
8
8
  /** Identify the operation owning these resources; binary callers retain their default. */
9
9
  options) {
10
- const { operation = "close_binary", ...errorOptions } = options ?? {};
11
- super(providerId, operation, { ...errorOptions, diagnostics });
10
+ const { operation = "close_binary", partialObservation, ...errorOptions } = options ?? {};
11
+ super(providerId, operation, {
12
+ ...errorOptions,
13
+ ...(partialObservation === undefined ? {} : { partialObservation }),
14
+ diagnostics,
15
+ });
12
16
  this.cleanupResources = [...resources];
13
17
  }
14
18
  }
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
4
5
  import { evidenceBundleSchema, parseEvidenceBundle } from "./evidenceBundle.js";
5
6
  import { evaluateReconstructionClaims, evaluateReconstructionPackageProofs, evaluateReconstructionSurfaces, evaluateReconstructionCoverageRisks, recommendedReconstructionProbes, } from "./reconstructionCoverageEvaluation.js";
6
7
  import { digestSchema } from "./../domain/digests.js";
@@ -315,7 +316,7 @@ const closureStatus = (reasons) => {
315
316
  return "unknown";
316
317
  return "partial";
317
318
  };
318
- const reasonOrder = (left, right) => `${left.code}:${left.subject_id}`.localeCompare(`${right.code}:${right.subject_id}`);
319
+ const reasonOrder = (left, right) => compareUnicodeCodePoints(compositeKey([left.code, left.subject_id]), compositeKey([right.code, right.subject_id]));
319
320
  const digest = (value) => {
320
321
  const encoded = canonicalize(value);
321
322
  if (encoded === undefined)
@@ -1,4 +1,5 @@
1
1
  import { uniqueSorted } from "./canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints, compositeKey, } from "./unicodeCodePointOrder.js";
2
3
  /** Select the latest revision of each residual unknown. */
3
4
  export const reconstructionUnknownHeads = (revisions) => {
4
5
  const heads = new Map();
@@ -44,7 +45,7 @@ export const reconstructionClaimUnknowns = (heads, comparisonId, sourceIds) => {
44
45
  const unknown = heads.get(id);
45
46
  return unknown === undefined ? [] : [unknown];
46
47
  })
47
- .sort((left, right) => left.unknown_id.localeCompare(right.unknown_id, "en"));
48
+ .sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id));
48
49
  };
49
50
  /** Aggregate deterministic probes for unresolved claims. */
50
51
  export const reconstructionProbes = (results, heads) => {
@@ -57,7 +58,7 @@ export const reconstructionProbes = (results, heads) => {
57
58
  const probes = unknowns.flatMap(({ recommended_probes: items }) => items);
58
59
  const candidates = probes.length > 0 ? probes : [defaultProbe(result.kind)];
59
60
  for (const probe of candidates) {
60
- const key = `${probe.operation}\0${probe.rationale}`;
61
+ const key = compositeKey([probe.operation, probe.rationale]);
61
62
  const current = output.get(key) ?? {
62
63
  ...probe,
63
64
  claim_ids: [],
@@ -71,7 +72,7 @@ export const reconstructionProbes = (results, heads) => {
71
72
  output.set(key, current);
72
73
  }
73
74
  }
74
- const sorted = [...output.values()].sort((left, right) => `${left.operation}\0${left.rationale}`.localeCompare(`${right.operation}\0${right.rationale}`, "en"));
75
+ const sorted = [...output.values()].sort((left, right) => compareUnicodeCodePoints(compositeKey([left.operation, left.rationale]), compositeKey([right.operation, right.rationale])));
75
76
  return sorted;
76
77
  };
77
78
  const defaultProbe = (kind) => kind === "behavioral"
@@ -4,6 +4,7 @@ import { z } from "zod";
4
4
  import { artifactComparisonResultSchema } from "./artifactComparison.js";
5
5
  import { artifactInventoryResultSchema } from "./artifactGraph.js";
6
6
  import { uniqueSorted } from "./canonicalOrdering.js";
7
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
7
8
  import { comparisonSourceEvidenceSides } from "./comparisonSourceEvidence.js";
8
9
  import { parseEvidence } from "./evidence.js";
9
10
  import { parseEvidenceBundle } from "./evidenceBundle.js";
@@ -42,7 +43,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
42
43
  const heads = reconstructionUnknownHeads(bundle.unknowns);
43
44
  const results = specification.claims
44
45
  .map((claim) => evaluateClaim(claim, records, heads))
45
- .sort((left, right) => left.claim_id.localeCompare(right.claim_id, "en"));
46
+ .sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id));
46
47
  const failed = count(results, "fail");
47
48
  const unresolved = count(results, "unknown");
48
49
  const probes = reconstructionProbes(results, heads);
@@ -51,7 +52,7 @@ export const verifyReconstruction = (specificationInput, bundleInput) => {
51
52
  status: failed > 0 ? "fail" : unresolved > 0 ? "unknown" : "pass",
52
53
  specification_sha256: digest({
53
54
  ...specification,
54
- claims: [...specification.claims].sort((left, right) => left.claim_id.localeCompare(right.claim_id, "en")),
55
+ claims: [...specification.claims].sort((left, right) => compareUnicodeCodePoints(left.claim_id, right.claim_id)),
55
56
  }),
56
57
  summary: {
57
58
  total: results.length,
@@ -1,6 +1,8 @@
1
1
  import { posix } from "node:path";
2
2
  import { z } from "zod";
3
- import { canonicalDigest, canonicalJson } from "./comparisonSemantics.js";
3
+ import { canonicalJson } from "./comparisonSemantics.js";
4
+ import { digestCanonicalValue } from "./canonicalDigest.js";
5
+ import { createReferenceSourcePathLookup, isPortableAbsoluteReferenceTarget, } from "./referenceSourcePathIdentity.js";
4
6
  import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
5
7
  import { digestSchema } from "./../domain/digests.js";
6
8
  import { prefixedDigestSchema } from "./../domain/digests.js";
@@ -66,13 +68,10 @@ const sourceDirectorySchema = z.strictObject({
66
68
  const symlinkTargetSchema = z
67
69
  .string()
68
70
  .min(1)
69
- .refine((target) => isPortableAbsoluteSymlinkTarget(target) ||
71
+ .refine((target) => isPortableAbsoluteReferenceTarget(target) ||
70
72
  (!target.startsWith("/") &&
71
73
  !target.includes("\\") &&
72
74
  posix.normalize(target) === target), "Expected a normalized POSIX symlink target");
73
- const isPortableAbsoluteSymlinkTarget = (target) => target.startsWith("/") ||
74
- /^[A-Za-z]:[\\/]/u.test(target) ||
75
- /^\\\\[^\\/]+[\\/][^\\/]+/u.test(target);
76
75
  const sourceSymlinkSchema = z.union([
77
76
  z.strictObject({
78
77
  ...entryBaseShape,
@@ -104,17 +103,22 @@ const parseFailureSchema = z.strictObject({
104
103
  parser: z.string().min(1),
105
104
  reason: boundedTextSchema,
106
105
  });
107
- const exclusionSchema = z.strictObject({
108
- path: relativePathSchema,
109
- reason: z.enum([
110
- "configured-secret",
111
- "symlink-escape",
112
- "size-limit",
113
- "inventory-limit",
114
- "unreadable",
115
- "caller-excluded",
116
- ]),
117
- });
106
+ const exclusionSchema = z.discriminatedUnion("reason", [
107
+ z.strictObject({
108
+ path: relativePathSchema,
109
+ reason: z.enum([
110
+ "configured-secret",
111
+ "project-ignored",
112
+ "default-ignored",
113
+ "caller-excluded",
114
+ ]),
115
+ pattern: boundedTextSchema,
116
+ }),
117
+ z.strictObject({
118
+ path: relativePathSchema,
119
+ reason: z.enum(["symlink-escape", "unreadable"]),
120
+ }),
121
+ ]);
118
122
  const vcsSchema = z
119
123
  .discriminatedUnion("kind", [
120
124
  z.strictObject({
@@ -230,12 +234,13 @@ const checkRelationships = (graph, paths, context) => {
230
234
  }
231
235
  };
232
236
  const checkSymlinks = (graph, paths, context) => {
237
+ const lookupPath = createReferenceSourcePathLookup(paths);
233
238
  for (const [index, entry] of graph.entries.entries()) {
234
239
  if (entry.kind !== "symlink")
235
240
  continue;
236
241
  if (entry.target === null)
237
242
  continue;
238
- const absolute = isPortableAbsoluteSymlinkTarget(entry.target);
243
+ const absolute = isPortableAbsoluteReferenceTarget(entry.target);
239
244
  if ((entry.target_state === "external" && !absolute) ||
240
245
  (entry.target_state === "internal" && absolute))
241
246
  context.addIssue({
@@ -246,7 +251,10 @@ const checkSymlinks = (graph, paths, context) => {
246
251
  if (entry.target_state !== "internal")
247
252
  continue;
248
253
  const resolved = posix.normalize(posix.join(posix.dirname(entry.path), entry.target));
249
- if (resolved.startsWith("../") || resolved === ".." || !paths.has(resolved))
254
+ if (resolved.startsWith("../") ||
255
+ resolved === ".." ||
256
+ // The inventory root is implicit rather than an entry with path ".".
257
+ (resolved !== "." && lookupPath.resolve(resolved) === undefined))
250
258
  context.addIssue({
251
259
  code: "custom",
252
260
  message: "Internal symlink target must resolve to an inventoried entry",
@@ -283,7 +291,7 @@ function checkGraphInvariants(graph, context) {
283
291
  checkSortedUnique(graph.manifests, "manifests", context);
284
292
  checkSortedUnique(graph.relationships.map(relationshipKey), "relationships", context);
285
293
  checkSortedUnique(graph.parse_failures.map(historicalSourceParseFailureKey), "parse_failures", context);
286
- checkSortedUnique(graph.exclusions.map(({ path, reason }) => `${path}\u0000${reason}`), "exclusions", context);
294
+ checkSortedUnique(graph.exclusions.map((exclusion) => `${exclusion.path}\u0000${exclusion.reason}\u0000${"pattern" in exclusion ? exclusion.pattern : ""}`), "exclusions", context);
287
295
  if (canonicalJson(graph.languages, "Reference source graph") !==
288
296
  canonicalJson(historicalSourceLanguages(graph.entries), "Reference source graph"))
289
297
  context.addIssue({
@@ -331,7 +339,7 @@ const rootCommitment = (entries, exclusions) => ({
331
339
  }),
332
340
  exclusions,
333
341
  });
334
- const computeRootSha256 = (entries, exclusions) => canonicalDigest(rootCommitment(entries, exclusions), "Reference source graph");
342
+ const computeRootSha256 = (entries, exclusions) => digestCanonicalValue(rootCommitment(entries, exclusions), "Reference source graph");
335
343
  /** Build and internally commit a normalized historical source graph. */
336
344
  export const createHistoricalSourceGraph = (input) => {
337
345
  const parsed = historicalSourceGraphInputSchema.parse(input);
@@ -343,7 +351,7 @@ export const createHistoricalSourceGraph = (input) => {
343
351
  /** Parse a graph and reject stale or caller-invented root commitments. */
344
352
  export const parseHistoricalSourceGraph = (input) => historicalSourceGraphSchema.parse(input);
345
353
  /** Compute a deterministic graph commitment containing no absolute root path. */
346
- export const computeHistoricalSourceGraphSha256 = (input) => canonicalDigest(parseHistoricalSourceGraph(input), "Reference source graph");
354
+ export const computeHistoricalSourceGraphSha256 = (input) => digestCanonicalValue(parseHistoricalSourceGraph(input), "Reference source graph");
347
355
  /** Build a deterministic, relocation-independent manifest for a source graph. */
348
356
  export const createHistoricalSourceManifest = (input) => {
349
357
  const graph = parseHistoricalSourceGraph(input);
@@ -358,14 +366,15 @@ export const createHistoricalSourceManifest = (input) => {
358
366
  };
359
367
  return historicalSourceManifestBaseSchema.parse({
360
368
  ...semantic,
361
- manifest_id: `hsm_${canonicalDigest(semantic, "Reference source graph")}`,
369
+ manifest_id: `hsm_${digestCanonicalValue(semantic, "Reference source graph")}`,
362
370
  });
363
371
  };
364
372
  /** Parse and verify a historical source manifest's semantic identifier. */
365
373
  export const parseHistoricalSourceManifest = (input) => {
366
374
  const manifest = historicalSourceManifestBaseSchema.parse(input);
367
375
  const { manifest_id: manifestId, ...semantic } = manifest;
368
- if (`hsm_${canonicalDigest(semantic, "Reference source graph")}` !== manifestId)
376
+ if (`hsm_${digestCanonicalValue(semantic, "Reference source graph")}` !==
377
+ manifestId)
369
378
  throw new TypeError("Historical source manifest identifier does not match");
370
379
  return manifest;
371
380
  };