rea-agents 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +103 -38
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/AndroidApplicationService.js +17 -0
  4. package/dist/application/AppleApplicationService.js +17 -0
  5. package/dist/application/ArtifactExtraction.js +1 -1
  6. package/dist/application/ArtifactInventory/classify.js +42 -0
  7. package/dist/application/ArtifactInventory/hash.js +43 -0
  8. package/dist/application/ArtifactInventory/reader.js +41 -0
  9. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  10. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  11. package/dist/application/ArtifactInventory/types.js +10 -0
  12. package/dist/application/ArtifactInventory.js +9 -351
  13. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  14. package/dist/application/BinarySession.js +47 -270
  15. package/dist/application/BinarySessionExecution.js +28 -0
  16. package/dist/application/BinarySessionOpen.js +39 -0
  17. package/dist/application/BinarySessionRecords.js +149 -0
  18. package/dist/application/BinarySessionStatus.js +75 -0
  19. package/dist/application/CapabilityInventory.js +24 -2
  20. package/dist/application/ClientRegistrationStatus.js +11 -4
  21. package/dist/application/CrossVersionInventory.js +8 -2
  22. package/dist/application/CrossVersionInvestigation.js +1 -23
  23. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  24. package/dist/application/DirectAnalysis.js +47 -44
  25. package/dist/application/Doctor.js +156 -238
  26. package/dist/application/DoctorDiagnostics.js +180 -0
  27. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  28. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  29. package/dist/application/EnhancedToolPagination.js +22 -0
  30. package/dist/application/EnhancedToolTypes.js +4 -0
  31. package/dist/application/EnhancedTools.js +20 -37
  32. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  33. package/dist/application/InventoryProjectionEvidence.js +41 -0
  34. package/dist/application/InvestigationProviders.js +12 -0
  35. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  36. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  37. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  38. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  39. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  40. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  41. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  42. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  43. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  44. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  45. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  46. package/dist/application/JavaScriptJsonModules.js +39 -0
  47. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  48. package/dist/application/JavaScriptReplayPermission.js +16 -0
  49. package/dist/application/JavaScriptReplayService.js +182 -156
  50. package/dist/application/LinuxHopper.js +10 -0
  51. package/dist/application/MacHopper.js +22 -11
  52. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  53. package/dist/application/PermissionAuthority.js +106 -63
  54. package/dist/application/ProcessCaptureCapability.js +1 -1
  55. package/dist/application/ProcessCapturePermission.js +13 -0
  56. package/dist/application/ProcessCli.js +2 -12
  57. package/dist/application/ProcessHarness.js +1 -1
  58. package/dist/application/ProcessPairedExperiment.js +72 -0
  59. package/dist/application/ProjectPermissionStore.js +48 -9
  60. package/dist/application/RealHopperAssertions.js +76 -0
  61. package/dist/application/ReconstructionCoverageService.js +69 -0
  62. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  63. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  64. package/dist/application/Setup.js +148 -260
  65. package/dist/application/SetupClientConfiguration.js +224 -0
  66. package/dist/application/SetupClients.js +24 -2
  67. package/dist/application/SetupPlan.js +124 -12
  68. package/dist/application/SetupSkill.js +54 -36
  69. package/dist/application/SupportedClients.js +1 -0
  70. package/dist/application/Uninstall.js +12 -3
  71. package/dist/application/Upgrade.js +16 -1
  72. package/dist/application/WindowsCapabilities.js +86 -0
  73. package/dist/artifacts/AsarArtifactReader.js +11 -0
  74. package/dist/browser/BrowserProcessStartup.js +88 -0
  75. package/dist/browser/CdpCaptureDocuments.js +12 -8
  76. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  77. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  78. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  79. package/dist/browser/CdpCaptureEventState.js +1 -0
  80. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  81. package/dist/browser/CdpCaptureEvents.js +29 -496
  82. package/dist/browser/CdpObservationSession.js +51 -8
  83. package/dist/browser/CdpPageCapture.js +12 -133
  84. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  85. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  86. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  87. package/dist/browser/PngVisualDiff.js +9 -2
  88. package/dist/catalogIdentity.js +4 -0
  89. package/dist/cli/artifactCommands.js +82 -0
  90. package/dist/cli/coreAnalysisCommands.js +232 -0
  91. package/dist/cli/managedCommands.js +397 -0
  92. package/dist/cli/managedProjectGraphCommand.js +24 -0
  93. package/dist/cli/options.js +9 -0
  94. package/dist/cli/setupCommands.js +113 -0
  95. package/dist/cli/types.js +1 -0
  96. package/dist/cli/utilityCommands.js +122 -0
  97. package/dist/cli.js +10 -768
  98. package/dist/cliApplicationCommands.js +118 -4
  99. package/dist/cliBrowserAdvancedCommands.js +73 -16
  100. package/dist/cliBrowserCommands.js +39 -115
  101. package/dist/cliCommandNames.js +4 -0
  102. package/dist/cliElectronCommands.js +33 -62
  103. package/dist/cliEvidenceCommands.js +13 -2
  104. package/dist/cliInvestigationCommands.js +53 -10
  105. package/dist/cliObservationOptions.js +137 -0
  106. package/dist/cliPolicyCommands.js +80 -46
  107. package/dist/cliSetup.js +306 -0
  108. package/dist/config/environment.js +107 -0
  109. package/dist/config/parseConfig.js +228 -0
  110. package/dist/config/parsers.js +68 -0
  111. package/dist/config/permissions.js +30 -0
  112. package/dist/config/types.js +1 -0
  113. package/dist/config.js +1 -375
  114. package/dist/contracts/applicationToolContracts.js +134 -0
  115. package/dist/contracts/electronToolContracts.js +51 -3
  116. package/dist/contracts/managedToolContracts.js +8 -3
  117. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  118. package/dist/contracts/providerSelection.js +2 -0
  119. package/dist/contracts/sessionStatusContract.js +26 -0
  120. package/dist/contracts/toolContractTypes.js +12 -1
  121. package/dist/contracts/toolContracts.js +5 -12
  122. package/dist/contracts/toolEffects.js +14 -0
  123. package/dist/contracts/toolOutputSchemaGroups.js +274 -0
  124. package/dist/contracts/toolOutputSchemaPrimitives.js +328 -0
  125. package/dist/contracts/toolOutputSchemas.js +2 -550
  126. package/dist/domain/analysisErrorPresentation.js +234 -0
  127. package/dist/domain/analysisErrorProjection.js +284 -0
  128. package/dist/domain/androidApplication.js +206 -0
  129. package/dist/domain/appleApplication.js +221 -0
  130. package/dist/domain/artifactComparison.js +34 -15
  131. package/dist/domain/binaryTarget.js +87 -37
  132. package/dist/domain/boundedCartesianProjection.js +15 -0
  133. package/dist/domain/browserObservation.js +1 -285
  134. package/dist/domain/browserObservationSchemas.js +286 -0
  135. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  136. package/dist/domain/errors.js +4 -486
  137. package/dist/domain/functionComparison.js +4 -165
  138. package/dist/domain/functionComparisonDimensions.js +164 -0
  139. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  140. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  141. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  142. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  143. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  144. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  145. package/dist/domain/javascriptSemanticIr.js +30 -0
  146. package/dist/domain/javascriptSemanticProjection.js +366 -0
  147. package/dist/domain/javascriptSemanticState.js +40 -0
  148. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  149. package/dist/domain/javascriptSemanticValues.js +352 -0
  150. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  151. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  152. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  153. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  154. package/dist/domain/knownPageCoverage.js +21 -0
  155. package/dist/domain/managedApplicationGraph.js +14 -364
  156. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  157. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  158. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  159. package/dist/domain/managedArtifact.js +16 -8
  160. package/dist/domain/managedMemberComparison.js +37 -391
  161. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  162. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  163. package/dist/domain/managedNativeVerification.js +27 -389
  164. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  165. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  166. package/dist/domain/managedReconstruction.js +82 -69
  167. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  168. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  169. package/dist/domain/permissionPolicy.js +2 -0
  170. package/dist/domain/processComparison.js +19 -0
  171. package/dist/domain/processPairedExperiment.js +128 -0
  172. package/dist/domain/reconstructionCoverage.js +387 -0
  173. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  174. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  175. package/dist/domain/replayMachine.js +316 -0
  176. package/dist/domain/replayMachineRuntime.js +215 -0
  177. package/dist/domain/runtimeCharacterization.js +85 -0
  178. package/dist/domain/runtimeIdentification.js +210 -0
  179. package/dist/domain/webBundleAnalyzer.js +3 -409
  180. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  181. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  182. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  183. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  184. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  185. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  186. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  187. package/dist/dotnet/ManagedMemberRows.js +120 -0
  188. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  189. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  190. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  191. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  192. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  193. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  194. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  195. package/dist/dotnet/ManagedPeReader.js +59 -28
  196. package/dist/evaluation/CodexAgentEval.js +132 -0
  197. package/dist/generatedPackageMetadata.js +2 -2
  198. package/dist/ghidra/GhidraClient.js +76 -91
  199. package/dist/ghidra/GhidraClientStartup.js +29 -0
  200. package/dist/ghidra/GhidraClientWire.js +34 -0
  201. package/dist/ghidra/GhidraDefaults.js +1 -1
  202. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  203. package/dist/ghidra/GhidraInstallation.js +20 -15
  204. package/dist/ghidra/GhidraLauncher.js +93 -29
  205. package/dist/ghidra/GhidraProvider.js +61 -161
  206. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  207. package/dist/ghidra/GhidraSessionValues.js +2 -0
  208. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  209. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  210. package/dist/ghidra/GhidraTransport.js +71 -0
  211. package/dist/identity.js +4 -2
  212. package/dist/main/messages.js +5 -0
  213. package/dist/main/reload.js +49 -0
  214. package/dist/main/shutdown.js +25 -0
  215. package/dist/main/startup.js +14 -0
  216. package/dist/main/state.js +26 -0
  217. package/dist/main/transport.js +61 -0
  218. package/dist/main/types.js +1 -0
  219. package/dist/main.js +35 -146
  220. package/dist/process/PrivateRuntimeRoot.js +3 -2
  221. package/dist/process/ProcessOwnership.js +35 -0
  222. package/dist/process/ProviderProcess.js +2 -0
  223. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  224. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  225. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  226. package/dist/replay/ReplayOutcome.js +95 -0
  227. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  228. package/dist/server/ProcessCaptureElicitation.js +157 -0
  229. package/dist/server/createServer.js +124 -56
  230. package/dist/server/javascriptApplicationResult.js +85 -0
  231. package/dist/server/registerApplicationTools/characterization.js +57 -0
  232. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  233. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  234. package/dist/server/registerApplicationTools/coverage.js +84 -0
  235. package/dist/server/registerApplicationTools/helpers.js +42 -0
  236. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  237. package/dist/server/registerApplicationTools/types.js +1 -0
  238. package/dist/server/registerApplicationTools.js +10 -112
  239. package/dist/server/registerBrowserTools.js +59 -83
  240. package/dist/server/registerElectronTools.js +48 -49
  241. package/dist/server/registerEnhancedTools.js +34 -42
  242. package/dist/server/registerEvidenceResources.js +56 -0
  243. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  244. package/dist/server/registerInvestigationTools/types.js +1 -0
  245. package/dist/server/registerInvestigationTools.js +83 -116
  246. package/dist/server/registerJavaScriptApplicationGraphResource.js +69 -0
  247. package/dist/server/registerManagedTools.js +18 -1
  248. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  249. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  250. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  251. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  252. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  253. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  254. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  255. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  256. package/dist/server/registerManagedWorkflowTools.js +10 -274
  257. package/dist/server/registerOfficialTools.js +73 -59
  258. package/dist/server/registerSessionRecordTools.js +137 -0
  259. package/dist/server/registerSessionStatusTool.js +97 -26
  260. package/dist/server/registerSessionTools.js +60 -164
  261. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  262. package/dist/server/toolRegistrationOptions.js +101 -3
  263. package/dist/server/toolResult.js +15 -4
  264. package/package.json +11 -11
  265. package/skills/reverse-engineer-anything/SKILL.md +76 -0
  266. package/skills/reverse-engineer-anything/references/controlled-replay.md +12 -0
  267. package/skills/reverse-engineer-anything/references/evidence-workflows.md +33 -0
  268. package/skills/reverse-engineer-anything/references/javascript-applications.md +25 -0
  269. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +36 -0
  270. package/skills/reverse-engineer-anything/references/runtime-observation.md +24 -0
  271. package/scripts/prepare-node-pty.mjs +0 -35
  272. package/scripts/rebuild-native.mjs +0 -22
  273. package/skills/rea-analysis/SKILL.md +0 -222
