rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,6 +1,6 @@
1
1
  import { callPathInputSchema, callPathResultSchema, parseCallPathAddress, } from "./callPathSchemas.js";
2
2
  import { parseFunctionEvidence, } from "./functionDossierEvidence.js";
3
- export { callPathInputSchema, callPathResultSchema };
3
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
4
4
  /** Minimal directed caller-to-callee adjacency for call-path search. */
5
5
  class CallGraph {
6
6
  successors = new Map();
@@ -77,7 +77,7 @@ export const buildCallPath = (input) => {
77
77
  goal: parsed.goal.address,
78
78
  explored: summarizeSearch(graph, search.reached),
79
79
  evidence_links: uniqueEvidence(snapshots.values()),
80
- limitations: [...new Set(limitations)].sort((left, right) => left.localeCompare(right)),
80
+ limitations: [...new Set(limitations)].sort(compareUnicodeCodePoints),
81
81
  };
82
82
  const searchScope = { exhaustive };
83
83
  if (found)
@@ -112,9 +112,9 @@ const parseSnapshots = (groups) => {
112
112
  const snapshots = new Map();
113
113
  for (const group of groups) {
114
114
  const snapshot = parseFunctionEvidence(group);
115
- const address = normalizeAddress(snapshot.procedure.address);
116
- for (const callee of snapshot.collections.callees.items)
117
- normalizeAddress(callee.address);
115
+ const address = parseCallPathAddress(snapshot.dossier.procedure.address);
116
+ for (const callee of snapshot.dossier.callees)
117
+ parseCallPathAddress(callee.address);
118
118
  if (snapshots.has(address))
119
119
  throw new TypeError(`Duplicate function Evidence for ${address}`);
120
120
  snapshots.set(address, snapshot);
@@ -131,9 +131,9 @@ const assertCompatible = (snapshots) => {
131
131
  snapshot.subject.format !== first.subject.format ||
132
132
  snapshot.subject.architecture !== first.subject.architecture)
133
133
  throw new TypeError("Call-path Evidence mixes artifact subjects");
134
- if (snapshot.provider.id !== first.provider.id ||
135
- snapshot.provider.name !== first.provider.name ||
136
- snapshot.provider.version !== first.provider.version)
134
+ if (snapshot.evidence.provider.id !== first.evidence.provider.id ||
135
+ snapshot.evidence.provider.name !== first.evidence.provider.name ||
136
+ snapshot.evidence.provider.version !== first.evidence.provider.version)
137
137
  throw new TypeError("Call-path Evidence mixes providers");
138
138
  }
139
139
  };
@@ -141,8 +141,8 @@ const createGraph = (snapshots) => {
141
141
  const graph = new CallGraph();
142
142
  for (const [address, snapshot] of snapshots) {
143
143
  graph.mergeNode(address);
144
- for (const callee of snapshot.collections.callees.items) {
145
- const calleeAddress = normalizeAddress(callee.address);
144
+ for (const callee of snapshot.dossier.callees) {
145
+ const calleeAddress = parseCallPathAddress(callee.address);
146
146
  graph.mergeNode(calleeAddress);
147
147
  graph.mergeDirectedEdge(address, calleeAddress);
148
148
  }
@@ -175,9 +175,7 @@ const inspectSearch = ({ graph, snapshots, start, goal, }) => {
175
175
  limitations.push(`No analyze_function Evidence covers reachable function ${node}`);
176
176
  continue;
177
177
  }
178
- const neighbors = graph
179
- .outNeighbors(node)
180
- .sort((left, right) => left.localeCompare(right));
178
+ const neighbors = graph.outNeighbors(node).sort(compareUnicodeCodePoints);
181
179
  for (const neighbor of neighbors)
182
180
  if (!reached.has(neighbor)) {
183
181
  reached.set(neighbor, depth + 1);
@@ -204,7 +202,7 @@ const enumeratePaths = ({ graph, start, goal, goalDistances, }) => {
204
202
  .outNeighbors(node)
205
203
  .filter((neighbor) => distance !== undefined &&
206
204
  goalDistances.get(neighbor) === distance - 1)
207
- .sort((left, right) => left.localeCompare(right));
205
+ .sort(compareUnicodeCodePoints);
208
206
  neighbors.set(node, candidates);
209
207
  }
210
208
  return { neighbors: candidates, nextIndex: 0 };
@@ -249,7 +247,7 @@ const citePath = (addresses, snapshots) => {
249
247
  (index > 0 ? snapshots.get(addresses[index - 1] ?? "") : undefined);
250
248
  return {
251
249
  address,
252
- name: snapshot?.procedure.name ?? null,
250
+ name: snapshot?.dossier.procedure.name ?? null,
253
251
  evidence_links: snapshotLinks(supporting),
254
252
  };
255
253
  });
@@ -267,9 +265,8 @@ const citePath = (addresses, snapshots) => {
267
265
  const snapshotLinks = (snapshot) => {
268
266
  if (snapshot === undefined)
269
267
  throw new TypeError("Every call-path claim requires supporting Evidence");
270
- return snapshot.evidence.map(({ evidence_id }) => evidence_id);
268
+ return [snapshot.evidence.evidence_id];
271
269
  };
272
270
  const uniqueEvidence = (snapshots) => [
273
271
  ...new Set([...snapshots].flatMap((snapshot) => snapshotLinks(snapshot))),
274
- ].sort((left, right) => left.localeCompare(right));
275
- const normalizeAddress = (input) => parseCallPathAddress(input);
272
+ ].sort(compareUnicodeCodePoints);
@@ -4,10 +4,10 @@ import { evidenceSchema } from "./evidence.js";
4
4
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
5
  const addressSchema = z
6
6
  .string()
7
- .regex(/^(?:(?:[A-Za-z0-9._~-]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
7
+ .regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
8
8
  const inputAddressSchema = z
9
9
  .string()
10
- .regex(/^(?:(?:[A-Za-z0-9._~-]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
10
+ .regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
11
11
  .transform((address) => {
12
12
  const separator = address.lastIndexOf(":") + 1;
13
13
  const space = address
@@ -1,5 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
- /** Hash canonicalize-compatible JSON without assembling an aggregate string. */
2
+ /**
3
+ * Streaming SHA-256 over canonical JSON. Hashing owner (avoids assembling
4
+ * aggregate strings); `comparisonSemantics.canonicalJson` (canonicalize lib)
5
+ * is the string-comparison owner. JSON object keys follow RFC 8785's UTF-16
6
+ * code-unit order in both; entity-list ordering is a separate concern.
7
+ */
3
8
  export const digestCanonicalValue = (value, context = "Comparison") => {
4
9
  const hash = createHash("sha256");
5
10
  // Batch small emitted parts to cut hash.update crossings.
@@ -54,6 +59,7 @@ const emitCanonical = (value, emit, ancestors) => {
54
59
  else {
55
60
  emit("{");
56
61
  let first = true;
62
+ // Match canonicalize/RFC 8785, including supplementary-plane keys.
57
63
  for (const key of Object.keys(value).sort()) {
58
64
  if (Reflect.get(value, key) === undefined ||
59
65
  typeof Reflect.get(value, key) === "symbol")
@@ -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,11 +1,12 @@
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
- import { functionComparisonResultSchema } from "./functionComparison.js";
7
+ import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
7
8
  import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
8
- import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processCapture.js";
9
+ import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
9
10
  import { prefixedDigestSchema } from "./../domain/digests.js";
10
11
  const evidenceIdSchema = prefixedDigestSchema("ev");
11
12
  /** Input for aggregating existing comparison Evidence. */
@@ -209,7 +210,7 @@ const functionFindings = (evidence) => {
209
210
  dimension: dimension.dimension,
210
211
  scope: "static_candidate",
211
212
  status: dimension.status,
212
- classification: dimension.status === "unknown" || dimension.status === "truncated"
213
+ classification: dimension.status === "unknown"
213
214
  ? "unresolved_branch"
214
215
  : dimension.conclusion_kind,
215
216
  limitations: dimension.limitations,
@@ -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}`);
@@ -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);
@@ -1,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
4
5
  import { createEvidenceCompletionLedger, evidenceCompletionRecordSchema, } from "./evidenceCompletionLedger.js";
5
6
  import { digestSchema } from "./../domain/digests.js";
6
7
  import { prefixedDigestSchema } from "./../domain/digests.js";
7
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
8
+ const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
8
9
  const identitySchema = z.strictObject({
9
10
  id: identifierSchema,
10
11
  version: z.string().min(1),
@@ -2,6 +2,11 @@ import { AnalysisError, } from "./analysisErrorBase.js";
2
2
  /** Runtime configuration could not be parsed safely. */
3
3
  export class ConfigurationError extends AnalysisError {
4
4
  _tag = "ConfigurationError";
5
+ settings;
6
+ constructor(message, options) {
7
+ super(message, options);
8
+ this.settings = (options?.settings ?? []).map(({ setting, constraint }) => ({ setting, constraint }));
9
+ }
5
10
  }
6
11
  /** No app or binary session exists for an analysis request. */
7
12
  export class NoBinaryOpenError extends AnalysisError {
@@ -16,10 +21,17 @@ export class BinaryTargetError extends AnalysisError {
16
21
  reason;
17
22
  _tag = "BinaryTargetError";
18
23
  constraint;
24
+ /** The OS read-permission code of the cause, when the host denied access. */
25
+ systemCode;
19
26
  constructor(path, reason, options) {
20
27
  super(`Cannot open artifact: ${reason}`, options);
21
28
  this.path = path;
22
29
  this.reason = reason;
23
30
  this.constraint = options?.constraint;
31
+ this.systemCode = readPermissionCode(options?.cause);
24
32
  }
25
33
  }
34
+ const readPermissionCode = (cause) => {
35
+ const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
36
+ return code === "EACCES" || code === "EPERM" ? code : undefined;
37
+ };
@@ -1,12 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
- import { evidenceEnvelopeSchema } from "./evidence.js";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
5
+ import { evidenceSchema } from "./evidence.js";
5
6
  import { evidenceBundleSchema } from "./evidenceBundle.js";
6
7
  import { err, ok } from "./result.js";
7
8
  import { prefixedDigestSchema } from "./../domain/digests.js";
8
9
  const conformancePackageIdSchema = prefixedDigestSchema("cp");
9
- const scenarioIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
10
+ const scenarioIdSchema = z.string().regex(IDENTIFIER_PATTERN);
10
11
  const scenarioManifestSchema = z.strictObject({
11
12
  scenario_id: scenarioIdSchema,
12
13
  name: z.string().min(1),
@@ -45,7 +46,7 @@ const shimPlanSchema = z.strictObject({
45
46
  const expectedEvidenceSchema = z.strictObject({
46
47
  scenario_id: scenarioIdSchema,
47
48
  /** Expected evidence envelopes. */
48
- envelopes: z.array(evidenceEnvelopeSchema),
49
+ envelopes: z.array(evidenceSchema),
49
50
  /** Expected evidence bundle. */
50
51
  bundle: evidenceBundleSchema.nullable(),
51
52
  /** Required dimensions that must be present in the evidence. */
@@ -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;
@@ -79,6 +79,7 @@ const evidenceBaseSchema = z
79
79
  evidence_id: prefixedDigestSchema("ev"),
80
80
  subject: subjectSchema.nullable(),
81
81
  provider: providerSchema,
82
+ analysis_profile: analysisProfileSchema.nullable(),
82
83
  predicate_type: z.string().min(1),
83
84
  operation: z.string().min(1),
84
85
  parameters: jsonObjectSchema,
@@ -92,13 +93,10 @@ const evidenceBaseSchema = z
92
93
  evidence_links: z.array(prefixedDigestSchema("ev")),
93
94
  })
94
95
  .strict();
95
- /** Object envelope used to specialize caller-visible Evidence result schemas. */
96
- export const evidenceEnvelopeSchema = evidenceBaseSchema.extend({
97
- analysis_profile: analysisProfileSchema.optional(),
98
- });
99
- const validateAnalysisProfileProvider = (evidence, context) => {
96
+ /** Require a reported analysis profile to identify the observation provider. */
97
+ export const validateAnalysisProfileProvider = (evidence, context) => {
100
98
  const profile = evidence.analysis_profile;
101
- if (profile !== undefined &&
99
+ if (profile !== null &&
102
100
  (profile.provider.id !== evidence.provider.id ||
103
101
  profile.provider.name !== evidence.provider.name ||
104
102
  profile.provider.version !== evidence.provider.version))
@@ -109,15 +107,16 @@ const validateAnalysisProfileProvider = (evidence, context) => {
109
107
  });
110
108
  };
111
109
  /** Strict, provider-neutral record for one successful public observation. */
112
- export const evidenceSchema = evidenceEnvelopeSchema.superRefine(validateAnalysisProfileProvider);
113
- const profiledEvidenceSchema = evidenceBaseSchema
114
- .extend({ analysis_profile: analysisProfileSchema })
115
- .superRefine(validateAnalysisProfileProvider);
116
- /** JSON-exact union used where Evidence participates in larger schemas. */
117
- export const evidenceRecordSchema = z.union([
118
- profiledEvidenceSchema,
119
- evidenceBaseSchema,
120
- ]);
110
+ export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
111
+ const authenticatedEvidenceSchema = evidenceSchema.superRefine((evidence, context) => {
112
+ const { evidence_id: evidenceId, ...withoutId } = evidence;
113
+ if (computeEvidenceId(withoutId) !== evidenceId)
114
+ context.addIssue({
115
+ code: "custom",
116
+ path: ["evidence_id"],
117
+ message: "Evidence semantic identifier does not match its record",
118
+ });
119
+ });
121
120
  const immutableEvidenceSnapshots = new WeakMap();
122
121
  const immutableResultSchema = z
123
122
  .custom(isImmutableJsonSnapshot)
@@ -135,9 +134,7 @@ const semanticProjection = (evidence) => ({
135
134
  architecture: evidence.subject.architecture,
136
135
  },
137
136
  provider: evidence.provider,
138
- ...(!("analysis_profile" in evidence)
139
- ? {}
140
- : { analysis_profile: evidence.analysis_profile }),
137
+ analysis_profile: evidence.analysis_profile,
141
138
  predicate_type: evidence.predicate_type,
142
139
  operation: evidence.operation,
143
140
  parameters: evidence.parameters,
@@ -159,17 +156,7 @@ export const parseEvidence = (input) => {
159
156
  : undefined;
160
157
  if (immutable !== undefined)
161
158
  return immutable;
162
- // Select the producer's envelope before traversing its payload. A legacy
163
- // record cannot satisfy the required-profile branch, whose failed parse
164
- // would otherwise clone the entire normalized result before trying legacy.
165
- const schema = typeof input === "object" && input !== null && "analysis_profile" in input
166
- ? profiledEvidenceSchema
167
- : evidenceBaseSchema;
168
- const evidence = schema.parse(input);
169
- const { evidence_id: evidenceId, ...withoutId } = evidence;
170
- if (computeEvidenceId(withoutId) !== evidenceId)
171
- throw new TypeError("Evidence semantic identifier does not match its record");
172
- return evidence;
159
+ return authenticatedEvidenceSchema.parse(input);
173
160
  };
174
161
  /** Authenticate and seal a ledger-owned snapshot; external mutable values are copied first. */
175
162
  export const immutableEvidence = (input) => rememberImmutableEvidence(parseEvidence(input));
@@ -226,9 +213,7 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
226
213
  name: provider.name,
227
214
  version: provider.version,
228
215
  },
229
- ...(observation.analysisProfile === undefined
230
- ? {}
231
- : { analysis_profile: observation.analysisProfile }),
216
+ analysis_profile: observation.analysisProfile ?? null,
232
217
  predicate_type: observation.predicateType ?? "rea.analysis",
233
218
  operation: observation.operation,
234
219
  parameters: observation.parameters,
@@ -249,18 +234,12 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
249
234
  locations: [...(observation.locations ?? [])],
250
235
  evidence_links: [...(observation.evidenceLinks ?? [])],
251
236
  };
252
- // Select the known envelope before parsing. A union otherwise traverses and
253
- // clones a legacy result for the profiled branch before rejecting its absent
254
- // profile and trying the legacy branch.
255
- const schema = observation.analysisProfile === undefined
256
- ? evidenceBaseSchema
257
- : profiledEvidenceSchema;
258
237
  const sharedResult = typeof observation.result === "object" &&
259
238
  observation.result !== null &&
260
239
  isImmutableJsonSnapshot(observation.result);
261
240
  const selectedSchema = sharedResult
262
- ? schema.safeExtend({ normalized_result: immutableResultSchema })
263
- : schema;
241
+ ? evidenceSchema.safeExtend({ normalized_result: immutableResultSchema })
242
+ : evidenceSchema;
264
243
  const normalized = selectedSchema.parse({
265
244
  ...semantic,
266
245
  evidence_id: `ev_${"0".repeat(64)}`,
@@ -1,24 +1,23 @@
1
1
  import { z } from "zod";
2
2
  import canonicalize from "canonicalize";
3
- import { evidenceEnvelopeSchema, evidenceRecordSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
3
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
4
+ import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
4
5
  import { residualUnknownSchema, } from "./residualUnknown.js";
5
6
  import { freezeJsonSnapshot } from "./immutableJson.js";
6
- const artifactManifestSchema = evidenceEnvelopeSchema.shape.subject
7
- .unwrap()
8
- .pick({
7
+ const artifactManifestSchema = evidenceSchema.shape.subject.unwrap().pick({
9
8
  digest: true,
10
9
  format: true,
11
10
  architecture: true,
12
11
  });
13
12
  const providerManifestSchema = providerSchema;
14
- const environmentManifestSchema = evidenceEnvelopeSchema.shape.environment.unwrap();
13
+ const environmentManifestSchema = evidenceSchema.shape.environment.unwrap();
15
14
  const scenarioManifestSchema = z.object({
16
- evidence_id: evidenceEnvelopeSchema.shape.evidence_id,
15
+ evidence_id: evidenceSchema.shape.evidence_id,
17
16
  operation: z.string().min(1),
18
17
  authority: z.literal("controlled-replay"),
19
18
  });
20
19
  const captureManifestSchema = z.object({
21
- evidence_id: evidenceEnvelopeSchema.shape.evidence_id,
20
+ evidence_id: evidenceSchema.shape.evidence_id,
22
21
  predicate_type: z.string().min(1),
23
22
  });
24
23
  export const evidenceBundleSchema = z.object({
@@ -28,7 +27,7 @@ export const evidenceBundleSchema = z.object({
28
27
  scenarios: z.array(scenarioManifestSchema),
29
28
  captures: z.array(captureManifestSchema),
30
29
  unknowns: z.array(residualUnknownSchema),
31
- records: z.array(evidenceRecordSchema),
30
+ records: z.array(evidenceSchema),
32
31
  });
33
32
  const immutableBundles = new WeakMap();
34
33
  /** Build and authenticate a sealed bundle while reusing immutable Evidence records. */
@@ -45,7 +44,7 @@ export const createImmutableEvidenceBundle = (records, unknowns = []) => {
45
44
  };
46
45
  /** Project records into a deterministic bundle whose order has no semantics. */
47
46
  export const createEvidenceBundle = (records, unknowns = []) => {
48
- 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));
49
48
  return {
50
49
  artifacts: uniqueSorted(sortedRecords.flatMap(({ subject }) => subject === null
51
50
  ? []
@@ -75,55 +74,60 @@ export const createEvidenceBundle = (records, unknowns = []) => {
75
74
  },
76
75
  ]
77
76
  : []),
78
- 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) ||
79
78
  left.revision - right.revision),
80
79
  records: sortedRecords,
81
80
  };
82
81
  };
83
- /** 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. */
84
83
  export const evidenceBundleForTarget = (bundle, sha256) => {
85
84
  const recordsById = new Map(bundle.records.map((record) => [record.evidence_id, record]));
86
- 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
+ }
87
91
  const retained = new Set();
88
- const revisionsById = new Map();
89
92
  const dependents = new Map();
90
- for (const unknown of candidates) {
91
- const mutationEvidenceIds = new Set(unknown.mutation_evidence_ids);
92
- const evidenceAvailable = referencedEvidenceIds(unknown).every((id) => {
93
- const record = recordsById.get(id);
94
- return (record?.subject?.digest.sha256 === sha256 ||
95
- (mutationEvidenceIds.has(id) &&
96
- record?.subject === null &&
97
- 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
+ });
98
107
  });
99
- if (!evidenceAvailable)
108
+ if (!eligible)
100
109
  continue;
101
- retained.add(unknown);
102
- revisionsById.set(unknown.unknown_id, (revisionsById.get(unknown.unknown_id) ?? 0) + 1);
103
- 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) {
104
114
  const references = dependents.get(relatedId) ?? new Set();
105
- references.add(unknown);
115
+ references.add(id);
106
116
  dependents.set(relatedId, references);
107
117
  }
108
118
  }
109
119
  const pending = [];
110
- for (const unknown of retained)
111
- if (unknown.relationships.some(({ unknown_id: id }) => !revisionsById.has(id)))
112
- pending.push(unknown);
120
+ for (const [id, relatedIds] of relationships)
121
+ if ([...relatedIds].some((relatedId) => !retained.has(relatedId)))
122
+ pending.push(id);
113
123
  for (let index = 0; index < pending.length; index += 1) {
114
- const unknown = pending[index];
115
- if (unknown === undefined || !retained.delete(unknown))
124
+ const id = pending[index];
125
+ if (id === undefined || !retained.delete(id))
116
126
  continue;
117
- const remaining = (revisionsById.get(unknown.unknown_id) ?? 1) - 1;
118
- if (remaining > 0) {
119
- revisionsById.set(unknown.unknown_id, remaining);
120
- continue;
121
- }
122
- revisionsById.delete(unknown.unknown_id);
123
- for (const dependent of dependents.get(unknown.unknown_id) ?? [])
127
+ for (const dependent of dependents.get(id) ?? [])
124
128
  pending.push(dependent);
125
129
  }
126
- const unknowns = candidates.filter((unknown) => retained.has(unknown));
130
+ const unknowns = bundle.unknowns.filter((unknown) => retained.has(unknown.unknown_id));
127
131
  const mutationIds = new Set(unknowns.flatMap(({ mutation_evidence_ids: ids }) => ids));
128
132
  return createEvidenceBundle(bundle.records.filter((record) => record.subject?.digest.sha256 === sha256 ||
129
133
  mutationIds.has(record.evidence_id)), unknowns);
@@ -139,7 +143,7 @@ const referencedEvidenceIds = (unknown) => [
139
143
  * Evidence record, such as one command result, is not a bundle.
140
144
  */
141
145
  export const describeEvidenceBundleFailure = (input, cause) => {
142
- const record = evidenceRecordSchema.safeParse(input);
146
+ const record = evidenceSchema.safeParse(input);
143
147
  if (record.success)
144
148
  return `Expected an Evidence bundle with records and manifest arrays, but this JSON is one Evidence record (${record.data.evidence_id}). Export a session bundle with the MCP export_evidence_bundle tool and supply that file.`;
145
149
  return cause instanceof z.ZodError
@@ -168,7 +172,19 @@ export const parseEvidenceBundle = (input) => {
168
172
  if (new Set(recordIds).size !== recordIds.length)
169
173
  throw new TypeError("Evidence bundle contains duplicate record IDs");
170
174
  validateUnknownGraph(parsed.unknowns, parsed.records);
171
- 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);
172
188
  if (JSON.stringify(parsed) !== JSON.stringify(canonical))
173
189
  throw new TypeError("Evidence bundle manifests are not canonical");
174
190
  return canonical;
@@ -366,6 +382,6 @@ const uniqueSorted = (values) => {
366
382
  for (const value of values)
367
383
  unique.set(JSON.stringify(value), value);
368
384
  return [...unique.entries()]
369
- .sort(([left], [right]) => left.localeCompare(right))
385
+ .sort(([left], [right]) => compareUnicodeCodePoints(left, right))
370
386
  .map(([, value]) => value);
371
387
  };
@@ -1,9 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
4
5
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
6
  const evidenceIdSchema = prefixedDigestSchema("ev");
6
- const claimIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
7
+ const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
7
8
  /** Terminal outcome recorded for one verifier claim. */
8
9
  export const evidenceCompletionStatusSchema = z.enum([
9
10
  "pass",
@@ -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,18 +1,18 @@
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";
5
6
  import { overallStatus, summarize } from "./functionComparisonResults.js";
6
7
  import { compareDimensions } from "./functionComparisonDimensions.js";
7
- export { functionComparisonInputSchema, functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
8
8
  /** Compare two complete function Evidence records without fuzzy matching. */
9
9
  export const compareFunctions = (leftInput, rightInput) => {
10
10
  const left = parseFunctionEvidence(leftInput);
11
11
  const right = parseFunctionEvidence(rightInput);
12
- const links = [left.evidence[0].evidence_id, right.evidence[0].evidence_id];
13
- const providersDiffer = canonicalJson(left.provider, "Function comparison") !==
14
- canonicalJson(right.provider, "Function comparison");
15
- const dimensions = compareDimensions(left, right, links, providersDiffer);
12
+ const links = [left.evidence.evidence_id, right.evidence.evidence_id];
13
+ const providersDiffer = canonicalJson(left.evidence.provider, "Function comparison") !==
14
+ canonicalJson(right.evidence.provider, "Function comparison");
15
+ const dimensions = compareDimensions(left, right, { links, providersDiffer });
16
16
  const match = functionMatch(left, right);
17
17
  const changes = dimensions.filter(({ status }) => status !== "unchanged");
18
18
  return functionComparisonResultSchema.parse({
@@ -33,6 +33,6 @@ export const compareFunctions = (leftInput, rightInput) => {
33
33
  ]
34
34
  : []),
35
35
  ]),
36
- ].sort((a, b) => a.localeCompare(b)),
36
+ ].sort((a, b) => compareUnicodeCodePoints(a, b)),
37
37
  });
38
38
  };