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,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { compareCodePoints } from "./canonicalOrdering.js";
2
+ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
3
3
  const jsonValueTypeSchema = z.enum([
4
4
  "object",
5
5
  "array",
@@ -8,17 +8,22 @@ const jsonValueTypeSchema = z.enum([
8
8
  "boolean",
9
9
  "null",
10
10
  ]);
11
+ const jsonShapePathSegmentSchema = z.discriminatedUnion("kind", [
12
+ z.object({ kind: z.literal("property"), name: z.string() }),
13
+ z.object({ kind: z.literal("array-element") }),
14
+ ]);
11
15
  /** Value-free structural summary of one approved JSON payload. */
12
16
  export const jsonShapeSchema = z.object({
13
17
  root_type: jsonValueTypeSchema,
14
18
  node_count: z.number().int().min(1),
15
19
  max_depth_observed: z.number().int().min(0),
16
20
  properties: z.array(z.object({
17
- path: z.string(),
21
+ path: z.array(jsonShapePathSegmentSchema).min(1),
18
22
  types: z.array(jsonValueTypeSchema).min(1),
19
23
  observations: z.number().int().min(1),
20
24
  })),
21
25
  });
26
+ const arrayElementKey = Symbol("array-element");
22
27
  /** Parse approved JSON and immediately discard values after iterative shape inference. */
23
28
  export const inferJsonShape = (text) => {
24
29
  let root;
@@ -30,8 +35,31 @@ export const inferJsonShape = (text) => {
30
35
  void cause;
31
36
  return null;
32
37
  }
33
- const properties = new Map();
34
- const pending = [{ value: root, path: "", depth: 0 }];
38
+ const rootShape = {
39
+ path: [],
40
+ types: new Set(),
41
+ observations: 0,
42
+ };
43
+ // Each structural path owns one accumulator, shared by all matching array rows.
44
+ const childShape = (parent, key) => {
45
+ const children = (parent.children ??= new Map());
46
+ const existing = children.get(key);
47
+ if (existing !== undefined)
48
+ return existing;
49
+ const node = {
50
+ path: [
51
+ ...parent.path,
52
+ typeof key === "string"
53
+ ? { kind: "property", name: key }
54
+ : { kind: "array-element" },
55
+ ],
56
+ types: new Set(),
57
+ observations: 0,
58
+ };
59
+ children.set(key, node);
60
+ return node;
61
+ };
62
+ const pending = [{ value: root, shape: rootShape }];
35
63
  let nodeCount = 0;
36
64
  let maxDepthObserved = 0;
37
65
  while (pending.length > 0) {
@@ -39,14 +67,15 @@ export const inferJsonShape = (text) => {
39
67
  if (current === undefined)
40
68
  break;
41
69
  nodeCount += 1;
42
- maxDepthObserved = Math.max(maxDepthObserved, current.depth);
70
+ maxDepthObserved = Math.max(maxDepthObserved, current.shape.path.length);
71
+ current.shape.types.add(jsonValueType(current.value));
72
+ current.shape.observations += 1;
43
73
  if (Array.isArray(current.value)) {
74
+ if (current.value.length === 0)
75
+ continue;
76
+ const shape = childShape(current.shape, arrayElementKey);
44
77
  for (let index = current.value.length - 1; index >= 0; index -= 1)
45
- pending.push({
46
- value: current.value[index],
47
- path: `${current.path}/*`,
48
- depth: current.depth + 1,
49
- });
78
+ pending.push({ value: current.value[index], shape });
50
79
  continue;
51
80
  }
52
81
  if (!isRecord(current.value))
@@ -57,31 +86,31 @@ export const inferJsonShape = (text) => {
57
86
  if (entry === undefined)
58
87
  continue;
59
88
  const [name, value] = entry;
60
- const path = `${current.path}/${pointerName(name)}`;
61
- const type = jsonValueType(value);
62
- const existing = properties.get(path);
63
- if (existing === undefined)
64
- properties.set(path, { types: new Set([type]), observations: 1 });
65
- else {
66
- existing.types.add(type);
67
- existing.observations += 1;
68
- }
69
- pending.push({ value, path, depth: current.depth + 1 });
89
+ pending.push({ value, shape: childShape(current.shape, name) });
70
90
  }
71
91
  }
72
- return jsonShapeSchema.parse({
92
+ // Preorder over sorted siblings gives canonical paths without repeatedly
93
+ // comparing their shared prefixes. Each returned path owns its segments.
94
+ const properties = [];
95
+ const shapes = orderedChildren(rootShape);
96
+ while (shapes.length > 0) {
97
+ const shape = shapes.pop();
98
+ if (shape === undefined)
99
+ break;
100
+ properties.push({
101
+ path: shape.path.map((segment) => ({ ...segment })),
102
+ types: [...shape.types].sort(),
103
+ observations: shape.observations,
104
+ });
105
+ for (const child of orderedChildren(shape))
106
+ shapes.push(child);
107
+ }
108
+ return {
73
109
  root_type: jsonValueType(root),
74
110
  node_count: nodeCount,
75
111
  max_depth_observed: maxDepthObserved,
76
- properties: [...properties.entries()]
77
- .map(([path, value]) => ({
78
- path,
79
- types: [...value.types].sort(),
80
- observations: value.observations,
81
- }))
82
- .sort((left, right) => left.path.localeCompare(right.path) ||
83
- compareCodePoints(left.path, right.path)),
84
- });
112
+ properties,
113
+ };
85
114
  };
86
115
  const jsonValueType = (value) => {
87
116
  if (value === null)
@@ -100,4 +129,13 @@ const jsonValueType = (value) => {
100
129
  }
101
130
  };
102
131
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
103
- const pointerName = (value) => value.replaceAll("~", "~0").replaceAll("/", "~1");
132
+ /** Reverse sibling order for the traversal stack; array elements sort first. */
133
+ const orderedChildren = (node) => [...(node.children ?? [])]
134
+ .sort(([left], [right]) => left === right
135
+ ? 0
136
+ : left === arrayElementKey
137
+ ? 1
138
+ : right === arrayElementKey
139
+ ? -1
140
+ : compareUnicodeCodePoints(right, left))
141
+ .map(([, child]) => child);
@@ -64,6 +64,9 @@ export function* jsonValueValidationSteps(root) {
64
64
  return finish(undefined);
65
65
  }
66
66
  const preserveJsonValue = (value) => {
67
+ const immutableCandidate = value;
68
+ if (isImmutableJsonSnapshot(immutableCandidate))
69
+ return value;
67
70
  if (Array.isArray(value))
68
71
  return value.map(preserveJsonValue);
69
72
  if (value !== null && typeof value === "object")
@@ -1,12 +1,18 @@
1
1
  import { isAbsolute, relative, sep } from "node:path";
2
2
  import { z } from "zod";
3
- /** Preserve selected filesystem names while rejecting OS-invalid NUL bytes. */
3
+ /**
4
+ * Preserve selected filesystem names while rejecting OS-invalid NUL bytes.
5
+ *
6
+ * The pattern spells NUL as `\x00` rather than `\u0000`. Both accept exactly the
7
+ * same strings. The hex form also avoids the short `\0` spelling rejected by
8
+ * strict schema consumers. A client can reject its entire tool request when
9
+ * one advertised pattern cannot compile. See `offsetDateTimeSchema` for the
10
+ * same hex-escape convention.
11
+ */
4
12
  export const localPathStringSchema = z
5
13
  .string()
6
14
  .min(1)
7
- .regex(/^[^\u0000]*$/u, "Local filesystem paths cannot contain NUL");
8
- /** True when the value is an absolute filesystem path on the host platform. */
9
- export const isAbsoluteLocalPath = (value) => isAbsolute(value);
15
+ .regex(/^[^\x00]*$/u, "Local filesystem paths cannot contain NUL");
10
16
  /** Test lexical containment on the host platform; callers must resolve symlinks first. */
11
17
  export const isPathWithinRoot = (root, path) => {
12
18
  const value = relative(root, path);
@@ -65,6 +65,7 @@ export const projectManagedApplicationGraph = (input) => {
65
65
  const parsed = parseManagedInputs(input);
66
66
  const artifactIdentity = chooseArtifact(parsed);
67
67
  assertSameArtifact(parsed, artifactIdentity.sha256);
68
+ assertConsistentModuleIdentity(parsed);
68
69
  const evidenceLinks = [
69
70
  parsed.artifact?.evidence.evidence_id,
70
71
  parsed.members?.evidence.evidence_id,
@@ -82,8 +83,8 @@ export const projectManagedApplicationGraph = (input) => {
82
83
  };
83
84
  const artifactNode = addArtifactNode(state);
84
85
  addArtifactIdentityNodes(state, artifactNode, parsed);
85
- const memberCounts = addMemberNodes(state, artifactNode, parsed);
86
- const boundaryCounts = addBoundaryNodes(state, artifactNode, parsed);
86
+ addMemberNodes(state, artifactNode, parsed);
87
+ addBoundaryNodes(state, artifactNode, parsed);
87
88
  const omissions = omittedCounts(parsed);
88
89
  const limitations = projectionLimitations(parsed, omissions);
89
90
  const graph = createJavaScriptApplicationGraph({
@@ -104,10 +105,13 @@ export const projectManagedApplicationGraph = (input) => {
104
105
  summary: {
105
106
  graph_nodes: graph.nodes.length,
106
107
  graph_edges: graph.edges.length,
107
- assemblies: parsed.artifact?.result.assembly === null ? 0 : 1,
108
- modules: parsed.artifact?.result.module === null ? 0 : 1,
109
- ...memberCounts,
110
- ...boundaryCounts,
108
+ assemblies: countNodes(graph.nodes, "managed-assembly"),
109
+ modules: countNodes(graph.nodes, "managed-module"),
110
+ types: countNodes(graph.nodes, "managed-type"),
111
+ methods: countNodes(graph.nodes, "managed-method"),
112
+ fields: countNodes(graph.nodes, "managed-field"),
113
+ pinvoke_imports: countNodes(graph.nodes, "managed-pinvoke-import"),
114
+ native_implementations: countNodes(graph.nodes, "managed-native-implementation"),
111
115
  },
112
116
  graph,
113
117
  coverage: managedGraphResultCoverage(omissions),
@@ -119,6 +123,7 @@ export const projectManagedApplicationGraph = (input) => {
119
123
  projection_id: `magp_${sha256(withoutId)}`,
120
124
  });
121
125
  };
126
+ const countNodes = (nodes, kind) => nodes.filter((node) => node.kind === kind).length;
122
127
  const parseManagedInputs = (input) => ({
123
128
  artifact: input.managed_artifact === undefined
124
129
  ? null
@@ -147,6 +152,37 @@ const assertSameArtifact = (parsed, sha256Value) => {
147
152
  if (result !== undefined && result.artifact.sha256 !== sha256Value)
148
153
  throw new TypeError("Managed graph projection inputs must describe the same artifact SHA-256");
149
154
  };
155
+ /** Reject contradictory known module identities while leaving null fields unknown. */
156
+ const assertConsistentModuleIdentity = (parsed) => {
157
+ const mvidClaims = [
158
+ parsed.artifact?.result.module?.mvid,
159
+ parsed.members?.result.module?.mvid,
160
+ parsed.members?.result.identity_scope.requires_mvid,
161
+ parsed.boundaries?.result.module?.mvid,
162
+ parsed.boundaries?.result.identity_scope.requires_mvid,
163
+ ]
164
+ .filter((mvid) => mvid !== undefined && mvid !== null)
165
+ .map((mvid) => mvid.toLowerCase());
166
+ if (new Set(mvidClaims).size > 1)
167
+ throw new TypeError("Managed graph inputs report conflicting known module MVIDs or token scopes");
168
+ const modules = [
169
+ parsed.artifact?.result.module,
170
+ parsed.members?.result.module,
171
+ parsed.boundaries?.result.module,
172
+ ].filter((module) => module !== undefined && module !== null);
173
+ for (const field of ["name", "generation", "token", "row_offset"]) {
174
+ const values = new Set(modules.map((module) => module[field]));
175
+ if (values.size > 1)
176
+ throw new TypeError(`Managed graph inputs report conflicting module ${field} values`);
177
+ }
178
+ for (const field of ["enc_id", "enc_base_id"]) {
179
+ const values = new Set(modules
180
+ .map((module) => module[field]?.toLowerCase())
181
+ .filter((value) => value !== undefined));
182
+ if (values.size > 1)
183
+ throw new TypeError(`Managed graph inputs report conflicting module ${field} values`);
184
+ }
185
+ };
150
186
  const omittedCounts = (parsed) => assessManagedGraphOmissions({
151
187
  artifact: parsed.artifact?.result ?? null,
152
188
  members: parsed.members?.result ?? null,
@@ -172,4 +208,9 @@ const projectionLimitations = (parsed, omissions) => [
172
208
  ...(omissions.partialInput
173
209
  ? ["At least one supplied managed Evidence record has partial coverage."]
174
210
  : []),
211
+ ...(omissions.unscopedTokenRelationships
212
+ ? [
213
+ "Managed boundary tokens were not linked to member nodes because matching module MVID scope was not established.",
214
+ ]
215
+ : []),
175
216
  ];
@@ -1,3 +1,4 @@
1
+ import { managedTokenScopesMatch } from "./managedInspectionEvidence.js";
1
2
  const completeCoverage = () => ({
2
3
  status: "complete",
3
4
  truncated: false,
@@ -15,6 +16,11 @@ export const managedSourceCoverage = (state) => state === "complete"
15
16
  };
16
17
  /** Determine whether any supplied managed inspection was partial. */
17
18
  export const assessManagedGraphOmissions = (sources) => ({
19
+ unscopedTokenRelationships: sources.members !== null &&
20
+ sources.boundaries !== null &&
21
+ (sources.boundaries.pinvoke_imports.some(({ member_token }) => member_token !== null) ||
22
+ sources.boundaries.native_implementations.length > 0) &&
23
+ !managedTokenScopesMatch(sources.members.identity_scope.requires_mvid, sources.boundaries.identity_scope.requires_mvid),
18
24
  partialInput: [
19
25
  sources.members?.coverage.state,
20
26
  sources.boundaries?.coverage.state,
@@ -22,7 +28,7 @@ export const assessManagedGraphOmissions = (sources) => ({
22
28
  ].some((state) => state !== undefined && state !== "complete"),
23
29
  });
24
30
  /** Derive graph coverage solely from the coverage of supplied source evidence. */
25
- export const managedGraphEvidenceCoverage = (omissions) => omissions.partialInput
31
+ export const managedGraphEvidenceCoverage = (omissions) => omissions.partialInput || omissions.unscopedTokenRelationships
26
32
  ? {
27
33
  status: "partial",
28
34
  truncated: false,
@@ -32,7 +38,7 @@ export const managedGraphEvidenceCoverage = (omissions) => omissions.partialInpu
32
38
  : completeCoverage();
33
39
  /** Report whether all supplied source evidence was complete. */
34
40
  export const managedGraphResultCoverage = (omissions) => ({
35
- status: omissions.partialInput
41
+ status: omissions.partialInput || omissions.unscopedTokenRelationships
36
42
  ? "partial"
37
43
  : "complete-within-inputs",
38
44
  });
@@ -1,8 +1,8 @@
1
1
  import { basename } from "node:path";
2
2
  import { createJavaScriptApplicationEdge, createJavaScriptApplicationNode, } from "../javascript/javascriptApplicationGraph.js";
3
3
  import { managedSourceCoverage } from "./managedApplicationGraphCoverage.js";
4
+ import { managedTokenScopesMatch } from "./managedInspectionEvidence.js";
4
5
  import {} from "./managedArtifact.js";
5
- import { moduleCoverageState } from "./managedApplicationGraphNodeCoverage.js";
6
6
  /** Add the root managed artifact node to the graph state. */
7
7
  export const addArtifactNode = (state) => {
8
8
  const node = createJavaScriptApplicationNode({
@@ -19,7 +19,7 @@ export const addArtifactNode = (state) => {
19
19
  format: "pe",
20
20
  source: "managed-application-graph",
21
21
  },
22
- evidence: managedEvidence(state, "project-managed-artifact"),
22
+ evidence: projectedManagedEvidence(state, "project-managed-artifact"),
23
23
  },
24
24
  ],
25
25
  });
@@ -28,39 +28,39 @@ export const addArtifactNode = (state) => {
28
28
  };
29
29
  /** Add managed assembly and module identity nodes for the artifact. */
30
30
  export const addArtifactIdentityNodes = (state, artifactNode, parsed) => {
31
- const artifact = parsed.artifact?.result;
32
- const artifactCoverage = managedSourceCoverage(parsed.artifact?.result.coverage.state ?? "complete");
33
- if (artifact?.assembly !== undefined && artifact.assembly !== null) {
31
+ const artifactInput = parsed.artifact;
32
+ if (artifactInput !== null && artifactInput.result.assembly !== null) {
33
+ const assemblyFacts = artifactInput.result.assembly;
34
+ const artifactEvidence = sourceManagedEvidence(state, artifactInput.evidence, artifactInput.result.coverage.state);
34
35
  const assembly = createJavaScriptApplicationNode({
35
36
  kind: "managed-assembly",
36
- identity: artifactLocalIdentity(state.artifactSha256, "managed-assembly", artifact.assembly.token),
37
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-assembly", assemblyFacts.token),
37
38
  observations: [
38
39
  {
39
- label: artifact.assembly.name,
40
+ label: assemblyFacts.name,
40
41
  properties: {
41
- name: artifact.assembly.name,
42
- version: artifact.assembly.version,
43
- culture: artifact.assembly.culture,
44
- public_key_kind: artifact.assembly.public_key.kind,
42
+ name: assemblyFacts.name,
43
+ version: assemblyFacts.version,
44
+ culture: assemblyFacts.culture,
45
+ public_key_kind: assemblyFacts.public_key.kind,
45
46
  },
46
- evidence: managedEvidence(state, "inspect_managed_artifact", artifactCoverage),
47
+ evidence: artifactEvidence,
47
48
  },
48
49
  ],
49
50
  });
50
51
  state.nodes.push(assembly);
51
52
  addContainsEdge(state, artifactNode, assembly, {
52
53
  kind: "declares-managed-assembly",
53
- coverage: artifactCoverage,
54
+ coverage: artifactEvidence.coverage,
54
55
  });
55
56
  }
56
- const module = artifact?.module ??
57
- parsed.members?.result.module ??
58
- parsed.boundaries?.result.module;
59
- if (module !== undefined && module !== null) {
60
- const moduleCoverage = managedSourceCoverage(moduleCoverageState(parsed));
57
+ const moduleSource = selectModuleSource(parsed);
58
+ if (moduleSource !== null) {
59
+ const { module } = moduleSource;
60
+ const moduleEvidence = sourceManagedEvidence(state, moduleSource.evidence, moduleSource.coverageState);
61
61
  const moduleNode = createJavaScriptApplicationNode({
62
62
  kind: "managed-module",
63
- identity: artifactLocalIdentity(state.artifactSha256, "managed-module", module.mvid ?? module.token),
63
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-module", module.mvid?.toLowerCase() ?? module.token),
64
64
  observations: [
65
65
  {
66
66
  label: module.name,
@@ -70,28 +70,56 @@ export const addArtifactIdentityNodes = (state, artifactNode, parsed) => {
70
70
  generation: module.generation,
71
71
  token: module.token,
72
72
  },
73
- evidence: managedEvidence(state, "inspect_managed_artifact", moduleCoverage),
73
+ evidence: moduleEvidence,
74
74
  },
75
75
  ],
76
76
  });
77
77
  state.nodes.push(moduleNode);
78
78
  addContainsEdge(state, artifactNode, moduleNode, {
79
79
  kind: "declares-managed-module",
80
- coverage: moduleCoverage,
80
+ coverage: moduleEvidence.coverage,
81
81
  });
82
82
  }
83
83
  };
84
+ const selectModuleSource = (parsed) => {
85
+ const sources = [
86
+ parsed.artifact?.result.module == null
87
+ ? null
88
+ : {
89
+ module: parsed.artifact.result.module,
90
+ evidence: parsed.artifact.evidence,
91
+ coverageState: parsed.artifact.result.coverage.state,
92
+ },
93
+ parsed.members?.result.module == null
94
+ ? null
95
+ : {
96
+ module: parsed.members.result.module,
97
+ evidence: parsed.members.evidence,
98
+ coverageState: parsed.members.result.coverage.state,
99
+ },
100
+ parsed.boundaries?.result.module == null
101
+ ? null
102
+ : {
103
+ module: parsed.boundaries.result.module,
104
+ evidence: parsed.boundaries.evidence,
105
+ coverageState: parsed.boundaries.result.coverage.state,
106
+ },
107
+ ].filter((source) => source !== null);
108
+ return (sources.find(({ module }) => module.mvid !== null) ?? sources[0] ?? null);
109
+ };
84
110
  /** Add managed type, method, and field nodes from member evidence. */
85
111
  export const addMemberNodes = (state, artifactNode, parsed) => {
86
- const members = parsed.members?.result;
87
- if (members === undefined)
88
- return { types: 0, methods: 0, fields: 0 };
112
+ const memberInput = parsed.members;
113
+ if (memberInput === null)
114
+ return;
115
+ const members = memberInput.result;
89
116
  const { types, methods, fields } = members;
90
117
  const typeCoverage = managedSourceCoverage(members.coverage.state);
91
118
  const methodCoverage = managedSourceCoverage(members.coverage.state);
92
119
  const fieldCoverage = managedSourceCoverage(members.coverage.state);
120
+ const sourceEvidence = sourceManagedEvidence(state, memberInput.evidence, members.coverage.state);
93
121
  for (const type of types) {
94
- const node = typeNode(state, type, typeCoverage);
122
+ const node = typeNode(state, type, sourceEvidence);
95
123
  state.nodes.push(node);
96
124
  state.typeNodes.set(type.token, node);
97
125
  addContainsEdge(state, artifactNode, node, {
@@ -100,7 +128,7 @@ export const addMemberNodes = (state, artifactNode, parsed) => {
100
128
  });
101
129
  }
102
130
  for (const method of methods) {
103
- const node = methodNode(state, method, methodCoverage);
131
+ const node = methodNode(state, method, sourceEvidence);
104
132
  state.nodes.push(node);
105
133
  state.methodNodes.set(method.token, node);
106
134
  const owner = method.declaring_type_token === null
@@ -112,7 +140,7 @@ export const addMemberNodes = (state, artifactNode, parsed) => {
112
140
  });
113
141
  }
114
142
  for (const field of fields) {
115
- const node = fieldNode(state, field, fieldCoverage);
143
+ const node = fieldNode(state, field, sourceEvidence);
116
144
  state.nodes.push(node);
117
145
  state.fieldNodes.set(field.token, node);
118
146
  const owner = field.declaring_type_token === null
@@ -123,14 +151,9 @@ export const addMemberNodes = (state, artifactNode, parsed) => {
123
151
  coverage: fieldCoverage,
124
152
  });
125
153
  }
126
- return {
127
- types: types.length,
128
- methods: methods.length,
129
- fields: fields.length,
130
- };
131
154
  };
132
155
  /** Build a managed type application node. */
133
- const typeNode = (state, type, coverage) => createJavaScriptApplicationNode({
156
+ const typeNode = (state, type, evidence) => createJavaScriptApplicationNode({
134
157
  kind: "managed-type",
135
158
  identity: artifactLocalIdentity(state.artifactSha256, "managed-type-token", type.token),
136
159
  observations: [
@@ -144,12 +167,12 @@ const typeNode = (state, type, coverage) => createJavaScriptApplicationNode({
144
167
  flags: type.flags,
145
168
  extends_token: type.extends_token,
146
169
  },
147
- evidence: managedEvidence(state, "inspect_managed_members", coverage),
170
+ evidence,
148
171
  },
149
172
  ],
150
173
  });
151
174
  /** Build a managed method application node. */
152
- const methodNode = (state, method, coverage) => createJavaScriptApplicationNode({
175
+ const methodNode = (state, method, evidence) => createJavaScriptApplicationNode({
153
176
  kind: "managed-method",
154
177
  identity: artifactLocalIdentity(state.artifactSha256, "managed-method-token", method.token),
155
178
  observations: [
@@ -169,12 +192,12 @@ const methodNode = (state, method, coverage) => createJavaScriptApplicationNode(
169
192
  normalized_il_sha256: method.body.normalized_il_sha256,
170
193
  il_size: method.body.il_size,
171
194
  },
172
- evidence: managedEvidence(state, "inspect_managed_members", coverage),
195
+ evidence,
173
196
  },
174
197
  ],
175
198
  });
176
199
  /** Build a managed field application node. */
177
- const fieldNode = (state, field, coverage) => createJavaScriptApplicationNode({
200
+ const fieldNode = (state, field, evidence) => createJavaScriptApplicationNode({
178
201
  kind: "managed-field",
179
202
  identity: artifactLocalIdentity(state.artifactSha256, "managed-field-token", field.token),
180
203
  observations: [
@@ -191,24 +214,32 @@ const fieldNode = (state, field, coverage) => createJavaScriptApplicationNode({
191
214
  signature_sha256: field.signature.raw_sha256,
192
215
  signature_status: field.signature.parse_status,
193
216
  },
194
- evidence: managedEvidence(state, "inspect_managed_members", coverage),
217
+ evidence,
195
218
  },
196
219
  ],
197
220
  });
198
221
  /** Add P/Invoke import and native implementation boundary nodes. */
199
222
  export const addBoundaryNodes = (state, artifactNode, parsed) => {
200
- const boundaries = parsed.boundaries?.result;
201
- if (boundaries === undefined)
202
- return { pinvoke_imports: 0, native_implementations: 0 };
223
+ const boundaryInput = parsed.boundaries;
224
+ if (boundaryInput === null)
225
+ return;
226
+ const boundaries = boundaryInput.result;
203
227
  const { pinvoke_imports: pinvokes, native_implementations: implementations } = boundaries;
204
228
  const pinvokeCoverage = managedSourceCoverage(boundaries.coverage.state);
205
229
  const implementationCoverage = managedSourceCoverage(boundaries.coverage.state);
230
+ const sourceEvidence = sourceManagedEvidence(state, boundaryInput.evidence, boundaries.coverage.state);
231
+ const canJoinMemberTokens = parsed.members !== null &&
232
+ managedTokenScopesMatch(parsed.members.result.identity_scope.requires_mvid, boundaries.identity_scope.requires_mvid);
206
233
  for (const pinvoke of pinvokes) {
207
- const node = pinvokeNode(state, pinvoke, pinvokeCoverage);
234
+ const node = pinvokeNode(state, pinvoke, sourceEvidence);
208
235
  state.nodes.push(node);
209
- const owner = pinvoke.member_token === null
210
- ? artifactNode
211
- : (state.methodNodes.get(pinvoke.member_token) ?? artifactNode);
236
+ const method = pinvoke.member_token === null || !canJoinMemberTokens
237
+ ? undefined
238
+ : state.methodNodes.get(pinvoke.member_token);
239
+ const memberEvidence = method === undefined || parsed.members === null
240
+ ? undefined
241
+ : parsed.members.evidence;
242
+ const owner = method ?? artifactNode;
212
243
  state.edges.push(createJavaScriptApplicationEdge({
213
244
  source_node_id: owner.node_id,
214
245
  target_node_id: node.node_id,
@@ -218,25 +249,23 @@ export const addBoundaryNodes = (state, artifactNode, parsed) => {
218
249
  import_name: pinvoke.import_name,
219
250
  import_scope_name: pinvoke.import_scope_name,
220
251
  },
221
- evidence: managedEvidence(state, "inspect_managed_native_boundaries", pinvokeCoverage),
252
+ evidence: pinvokeAssociationEvidence(state, boundaryInput.evidence, pinvokeCoverage, memberEvidence),
222
253
  }));
223
254
  }
224
255
  for (const implementation of implementations) {
225
- const node = nativeImplementationNode(state, implementation, implementationCoverage);
256
+ const node = nativeImplementationNode(state, implementation, sourceEvidence);
226
257
  state.nodes.push(node);
227
- const owner = state.methodNodes.get(implementation.token) ?? artifactNode;
258
+ const owner = (canJoinMemberTokens
259
+ ? state.methodNodes.get(implementation.token)
260
+ : undefined) ?? artifactNode;
228
261
  addContainsEdge(state, owner, node, {
229
262
  kind: "declares-managed-native-implementation",
230
263
  coverage: implementationCoverage,
231
264
  });
232
265
  }
233
- return {
234
- pinvoke_imports: pinvokes.length,
235
- native_implementations: implementations.length,
236
- };
237
266
  };
238
267
  /** Build a managed P/Invoke import application node. */
239
- const pinvokeNode = (state, pinvoke, coverage) => createJavaScriptApplicationNode({
268
+ const pinvokeNode = (state, pinvoke, evidence) => createJavaScriptApplicationNode({
240
269
  kind: "managed-pinvoke-import",
241
270
  identity: artifactLocalIdentity(state.artifactSha256, "managed-pinvoke-token", pinvoke.token),
242
271
  observations: [
@@ -252,12 +281,12 @@ const pinvokeNode = (state, pinvoke, coverage) => createJavaScriptApplicationNod
252
281
  call_convention: pinvoke.call_convention,
253
282
  verification: pinvoke.verification,
254
283
  },
255
- evidence: managedEvidence(state, "inspect_managed_native_boundaries", coverage),
284
+ evidence,
256
285
  },
257
286
  ],
258
287
  });
259
288
  /** Build a managed native implementation application node. */
260
- const nativeImplementationNode = (state, implementation, coverage) => createJavaScriptApplicationNode({
289
+ const nativeImplementationNode = (state, implementation, evidence) => createJavaScriptApplicationNode({
261
290
  kind: "managed-native-implementation",
262
291
  identity: artifactLocalIdentity(state.artifactSha256, "managed-native-implementation-token", implementation.token),
263
292
  observations: [
@@ -273,7 +302,7 @@ const nativeImplementationNode = (state, implementation, coverage) => createJava
273
302
  boundary_kind: implementation.boundary_kind,
274
303
  body_interpretation: implementation.body_interpretation,
275
304
  },
276
- evidence: managedEvidence(state, "inspect_managed_native_boundaries", coverage),
305
+ evidence,
277
306
  },
278
307
  ],
279
308
  });
@@ -284,7 +313,7 @@ const addContainsEdge = (state, source, target, options) => {
284
313
  target_node_id: target.node_id,
285
314
  relation: "contains",
286
315
  properties: { kind: options.kind },
287
- evidence: managedEvidence(state, "project-managed-contains", options.coverage),
316
+ evidence: projectedManagedEvidence(state, "project-managed-contains", options.coverage),
288
317
  }));
289
318
  };
290
319
  /** Build an artifact-local key identity for a managed graph entity. */
@@ -296,7 +325,13 @@ const artifactLocalIdentity = (artifactSha256, namespace, key) => ({
296
325
  key,
297
326
  });
298
327
  /** Build managed static-analysis evidence for a graph observation. */
299
- const managedEvidence = (state, operation, coverage = managedSourceCoverage("complete")) => ({
328
+ const sourceManagedEvidence = (state, source, coverageState) => createManagedEvidence(state, source.operation, managedSourceCoverage(coverageState), [source.evidence_id]);
329
+ const projectedManagedEvidence = (state, operation, coverage = managedSourceCoverage("complete")) => createManagedEvidence(state, operation, coverage, state.evidenceLinks);
330
+ const pinvokeAssociationEvidence = (state, boundaryEvidence, coverage, memberEvidence) => createManagedEvidence(state, boundaryEvidence.operation, coverage, [
331
+ boundaryEvidence.evidence_id,
332
+ ...(memberEvidence === undefined ? [] : [memberEvidence.evidence_id]),
333
+ ]);
334
+ const createManagedEvidence = (state, operation, coverage, evidenceIds) => ({
300
335
  authority: "managed-static-analysis",
301
336
  state: "observed",
302
337
  confidence: "exact",
@@ -324,7 +359,7 @@ const managedEvidence = (state, operation, coverage = managedSourceCoverage("com
324
359
  : [
325
360
  "The source managed Evidence slice is incomplete; unreturned or unavailable items remain unobserved.",
326
361
  ],
327
- evidence_ids: state.evidenceLinks,
362
+ evidence_ids: [...evidenceIds],
328
363
  });
329
364
  /** Sanitize an artifact path into a managed graph location. */
330
365
  const graphArtifactPath = (path) => {
@@ -256,6 +256,7 @@ const managedFieldAccessSchema = z.object({
256
256
  });
257
257
  const managedParseIssueSchema = z.object({
258
258
  code: z.enum([
259
+ "resource-limit",
259
260
  "invalid-cli-header",
260
261
  "invalid-directory",
261
262
  "invalid-metadata-root",