@@ -0,0 +1,336 @@
1
+ import { basename } from "node:path";
2
+ import { createJavaScriptApplicationEdge, createJavaScriptApplicationNode, } from "./javascriptApplicationGraph.js";
3
+ import { managedSourceCoverage, managedSourcePageCoverage, } from "./managedApplicationGraphCoverage.js";
4
+ import {} from "./managedArtifact.js";
5
+ import { moduleCoverageState } from "./managedApplicationGraphNodeCoverage.js";
6
+ /** Add the root managed artifact node to the graph state. */
7
+ export const addArtifactNode = (state) => {
8
+ const node = createJavaScriptApplicationNode({
9
+ kind: "artifact",
10
+ identity: {
11
+ strategy: "content-digest",
12
+ stability: "global-exact",
13
+ sha256: state.artifactSha256,
14
+ },
15
+ observations: [
16
+ {
17
+ label: basename(state.artifactPath),
18
+ properties: {
19
+ format: "pe",
20
+ source: "managed-application-graph",
21
+ },
22
+ evidence: managedEvidence(state, "project-managed-artifact"),
23
+ },
24
+ ],
25
+ });
26
+ state.nodes.push(node);
27
+ return node;
28
+ };
29
+ /** Add managed assembly and module identity nodes for the artifact. */
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) {
34
+ const assembly = createJavaScriptApplicationNode({
35
+ kind: "managed-assembly",
36
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-assembly", artifact.assembly.token),
37
+ observations: [
38
+ {
39
+ label: artifact.assembly.name,
40
+ 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,
45
+ },
46
+ evidence: managedEvidence(state, "inspect_managed_artifact", artifactCoverage),
47
+ },
48
+ ],
49
+ });
50
+ state.nodes.push(assembly);
51
+ addContainsEdge(state, artifactNode, assembly, {
52
+ kind: "declares-managed-assembly",
53
+ coverage: artifactCoverage,
54
+ });
55
+ }
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));
61
+ const moduleNode = createJavaScriptApplicationNode({
62
+ kind: "managed-module",
63
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-module", module.mvid ?? module.token),
64
+ observations: [
65
+ {
66
+ label: module.name,
67
+ properties: {
68
+ name: module.name,
69
+ mvid: module.mvid,
70
+ generation: module.generation,
71
+ token: module.token,
72
+ },
73
+ evidence: managedEvidence(state, "inspect_managed_artifact", moduleCoverage),
74
+ },
75
+ ],
76
+ });
77
+ state.nodes.push(moduleNode);
78
+ addContainsEdge(state, artifactNode, moduleNode, {
79
+ kind: "declares-managed-module",
80
+ coverage: moduleCoverage,
81
+ });
82
+ }
83
+ };
84
+ /** Add managed type, method, and field nodes from member evidence. */
85
+ export const addMemberNodes = (state, artifactNode, parsed, limits) => {
86
+ const members = parsed.members?.result;
87
+ if (members === undefined)
88
+ return { types: 0, methods: 0, fields: 0 };
89
+ const types = members.types.items.slice(0, limits.max_types);
90
+ const methods = members.methods.items.slice(0, limits.max_methods);
91
+ const fields = members.fields.items.slice(0, limits.max_fields);
92
+ const typeCoverage = managedSourcePageCoverage(members.coverage.state, members.types, "types");
93
+ const methodCoverage = managedSourcePageCoverage(members.coverage.state, members.methods, "methods");
94
+ const fieldCoverage = managedSourcePageCoverage(members.coverage.state, members.fields, "fields");
95
+ for (const type of types) {
96
+ const node = typeNode(state, type, typeCoverage);
97
+ state.nodes.push(node);
98
+ state.typeNodes.set(type.token, node);
99
+ addContainsEdge(state, artifactNode, node, {
100
+ kind: "declares-managed-type",
101
+ coverage: typeCoverage,
102
+ });
103
+ }
104
+ for (const method of methods) {
105
+ const node = methodNode(state, method, methodCoverage);
106
+ state.nodes.push(node);
107
+ state.methodNodes.set(method.token, node);
108
+ const owner = method.declaring_type_token === null
109
+ ? artifactNode
110
+ : (state.typeNodes.get(method.declaring_type_token) ?? artifactNode);
111
+ addContainsEdge(state, owner, node, {
112
+ kind: "declares-managed-method",
113
+ coverage: methodCoverage,
114
+ });
115
+ }
116
+ for (const field of fields) {
117
+ const node = fieldNode(state, field, fieldCoverage);
118
+ state.nodes.push(node);
119
+ state.fieldNodes.set(field.token, node);
120
+ const owner = field.declaring_type_token === null
121
+ ? artifactNode
122
+ : (state.typeNodes.get(field.declaring_type_token) ?? artifactNode);
123
+ addContainsEdge(state, owner, node, {
124
+ kind: "declares-managed-field",
125
+ coverage: fieldCoverage,
126
+ });
127
+ }
128
+ return {
129
+ types: types.length,
130
+ methods: methods.length,
131
+ fields: fields.length,
132
+ };
133
+ };
134
+ /** Build a managed type application node. */
135
+ const typeNode = (state, type, coverage) => createJavaScriptApplicationNode({
136
+ kind: "managed-type",
137
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-type-token", type.token),
138
+ observations: [
139
+ {
140
+ label: type.full_name,
141
+ properties: {
142
+ token: type.token,
143
+ namespace: type.namespace,
144
+ name: type.name,
145
+ full_name: type.full_name,
146
+ flags: type.flags,
147
+ extends_token: type.extends_token,
148
+ },
149
+ evidence: managedEvidence(state, "inspect_managed_members", coverage),
150
+ },
151
+ ],
152
+ });
153
+ /** Build a managed method application node. */
154
+ const methodNode = (state, method, coverage) => createJavaScriptApplicationNode({
155
+ kind: "managed-method",
156
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-method-token", method.token),
157
+ observations: [
158
+ {
159
+ label: method.declaring_type === null
160
+ ? method.name
161
+ : `${method.declaring_type}.${method.name}`,
162
+ properties: {
163
+ token: method.token,
164
+ declaring_type_token: method.declaring_type_token,
165
+ declaring_type: method.declaring_type,
166
+ name: method.name,
167
+ rva: method.rva,
168
+ signature_sha256: method.signature.raw_sha256,
169
+ signature_status: method.signature.parse_status,
170
+ body_status: method.body.status,
171
+ normalized_il_sha256: method.body.normalized_il_sha256,
172
+ il_size: method.body.il_size,
173
+ },
174
+ evidence: managedEvidence(state, "inspect_managed_members", coverage),
175
+ },
176
+ ],
177
+ });
178
+ /** Build a managed field application node. */
179
+ const fieldNode = (state, field, coverage) => createJavaScriptApplicationNode({
180
+ kind: "managed-field",
181
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-field-token", field.token),
182
+ observations: [
183
+ {
184
+ label: field.declaring_type === null
185
+ ? field.name
186
+ : `${field.declaring_type}.${field.name}`,
187
+ properties: {
188
+ token: field.token,
189
+ declaring_type_token: field.declaring_type_token,
190
+ declaring_type: field.declaring_type,
191
+ name: field.name,
192
+ flags: field.flags,
193
+ signature_sha256: field.signature.raw_sha256,
194
+ signature_status: field.signature.parse_status,
195
+ },
196
+ evidence: managedEvidence(state, "inspect_managed_members", coverage),
197
+ },
198
+ ],
199
+ });
200
+ /** Add P/Invoke import and native implementation boundary nodes. */
201
+ export const addBoundaryNodes = (state, artifactNode, parsed, limits) => {
202
+ const boundaries = parsed.boundaries?.result;
203
+ if (boundaries === undefined)
204
+ return { pinvoke_imports: 0, native_implementations: 0 };
205
+ const pinvokes = boundaries.pinvoke_imports.items.slice(0, limits.max_pinvoke_imports);
206
+ const implementations = boundaries.native_implementations.items.slice(0, limits.max_native_implementations);
207
+ const pinvokeCoverage = managedSourcePageCoverage(boundaries.coverage.state, boundaries.pinvoke_imports, "pinvoke_imports");
208
+ const implementationCoverage = managedSourcePageCoverage(boundaries.coverage.state, boundaries.native_implementations, "native_implementations");
209
+ for (const pinvoke of pinvokes) {
210
+ const node = pinvokeNode(state, pinvoke, pinvokeCoverage);
211
+ state.nodes.push(node);
212
+ const owner = pinvoke.member_token === null
213
+ ? artifactNode
214
+ : (state.methodNodes.get(pinvoke.member_token) ?? artifactNode);
215
+ state.edges.push(createJavaScriptApplicationEdge({
216
+ source_node_id: owner.node_id,
217
+ target_node_id: node.node_id,
218
+ relation: "imports",
219
+ properties: {
220
+ kind: "managed-pinvoke",
221
+ import_name: pinvoke.import_name,
222
+ import_scope_name: pinvoke.import_scope_name,
223
+ },
224
+ evidence: managedEvidence(state, "inspect_managed_native_boundaries", pinvokeCoverage),
225
+ }));
226
+ }
227
+ for (const implementation of implementations) {
228
+ const node = nativeImplementationNode(state, implementation, implementationCoverage);
229
+ state.nodes.push(node);
230
+ const owner = state.methodNodes.get(implementation.token) ?? artifactNode;
231
+ addContainsEdge(state, owner, node, {
232
+ kind: "declares-managed-native-implementation",
233
+ coverage: implementationCoverage,
234
+ });
235
+ }
236
+ return {
237
+ pinvoke_imports: pinvokes.length,
238
+ native_implementations: implementations.length,
239
+ };
240
+ };
241
+ /** Build a managed P/Invoke import application node. */
242
+ const pinvokeNode = (state, pinvoke, coverage) => createJavaScriptApplicationNode({
243
+ kind: "managed-pinvoke-import",
244
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-pinvoke-token", pinvoke.token),
245
+ observations: [
246
+ {
247
+ label: pinvoke.import_name,
248
+ properties: {
249
+ token: pinvoke.token,
250
+ member_token: pinvoke.member_token,
251
+ member_name: pinvoke.member_name,
252
+ import_name: pinvoke.import_name,
253
+ import_scope_name: pinvoke.import_scope_name,
254
+ char_set: pinvoke.char_set,
255
+ call_convention: pinvoke.call_convention,
256
+ verification: pinvoke.verification,
257
+ },
258
+ evidence: managedEvidence(state, "inspect_managed_native_boundaries", coverage),
259
+ },
260
+ ],
261
+ });
262
+ /** Build a managed native implementation application node. */
263
+ const nativeImplementationNode = (state, implementation, coverage) => createJavaScriptApplicationNode({
264
+ kind: "managed-native-implementation",
265
+ identity: artifactLocalIdentity(state.artifactSha256, "managed-native-implementation-token", implementation.token),
266
+ observations: [
267
+ {
268
+ label: implementation.name,
269
+ properties: {
270
+ token: implementation.token,
271
+ name: implementation.name,
272
+ rva: implementation.rva,
273
+ code_type: implementation.code_type,
274
+ managed_kind: implementation.managed_kind,
275
+ pinvoke_declared: implementation.pinvoke_declared,
276
+ boundary_kind: implementation.boundary_kind,
277
+ body_interpretation: implementation.body_interpretation,
278
+ },
279
+ evidence: managedEvidence(state, "inspect_managed_native_boundaries", coverage),
280
+ },
281
+ ],
282
+ });
283
+ /** Add a contains relationship edge between two nodes. */
284
+ const addContainsEdge = (state, source, target, options) => {
285
+ state.edges.push(createJavaScriptApplicationEdge({
286
+ source_node_id: source.node_id,
287
+ target_node_id: target.node_id,
288
+ relation: "contains",
289
+ properties: { kind: options.kind },
290
+ evidence: managedEvidence(state, "project-managed-contains", options.coverage),
291
+ }));
292
+ };
293
+ /** Build an artifact-local key identity for a managed graph entity. */
294
+ const artifactLocalIdentity = (artifactSha256, namespace, key) => ({
295
+ strategy: "artifact-local-key",
296
+ stability: "artifact-version",
297
+ artifact_sha256: artifactSha256,
298
+ namespace,
299
+ key,
300
+ });
301
+ /** Build managed static-analysis evidence for a graph observation. */
302
+ const managedEvidence = (state, operation, coverage = managedSourceCoverage("complete")) => ({
303
+ authority: "managed-static-analysis",
304
+ state: "observed",
305
+ confidence: "exact",
306
+ artifact: {
307
+ available: true,
308
+ artifact_id: `art_${state.artifactSha256}`,
309
+ sha256: state.artifactSha256,
310
+ },
311
+ location: {
312
+ available: true,
313
+ value: {
314
+ kind: "artifact-path",
315
+ path: graphArtifactPath(state.artifactPath),
316
+ },
317
+ },
318
+ extractor: {
319
+ name: "rea-dotnet-static",
320
+ version: "1",
321
+ operation,
322
+ executable_sha256: null,
323
+ },
324
+ coverage,
325
+ limitations: coverage.status === "complete"
326
+ ? []
327
+ : [
328
+ "The source managed Evidence slice is incomplete; unreturned or unavailable items remain unobserved.",
329
+ ],
330
+ evidence_ids: state.evidenceLinks,
331
+ });
332
+ /** Sanitize an artifact path into a managed graph location. */
333
+ const graphArtifactPath = (path) => {
334
+ const name = basename(path).replaceAll(/[^A-Za-z0-9._-]/gu, "_");
335
+ return `managed/${name.length === 0 ? "artifact.pe" : name}`;
336
+ };
@@ -2,6 +2,10 @@ import { z } from "zod";
2
2
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
3
3
  const tokenSchema = z.string().regex(/^0x[0-9a-f]{8}$/u);
