rea-agents 2.0.0 → 2.1.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 (246) hide show
  1. package/README.md +78 -32
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/ArtifactExtraction.js +1 -1
  4. package/dist/application/ArtifactInventory/classify.js +42 -0
  5. package/dist/application/ArtifactInventory/hash.js +43 -0
  6. package/dist/application/ArtifactInventory/reader.js +41 -0
  7. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  8. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  9. package/dist/application/ArtifactInventory/types.js +10 -0
  10. package/dist/application/ArtifactInventory.js +9 -351
  11. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  12. package/dist/application/BinarySession.js +47 -270
  13. package/dist/application/BinarySessionExecution.js +28 -0
  14. package/dist/application/BinarySessionOpen.js +39 -0
  15. package/dist/application/BinarySessionRecords.js +149 -0
  16. package/dist/application/BinarySessionStatus.js +75 -0
  17. package/dist/application/CapabilityInventory.js +24 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +1 -23
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +156 -238
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  26. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  27. package/dist/application/EnhancedToolPagination.js +22 -0
  28. package/dist/application/EnhancedToolTypes.js +4 -0
  29. package/dist/application/EnhancedTools.js +20 -37
  30. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  31. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  32. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  33. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  34. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  35. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  36. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  37. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  38. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  39. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  40. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  41. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  42. package/dist/application/JavaScriptJsonModules.js +39 -0
  43. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  44. package/dist/application/JavaScriptReplayPermission.js +16 -0
  45. package/dist/application/JavaScriptReplayService.js +182 -156
  46. package/dist/application/LinuxHopper.js +10 -0
  47. package/dist/application/MacHopper.js +22 -11
  48. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  49. package/dist/application/PermissionAuthority.js +106 -63
  50. package/dist/application/ProcessCaptureCapability.js +1 -1
  51. package/dist/application/ProcessCapturePermission.js +13 -0
  52. package/dist/application/ProcessCli.js +2 -12
  53. package/dist/application/ProcessHarness.js +1 -1
  54. package/dist/application/ProjectPermissionStore.js +48 -9
  55. package/dist/application/RealHopperAssertions.js +76 -0
  56. package/dist/application/ReconstructionCoverageService.js +69 -0
  57. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  58. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  59. package/dist/application/Setup.js +147 -259
  60. package/dist/application/SetupClientConfiguration.js +220 -0
  61. package/dist/application/SetupClients.js +24 -2
  62. package/dist/application/SetupPlan.js +123 -12
  63. package/dist/application/SetupSkill.js +26 -12
  64. package/dist/application/SupportedClients.js +1 -0
  65. package/dist/application/Uninstall.js +6 -3
  66. package/dist/application/WindowsCapabilities.js +86 -0
  67. package/dist/artifacts/AsarArtifactReader.js +11 -0
  68. package/dist/browser/BrowserProcessStartup.js +88 -0
  69. package/dist/browser/CdpCaptureDocuments.js +12 -8
  70. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  71. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  72. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  73. package/dist/browser/CdpCaptureEventState.js +1 -0
  74. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  75. package/dist/browser/CdpCaptureEvents.js +29 -496
  76. package/dist/browser/CdpObservationSession.js +51 -8
  77. package/dist/browser/CdpPageCapture.js +12 -133
  78. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  79. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  80. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  81. package/dist/browser/PngVisualDiff.js +9 -2
  82. package/dist/catalogIdentity.js +4 -0
  83. package/dist/cli/artifactCommands.js +82 -0
  84. package/dist/cli/coreAnalysisCommands.js +232 -0
  85. package/dist/cli/managedCommands.js +397 -0
  86. package/dist/cli/managedProjectGraphCommand.js +24 -0
  87. package/dist/cli/options.js +9 -0
  88. package/dist/cli/setupCommands.js +108 -0
  89. package/dist/cli/types.js +1 -0
  90. package/dist/cli/utilityCommands.js +122 -0
  91. package/dist/cli.js +10 -768
  92. package/dist/cliApplicationCommands.js +118 -4
  93. package/dist/cliBrowserAdvancedCommands.js +73 -16
  94. package/dist/cliBrowserCommands.js +39 -115
  95. package/dist/cliCommandNames.js +4 -0
  96. package/dist/cliElectronCommands.js +33 -62
  97. package/dist/cliEvidenceCommands.js +13 -2
  98. package/dist/cliInvestigationCommands.js +53 -10
  99. package/dist/cliObservationOptions.js +137 -0
  100. package/dist/cliPolicyCommands.js +80 -46
  101. package/dist/cliSetup.js +289 -0
  102. package/dist/config/environment.js +107 -0
  103. package/dist/config/parseConfig.js +228 -0
  104. package/dist/config/parsers.js +68 -0
  105. package/dist/config/permissions.js +30 -0
  106. package/dist/config/types.js +1 -0
  107. package/dist/config.js +1 -375
  108. package/dist/contracts/applicationToolContracts.js +134 -0
  109. package/dist/contracts/managedToolContracts.js +1 -1
  110. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  111. package/dist/contracts/providerSelection.js +2 -0
  112. package/dist/contracts/toolContracts.js +2 -2
  113. package/dist/contracts/toolEffects.js +14 -0
  114. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  115. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  116. package/dist/contracts/toolOutputSchemas.js +2 -550
  117. package/dist/domain/analysisErrorPresentation.js +234 -0
  118. package/dist/domain/analysisErrorProjection.js +284 -0
  119. package/dist/domain/artifactComparison.js +34 -15
  120. package/dist/domain/binaryTarget.js +87 -37
  121. package/dist/domain/browserObservation.js +1 -285
  122. package/dist/domain/browserObservationSchemas.js +286 -0
  123. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  124. package/dist/domain/errors.js +4 -486
  125. package/dist/domain/functionComparison.js +4 -165
  126. package/dist/domain/functionComparisonDimensions.js +164 -0
  127. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  128. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  129. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  130. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  131. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  132. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  133. package/dist/domain/javascriptSemanticIr.js +30 -0
  134. package/dist/domain/javascriptSemanticProjection.js +366 -0
  135. package/dist/domain/javascriptSemanticState.js +40 -0
  136. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  137. package/dist/domain/javascriptSemanticValues.js +352 -0
  138. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  139. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  140. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  141. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  142. package/dist/domain/knownPageCoverage.js +21 -0
  143. package/dist/domain/managedApplicationGraph.js +14 -364
  144. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  145. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  146. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  147. package/dist/domain/managedArtifact.js +16 -8
  148. package/dist/domain/managedMemberComparison.js +37 -391
  149. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  150. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  151. package/dist/domain/managedNativeVerification.js +27 -389
  152. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  153. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  154. package/dist/domain/managedReconstruction.js +82 -69
  155. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  156. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  157. package/dist/domain/permissionPolicy.js +2 -0
  158. package/dist/domain/reconstructionCoverage.js +387 -0
  159. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  160. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  161. package/dist/domain/runtimeCharacterization.js +85 -0
  162. package/dist/domain/webBundleAnalyzer.js +3 -409
  163. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  164. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  165. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  166. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  167. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  168. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  169. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  170. package/dist/dotnet/ManagedMemberRows.js +120 -0
  171. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  172. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  173. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  174. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  175. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  176. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  177. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  178. package/dist/dotnet/ManagedPeReader.js +59 -28
  179. package/dist/generatedPackageMetadata.js +2 -2
  180. package/dist/ghidra/GhidraClient.js +76 -91
  181. package/dist/ghidra/GhidraClientStartup.js +29 -0
  182. package/dist/ghidra/GhidraClientWire.js +34 -0
  183. package/dist/ghidra/GhidraDefaults.js +1 -1
  184. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  185. package/dist/ghidra/GhidraInstallation.js +20 -15
  186. package/dist/ghidra/GhidraLauncher.js +93 -29
  187. package/dist/ghidra/GhidraProvider.js +61 -161
  188. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  189. package/dist/ghidra/GhidraSessionValues.js +2 -0
  190. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  191. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  192. package/dist/ghidra/GhidraTransport.js +71 -0
  193. package/dist/identity.js +3 -2
  194. package/dist/main/messages.js +5 -0
  195. package/dist/main/reload.js +49 -0
  196. package/dist/main/shutdown.js +25 -0
  197. package/dist/main/startup.js +14 -0
  198. package/dist/main/state.js +26 -0
  199. package/dist/main/transport.js +61 -0
  200. package/dist/main/types.js +1 -0
  201. package/dist/main.js +35 -146
  202. package/dist/process/PrivateRuntimeRoot.js +3 -2
  203. package/dist/process/ProcessOwnership.js +35 -0
  204. package/dist/process/ProviderProcess.js +2 -0
  205. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  206. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  207. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  208. package/dist/replay/ReplayOutcome.js +95 -0
  209. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  210. package/dist/server/ProcessCaptureElicitation.js +157 -0
  211. package/dist/server/createServer.js +119 -54
  212. package/dist/server/registerApplicationTools/characterization.js +57 -0
  213. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  214. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  215. package/dist/server/registerApplicationTools/coverage.js +84 -0
  216. package/dist/server/registerApplicationTools/helpers.js +42 -0
  217. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  218. package/dist/server/registerApplicationTools/types.js +1 -0
  219. package/dist/server/registerApplicationTools.js +10 -112
  220. package/dist/server/registerBrowserTools.js +59 -83
  221. package/dist/server/registerElectronTools.js +31 -46
  222. package/dist/server/registerEnhancedTools.js +34 -42
  223. package/dist/server/registerEvidenceResources.js +54 -0
  224. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  225. package/dist/server/registerInvestigationTools/types.js +1 -0
  226. package/dist/server/registerInvestigationTools.js +83 -116
  227. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  228. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  229. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  230. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  231. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  232. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  233. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  234. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  235. package/dist/server/registerManagedWorkflowTools.js +10 -274
  236. package/dist/server/registerOfficialTools.js +73 -59
  237. package/dist/server/registerSessionRecordTools.js +137 -0
  238. package/dist/server/registerSessionStatusTool.js +2 -1
  239. package/dist/server/registerSessionTools.js +60 -164
  240. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  241. package/dist/server/toolRegistrationOptions.js +101 -3
  242. package/dist/server/toolResult.js +5 -0
  243. package/package.json +10 -11
  244. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +20 -7
  245. package/scripts/prepare-node-pty.mjs +0 -35
  246. package/scripts/rebuild-native.mjs +0 -22
@@ -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(),