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
@@ -1,15 +1,3 @@
1
1
  import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
2
- /**
3
- * Canonical code-point ordering shared across domain and application layers.
4
- *
5
- * Compares strings by Unicode code point so graph ordering, fingerprints, and
6
- * deterministic tie-breaks stay stable regardless of locale. Prefer this over
7
- * `String.prototype.localeCompare`, which is locale-dependent.
8
- *
9
- * Ordering by code point differs from ordering by UTF-16 code unit for astral
10
- * code points (above U+FFFF), whose lead surrogate is numerically below the
11
- * BMP tail U+E000-U+FFFF.
12
- */
13
- export const compareCodePoints = (left, right) => compareUnicodeCodePoints(left, right);
14
2
  /** Deduplicate and sort strings with canonical code-point ordering. */
15
- export const uniqueSorted = (values) => [...new Set(values)].sort(compareCodePoints);
3
+ export const uniqueSorted = (values) => [...new Set(values)].sort(compareUnicodeCodePoints);
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { artifactComparisonResultSchema } from "./artifactComparison.js";
3
3
  import { uniqueSorted } from "./canonicalOrdering.js";
4
+ import { compositeKey, compareUnicodeCodePoints, } from "./unicodeCodePointOrder.js";
4
5
  import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
5
6
  import { evidenceSchema, parseEvidence } from "./evidence.js";
6
7
  import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