4
4
  const offsetSchema = z.number().int().min(0);
5
+ /** A 16-byte CLI metadata GUID without RFC 4122 version/variant restrictions. */
6
+ export const cliMetadataGuidSchema = z
7
+ .string()
8
+ .regex(/^[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}$/u);
5
9
  const managedPage = (item) => z.object({
6
10
  items: z.array(item),
7
11
  offset: offsetSchema,
@@ -33,9 +37,9 @@ const assemblyIdentitySchema = z.object({
33
37
  const moduleIdentitySchema = z.object({
34
38
  name: z.string(),
35
39
  generation: z.number().int().min(0).max(0xffff),
36
- mvid: z.string().uuid().nullable(),
37
- enc_id: z.string().uuid().nullable(),
38
- enc_base_id: z.string().uuid().nullable(),
40
+ mvid: cliMetadataGuidSchema.nullable(),
41
+ enc_id: cliMetadataGuidSchema.nullable(),
42
+ enc_base_id: cliMetadataGuidSchema.nullable(),
39
43
  token: tokenSchema,
40
44
  row_offset: offsetSchema,
41
45
  });
@@ -142,7 +146,7 @@ const managedInstructionAnchorSchema = z.object({
142
146
  operand: z.string().nullable(),
143
147
  });
144
148
  const managedMethodBodySchema = z.object({
145
- status: z.enum(["present", "absent", "malformed", "too-large"]),
149
+ status: z.enum(["present", "partial", "absent", "malformed", "too-large"]),
146
150
  header_format: z.enum(["tiny", "fat", "none", "unknown"]),
147
151
  rva: z.number().int().min(0).max(0xffff_ffff),
148
152
  file_offset: offsetSchema.nullable(),
@@ -150,8 +154,12 @@ const managedMethodBodySchema = z.object({
150
154
  init_locals: z.boolean().nullable(),
151
155
  local_var_sig_token: tokenSchema.nullable(),
152
156
  il_size: z.number().int().min(0),
153
- il_sha256: digestSchema.nullable(),
154
- normalized_il_sha256: digestSchema.nullable(),
157
+ il_sha256: digestSchema
158
+ .nullable()
159
+ .describe("SHA-256 of exactly the raw il_size CIL bytes; excludes the method header, locals signature, alignment, and extra sections"),
160
+ normalized_il_sha256: digestSchema
161
+ .nullable()
162
+ .describe("Member-result-v1 SHA-256 of UTF-8 JSON [opcode, operand_kind, operand] tuples for a complete decode; retains build-local tokens, omits switch targets, and excludes headers, locals, and exception regions"),
155
163
  instruction_count: z.number().int().min(0),
156
164
  decoded_instruction_count: z.number().int().min(0),
157
165
  truncated_instructions: z.number().int().min(0),
@@ -383,7 +391,7 @@ export const managedMemberInspectionSchema = z.object({
383
391
  identity_scope: z.object({
384
392
  token_identity: z.literal("build-local"),
385
393
  requires_artifact_sha256: digestSchema,
386
- requires_mvid: z.string().uuid().nullable(),
394
+ requires_mvid: cliMetadataGuidSchema.nullable(),
387
395
  }),
388
396
  types: managedPage(managedTypeSchema),
389
397
  fields: managedPage(managedFieldSchema),
@@ -415,7 +423,7 @@ export const managedNativeBoundaryInspectionSchema = z.object({
415
423
  identity_scope: z.object({
416
424
  token_identity: z.literal("build-local"),
417
425
  requires_artifact_sha256: digestSchema,
418
- requires_mvid: z.string().uuid().nullable(),
426
+ requires_mvid: cliMetadataGuidSchema.nullable(),
419
427
  }),
420
428
  cli_native: z.object({
421
429
  il_only: z.boolean(),