rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,5 +1,4 @@
1
1
  import { processCaptureSchema, } from "./processCapture.js";
2
- import { z } from "zod";
3
2
  const verifiedCaptures = new WeakSet();
4
3
  const isVerifiedCapture = (capture) => verifiedCaptures.has(capture);
5
4
  const attachProof = (capture) => {
@@ -8,41 +7,9 @@ const attachProof = (capture) => {
8
7
  return capture;
9
8
  throw new TypeError("Process Capture proof ownership failed");
10
9
  };
11
- const recordSchema = z.record(z.string(), z.unknown());
12
- const LEGACY_EXECUTABLE_IDENTITY_REASON = "Legacy v3 capture did not distinguish selected and launch executable digests";
13
- const migrateLegacyV3Capture = (input) => {
14
- const capture = recordSchema.safeParse(input);
15
- if (!capture.success)
16
- return input;
17
- const manifest = recordSchema.safeParse(capture.data.manifest);
18
- if (!manifest.success)
19
- return input;
20
- if (manifest.data.provider_version !== "3" ||
21
- "selected_executable_sha256" in manifest.data ||
22
- "executable_identity" in manifest.data ||
23
- "legacy_executable_sha256" in manifest.data)
24
- return input;
25
- const { executable_sha256 } = manifest.data;
26
- if (typeof executable_sha256 !== "string" ||
27
- !/^[a-f0-9]{64}$/u.test(executable_sha256))
28
- return input;
29
- return {
30
- ...capture.data,
31
- manifest: {
32
- ...manifest.data,
33
- selected_executable_sha256: null,
34
- executable_sha256: null,
35
- executable_identity: {
36
- state: "unknown",
37
- reason: LEGACY_EXECUTABLE_IDENTITY_REASON,
38
- },
39
- legacy_executable_sha256: executable_sha256,
40
- },
41
- };
42
- };
43
10
  /** Parse unknown input and reject invalid commitments or semantics. */
44
11
  export const parseProcessCapture = (input) => {
45
- const parsed = processCaptureSchema.safeParse(migrateLegacyV3Capture(input));
12
+ const parsed = processCaptureSchema.safeParse(input);
46
13
  if (parsed.success)
47
14
  return attachProof(parsed.data);
48
15
  const issues = parsed.error.issues.flatMap((issue) => issue.code === "custom"
@@ -1,22 +1,13 @@
1
1
  import { digestProcessCommitment } from "./processScenario.js";
2
+ import { hasCaptureTruncation } from "./processCaptureCoverage.js";
2
3
  const orderedTimestamps = (values) => values.every((value, index) => {
3
4
  const previous = values[index - 1];
4
5
  return previous === undefined || value.at_ms >= previous.at_ms;
5
6
  });
6
7
  const validateCommitments = (capture, require) => {
7
8
  const { manifest } = capture;
8
- if (manifest.legacy_executable_sha256 !== undefined) {
9
- require(manifest.selected_executable_sha256 === null &&
10
- manifest.executable_sha256 === null &&
11
- manifest.executable_identity.state === "unknown" &&
12
- manifest.executable_identity.reason !== null &&
13
- manifest.scenario.executable_sha256 ===
14
- manifest.legacy_executable_sha256, "manifest.legacy_executable_sha256", "legacy executable digest must remain distinct from unknown selected and launch digests");
15
- }
16
- else {
17
- require(manifest.scenario.executable_sha256 ===
18
- manifest.selected_executable_sha256, "manifest.selected_executable_sha256", "selected executable commitment does not match the scenario projection");
19
- }
9
+ require(manifest.scenario.executable_sha256 ===
10
+ manifest.selected_executable_sha256, "manifest.selected_executable_sha256", "selected executable commitment does not match the scenario projection");
20
11
  require(manifest.executable_identity.state === "path_metadata_unchanged"
21
12
  ? manifest.executable_sha256 === manifest.selected_executable_sha256 &&
22
13
  manifest.executable_identity.reason === null
@@ -48,7 +39,7 @@ const validateOrdering = (capture, require) => {
48
39
  require(orderedTimestamps(values), name, "timestamps must be ordered");
49
40
  };
50
41
  const validateEventJournal = (capture, require) => {
51
- const journal = capture.event_journal ?? [];
42
+ const journal = capture.event_journal;
52
43
  if (journal.length === 0)
53
44
  return;
54
45
  const sizes = {
@@ -83,6 +74,82 @@ const validateLifecycle = (capture, require) => {
83
74
  capture.exit.code ===
84
75
  null, "exit", "deadline termination cannot declare a normal exit code");
85
76
  };
77
+ const validateCoverage = (capture, require) => {
78
+ const details = capture.truncation_details;
79
+ if (details === undefined)
80
+ return;
81
+ require(details.process.retained_samples === capture.process_samples.length &&
82
+ details.process.retained_samples <= details.process.sample_limit &&
83
+ details.process.sampling_partial ===
84
+ (details.process.sample_limit_reached ||
85
+ details.process.sampling_failures > 0) &&
86
+ (details.process.sampling_failures === 0) ===
87
+ (details.process.first_sampling_failure ===
88
+ null), "truncation_details.process", "sampling coverage must agree with retained samples and observed failures");
89
+ require(capture.truncated ===
90
+ hasCaptureTruncation(details), "truncation_details", "aggregate truncation must match producer coverage");
91
+ for (const [name, retention, count, bytes] of [
92
+ [
93
+ "raw_terminal",
94
+ details.raw_terminal,
95
+ capture.frames.length,
96
+ capture.frames.reduce((total, frame) => total + Buffer.byteLength(frame.raw_data ?? frame.data), 0),
97
+ ],
98
+ [
99
+ "rendered_terminal",
100
+ details.rendered_terminal,
101
+ capture.rendered_frames.length,
102
+ capture.rendered_frames.reduce((total, frame) => frame.lines.reduce((sum, line) => sum + Buffer.byteLength(line), total + Buffer.byteLength(frame.serialized_state)), 0),
103
+ ],
104
+ ]) {
105
+ // Whole frames are retained or omitted, so retained bytes are exactly the
106
+ // retained frames' bytes, and nothing is unretained when no frame was omitted.
107
+ require(retention.retained_frames === count &&
108
+ retention.observed_frames >= count &&
109
+ retention.retained_bytes === bytes &&
110
+ retention.observed_bytes >= retention.retained_bytes &&
111
+ (retention.observed_frames > count ||
112
+ retention.observed_bytes === retention.retained_bytes) &&
113
+ retention.retained_bytes <=
114
+ retention.budget_bytes, `truncation_details.${name}`, "retained observations and budget accounting do not agree");
115
+ }
116
+ for (const [name, coverage, files, checkpoint] of [
117
+ [
118
+ "filesystem_before",
119
+ details.filesystem_before,
120
+ capture.files_before,
121
+ capture.filesystem_checkpoints[0],
122
+ ],
123
+ [
124
+ "filesystem_after",
125
+ details.filesystem_after,
126
+ capture.files_after,
127
+ capture.filesystem_checkpoints[1],
128
+ ],
129
+ ]) {
130
+ const unhashedFiles = new Map(files
131
+ .filter((file) => file.type === "file" && file.sha256 === null)
132
+ .map((file) => [file.path, file]));
133
+ require(coverage.hash_omissions.length === unhashedFiles.size &&
134
+ new Set(coverage.hash_omissions.map(({ path }) => path)).size ===
135
+ unhashedFiles.size &&
136
+ 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");
138
+ require(coverage.hashed_bytes ===
139
+ files
140
+ .filter((file) => file.type === "file" && file.sha256 !== null)
141
+ .reduce((sum, file) => sum + file.size, 0) &&
142
+ coverage.hashed_bytes <= coverage.hash_budget_bytes &&
143
+ files.length <=
144
+ coverage.files_limit, `truncation_details.${name}`, "filesystem budget accounting does not match retained observations");
145
+ require(coverage.enumeration_truncated ===
146
+ coverage.enumeration_reasons.length > 0 &&
147
+ checkpoint?.truncated ===
148
+ (coverage.enumeration_truncated ||
149
+ coverage.hash_omissions.length >
150
+ 0), `truncation_details.${name}`, "filesystem checkpoint truncation must match enumeration and digest coverage");
151
+ }
152
+ };
86
153
  /** Recompute commitments and cross-field invariants without side effects. */
87
154
  export const collectProcessCaptureIssues = (capture) => {
88
155
  const issues = [];
@@ -94,5 +161,6 @@ export const collectProcessCaptureIssues = (capture) => {
94
161
  validateOrdering(capture, require);
95
162
  validateEventJournal(capture, require);
96
163
  validateLifecycle(capture, require);
164
+ validateCoverage(capture, require);
97
165
  return issues;
98
166
  };
@@ -1,8 +1,14 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { z } from "zod";
3
+ import { processSourceTruncated } from "./processCaptureCoverage.js";
4
+ import { comparableTerminalFrame } from "./processObservation.js";
5
+ import { AnalysisInputError } from "../analysisErrorCore.js";
3
6
  import { jsonValueSchema } from "../jsonValue.js";
4
- import { compareProcessTraces, processTraceOutcomesDiffer, processTraceComparisonResultSchema, } from "./processTraceComparison.js";
7
+ import {} from "./processTraceSpecification.js";
8
+ import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js";
5
9
  import { dimensionsForTraceSources, traceCoversObservedDimension, } from "./processTraceDimensionProjection.js";
10
+ import { compareProcessTraces, processTraceOutcomesDiffer, } from "./processTraceComparison.js";
11
+ const OPERATION = "compare_process_captures";
6
12
  /** Comparison classification that never equates incomplete evidence. */
7
13
  export const comparisonStatusSchema = z.enum([
8
14
  "unchanged",
@@ -70,7 +76,10 @@ export const processCaptureComparisonSchema = z
70
76
  });
71
77
  });
72
78
  const terminalObservations = (capture) => [
73
- ...capture.frames.map((frame) => ({ kind: "raw", ...frame })),
79
+ ...capture.frames.map((frame) => ({
80
+ kind: "raw",
81
+ ...comparableTerminalFrame(frame),
82
+ })),
74
83
  ...capture.rendered_frames.map((frame) => ({
75
84
  kind: "rendered",
76
85
  ...frame,
@@ -152,15 +161,47 @@ const chooseFirstDivergence = (candidates) => {
152
161
  };
153
162
  const assertComparable = (left, right, options) => {
154
163
  if (left.manifest.comparison_contract_sha256 !==
155
- right.manifest.comparison_contract_sha256)
156
- throw new TypeError("Process captures have incompatible comparison contracts");
164
+ right.manifest.comparison_contract_sha256) {
165
+ const fields = differingContractFields(left.manifest.comparison_contract, right.manifest.comparison_contract);
166
+ throw new AnalysisInputError(OPERATION, undefined, [
167
+ {
168
+ path: ["right"],
169
+ reason: "invalid_value",
170
+ message: `Process captures have incompatible comparison contracts${fields.length === 0 ? "" : `; these scenario fields differ: ${fields.join(", ")}`}. Capture both scenarios with the same values for these fields, then compare them.`,
171
+ expected: fields,
172
+ },
173
+ ]);
174
+ }
157
175
  if (options.maxCaptureAgeMs === undefined)
158
176
  return;
159
177
  const maxCaptureAgeMs = options.maxCaptureAgeMs;
160
178
  const now = (options.now ?? Date.now)();
161
- if ([left, right].some(({ manifest }) => now - Date.parse(manifest.completed_at) > maxCaptureAgeMs))
162
- throw new TypeError("Process capture exceeds max_capture_age_ms");
179
+ const stale = [
180
+ ["left", left],
181
+ ["right", right],
182
+ ].flatMap(([side, { manifest }]) => {
183
+ const age = now - Date.parse(manifest.completed_at);
184
+ return age > maxCaptureAgeMs
185
+ ? [
186
+ `${side} completed at ${manifest.completed_at} (${String(age)} ms ago)`,
187
+ ]
188
+ : [];
189
+ });
190
+ if (stale.length > 0)
191
+ throw new AnalysisInputError(OPERATION, undefined, [
192
+ {
193
+ path: ["max_capture_age_ms"],
194
+ reason: "out_of_range",
195
+ message: `Process capture exceeds max_capture_age_ms ${String(maxCaptureAgeMs)}: ${stale.join("; ")}. Recapture the stale scenario or raise max_capture_age_ms.`,
196
+ },
197
+ ]);
163
198
  };
199
+ /** Name top-level contract fields whose canonical values differ. */
200
+ const differingContractFields = (left, right) => [...new Set([...Object.keys(left), ...Object.keys(right)])]
201
+ .filter((field) => !Object.hasOwn(left, field) ||
202
+ !Object.hasOwn(right, field) ||
203
+ canonicalize(left[field]) !== canonicalize(right[field]))
204
+ .sort();
164
205
  const truncatedComparison = () => ({
165
206
  status: "truncated",
166
207
  terminal: "truncated",
@@ -207,19 +248,23 @@ const applyTraceVerdict = (dimensions, specification, trace, captures) => {
207
248
  };
208
249
  };
209
250
  const compareDimensions = (left, right, sameNormalization) => {
210
- const classify = (scope, leftValues, rightValues) => !sameNormalization || hasUnknown(left, scope) || hasUnknown(right, scope)
251
+ const classify = (scope, leftValues, rightValues, source) => !sameNormalization ||
252
+ hasUnknown(left, scope) ||
253
+ hasUnknown(right, scope) ||
254
+ processSourceTruncated(left, source) ||
255
+ processSourceTruncated(right, source)
211
256
  ? "unknown"
212
257
  : classifyCollection(leftValues, rightValues);
213
258
  return {
214
- terminal: classify("terminal", terminalObservations(left), terminalObservations(right)),
215
- interaction: classify("interaction", left.interaction_events, right.interaction_events),
259
+ terminal: classify("terminal", terminalObservations(left), terminalObservations(right), "terminal_rendered"),
260
+ interaction: classify("interaction", left.interaction_events, right.interaction_events, "interaction"),
216
261
  exit: hasUnknown(left, "exit") || hasUnknown(right, "exit")
217
262
  ? "unknown"
218
263
  : sameJsonValue({ exit: left.exit, settlement: left.settlement }, { exit: right.exit, settlement: right.settlement })
219
264
  ? "unchanged"
220
265
  : "changed",
221
- filesystem: classify("filesystem", filesystemObservations(left), filesystemObservations(right)),
222
- process: classify("process", left.process_samples, right.process_samples),
266
+ filesystem: classify("filesystem", filesystemObservations(left), filesystemObservations(right), "filesystem"),
267
+ process: classify("process", left.process_samples, right.process_samples, "process"),
223
268
  };
224
269
  };
225
270
  /**
@@ -230,7 +275,8 @@ const compareDimensions = (left, right, sameNormalization) => {
230
275
  */
231
276
  export const compareProcessCaptures = (left, right, options = {}) => {
232
277
  assertComparable(left, right, options);
233
- if (left.truncated || right.truncated) {
278
+ if ((left.truncated && left.truncation_details === undefined) ||
279
+ (right.truncated && right.truncation_details === undefined)) {
234
280
  const truncated = truncatedComparison();
235
281
  return options.traceSpecification === undefined
236
282
  ? truncated
@@ -250,25 +296,32 @@ export const compareProcessCaptures = (left, right, options = {}) => {
250
296
  left,
251
297
  right,
252
298
  ]);
253
- const divergenceCandidates = PROCESS_COMPARISON_DIMENSIONS.map((dimension) => firstCollectionDivergence(dimension, processDimensionObservations(left, dimension), processDimensionObservations(right, dimension)));
299
+ const divergenceCandidates = PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension] === "unknown"
300
+ ? null
301
+ : firstCollectionDivergence(dimension, processDimensionObservations(left, dimension), processDimensionObservations(right, dimension)));
254
302
  const observedFirstDivergence = chooseFirstDivergence(divergenceCandidates.map((candidate) => candidate !== null &&
255
303
  trace?.verdict === "equivalent" &&
256
304
  dimensions[candidate.dimension] === "unchanged"
257
305
  ? null
258
306
  : candidate));
259
- const firstDivergence = trace?.verdict === "equivalent" &&
260
- deriveProcessComparisonStatus(PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension])) === "unchanged"
261
- ? { status: "none" }
262
- : observedFirstDivergence.status === "found"
263
- ? observedFirstDivergence
264
- : !sameNormalization ||
265
- left.residual_unknowns.length > 0 ||
266
- right.residual_unknowns.length > 0
267
- ? {
268
- status: "unknown",
269
- reason: "Residual unknowns prevent proving that no divergence occurred.",
270
- }
271
- : observedFirstDivergence;
307
+ const firstDivergence = left.truncated || right.truncated
308
+ ? {
309
+ status: "unknown",
310
+ reason: "Incomplete observations prevent locating the first divergence; unaffected dimensions retain their comparisons.",
311
+ }
312
+ : trace?.verdict === "equivalent" &&
313
+ deriveProcessComparisonStatus(PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension])) === "unchanged"
314
+ ? { status: "none" }
315
+ : observedFirstDivergence.status === "found"
316
+ ? observedFirstDivergence
317
+ : !sameNormalization ||
318
+ left.residual_unknowns.length > 0 ||
319
+ right.residual_unknowns.length > 0
320
+ ? {
321
+ status: "unknown",
322
+ reason: "Residual unknowns prevent proving that no divergence occurred.",
323
+ }
324
+ : observedFirstDivergence;
272
325
  const observedStatus = deriveProcessComparisonStatus(PROCESS_COMPARISON_DIMENSIONS.map((dimension) => dimensions[dimension]));
273
326
  return {
274
327
  status: observedStatus,
@@ -1,5 +1,11 @@
1
1
  import { z } from "zod";
2
2
  import { jsonValueSchema } from "../jsonValue.js";
3
+ /** Project normalized PTY facts without source text used only for audit. */
4
+ export const comparableTerminalFrame = (frame) => ({
5
+ sequence: frame.sequence,
6
+ at_ms: frame.at_ms,
7
+ data: frame.data,
8
+ });
3
9
  /** Process-capture observation families shared by live drivers and trace assertions. */
4
10
  export const processObservationSourceSchema = z.enum([
5
11
  "terminal_raw",
@@ -67,11 +73,13 @@ export const processObservationSubject = (source, value) => {
67
73
  const projectedRecord = (capture, location) => {
68
74
  const projected = (() => {
69
75
  switch (location.collection) {
70
- case "frames":
76
+ case "frames": {
77
+ const frame = capture.frames[location.index];
71
78
  return {
72
79
  source: "terminal_raw",
73
- value: capture.frames[location.index],
80
+ value: frame === undefined ? undefined : comparableTerminalFrame(frame),
74
81
  };
82
+ }
75
83
  case "rendered_frames":
76
84
  return {
77
85
  source: "terminal_rendered",
@@ -4,17 +4,36 @@ import { z } from "zod";
4
4
  const positiveBudget = z.number().int().safe().positive();
5
5
  const timedEventBase = { at_ms: z.number().int().safe().nonnegative() };
6
6
  const reservedRunIdEnvironmentName = "REA_PROCESS_RUN_ID";
7
+ const ENVIRONMENT_NAME_CHARACTER = "[^=\\u0000]";
8
+ /**
9
+ * Nonempty environment names other than the reserved run identifier. The
10
+ * exclusion is spelled as a complement instead of a negative look-ahead,
11
+ * because RE2 and Rust schema validators reject look-around and would refuse
12
+ * every tool in the advertised catalog.
13
+ */
14
+ const environmentNamePattern = (reserved) => {
15
+ // After the complete reserved name, at least one more character is needed.
16
+ let rest = `${ENVIRONMENT_NAME_CHARACTER}+`;
17
+ for (let index = reserved.length - 1; index >= 0; index -= 1) {
18
+ const character = reserved[index] ?? "";
19
+ // Diverge here, match the next reserved character, or (after a nonempty
20
+ // prefix) end the name early.
21
+ const choice = `[^=\\u0000${character}]${ENVIRONMENT_NAME_CHARACTER}*|${character}${rest}`;
22
+ rest = index === 0 ? choice : `(?:${choice})?`;
23
+ }
24
+ return new RegExp(`^(?:${rest})$`, "u");
25
+ };
7
26
  const environmentName = z
8
27
  .string()
9
28
  .min(1, "Environment names must not be empty")
10
- .regex(/^(?!REA_PROCESS_RUN_ID(?![\s\S]))[^=\0]+$/u, {
29
+ .regex(environmentNamePattern(reservedRunIdEnvironmentName), {
11
30
  error: (issue) => issue.input === reservedRunIdEnvironmentName
12
31
  ? `${reservedRunIdEnvironmentName} is reserved by the process adapter`
13
32
  : "Environment names cannot contain '=' or NUL",
14
33
  });
15
34
  const childProcessString = z
16
35
  .string()
17
- .regex(/^[^\0]*$/u, "Values passed to operating-system APIs cannot contain NUL");
36
+ .regex(/^[^\u0000]*$/u, "Values passed to operating-system APIs cannot contain NUL");
18
37
  export const normalizationSchema = z.object({
19
38
  paths: z.boolean(),
20
39
  pids: z.boolean(),
@@ -62,13 +81,16 @@ export const processComparisonContract = (scenario) => ({
62
81
  settle_ms: scenario.settle_ms,
63
82
  limits: scenario.limits,
64
83
  normalization: scenario.normalization,
84
+ ...(scenario.normalization.ports
85
+ ? { port_normalization_version: "contextual-endpoints-v2" }
86
+ : {}),
65
87
  });
66
88
  /**
67
89
  * Boundary schema for one bounded process experiment.
68
90
  * Defaults are part of the evidence contract and must remain deterministic.
69
91
  */
70
92
  export const processScenarioSchema = z
71
- .object({
93
+ .strictObject({
72
94
  executable: childProcessString.min(1),
73
95
  arguments: z.array(childProcessString).default([]),
74
96
  working_directory: childProcessString.default("."),
@@ -77,7 +99,7 @@ export const processScenarioSchema = z
77
99
  .array(childProcessString.min(1))
78
100
  .default([]),
79
101
  terminal: z
80
- .object({
102
+ .strictObject({
81
103
  columns: z.number().int().min(1).max(65_535).default(80),
82
104
  rows: z.number().int().min(1).max(65_535).default(24),
83
105
  scrollback: z.number().int().min(0).default(1_000),
@@ -85,19 +107,19 @@ export const processScenarioSchema = z
85
107
  .default({ columns: 80, rows: 24, scrollback: 1_000 }),
86
108
  events: z
87
109
  .array(z.discriminatedUnion("type", [
88
- z.object({
110
+ z.strictObject({
89
111
  ...timedEventBase,
90
112
  type: z.literal("input"),
91
113
  data: z.string(),
92
114
  sensitive: z.boolean().default(false),
93
115
  }),
94
- z.object({
116
+ z.strictObject({
95
117
  ...timedEventBase,
96
118
  type: z.literal("resize"),
97
119
  columns: z.number().int().min(1).max(65_535),
98
120
  rows: z.number().int().min(1).max(65_535),
99
121
  }),
100
- z.object({
122
+ z.strictObject({
101
123
  ...timedEventBase,
102
124
  type: z.literal("signal"),
103
125
  signal: z.enum(["SIGINT", "SIGTERM", "SIGKILL"]),
@@ -108,7 +130,7 @@ export const processScenarioSchema = z
108
130
  idle_timeout_ms: positiveBudget.default(30_000),
109
131
  settle_ms: z.number().int().safe().nonnegative().default(100),
110
132
  limits: z
111
- .object({
133
+ .strictObject({
112
134
  output_bytes: positiveBudget.default(1_000_000),
113
135
  files: positiveBudget.default(10_000),
114
136
  file_bytes: positiveBudget.default(10_000_000),
@@ -124,14 +146,16 @@ export const processScenarioSchema = z
124
146
  filesystem_depth: 16,
125
147
  }),
126
148
  normalization: z
127
- .object({
149
+ .strictObject({
128
150
  paths: z.boolean().default(false),
129
151
  pids: z.boolean().default(true),
130
152
  ports: z.boolean().default(true),
131
153
  time_bucket_ms: positiveBudget.default(10),
132
154
  patterns: z
133
- .array(z.object({
134
- pattern: z.string(),
155
+ .array(z.strictObject({
156
+ pattern: z
157
+ .string()
158
+ .describe("Literal text to replace in captured output; not a regular expression."),
135
159
  replacement: z.string(),
136
160
  }))
137
161
  .default([]),
@@ -144,7 +168,6 @@ export const processScenarioSchema = z
144
168
  patterns: [],
145
169
  }),
146
170
  })
147
- .strict()
148
171
  .superRefine((scenario, context) => {
149
172
  for (let index = 1; index < scenario.events.length; index += 1) {
150
173
  const event = scenario.events[index];
@@ -1,7 +1,5 @@
1
1
  import { evaluateProcessTraceSide, processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
2
2
  import { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
3
- export { processTraceComparisonResultSchema, } from "./processTraceEvaluation.js";
4
- export { processTraceSpecificationSchema, } from "./processTraceSpecification.js";
5
3
  /** Compare two captures against an explicit finite trace language. */
6
4
  export const compareProcessTraces = (left, right, specificationInput) => {
7
5
  const specification = processTraceSpecificationSchema.parse(specificationInput);
@@ -1,4 +1,4 @@
1
- /** Map declared trace sources to legacy process-comparison dimensions. */
1
+ /** Map declared trace sources to process-comparison dimensions. */
2
2
  export const dimensionsForTraceSources = (sources) => {
3
3
  const dimensions = new Set();
4
4
  for (const source of sources) {
@@ -1,11 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { processSourceTruncated } from "./processCaptureCoverage.js";
2
3
  import { processObservationLocationSchema, projectProcessObservation, } from "./processObservation.js";
3
4
  import { canonicalTraceJson, comparableTracePayload, processTraceCardinalityBounds, } from "./processTraceSpecification.js";
4
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]{0,63}$/u);
5
- const locationSchema = processObservationLocationSchema;
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,
8
- location: locationSchema,
8
+ location: processObservationLocationSchema,
9
9
  });
10
10
  const sideResultShape = {
11
11
  satisfied_constraints: z.array(z.string()),
@@ -36,7 +36,7 @@ const diagnosticSchema = z.strictObject({
36
36
  side: z.enum(["left", "right"]),
37
37
  message: z.string(),
38
38
  event_ids: z.array(identifierSchema),
39
- locations: z.array(locationSchema),
39
+ locations: z.array(processObservationLocationSchema),
40
40
  });
41
41
  /** Structured verdict for one declared process trace language. */
42
42
  export const processTraceComparisonResultSchema = z.strictObject({
@@ -56,11 +56,11 @@ const scopesFor = (sources) => new Set([...sources].map((source) => {
56
56
  return "process";
57
57
  return "interaction";
58
58
  }));
59
- const unknownSide = () => ({
59
+ const unknownSide = (rawTrace = []) => ({
60
60
  status: "unknown",
61
61
  matched_variant: null,
62
62
  satisfied_constraints: [],
63
- raw_trace: [],
63
+ raw_trace: rawTrace,
64
64
  });
65
65
  const failure = (input) => ({
66
66
  result: {
@@ -102,7 +102,7 @@ const evaluateFiniteTrace = (ids, specification) => {
102
102
  };
103
103
  const collectRecords = (capture, sources) => {
104
104
  const records = [];
105
- for (const location of capture.event_journal ?? []) {
105
+ for (const location of capture.event_journal) {
106
106
  const record = projectProcessObservation(capture, location);
107
107
  if (record !== null && sources.has(record.source))
108
108
  records.push({
@@ -296,10 +296,9 @@ const evaluateMatchedTrace = (trace, specification) => {
296
296
  export const evaluateProcessTraceSide = (capture, specification) => {
297
297
  const sources = new Set(specification.events.map(({ source }) => source));
298
298
  const relevantScopes = scopesFor(sources);
299
- if (capture.truncated ||
300
- capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope)))
301
- return { result: unknownSide(), diagnostic: null };
302
- if ((capture.event_journal ?? []).length === 0)
299
+ const incomplete = [...sources].some((source) => processSourceTruncated(capture, source)) ||
300
+ capture.residual_unknowns.some(({ scope }) => relevantScopes.has(scope));
301
+ if (capture.event_journal.length === 0)
303
302
  return {
304
303
  result: unknownSide(),
305
304
  diagnostic: {
@@ -310,6 +309,11 @@ export const evaluateProcessTraceSide = (capture, specification) => {
310
309
  },
311
310
  };
312
311
  const matched = matchRecords(collectRecords(capture, sources), specification);
312
+ if (incomplete)
313
+ return {
314
+ result: unknownSide("rawTrace" in matched ? matched.rawTrace : matched.result.raw_trace),
315
+ diagnostic: null,
316
+ };
313
317
  return "rawTrace" in matched
314
318
  ? evaluateMatchedTrace(matched, specification)
315
319
  : matched;
@@ -1,10 +1,9 @@
1
1
  import canonicalize from "canonicalize";
2
2
  import { z } from "zod";
3
+ import { IDENTIFIER_PATTERN } from "../stringPatterns.js";
3
4
  import { jsonValueSchema } from "../jsonValue.js";
4
5
  import { comparableProcessObservationPayload, processObservationSourceSchema, } from "./processObservation.js";
5
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
6
- /** Process observation families admitted by a declared trace specification. */
7
- export const processTraceSourceSchema = processObservationSourceSchema;
6
+ const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
8
7
  const cardinalitySchema = z.discriminatedUnion("kind", [
9
8
  z.strictObject({ kind: z.literal("required") }),
10
9
  z.strictObject({ kind: z.literal("optional") }),
@@ -25,7 +24,7 @@ const cardinalitySchema = z.discriminatedUnion("kind", [
25
24
  ]);
26
25
  const eventDeclarationSchema = z.strictObject({
27
26
  id: identifierSchema,
28
- source: processTraceSourceSchema,
27
+ source: processObservationSourceSchema,
29
28
  exact: jsonValueSchema,
30
29
  ignore_fields: z
31
30
  .array(z.enum([
@@ -39,7 +39,7 @@ const XML_ENTITIES = {
39
39
  * Unicode stays as written: comments and CDATA may hold such text literally,
40
40
  * and the XML decoder rejects it anywhere else.
41
41
  */
42
- const decodeXmlText = (text) => text.replace(/&(?:#x([\da-f]+)|#(\d+)|([a-z]+));/giu, (entity, hex, decimal, name) => {
42
+ export const decodeXmlText = (text) => text.replace(/&(?:#x([\da-f]+)|#(\d+)|([a-z]+));/giu, (entity, hex, decimal, name) => {
43
43
  const codePoint = hex !== undefined
44
44
  ? parseInt(hex, 16)
45
45
  : decimal !== undefined
@@ -0,0 +1,19 @@
1
+ /** Decode BOM-aware XML plist text with fatal byte validation. */
2
+ export const decodeXmlPlistText = (bytes) => {
3
+ const encoding = bytes[0] === 0xff && bytes[1] === 0xfe
4
+ ? "utf-16le"
5
+ : bytes[0] === 0xfe && bytes[1] === 0xff
6
+ ? "utf-16be"
7
+ : "utf-8";
8
+ const text = new TextDecoder(encoding, { fatal: true }).decode(bytes);
9
+ const declaration = /^<\?xml\s[^?]*\bencoding\s*=\s*["']([^"']+)["']/u.exec(text)?.[1];
10
+ const declared = declaration?.toLowerCase();
11
+ if (declared !== undefined &&
12
+ !["utf-8", "utf-16", "utf-16le", "utf-16be"].includes(declared))
13
+ throw new TypeError(`Unsupported XML encoding declaration: ${declaration}. Supported encodings are UTF-8 and BOM-marked UTF-16 in either byte order.`);
14
+ if (declared !== undefined &&
15
+ declared !== encoding &&
16
+ !(encoding !== "utf-8" && declared === "utf-16"))
17
+ throw new TypeError("XML encoding declaration disagrees with its bytes");
18
+ return text;
19
+ };
@@ -1,14 +1,16 @@
1
- import { AnalysisError } from "./analysisErrorBase.js";
1
+ import { AnalysisError, } from "./analysisErrorBase.js";
2
2
  /** A provider adapter failed outside its more precise typed variants. */
3
3
  export class ProviderAdapterError extends AnalysisError {
4
4
  providerId;
5
5
  operation;
6
6
  _tag = "ProviderAdapterError";
7
+ userMessage;
7
8
  diagnostics;
8
9
  constructor(providerId, operation, options = {}) {
9
10
  super(`Provider ${providerId} adapter failed during ${operation}`, options);
10
11
  this.providerId = providerId;
11
12
  this.operation = operation;
13
+ this.userMessage = options.userMessage;
12
14
  this.diagnostics =
13
15
  options.diagnostics === undefined
14
16
  ? undefined