@@ -274,9 +275,7 @@ const behaviorStatus = (statuses) => {
274
275
  const isChange = (status) => status === "added" || status === "removed" || status === "changed";
275
276
  const count = (findings, classification) => findings.filter((finding) => finding.classification === classification)
276
277
  .length;
277
- const compareFindings = (left, right) => [left.scope, left.dimension, left.source_comparison_id]
278
- .join("\0")
279
- .localeCompare([right.scope, right.dimension, right.source_comparison_id].join("\0"), "en");
278
+ const compareFindings = (left, right) => compareUnicodeCodePoints(compositeKey([left.scope, left.dimension, left.source_comparison_id]), compositeKey([right.scope, right.dimension, right.source_comparison_id]));
280
279
  const assertUnique = (values, label) => {
281
280
  if (new Set(values).size !== values.length)
282
281
  throw new TypeError(`Changed-behavior analysis rejects duplicate ${label}`);
@@ -0,0 +1,9 @@
1
+ import { digestCanonicalValue } from "./canonicalDigest.js";
2
+ /** Retain short exact string keys or commit their value in a reserved digest namespace. */
3
+ export const compactStringIdentityKey = (value) => {
4
+ const prefix = "value-sha256:";
5
+ const digestKey = `${prefix}${digestCanonicalValue(value, "String identity")}`;
6
+ return value.length <= digestKey.length && !value.startsWith(prefix)
7
+ ? value
8
+ : digestKey;
9
+ };
@@ -1,13 +1,8 @@
1
1
  import canonicalize from "canonicalize";
2
- import { digestCanonicalValue } from "./canonicalDigest.js";
3
2
  /** Whether an inventory can support a claim that an item is absent. */
4
3
  export const absenceClaimable = (coverage) => coverage.status === "complete" &&
5
4
  coverage.truncated !== true &&
6
5
  (coverage.omitted_count === undefined || coverage.omitted_count === 0);
7
- /** SHA-256 of canonical JSON for stable, provider-neutral comparison IDs. */
8
- export const canonicalDigest = (value, context = "Comparison") => {
9
- return digestCanonicalValue(value, context);
10
- };
11
6
  /** Canonical JSON used for deterministic tie breaking and stable digests. */
12
7
  export const canonicalJson = (value, context = "Comparison") => {
13
8
  const encoded = canonicalize(value);
@@ -25,6 +25,3 @@ export const prefixedDigestSchema = (prefix) => z
25
25
  .regex(new RegExp(`^${prefix}_[a-f0-9]{64}$`, "u"), `Expected a ${prefix}_ prefixed lowercase sha256 digest`);
26
26
  /** True when `value` is a bare digest. */
27
27
  export const isDigest = (value) => typeof value === "string" && SHA256_PATTERN.test(value);
28
- /** True when `value` is a digest carrying `prefix`. */
29
- export const isPrefixedDigest = (value, prefix) => typeof value === "string" &&
30
- prefixedDigestSchema(prefix).safeParse(value).success;
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import { digestCanonicalValue } from "./canonicalDigest.js";
3
3
  import { canonicalJsonDigestSteps } from "./canonicalJsonDigestSteps.js";
4
4
  import { analysisProfileSchema, } from "./analysisProfile.js";
5
+ import { BINARY_ARCHITECTURES, } from "./binaryTargetTypes.js";
5
6
  import { jsonObjectSchema, jsonValueSchema, jsonValueValidationIssue, jsonValueValidationSteps, } from "./jsonValue.js";
6
7
  import { freezeJsonSnapshot, isImmutableJsonSnapshot, } from "./immutableJson.js";
7
8
  import { digestSchema } from "./../domain/digests.js";
@@ -41,7 +42,7 @@ const subjectSchema = z.object({
41
42
  "javascript-bundle",
42
43
  "entitlements",
43
44
  ]),
44
- architecture: z.enum(["x86", "x86_64", "arm", "arm64"]).nullable(),
45
+ architecture: z.enum(BINARY_ARCHITECTURES).nullable(),
45
46
  local_path: z.string(),
46
47
  });
47
48
  /** Source location attached to an evidence observation. */
@@ -108,6 +109,15 @@ export const validateAnalysisProfileProvider = (evidence, context) => {
108
109
  };
109
110
  /** Strict, provider-neutral record for one successful public observation. */
110
111
  export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
112
+ const authenticatedEvidenceSchema = evidenceSchema.superRefine((evidence, context) => {
113
+ const { evidence_id: evidenceId, ...withoutId } = evidence;
114
+ if (computeEvidenceId(withoutId) !== evidenceId)
115
+ context.addIssue({
116
+ code: "custom",
117
+ path: ["evidence_id"],
118
+ message: "Evidence semantic identifier does not match its record",
119
+ });
120
+ });
111
121
  const immutableEvidenceSnapshots = new WeakMap();
112
122
  const immutableResultSchema = z
113
123
  .custom(isImmutableJsonSnapshot)
@@ -147,11 +157,7 @@ export const parseEvidence = (input) => {
147
157
  : undefined;
148
158
  if (immutable !== undefined)
149
159
  return immutable;
150
- const evidence = evidenceSchema.parse(input);
151
- const { evidence_id: evidenceId, ...withoutId } = evidence;
152
- if (computeEvidenceId(withoutId) !== evidenceId)
153
- throw new TypeError("Evidence semantic identifier does not match its record");
154
- return evidence;
160
+ return authenticatedEvidenceSchema.parse(input);
155
161
  };
156
162
  /** Authenticate and seal a ledger-owned snapshot; external mutable values are copied first. */
157
163
  export const immutableEvidence = (input) => rememberImmutableEvidence(parseEvidence(input));
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import canonicalize from "canonicalize";
3
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
3
4
  import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
4
5
  import { residualUnknownSchema, } from "./residualUnknown.js";
5
6
  import { freezeJsonSnapshot } from "./immutableJson.js";
@@ -43,7 +44,7 @@ export const createImmutableEvidenceBundle = (records, unknowns = []) => {
43
44
  };
44
45
  /** Project records into a deterministic bundle whose order has no semantics. */
45
46
  export const createEvidenceBundle = (records, unknowns = []) => {
46
- const sortedRecords = [...records].sort((left, right) => left.evidence_id.localeCompare(right.evidence_id));
47
+ const sortedRecords = [...records].sort((left, right) => compareUnicodeCodePoints(left.evidence_id, right.evidence_id));
47
48
  return {
48
49
  artifacts: uniqueSorted(sortedRecords.flatMap(({ subject }) => subject === null
49
50
  ? []
@@ -73,55 +74,60 @@ export const createEvidenceBundle = (records, unknowns = []) => {
73
74
  },
74
75
  ]
75
76
  : []),
76
- unknowns: [...unknowns].sort((left, right) => left.unknown_id.localeCompare(right.unknown_id) ||
77
+ unknowns: [...unknowns].sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id) ||
77
78
  left.revision - right.revision),
78
79
  records: sortedRecords,
79
80
  };
80
81
  };
