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
@@ -1,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
- import { basename } from "node:path";
3
2
  import canonicalize from "canonicalize";
4
3
  import { z } from "zod";
5
4
  import { evidenceSchema, parseEvidence } from "./evidence.js";
6
- import { createJavaScriptApplicationEdge, createJavaScriptApplicationGraph, createJavaScriptApplicationNode, javascriptApplicationGraphSchema, } from "./javascriptApplicationGraph.js";
5
+ import { createJavaScriptApplicationGraph, javascriptApplicationGraphSchema, } from "./javascriptApplicationGraph.js";
7
6
  import { managedArtifactInspectionSchema, managedMemberInspectionSchema, managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
7
+ import { assessManagedGraphOmissions, managedGraphEvidenceCoverage, managedGraphResultCoverage, totalManagedGraphOmitted, } from "./managedApplicationGraphCoverage.js";
8
+ import { addArtifactNode, addArtifactIdentityNodes, addBoundaryNodes, addMemberNodes, } from "./managedApplicationGraphNodes.js";
8
9
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
9
10
  const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
10
11
  const boundedTextSchema = z.string().min(1).max(4_096);
@@ -114,7 +115,7 @@ export const projectManagedApplicationGraph = (input) => {
114
115
  root_node_ids: [artifactNode.node_id],
115
116
  nodes: state.nodes,
116
117
  edges: state.edges,
117
- coverage: graphCoverage(omissions),
118
+ coverage: managedGraphEvidenceCoverage(omissions),
118
119
  limitations,
119
120
  });
120
121
  const withoutId = {
@@ -134,7 +135,7 @@ export const projectManagedApplicationGraph = (input) => {
134
135
  ...boundaryCounts,
135
136
  },
136
137
  graph,
137
- coverage: resultCoverage(omissions),
138
+ coverage: managedGraphResultCoverage(omissions),
138
139
  evidence_links: evidenceLinks,
139
140
  limitations,
140
141
  };
@@ -177,364 +178,11 @@ const assertSameArtifact = (parsed, sha256Value) => {
177
178
  if (result !== undefined && result.artifact.sha256 !== sha256Value)
178
179
  throw new TypeError("Managed graph projection inputs must describe the same artifact SHA-256");
179
180
  };