81
- /** Restrict a bundle to records and complete unknown histories for one artifact. */
82
+ /** Retain target records and eligible complete unknown histories with their mutation evidence. */
82
83
  export const evidenceBundleForTarget = (bundle, sha256) => {
83
84
  const recordsById = new Map(bundle.records.map((record) => [record.evidence_id, record]));
84
- const candidates = bundle.unknowns.filter(({ scope_digest: scopeDigest }) => scopeDigest === sha256);
85
+ const histories = new Map();
86
+ for (const unknown of bundle.unknowns) {
87
+ const history = histories.get(unknown.unknown_id) ?? [];
88
+ history.push(unknown);
89
+ histories.set(unknown.unknown_id, history);
90
+ }
85
91
  const retained = new Set();
86
- const revisionsById = new Map();
87
92
  const dependents = new Map();
88
- for (const unknown of candidates) {
89
- const mutationEvidenceIds = new Set(unknown.mutation_evidence_ids);
90
- const evidenceAvailable = referencedEvidenceIds(unknown).every((id) => {
91
- const record = recordsById.get(id);
92
- return (record?.subject?.digest.sha256 === sha256 ||
93
- (mutationEvidenceIds.has(id) &&
94
- record?.subject === null &&
95
- record.predicate_type === "rea.residual-unknown-mutation"));
93
+ const relationships = new Map();
94
+ for (const [id, history] of histories) {
95
+ const eligible = history.every((unknown) => {
96
+ if (unknown.scope_digest !== sha256)
97
+ return false;
98
+ const mutationEvidenceIds = new Set(unknown.mutation_evidence_ids);
99
+ return referencedEvidenceIds(unknown).every((evidenceId) => {
100
+ const record = recordsById.get(evidenceId);
101
+ // Mutation subjects record the target active at the time of an edit,
102
+ // which need not be the question's immutable investigation scope.
103
+ return (record?.subject?.digest.sha256 === sha256 ||
104
+ (mutationEvidenceIds.has(evidenceId) &&
105
+ record?.predicate_type === "rea.residual-unknown-mutation"));
106
+ });
96
107
  });
97
- if (!evidenceAvailable)
108
+ if (!eligible)
98
109
  continue;
99
- retained.add(unknown);
100
- revisionsById.set(unknown.unknown_id, (revisionsById.get(unknown.unknown_id) ?? 0) + 1);
101
- for (const relatedId of new Set(unknown.relationships.map(({ unknown_id: id }) => id))) {
110
+ retained.add(id);
111
+ const relatedIds = new Set(history.flatMap((unknown) => unknown.relationships.map(({ unknown_id }) => unknown_id)));
112
+ relationships.set(id, relatedIds);
113
+ for (const relatedId of relatedIds) {
102
114
  const references = dependents.get(relatedId) ?? new Set();
103
- references.add(unknown);
115
+ references.add(id);
104
116
  dependents.set(relatedId, references);
105
117
  }
106
118
  }
107
119
  const pending = [];
108
- for (const unknown of retained)
109
- if (unknown.relationships.some(({ unknown_id: id }) => !revisionsById.has(id)))
110
- pending.push(unknown);
120
+ for (const [id, relatedIds] of relationships)
121
+ if ([...relatedIds].some((relatedId) => !retained.has(relatedId)))
122
+ pending.push(id);
111
123
  for (let index = 0; index < pending.length; index += 1) {
112
- const unknown = pending[index];
113
- if (unknown === undefined || !retained.delete(unknown))
124
+ const id = pending[index];
125
+ if (id === undefined || !retained.delete(id))
114
126
  continue;
115
- const remaining = (revisionsById.get(unknown.unknown_id) ?? 1) - 1;
116
- if (remaining > 0) {
117
- revisionsById.set(unknown.unknown_id, remaining);
118
- continue;
119
- }
120
- revisionsById.delete(unknown.unknown_id);
121
- for (const dependent of dependents.get(unknown.unknown_id) ?? [])
127
+ for (const dependent of dependents.get(id) ?? [])
122
128
  pending.push(dependent);
123
129
  }
124
- const unknowns = candidates.filter((unknown) => retained.has(unknown));
130
+ const unknowns = bundle.unknowns.filter((unknown) => retained.has(unknown.unknown_id));
125
131
  const mutationIds = new Set(unknowns.flatMap(({ mutation_evidence_ids: ids }) => ids));
126
132
  return createEvidenceBundle(bundle.records.filter((record) => record.subject?.digest.sha256 === sha256 ||
127
133
  mutationIds.has(record.evidence_id)), unknowns);
@@ -166,7 +172,19 @@ export const parseEvidenceBundle = (input) => {
166
172
  if (new Set(recordIds).size !== recordIds.length)
167
173
  throw new TypeError("Evidence bundle contains duplicate record IDs");
168
174
  validateUnknownGraph(parsed.unknowns, parsed.records);
169
- const canonical = createEvidenceBundle(parsed.records.map(parseEvidence), parsed.unknowns);
175
+ const canonical = createEvidenceBundle(parsed.records.map((record, index) => {
176
+ try {
177
+ return parseEvidence(record);
178
+ }
179
+ catch (cause) {
180
+ if (cause instanceof z.ZodError)
181
+ throw new z.ZodError(cause.issues.map((issue) => ({
182
+ ...issue,
183
+ path: ["records", index, ...issue.path],
184
+ })));
185
+ throw cause;
186
+ }
187
+ }), parsed.unknowns);
170
188
  if (JSON.stringify(parsed) !== JSON.stringify(canonical))
171
189
  throw new TypeError("Evidence bundle manifests are not canonical");
172
190
  return canonical;
@@ -364,6 +382,6 @@ const uniqueSorted = (values) => {
364
382
  for (const value of values)
365
383
  unique.set(JSON.stringify(value), value);
366
384
  return [...unique.entries()]
367
- .sort(([left], [right]) => left.localeCompare(right))
385
+ .sort(([left], [right]) => compareUnicodeCodePoints(left, right))
368
386
  .map(([, value]) => value);
369
387
  };
@@ -0,0 +1,144 @@
1
+ import { z } from "zod";
2
+ import { digestSchema, prefixedDigestSchema } from "./digests.js";
3
+ import { evidenceSchema } from "./evidence.js";
4
+ /** Exact retained-record selectors; selection never resolves a provider address. */
5
+ export const evidenceRecordFiltersSchema = z.strictObject({
6
+ evidence_id: prefixedDigestSchema("ev").optional(),
7
+ operation: z.string().min(1).optional(),
8
+ target_sha256: digestSchema.optional(),
9
+ analysis_profile_digest: digestSchema.optional(),
10
+ procedure_address: z.string().min(1).optional(),
11
+ });
12
+ const countSchema = z.number().int().nonnegative();
13
+ const nativeMetadataSchema = z.object({
14
+ procedure: z.object({ address: z.string(), name: z.string().nullish() }),
15
+ native_value_flow: z.unknown().optional(),
16
+ });
17
+ const valueFlowMetadataSchema = z.union([
18
+ z.object({
19
+ available: z.literal(true),
20
+ truncated: z.boolean(),
21
+ omitted_operations_lower_bound: countSchema.optional(),
22
+ known_omitted_inputs: countSchema.optional(),
23
+ known_omitted_edges: countSchema.optional(),
24
+ }),
25
+ z.object({ available: z.literal(false), reason: z.string() }),
26
+ ]);
27
+ const nativeSummarySchema = z.discriminatedUnion("available", [
28
+ z.strictObject({
29
+ available: z.literal(true),
30
+ procedure_address: z.string(),
31
+ procedure_name: z.string().nullable(),
32
+ value_flow: z.discriminatedUnion("status", [
33
+ z.strictObject({
34
+ status: z.literal("observed"),
35
+ truncated: z.boolean(),
36
+ omitted_operations_lower_bound: countSchema.nullable(),
37
+ known_omitted_inputs: countSchema.nullable(),
38
+ known_omitted_edges: countSchema.nullable(),
39
+ }),
40
+ z.strictObject({ status: z.literal("unavailable"), reason: z.string() }),
41
+ z.strictObject({ status: z.literal("not-recorded") }),
42
+ z.strictObject({ status: z.literal("unknown"), reason: z.string() }),
43
+ ]),
44
+ }),
45
+ z.strictObject({
46
+ available: z.literal(false),
47
+ reason: z.enum(["different-operation", "not-recorded-or-incompatible"]),
48
+ }),
49
+ ]);
50
+ /** Metadata for complete retained records, independent of analysis completeness. */
51
+ export const evidenceBundleSummarySchema = z.strictObject({
52
+ kind: z.literal("evidence-bundle-summary"),
53
+ filters: z.record(z.string(), z.string()),
54
+ total_retained_records: countSchema,
55
+ matching_records: countSchema,
56
+ unknown_revisions: countSchema,
57
+ records: z.array(z.strictObject({
58
+ evidence_id: evidenceSchema.shape.evidence_id,
59
+ subject: evidenceSchema.shape.subject,
60
+ provider: evidenceSchema.shape.provider,
61
+ operation: evidenceSchema.shape.operation,
62
+ confidence: evidenceSchema.shape.confidence,
63
+ authority: evidenceSchema.shape.authority,
64
+ analysis_profile_digest: digestSchema.nullable(),
65
+ retention: z.literal("complete-record"),
66
+ limitation_count: countSchema,
67
+ native_dossier: nativeSummarySchema,
68
+ })),
69
+ });
70
+ const nativeSummary = (evidence) => {
71
+ if (evidence.operation !== "analyze_function")
72
+ return { available: false, reason: "different-operation" };
73
+ // Read only producer metadata. Parsing the full dossier would allocate every
74
+ // large collection merely to discover its already authenticated parent ID.
75
+ const parsed = nativeMetadataSchema.safeParse(evidence.normalized_result);
76
+ if (!parsed.success)
77
+ return { available: false, reason: "not-recorded-or-incompatible" };
78
+ const flow = valueFlowMetadataSchema.safeParse(parsed.data.native_value_flow);
79
+ return {
80
+ available: true,
81
+ procedure_address: parsed.data.procedure.address,
82
+ procedure_name: parsed.data.procedure.name ?? null,
83
+ value_flow: parsed.data.native_value_flow == null
84
+ ? { status: "not-recorded" }
85
+ : !flow.success
86
+ ? {
87
+ status: "unknown",
88
+ reason: "Value-flow metadata has an incompatible representation.",
89
+ }
90
+ : flow.data.available
91
+ ? {
92
+ status: "observed",
93
+ truncated: flow.data.truncated,
94
+ omitted_operations_lower_bound: flow.data.omitted_operations_lower_bound ?? null,
95
+ known_omitted_inputs: flow.data.known_omitted_inputs ?? null,
96
+ known_omitted_edges: flow.data.known_omitted_edges ?? null,
97
+ }
98
+ : { status: "unavailable", reason: flow.data.reason },
99
+ };
100
+ };
101
+ /** Discover retained Evidence without reading or copying its complete payloads. */
102
+ export const summarizeEvidenceBundle = (bundle, filters = {}) => {
103
+ const selectedFilters = {};
104
+ for (const [field, value] of Object.entries(filters))
105
+ if (value !== undefined)
106
+ selectedFilters[field] = value;
107
+ const records = [];
108
+ for (const evidence of bundle.records) {
109
+ if ((filters.evidence_id !== undefined &&
110
+ filters.evidence_id !== evidence.evidence_id) ||
111
+ (filters.operation !== undefined &&
112
+ filters.operation !== evidence.operation) ||
113
+ (filters.target_sha256 !== undefined &&
114
+ filters.target_sha256 !== evidence.subject?.digest.sha256) ||
115
+ (filters.analysis_profile_digest !== undefined &&
116
+ filters.analysis_profile_digest !== evidence.analysis_profile?.digest))
117
+ continue;
118
+ const native = nativeSummary(evidence);
119
+ if (filters.procedure_address !== undefined &&
120
+ (!native.available ||
121
+ filters.procedure_address !== native.procedure_address))
122
+ continue;
123
+ records.push({
124
+ evidence_id: evidence.evidence_id,
125
+ subject: evidence.subject,
126
+ provider: evidence.provider,
127
+ operation: evidence.operation,
128
+ confidence: evidence.confidence,
129
+ authority: evidence.authority,
130
+ analysis_profile_digest: evidence.analysis_profile?.digest ?? null,
131
+ retention: "complete-record",
132
+ limitation_count: evidence.limitations.length,
133
+ native_dossier: native,
134
+ });
135
+ }
136
+ return {
137
+ kind: "evidence-bundle-summary",
138
+ filters: selectedFilters,
139
+ total_retained_records: bundle.records.length,
140
+ matching_records: records.length,
141
+ unknown_revisions: bundle.unknowns.length,
142
+ records,
143
+ };
144
+ };
@@ -1,12 +1,13 @@
1
1
  import { z } from "zod";
2
+ import { isAbsolute } from "node:path";
2
3
  import { digestSchema } from "../digests.js";
3
4
  import { jsonValueSchema } from "../jsonValue.js";
4
- import { isAbsoluteLocalPath, localPathStringSchema } from "../localPath.js";
5
+ import { localPathStringSchema } from "../localPath.js";
5
6
  const bytes = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
6
7
  const range = z.strictObject({ offset: bytes, length: bytes.positive() });
7
8
  const target = {
8
9
  path: localPathStringSchema
9
- .refine(isAbsoluteLocalPath, {
10
+ .refine(isAbsolute, {
10
11
  message: "path must be an absolute local filesystem path (for example /tmp/firmware.bin or C:\\firmware\\firmware.bin)",
11
12
  })
12
13
  .describe("Absolute local firmware file; never executed. Relative paths are rejected."),
@@ -17,7 +18,7 @@ export const firmwareInputSchemas = {
17
18
  extract_firmware: z.strictObject({
18
19
  ...target,
19
20
  output_directory: localPathStringSchema
20
- .refine(isAbsoluteLocalPath, {
21
+ .refine(isAbsolute, {
21
22
  message: "output_directory must be an absolute local filesystem path",
22
23
  })
23
24
  .describe("Absolute, absent output directory; parent must exist"),
@@ -1,4 +1,5 @@
1
1
  import { canonicalJson } from "./comparisonSemantics.js";
2
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
2
3
  import { parseFunctionEvidence } from "./functionDossierEvidence.js";
3
4
  import { functionMatch } from "./functionComparisonNormalization.js";
4
5
  import { functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
@@ -32,6 +33,6 @@ export const compareFunctions = (leftInput, rightInput) => {
32
33
  ]
33
34
  : []),
34
35
  ]),
35
- ].sort((a, b) => a.localeCompare(b)),
36
+ ].sort((a, b) => compareUnicodeCodePoints(a, b)),
36
37
  });
37
38
  };
@@ -1,5 +1,5 @@
1
1
  import { canonicalJson } from "./comparisonSemantics.js";
2
- import { compareCodePoints } from "./canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
3
3
  export const identityProjection = (snapshot) => ({
4
4
  name: snapshot.dossier.procedure.name,
5
5
  signature: snapshot.dossier.procedure.signature,
@@ -136,9 +136,10 @@ export const sorted = (values) => values
136
136
  value,
137
137
  json: canonicalJson(value, "Function normalization"),
138
138
  }))
139
- .sort((left, right) => compareCodePoints(left.json, right.json))
139
+ .sort((left, right) => compareUnicodeCodePoints(left.json, right.json))
140
140
  .map(({ value }) => value);
141
- export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.[0-9a-f]+)$/iu.test(name);
141
+ /** Recognize address-derived procedure names without excluding named FUN_ symbols. */
142
+ export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.[0-9a-f]+|FUN_[0-9a-f]+)$/iu.test(name);
142
143
  const parseAddress = (value) => /^0x[0-9a-f]+$/iu.test(value) ? BigInt(value) : null;
143
144
  const relativeAddress = (value, base) => {
144
145
  const parsed = parseAddress(value);
@@ -1,4 +1,4 @@
1
- import { canonicalDigest } from "./comparisonSemantics.js";
1
+ import { digestCanonicalValue } from "./canonicalDigest.js";
2
2
  export const dimensionResult = (input) => {
3
3
  const context = {
4
4
  dimension: input.dimension,
@@ -51,4 +51,4 @@ export const summarize = (dimensions) => ({
51
51
  changed: dimensions.filter(({ status }) => status === "changed").length,
52
52
  unknown: dimensions.filter(({ status }) => status === "unknown").length,
53
53
  });
54
- const digest = (value) => canonicalDigest(value, "Function comparison");
54
+ const digest = (value) => digestCanonicalValue(value, "Function comparison");
@@ -1,4 +1,5 @@
1
1
  import { parseEvidence } from "./evidence.js";
2
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
2
3
  import { functionDossierSchema } from "./hopperValues.js";
3
4
  /** Parse one complete analyze_function Evidence record for comparison workflows. */
4
5
  export const parseFunctionEvidence = (input) => {
@@ -14,6 +15,6 @@ export const parseFunctionEvidence = (input) => {
14
15
  dossier,
15
16
  limitations: [
16
17
  ...new Set([...evidence.limitations, ...dossier.limitations]),
17
- ].sort((left, right) => left.localeCompare(right)),
18
+ ].sort((left, right) => compareUnicodeCodePoints(left, right)),
18
19
  };
19
20
  };
@@ -29,12 +29,12 @@ const procedureMapSchema = z.record(z.string(), z.string());
29
29
  const addressedNamesSchema = z.array(z.object({ address: z.string(), name: z.string() }));
30
30
  const addressedNameMapSchema = z.record(z.string(), z.string());
31
31
  const segmentSchema = z.object({
32
- name: z.string().default(""),
33
- start: z.string().default(""),
34
- end: z.string().default(""),
35
- readable: z.boolean().nullable().default(null),
36
- writable: z.boolean().nullable().default(null),
37
- executable: z.boolean().nullable().default(null),
32
+ name: z.string(),
33
+ start: z.string(),
34
+ end: z.string(),
35
+ readable: z.boolean().nullable(),
36
+ writable: z.boolean().nullable(),
37
+ executable: z.boolean().nullable(),
38
38
  });
39
39
  const unavailableAnalysisFactSchema = z
40
40
  .object({ available: z.literal(false), reason: z.string() })
@@ -142,10 +142,6 @@ export const functionBodySchema = z.discriminatedUnion("available", [
142
142
  });
143
143
  }),
144
144
  ]);
145
- const unknownFunctionBody = () => functionBodySchema.default({
146
- available: false,
147
- reason: "The provider did not report complete function body ranges.",
148
- });
149
145
  /** Check the declared entry membership against complete, inclusive body ranges. */
150
146
  export const functionBodyEntryAgrees = (body, address) => {
151
147
  if (!body.available)
@@ -176,8 +172,8 @@ export const procedureIdentitySchema = z
176
172
  .object({
177
173
  address: z.string(),
178
174
  name: z.string(),
179
- classification: procedureClassificationSchema.nullable().default(null),
180
- body: unknownFunctionBody(),
175
+ classification: procedureClassificationSchema.nullable(),
176
+ body: functionBodySchema,
181
177
  })
182
178
  .strict()
183
179
  .superRefine((identity, context) => {
@@ -289,9 +285,9 @@ export const functionDossierSchema = z
289
285
  successors: z.array(z.string()),
290
286
  })
291
287
  .strict()),
292
- native_api: nativeApiBoundarySchema.nullable().default(null),
293
- native_value_flow: nativeValueFlowSchema.nullable().default(null),
294
- limitations: z.array(z.string()).default([]),
288
+ native_api: nativeApiBoundarySchema.nullable(),
289
+ native_value_flow: nativeValueFlowSchema.nullable(),
290
+ limitations: z.array(z.string()),
295
291
  })