180
- const addArtifactNode = (state) => {
181
- const node = createJavaScriptApplicationNode({
182
- kind: "artifact",
183
- identity: {
184
- strategy: "content-digest",
185
- stability: "global-exact",
186
- sha256: state.artifactSha256,
187
- },
188
- observations: [
189
- {
190
- label: basename(state.artifactPath),
191
- properties: {
192
- format: "pe",
193
- source: "managed-application-graph",
194
- },
195
- evidence: managedEvidence(state, "project-managed-artifact"),
196
- },
197
- ],
198
- });
199
- state.nodes.push(node);
200
- return node;
201
- };
202
- const addArtifactIdentityNodes = (state, artifactNode, parsed) => {
203
- const artifact = parsed.artifact?.result;
204
- if (artifact?.assembly !== undefined && artifact.assembly !== null) {
205
- const assembly = createJavaScriptApplicationNode({
206
- kind: "managed-assembly",
207
- identity: artifactLocalIdentity(state.artifactSha256, "managed-assembly", artifact.assembly.token),
208
- observations: [
209
- {
210
- label: artifact.assembly.name,
211
- properties: {
212
- name: artifact.assembly.name,
213
- version: artifact.assembly.version,
214
- culture: artifact.assembly.culture,
215
- public_key_kind: artifact.assembly.public_key.kind,
216
- },
217
- evidence: managedEvidence(state, "inspect_managed_artifact"),
218
- },
219
- ],
220
- });
221
- state.nodes.push(assembly);
222
- addContainsEdge(state, artifactNode, assembly, "declares-managed-assembly");
223
- }
224
- const module = artifact?.module ??
225
- parsed.members?.result.module ??
226
- parsed.boundaries?.result.module;
227
- if (module !== undefined && module !== null) {
228
- const moduleNode = createJavaScriptApplicationNode({
229
- kind: "managed-module",
230
- identity: artifactLocalIdentity(state.artifactSha256, "managed-module", module.mvid ?? module.token),
231
- observations: [
232
- {
233
- label: module.name,
234
- properties: {
235
- name: module.name,
236
- mvid: module.mvid,
237
- generation: module.generation,
238
- token: module.token,
239
- },
240
- evidence: managedEvidence(state, "inspect_managed_artifact"),
241
- },
242
- ],
243
- });
244
- state.nodes.push(moduleNode);
245
- addContainsEdge(state, artifactNode, moduleNode, "declares-managed-module");
246
- }
247
- };
248
- const addMemberNodes = (state, artifactNode, parsed, limits) => {
249
- const members = parsed.members?.result;
250
- if (members === undefined)
251
- return { types: 0, methods: 0, fields: 0 };
252
- const types = members.types.items.slice(0, limits.max_types);
253
- const methods = members.methods.items.slice(0, limits.max_methods);
254
- const fields = members.fields.items.slice(0, limits.max_fields);
255
- for (const type of types) {
256
- const node = typeNode(state, type);
257
- state.nodes.push(node);
258
- state.typeNodes.set(type.token, node);
259
- addContainsEdge(state, artifactNode, node, "declares-managed-type");
260
- }
261
- for (const method of methods) {
262
- const node = methodNode(state, method);
263
- state.nodes.push(node);
264
- state.methodNodes.set(method.token, node);
265
- const owner = method.declaring_type_token === null
266
- ? artifactNode
267
- : (state.typeNodes.get(method.declaring_type_token) ?? artifactNode);
268
- addContainsEdge(state, owner, node, "declares-managed-method");
269
- }
270
- for (const field of fields) {
271
- const node = fieldNode(state, field);
272
- state.nodes.push(node);
273
- state.fieldNodes.set(field.token, node);
274
- const owner = field.declaring_type_token === null
275
- ? artifactNode
276
- : (state.typeNodes.get(field.declaring_type_token) ?? artifactNode);
277
- addContainsEdge(state, owner, node, "declares-managed-field");
278
- }
279
- return {
280
- types: types.length,
281
- methods: methods.length,
282
- fields: fields.length,
283
- };
284
- };
285
- const typeNode = (state, type) => createJavaScriptApplicationNode({
286
- kind: "managed-type",
287
- identity: artifactLocalIdentity(state.artifactSha256, "managed-type-token", type.token),
288
- observations: [
289
- {
290
- label: type.full_name,
291
- properties: {
292
- token: type.token,
293
- namespace: type.namespace,
294
- name: type.name,
295
- full_name: type.full_name,
296
- flags: type.flags,
297
- extends_token: type.extends_token,
298
- },
299
- evidence: managedEvidence(state, "inspect_managed_members"),
300
- },
301
- ],
302
- });
303
- const methodNode = (state, method) => createJavaScriptApplicationNode({
304
- kind: "managed-method",
305
- identity: artifactLocalIdentity(state.artifactSha256, "managed-method-token", method.token),
306
- observations: [
307
- {
308
- label: method.declaring_type === null
309
- ? method.name
310
- : `${method.declaring_type}.${method.name}`,
311
- properties: {
312
- token: method.token,
313
- declaring_type_token: method.declaring_type_token,
314
- declaring_type: method.declaring_type,
315
- name: method.name,
316
- rva: method.rva,
317
- signature_sha256: method.signature.raw_sha256,
318
- signature_status: method.signature.parse_status,
319
- body_status: method.body.status,
320
- normalized_il_sha256: method.body.normalized_il_sha256,
321
- il_size: method.body.il_size,
322
- },
323
- evidence: managedEvidence(state, "inspect_managed_members"),
324
- },
325
- ],
326
- });
327
- const fieldNode = (state, field) => createJavaScriptApplicationNode({
328
- kind: "managed-field",
329
- identity: artifactLocalIdentity(state.artifactSha256, "managed-field-token", field.token),
330
- observations: [
331
- {
332
- label: field.declaring_type === null
333
- ? field.name
334
- : `${field.declaring_type}.${field.name}`,
335
- properties: {
336
- token: field.token,
337
- declaring_type_token: field.declaring_type_token,
338
- declaring_type: field.declaring_type,
339
- name: field.name,
340
- flags: field.flags,
341
- signature_sha256: field.signature.raw_sha256,
342
- signature_status: field.signature.parse_status,
343
- },
344
- evidence: managedEvidence(state, "inspect_managed_members"),
345
- },
346
- ],
347
- });
348
- const addBoundaryNodes = (state, artifactNode, parsed, limits) => {
349
- const boundaries = parsed.boundaries?.result;
350
- if (boundaries === undefined)
351
- return { pinvoke_imports: 0, native_implementations: 0 };
352
- const pinvokes = boundaries.pinvoke_imports.items.slice(0, limits.max_pinvoke_imports);
353
- const implementations = boundaries.native_implementations.items.slice(0, limits.max_native_implementations);
354
- for (const pinvoke of pinvokes) {
355
- const node = pinvokeNode(state, pinvoke);
356
- state.nodes.push(node);
357
- const owner = pinvoke.member_token === null
358
- ? artifactNode
359
- : (state.methodNodes.get(pinvoke.member_token) ?? artifactNode);
360
- state.edges.push(createJavaScriptApplicationEdge({
361
- source_node_id: owner.node_id,
362
- target_node_id: node.node_id,
363
- relation: "imports",
364
- properties: {
365
- kind: "managed-pinvoke",
366
- import_name: pinvoke.import_name,
367
- import_scope_name: pinvoke.import_scope_name,
368
- },
369
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
370
- }));
371
- }
372
- for (const implementation of implementations) {
373
- const node = nativeImplementationNode(state, implementation);
374
- state.nodes.push(node);
375
- const owner = state.methodNodes.get(implementation.token) ?? artifactNode;
376
- addContainsEdge(state, owner, node, "declares-managed-native-implementation");
377
- }
378
- return {
379
- pinvoke_imports: pinvokes.length,
380
- native_implementations: implementations.length,
381
- };
382
- };
383
- const pinvokeNode = (state, pinvoke) => createJavaScriptApplicationNode({
384
- kind: "managed-pinvoke-import",
385
- identity: artifactLocalIdentity(state.artifactSha256, "managed-pinvoke-token", pinvoke.token),
386
- observations: [
387
- {
388
- label: pinvoke.import_name,
389
- properties: {
390
- token: pinvoke.token,
391
- member_token: pinvoke.member_token,
392
- member_name: pinvoke.member_name,
393
- import_name: pinvoke.import_name,
394
- import_scope_name: pinvoke.import_scope_name,
395
- char_set: pinvoke.char_set,
396
- call_convention: pinvoke.call_convention,
397
- verification: pinvoke.verification,
398
- },
399
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
400
- },
401
- ],
402
- });
403
- const nativeImplementationNode = (state, implementation) => createJavaScriptApplicationNode({
404
- kind: "managed-native-implementation",
405
- identity: artifactLocalIdentity(state.artifactSha256, "managed-native-implementation-token", implementation.token),
406
- observations: [
407
- {
408
- label: implementation.name,
409
- properties: {
410
- token: implementation.token,
411
- name: implementation.name,
412
- rva: implementation.rva,
413
- code_type: implementation.code_type,
414
- managed_kind: implementation.managed_kind,
415
- pinvoke_declared: implementation.pinvoke_declared,
416
- boundary_kind: implementation.boundary_kind,
417
- body_interpretation: implementation.body_interpretation,
418
- },
419
- evidence: managedEvidence(state, "inspect_managed_native_boundaries"),
420
- },
421
- ],
422
- });
423
- const addContainsEdge = (state, source, target, kind) => {
424
- state.edges.push(createJavaScriptApplicationEdge({
425
- source_node_id: source.node_id,
426
- target_node_id: target.node_id,
427
- relation: "contains",
428
- properties: { kind },
429
- evidence: managedEvidence(state, "project-managed-contains"),
430
- }));
431
- };
432
- const artifactLocalIdentity = (artifactSha256, namespace, key) => ({
433
- strategy: "artifact-local-key",
434
- stability: "artifact-version",
435
- artifact_sha256: artifactSha256,
436
- namespace,
437
- key,
438
- });
439
- const managedEvidence = (state, operation) => ({
440
- authority: "managed-static-analysis",
441
- state: "observed",
442
- confidence: "exact",
443
- artifact: {
444
- available: true,
445
- artifact_id: `art_${state.artifactSha256}`,
446
- sha256: state.artifactSha256,
447
- },
448
- location: {
449
- available: true,
450
- value: {
451
- kind: "artifact-path",
452
- path: graphArtifactPath(state.artifactPath),
453
- },
454
- },
455
- extractor: {
456
- name: "rea-dotnet-static",
457
- version: "1",
458
- operation,
459
- executable_sha256: null,
460
- },
461
- coverage: completeCoverage(),
462
- limitations: [],
463
- evidence_ids: state.evidenceLinks,
464
- });
465
- const graphArtifactPath = (path) => {
466
- const name = basename(path).replaceAll(/[^A-Za-z0-9._-]/gu, "_");
467
- return `managed/${name.length === 0 ? "artifact.pe" : name}`;
468
- };
469
- const completeCoverage = () => ({
470
- status: "complete",
471
- truncated: false,
472
- omitted_count: 0,
473
- limits: [],
474
- });
475
- const graphCoverage = (omissions) => {
476
- const omitted = totalOmitted(omissions);
477
- return {
478
- status: omitted === 0 ? "complete" : "partial",
479
- truncated: omitted > 0,
480
- omitted_count: omitted,
481
- limits: [
482
- { name: "max_types", value: omissions.limits.max_types, unit: "items" },
483
- {
484
- name: "max_methods",
485
- value: omissions.limits.max_methods,
486
- unit: "items",
487
- },
488
- { name: "max_fields", value: omissions.limits.max_fields, unit: "items" },
489
- {
490
- name: "max_pinvoke_imports",
491
- value: omissions.limits.max_pinvoke_imports,
492
- unit: "items",
493
- },
494
- {
495
- name: "max_native_implementations",
496
- value: omissions.limits.max_native_implementations,
497
- unit: "items",
498
- },
499
- ],
500
- };
501
- };
502
- const resultCoverage = (omissions) => {
503
- const omitted = totalOmitted(omissions);
504
- return {
505
- status: omitted > 0
506
- ? "truncated"
507
- : omissions.partialInput
508
- ? "partial"
509
- : "complete-within-inputs",
510
- omitted_types: omissions.types,
511
- omitted_methods: omissions.methods,
512
- omitted_fields: omissions.fields,
513
- omitted_pinvoke_imports: omissions.pinvokeImports,
514
- omitted_native_implementations: omissions.nativeImplementations,
515
- };
516
- };
517
- const omittedCounts = (parsed, limits) => ({
518
- limits,
519
- partialInput: (parsed.members !== null &&
520
- parsed.members.result.coverage.state !== "complete") ||
521
- (parsed.boundaries !== null &&
522
- parsed.boundaries.result.coverage.state !== "complete") ||
523
- (parsed.artifact !== null &&
524
- parsed.artifact.result.coverage.state !== "complete"),
525
- types: Math.max(0, (parsed.members?.result.types.items.length ?? 0) - limits.max_types),
526
- methods: Math.max(0, (parsed.members?.result.methods.items.length ?? 0) - limits.max_methods),
527
- fields: Math.max(0, (parsed.members?.result.fields.items.length ?? 0) - limits.max_fields),
528
- pinvokeImports: Math.max(0, (parsed.boundaries?.result.pinvoke_imports.items.length ?? 0) -
529
- limits.max_pinvoke_imports),
530
- nativeImplementations: Math.max(0, (parsed.boundaries?.result.native_implementations.items.length ?? 0) -
531
- limits.max_native_implementations),
532
- });
533
- const totalOmitted = (omissions) => omissions.types +
534
- omissions.methods +
535
- omissions.fields +
536
- omissions.pinvokeImports +
537
- omissions.nativeImplementations;
181
+ const omittedCounts = (parsed, limits) => assessManagedGraphOmissions({
182
+ artifact: parsed.artifact?.result ?? null,
183
+ members: parsed.members?.result ?? null,
184
+ boundaries: parsed.boundaries?.result ?? null,
185
+ }, limits);
538
186
  const projectionLimitations = (parsed, omissions) => [
539
187
  "Managed graph projection preserves static metadata observations only; it does not execute managed code, load assemblies, or map managed tokens to native addresses.",
540
188
  ...(parsed.members === null
@@ -550,7 +198,9 @@ const projectionLimitations = (parsed, omissions) => [
550
198
  ...(omissions.partialInput
551
199
  ? ["At least one supplied managed Evidence record has partial coverage."]
552
200
  : []),
553
- ...(totalOmitted(omissions) > 0
554
- ? ["Projection output was truncated by managed application graph limits."]
201
+ ...(totalManagedGraphOmitted(omissions) > 0
202
+ ? [
203
+ "Projection output omits managed entities because of source pagination or managed application graph limits.",
204
+ ]
555
205
  : []),
556
206
  ];
@@ -0,0 +1,170 @@
1
+ import { assessKnownPageCoverage, } from "./knownPageCoverage.js";
2
+ /** Complete application-graph fact coverage. */
3
+ const completeManagedGraphCoverage = () => ({
4
+ status: "complete",
5
+ truncated: false,
6
+ omitted_count: 0,
7
+ limits: [],
8
+ });
9
+ /** Translate one managed parser coverage state without inventing omissions. */
10
+ export const managedSourceCoverage = (state) => state === "complete"
11
+ ? completeManagedGraphCoverage()
12
+ : {
13
+ status: state,
14
+ truncated: false,
15
+ omitted_count: null,
16
+ limits: [],
17
+ };
18
+ /** Preserve one known source page's coverage on a projected graph fact. */
19
+ export const managedSourcePageCoverage = (state, page, scope) => {
20
+ if (state !== "complete")
21
+ return managedSourceCoverage(state);
22
+ const assessment = assessKnownPageCoverage(page);
23
+ if (assessment.complete)
24
+ return completeManagedGraphCoverage();
25
+ return {
26
+ status: "partial",
27
+ truncated: assessment.omittedCount > 0,
28
+ omitted_count: assessment.omittedCount,
29
+ limits: assessment.omittedCount > 0
30
+ ? [
31
+ { name: `${scope}_offset`, value: page.offset, unit: "items" },
32
+ { name: `${scope}_limit`, value: page.limit, unit: "items" },
33
+ ]
34
+ : [],
35
+ };
36
+ };
37
+ /** Assess exact source-page and local-limit omissions for graph projection. */
38
+ export const assessManagedGraphOmissions = (sources, limits) => {
39
+ const { typeAssessment, methodAssessment, fieldAssessment } = assessMemberPages(sources.members, limits);
40
+ const { pinvokeAssessment, implementationAssessment } = assessBoundaryPages(sources.boundaries, limits);
41
+ const pageAssessments = [
42
+ typeAssessment,
43
+ methodAssessment,
44
+ fieldAssessment,
45
+ pinvokeAssessment,
46
+ implementationAssessment,
47
+ ];
48
+ const unknownInputCoverage = hasUnknownInputCoverage(sources);
49
+ return {
50
+ limits,
51
+ unknownInputCoverage,
52
+ partialInput: pageAssessments.some(({ sourceComplete }) => !sourceComplete) ||
53
+ unknownInputCoverage,
54
+ types: typeAssessment.omittedCount,
55
+ methods: methodAssessment.omittedCount,
56
+ fields: fieldAssessment.omittedCount,
57
+ pinvokeImports: pinvokeAssessment.omittedCount,
58
+ nativeImplementations: implementationAssessment.omittedCount,
59
+ sourceLimits: [
60
+ ...memberSourceLimits(sources.members),
61
+ ...boundarySourceLimits(sources.boundaries),
62
+ ],
63
+ };
64
+ };
65
+ /** Project aggregate omissions into the application graph coverage contract. */
66
+ export const managedGraphEvidenceCoverage = (omissions) => {
67
+ const omitted = totalManagedGraphOmitted(omissions);
68
+ if (omissions.unknownInputCoverage)
69
+ return {
70
+ status: "partial",
71
+ truncated: false,
72
+ omitted_count: null,
73
+ limits: [],
74
+ };
75
+ return {
76
+ status: omitted === 0 && !omissions.partialInput ? "complete" : "partial",
77
+ truncated: omitted > 0,
78
+ omitted_count: omitted > 0 ? omitted : omissions.partialInput ? null : 0,
79
+ limits: omitted > 0 ? projectionLimits(omissions) : [],
80
+ };
81
+ };
82
+ /** Project aggregate omissions into the managed workflow result contract. */
83
+ export const managedGraphResultCoverage = (omissions) => {
84
+ const omitted = totalManagedGraphOmitted(omissions);
85
+ return {
86
+ status: omissions.unknownInputCoverage
87
+ ? "partial"
88
+ : omitted > 0
89
+ ? "truncated"
90
+ : omissions.partialInput
91
+ ? "partial"
92
+ : "complete-within-inputs",
93
+ omitted_types: omissions.types,
94
+ omitted_methods: omissions.methods,
95
+ omitted_fields: omissions.fields,
96
+ omitted_pinvoke_imports: omissions.pinvokeImports,
97
+ omitted_native_implementations: omissions.nativeImplementations,
98
+ };
99
+ };
100
+ /** Sum all exact entity omissions represented by the managed graph result. */
101
+ export const totalManagedGraphOmitted = (omissions) => omissions.types +
102
+ omissions.methods +
103
+ omissions.fields +
104
+ omissions.pinvokeImports +
105
+ omissions.nativeImplementations;
106
+ const COMPLETE_EMPTY_PAGE = {
107
+ complete: true,
108
+ sourceComplete: true,
109
+ includedCount: 0,
110
+ omittedCount: 0,
111
+ sourceOmittedCount: 0,
112
+ };
113
+ const assessMemberPages = (members, limits) => members === null
114
+ ? {
115
+ typeAssessment: COMPLETE_EMPTY_PAGE,
116
+ methodAssessment: COMPLETE_EMPTY_PAGE,
117
+ fieldAssessment: COMPLETE_EMPTY_PAGE,
118
+ }
119
+ : {
120
+ typeAssessment: assessKnownPageCoverage(members.types, limits.max_types),
121
+ methodAssessment: assessKnownPageCoverage(members.methods, limits.max_methods),
122
+ fieldAssessment: assessKnownPageCoverage(members.fields, limits.max_fields),
123
+ };
124
+ const assessBoundaryPages = (boundaries, limits) => boundaries === null
125
+ ? {
126
+ pinvokeAssessment: COMPLETE_EMPTY_PAGE,
127
+ implementationAssessment: COMPLETE_EMPTY_PAGE,
128
+ }
129
+ : {
130
+ pinvokeAssessment: assessKnownPageCoverage(boundaries.pinvoke_imports, limits.max_pinvoke_imports),
131
+ implementationAssessment: assessKnownPageCoverage(boundaries.native_implementations, limits.max_native_implementations),
132
+ };
133
+ const hasUnknownInputCoverage = (sources) => [
134
+ sources.members?.coverage.state,
135
+ sources.boundaries?.coverage.state,
136
+ sources.artifact?.coverage.state,
137
+ ].some((state) => state !== undefined && state !== "complete");
138
+ const pageLimits = (name, page) => [
139
+ { name: `${name}_offset`, value: page.offset, unit: "items" },
140
+ { name: `${name}_limit`, value: page.limit, unit: "items" },
141
+ ];
142
+ const memberSourceLimits = (members) => members === null
143
+ ? []
144
+ : [
145
+ ...pageLimits("source_types", members.types),
146
+ ...pageLimits("source_methods", members.methods),
147
+ ...pageLimits("source_fields", members.fields),
148
+ ];
149
+ const boundarySourceLimits = (boundaries) => boundaries === null
150
+ ? []
151
+ : [
152
+ ...pageLimits("source_pinvoke_imports", boundaries.pinvoke_imports),
153
+ ...pageLimits("source_native_implementations", boundaries.native_implementations),
154
+ ];
155
+ const projectionLimits = (omissions) => [
156
+ { name: "max_types", value: omissions.limits.max_types, unit: "items" },
157
+ { name: "max_methods", value: omissions.limits.max_methods, unit: "items" },
158
+ { name: "max_fields", value: omissions.limits.max_fields, unit: "items" },
159
+ {
160
+ name: "max_pinvoke_imports",
161
+ value: omissions.limits.max_pinvoke_imports,
162
+ unit: "items",
163
+ },
164
+ {
165
+ name: "max_native_implementations",
166
+ value: omissions.limits.max_native_implementations,
167
+ unit: "items",
168
+ },
169
+ ...omissions.sourceLimits,
170
+ ];
@@ -0,0 +1,6 @@
1
+ /** Derive module coverage from the best available managed evidence source. */
2
+ export const moduleCoverageState = (parsed) => parsed.artifact !== null && parsed.artifact.result.module !== null
3
+ ? parsed.artifact.result.coverage.state
4
+ : parsed.members !== null && parsed.members.result.module !== null
5
+ ? parsed.members.result.coverage.state
6
+ : (parsed.boundaries?.result.coverage.state ?? "complete");