296
292
  .strict();
297
293
  /** Strictly parse a complete provider-neutral function dossier. */
@@ -6,8 +6,23 @@ export const projectInputIssues = (issues, input) => issues.flatMap((issue) => p
6
6
  const projectIssue = (issue, input) => {
7
7
  const path = issue.path.flatMap((part) => typeof part === "string" || typeof part === "number" ? [part] : []);
8
8
  // Branch issue paths are relative to the union; branches often agree.
9
- if (issue.code === "invalid_union")
9
+ if (issue.code === "invalid_union") {
10
+ // Unmatched discriminators and ambiguous unions have no branch issues.
11
+ // Keep their outer failure instead of flattening it into an empty list.
12
+ if (issue.errors.length === 0) {
13
+ const expected = "options" in issue ? issue.options?.filter(isSafeExpected) : undefined;
14
+ return [
15
+ {
16
+ path,
17
+ reason: valueAtPath(input, path) === undefined
18
+ ? "missing_argument"
19
+ : "invalid_value",
20
+ ...(expected === undefined ? {} : { expected }),
21
+ },
22
+ ];
23
+ }
10
24
  return uniqueIssues(issue.errors.flatMap((branch) => branch.flatMap((branchIssue) => projectIssue({ ...branchIssue, path: [...issue.path, ...branchIssue.path] }, input))));
25
+ }
11
26
  if (issue.code === "invalid_key")
12
27
  return issue.issues.flatMap((keyIssue) => projectIssue({ ...keyIssue, path: [...issue.path, ...keyIssue.path] }, input));
13
28
  if (issue.code === "unrecognized_keys")
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
- import { isAbsoluteLocalPath, localPathStringSchema } from "../localPath.js";
3
- const pathInputSchema = localPathStringSchema.refine(isAbsoluteLocalPath, {
2
+ import { isAbsolute } from "node:path";
3
+ import { localPathStringSchema } from "../localPath.js";
4
+ const pathInputSchema = localPathStringSchema.refine(isAbsolute, {
4
5
  message: "Electron executable, application, and root paths must be absolute local filesystem paths (for example /Applications/Electron.app/Contents/MacOS/Electron)",
5
6
  });
6
7
  const absolutePathSchema = z
@@ -63,7 +64,7 @@ export const electronActiveObservationInputSchema = z.strictObject({
63
64
  args: z
64
65
  .array(z
65
66
  .string()
66
- .regex(/^[^\u0000]*$/u, "Electron arguments must not contain NUL"))
67
+ .regex(/^[^\x00]*$/u, "Electron arguments must not contain NUL"))
67
68
  .default([]),
68
69
  actions: z.array(actionSchema).default([]),
69
70
  });