rea-agents 1.7.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 (333) hide show
  1. package/README.md +112 -59
  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 +42 -2
  18. package/dist/application/ClientRegistrationStatus.js +1 -1
  19. package/dist/application/CrossVersionInventory.js +8 -2
  20. package/dist/application/CrossVersionInvestigation.js +11 -29
  21. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  22. package/dist/application/DirectAnalysis.js +47 -44
  23. package/dist/application/Doctor.js +165 -197
  24. package/dist/application/DoctorDiagnostics.js +180 -0
  25. package/dist/application/ElectronBoundaryAnalysis.js +112 -0
  26. package/dist/application/ElectronBoundaryGraph.js +9 -0
  27. package/dist/application/ElectronBoundaryGraphContext.js +62 -0
  28. package/dist/application/ElectronBoundaryGraphIpc.js +242 -0
  29. package/dist/application/ElectronBoundaryGraphNative.js +86 -0
  30. package/dist/application/ElectronBoundaryGraphWindows.js +223 -0
  31. package/dist/application/EnhancedToolPagination.js +22 -0
  32. package/dist/application/EnhancedToolTypes.js +4 -0
  33. package/dist/application/EnhancedTools.js +58 -50
  34. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  35. package/dist/application/InvestigationProviders.js +30 -0
  36. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  37. package/dist/application/JavaScriptApplicationEvidence.js +26 -0
  38. package/dist/application/JavaScriptApplicationEvidenceGraph.js +89 -0
  39. package/dist/application/JavaScriptApplicationService.js +74 -0
  40. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +29 -0
  41. package/dist/application/JavaScriptApplicationWorkflowService.js +90 -0
  42. package/dist/application/JavaScriptArtifactAnalysis.js +52 -7
  43. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  44. package/dist/application/JavaScriptArtifactGraphBuilder.js +82 -17
  45. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  46. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  47. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  48. package/dist/application/JavaScriptArtifactGraphEvidence.js +24 -14
  49. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  50. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  51. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  52. package/dist/application/JavaScriptArtifactReconstruction.js +4 -1
  53. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -83
  54. package/dist/application/JavaScriptJsonModules.js +39 -0
  55. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  56. package/dist/application/JavaScriptReplayPermission.js +16 -0
  57. package/dist/application/JavaScriptReplayPlanning.js +201 -0
  58. package/dist/application/JavaScriptReplayService.js +292 -0
  59. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +25 -0
  60. package/dist/application/JavaScriptRuntimeReconciliationService.js +27 -0
  61. package/dist/application/LinuxHopper.js +10 -0
  62. package/dist/application/MacHopper.js +22 -11
  63. package/dist/application/ManagedApplicationGraphService.js +55 -0
  64. package/dist/application/ManagedMemberComparisonService.js +122 -0
  65. package/dist/application/ManagedNativeVerificationService.js +39 -0
  66. package/dist/application/ManagedReconstructionService.js +58 -0
  67. package/dist/application/ManagedRuntimeCorrelationService.js +103 -0
  68. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  69. package/dist/application/PermissionAuthority.js +106 -63
  70. package/dist/application/ProcessCaptureCapability.js +1 -1
  71. package/dist/application/ProcessCapturePermission.js +13 -0
  72. package/dist/application/ProcessCli.js +2 -12
  73. package/dist/application/ProcessHarness.js +1 -1
  74. package/dist/application/ProcessSampling.js +15 -11
  75. package/dist/application/ProjectPermissionStore.js +49 -9
  76. package/dist/application/RealHopperAssertions.js +76 -0
  77. package/dist/application/ReconstructionCoverageService.js +69 -0
  78. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  79. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  80. package/dist/application/Setup.js +147 -259
  81. package/dist/application/SetupClientConfiguration.js +220 -0
  82. package/dist/application/SetupClients.js +24 -2
  83. package/dist/application/SetupPlan.js +123 -12
  84. package/dist/application/SetupSkill.js +26 -12
  85. package/dist/application/SupportedClients.js +1 -0
  86. package/dist/application/Uninstall.js +6 -3
  87. package/dist/application/WindowsCapabilities.js +86 -0
  88. package/dist/application/runtime.js +2 -0
  89. package/dist/artifacts/AsarArtifactReader.js +11 -0
  90. package/dist/browser/BrowserProcessStartup.js +88 -0
  91. package/dist/browser/CdpCaptureDocuments.js +12 -8
  92. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  93. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  94. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  95. package/dist/browser/CdpCaptureEventState.js +1 -0
  96. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  97. package/dist/browser/CdpCaptureEvents.js +46 -464
  98. package/dist/browser/CdpElectronInspection.js +106 -162
  99. package/dist/browser/CdpElectronProvider.js +5 -1
  100. package/dist/browser/CdpElectronScriptEvents.js +69 -0
  101. package/dist/browser/CdpElectronScripts.js +94 -0
  102. package/dist/browser/CdpElectronWorkers.js +56 -0
  103. package/dist/browser/CdpObservationSession.js +51 -8
  104. package/dist/browser/CdpPageCapture.js +12 -129
  105. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  106. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  107. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  108. package/dist/browser/PngVisualDiff.js +9 -2
  109. package/dist/catalogIdentity.js +8 -1
  110. package/dist/cli/artifactCommands.js +82 -0
  111. package/dist/cli/coreAnalysisCommands.js +232 -0
  112. package/dist/cli/managedCommands.js +397 -0
  113. package/dist/cli/managedProjectGraphCommand.js +24 -0
  114. package/dist/cli/options.js +9 -0
  115. package/dist/cli/setupCommands.js +108 -0
  116. package/dist/cli/types.js +1 -0
  117. package/dist/cli/utilityCommands.js +122 -0
  118. package/dist/cli.js +13 -383
  119. package/dist/cliApplicationCommands.js +176 -0
  120. package/dist/cliBrowserAdvancedCommands.js +73 -16
  121. package/dist/cliBrowserCommands.js +39 -115
  122. package/dist/cliCommandNames.js +17 -0
  123. package/dist/cliElectronCommands.js +100 -27
  124. package/dist/cliEvidenceCommands.js +13 -2
  125. package/dist/cliInvestigationCommands.js +53 -10
  126. package/dist/cliJsonInput.js +54 -0
  127. package/dist/cliObservationOptions.js +137 -0
  128. package/dist/cliPolicyCommands.js +80 -46
  129. package/dist/cliSetup.js +289 -0
  130. package/dist/config/environment.js +107 -0
  131. package/dist/config/parseConfig.js +228 -0
  132. package/dist/config/parsers.js +68 -0
  133. package/dist/config/permissions.js +30 -0
  134. package/dist/config/types.js +1 -0
  135. package/dist/config.js +1 -292
  136. package/dist/contracts/applicationToolContracts.js +225 -0
  137. package/dist/contracts/artifactToolContracts.js +5 -9
  138. package/dist/contracts/browserToolContracts.js +14 -62
  139. package/dist/contracts/electronToolContracts.js +45 -19
  140. package/dist/contracts/errorSchemas.js +1 -0
  141. package/dist/contracts/investigationExamples.js +0 -6
  142. package/dist/contracts/javascriptApplicationWorkflowExamples.js +46 -0
  143. package/dist/contracts/javascriptRuntimeReconciliationExample.js +208 -0
  144. package/dist/contracts/managedToolContracts.js +153 -0
  145. package/dist/contracts/managedWorkflowExamples.js +346 -0
  146. package/dist/contracts/managedWorkflowToolContracts.js +203 -0
  147. package/dist/contracts/nativeToolContracts.js +2 -6
  148. package/dist/contracts/promptContracts.js +18 -2
  149. package/dist/contracts/providerSelection.js +2 -0
  150. package/dist/contracts/toolContractExamples.js +10 -25
  151. package/dist/contracts/toolContracts.js +49 -47
  152. package/dist/contracts/toolEffects.js +174 -0
  153. package/dist/contracts/toolOutputSchemaGroups.js +232 -0
  154. package/dist/contracts/toolOutputSchemaPrimitives.js +327 -0
  155. package/dist/contracts/toolOutputSchemas.js +2 -535
  156. package/dist/doctorRuntime.js +42 -1
  157. package/dist/domain/analysisErrorPresentation.js +234 -0
  158. package/dist/domain/analysisErrorProjection.js +284 -0
  159. package/dist/domain/artifactComparison.js +37 -19
  160. package/dist/domain/binaryTarget.js +87 -37
  161. package/dist/domain/browserObservation.js +1 -282
  162. package/dist/domain/browserObservationSchemas.js +286 -0
  163. package/dist/domain/bundleComparison.js +4 -4
  164. package/dist/domain/electronObservation.js +13 -0
  165. package/dist/domain/electronStaticAnalysis.js +9 -0
  166. package/dist/domain/electronStaticAnalysisBrowser.js +206 -0
  167. package/dist/domain/electronStaticAnalysisIpc.js +171 -0
  168. package/dist/domain/electronStaticAnalysisNative.js +164 -0
  169. package/dist/domain/electronStaticAnalysisTypes.js +1 -0
  170. package/dist/domain/electronStaticAnalysisValues.js +103 -0
  171. package/dist/domain/errors.js +32 -448
  172. package/dist/domain/functionComparison.js +4 -165
  173. package/dist/domain/functionComparisonDimensions.js +164 -0
  174. package/dist/domain/functionComparisonSchemas.js +3 -8
  175. package/dist/domain/inputIssueProjection.js +52 -0
  176. package/dist/domain/javascriptApplicationAnalysis.js +155 -0
  177. package/dist/domain/javascriptApplicationChangeGraph.js +231 -0
  178. package/dist/domain/javascriptApplicationEvidenceSchemas.js +18 -0
  179. package/dist/domain/javascriptApplicationGraph.js +2 -1
  180. package/dist/domain/javascriptApplicationGraphSchemas.js +7 -0
  181. package/dist/domain/javascriptApplicationVersionComparison.js +116 -0
  182. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +139 -0
  183. package/dist/domain/javascriptApplicationVersionItems.js +233 -0
  184. package/dist/domain/javascriptApplicationVersionKeys.js +170 -0
  185. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  186. package/dist/domain/javascriptFeatureSeed.js +140 -0
  187. package/dist/domain/javascriptFeatureTrace.js +232 -0
  188. package/dist/domain/javascriptFeatureTraceSchemas.js +136 -0
  189. package/dist/domain/javascriptFeatureTraversal.js +100 -0
  190. package/dist/domain/javascriptNativeHandoff.js +85 -0
  191. package/dist/domain/javascriptReplay.js +361 -0
  192. package/dist/domain/javascriptRuntimeLoadState.js +106 -0
  193. package/dist/domain/javascriptRuntimeReconciliation.js +42 -0
  194. package/dist/domain/javascriptRuntimeReconciliationGraph.js +169 -0
  195. package/dist/domain/javascriptRuntimeReconciliationMatching.js +247 -0
  196. package/dist/domain/javascriptRuntimeReconciliationParsing.js +160 -0
  197. package/dist/domain/javascriptRuntimeReconciliationResult.js +119 -0
  198. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +316 -0
  199. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +245 -0
  200. package/dist/domain/javascriptRuntimeStaticCandidates.js +193 -0
  201. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  202. package/dist/domain/javascriptSemanticIr.js +30 -0
  203. package/dist/domain/javascriptSemanticProjection.js +366 -0
  204. package/dist/domain/javascriptSemanticState.js +40 -0
  205. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  206. package/dist/domain/javascriptSemanticValues.js +352 -0
  207. package/dist/domain/javascriptStaticAnalysis.js +26 -254
  208. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  209. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  210. package/dist/domain/javascriptStaticAnalysisFindings.js +39 -0
  211. package/dist/domain/javascriptStaticAnalysisHelpers.js +81 -2
  212. package/dist/domain/javascriptStaticAnalysisState.js +6 -0
  213. package/dist/domain/knownPageCoverage.js +21 -0
  214. package/dist/domain/managedApplicationGraph.js +206 -0
  215. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  216. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  217. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  218. package/dist/domain/managedArtifact.js +452 -0
  219. package/dist/domain/managedMemberComparison.js +211 -0
  220. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  221. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  222. package/dist/domain/managedNativeVerification.js +46 -0
  223. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  224. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  225. package/dist/domain/managedReconstruction.js +196 -0
  226. package/dist/domain/managedRuntimeCorrelation.js +184 -0
  227. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  228. package/dist/domain/permissionPolicy.js +2 -0
  229. package/dist/domain/reconstructionCoverage.js +387 -0
  230. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  231. package/dist/domain/reconstructionVerificationSchemas.js +9 -3
  232. package/dist/domain/runtimeCharacterization.js +85 -0
  233. package/dist/domain/webBundleAnalyzer.js +3 -409
  234. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  235. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  236. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  237. package/dist/dotnet/ManagedArtifactInspector.js +339 -0
  238. package/dist/dotnet/ManagedMemberInspector.js +153 -0
  239. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  240. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  241. package/dist/dotnet/ManagedMemberRows.js +120 -0
  242. package/dist/dotnet/ManagedMetadataHeaps.js +131 -0
  243. package/dist/dotnet/ManagedMetadataInventory.js +104 -0
  244. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  245. package/dist/dotnet/ManagedMetadataLayout.js +259 -0
  246. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  247. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  248. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  249. package/dist/dotnet/ManagedNativeBoundaryInspector.js +143 -0
  250. package/dist/dotnet/ManagedPeReader.js +188 -0
  251. package/dist/dotnet/ManagedReaderFailure.js +10 -0
  252. package/dist/dotnet/ManagedStaticProvider.js +203 -0
  253. package/dist/generatedPackageMetadata.js +2 -2
  254. package/dist/ghidra/GhidraClient.js +76 -91
  255. package/dist/ghidra/GhidraClientStartup.js +29 -0
  256. package/dist/ghidra/GhidraClientWire.js +34 -0
  257. package/dist/ghidra/GhidraDefaults.js +1 -1
  258. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  259. package/dist/ghidra/GhidraInstallation.js +20 -15
  260. package/dist/ghidra/GhidraLauncher.js +93 -29
  261. package/dist/ghidra/GhidraProvider.js +67 -161
  262. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  263. package/dist/ghidra/GhidraSessionValues.js +2 -0
  264. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  265. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  266. package/dist/ghidra/GhidraTransport.js +71 -0
  267. package/dist/identity.js +3 -2
  268. package/dist/main/messages.js +5 -0
  269. package/dist/main/reload.js +49 -0
  270. package/dist/main/shutdown.js +25 -0
  271. package/dist/main/startup.js +14 -0
  272. package/dist/main/state.js +26 -0
  273. package/dist/main/transport.js +61 -0
  274. package/dist/main/types.js +1 -0
  275. package/dist/main.js +35 -132
  276. package/dist/process/PrivateRuntimeRoot.js +3 -2
  277. package/dist/process/ProcessOwnership.js +35 -0
  278. package/dist/process/ProviderProcess.js +2 -0
  279. package/dist/replay/JavaScriptReplayWorker.js +300 -0
  280. package/dist/replay/LinuxJavaScriptReplayRunner.js +217 -0
  281. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  282. package/dist/replay/LinuxRuntimeClosure.js +46 -0
  283. package/dist/replay/LinuxSeccompPolicy.js +40 -0
  284. package/dist/replay/ReplayOutcome.js +95 -0
  285. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  286. package/dist/replay/ReplayWorkerProtocol.js +55 -0
  287. package/dist/replay/SystemJavaScriptReplayHost.js +182 -0
  288. package/dist/server/ProcessCaptureElicitation.js +157 -0
  289. package/dist/server/createServer.js +158 -41
  290. package/dist/server/registerApplicationTools/characterization.js +57 -0
  291. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  292. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  293. package/dist/server/registerApplicationTools/coverage.js +84 -0
  294. package/dist/server/registerApplicationTools/helpers.js +42 -0
  295. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  296. package/dist/server/registerApplicationTools/types.js +1 -0
  297. package/dist/server/registerApplicationTools.js +13 -0
  298. package/dist/server/registerArtifactComparisonTool.js +16 -9
  299. package/dist/server/registerBrowserTools.js +61 -60
  300. package/dist/server/registerBundleComparisonTool.js +17 -20
  301. package/dist/server/registerElectronTools.js +39 -12
  302. package/dist/server/registerEnhancedTools.js +52 -15
  303. package/dist/server/registerEvidenceResources.js +54 -0
  304. package/dist/server/registerEvidenceTools.js +5 -1
  305. package/dist/server/registerFunctionComparisonTool.js +14 -7
  306. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  307. package/dist/server/registerInvestigationTools/types.js +1 -0
  308. package/dist/server/registerInvestigationTools.js +103 -132
  309. package/dist/server/registerManagedTools.js +6 -0
  310. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  311. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  312. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  313. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  314. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  315. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  316. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  317. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  318. package/dist/server/registerManagedWorkflowTools.js +13 -0
  319. package/dist/server/registerOfficialTools.js +81 -67
  320. package/dist/server/registerProcessComparisonTool.js +25 -47
  321. package/dist/server/registerSessionRecordTools.js +137 -0
  322. package/dist/server/registerSessionStatusTool.js +9 -8
  323. package/dist/server/registerSessionTools.js +77 -216
  324. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  325. package/dist/server/sessionEvidence.js +14 -19
  326. package/dist/server/toolInputValidation.js +77 -0
  327. package/dist/server/toolRegistrationOptions.js +177 -2
  328. package/dist/server/toolResult.js +30 -17
  329. package/package.json +21 -14
  330. package/scripts/rea.mjs +1 -1
  331. package/skills/{rea-analysis → reverse-engineer-anything}/SKILL.md +75 -6
  332. package/scripts/prepare-node-pty.mjs +0 -35
  333. package/scripts/rebuild-native.mjs +0 -22
@@ -0,0 +1,212 @@
1
+ export const recommendedReconstructionProbes = (reasons) => reasons.slice(0, 100).map((reason) => ({
2
+ operation: probeOperation(reason.code),
3
+ subject_id: reason.subject_id,
4
+ rationale: reason.detail,
5
+ }));
6
+ const probeOperation = (code) => {
7
+ if (code.startsWith("owner-") || code.startsWith("authority-routing"))
8
+ return "reconcile_reconstruction_owner";
9
+ if (code.startsWith("verifier-"))
10
+ return "run_reconstruction_verifier";
11
+ if (code.startsWith("package-proof"))
12
+ return "verify_reconstruction_package";
13
+ if (code === "active-contradiction")
14
+ return "resolve_contradiction";
15
+ if (code === "active-unknown")
16
+ return "probe_residual_unknown";
17
+ return "update_authoritative_inventory";
18
+ };
19
+ export const evaluateReconstructionSurfaces = (context) => {
20
+ const surfaces = indexUnique(context.workspace.surfaces, "surface_id");
21
+ for (const surfaceId of context.boundary.required_surface_ids) {
22
+ const surface = surfaces.get(surfaceId);
23
+ if (surface === undefined) {
24
+ addReason(context, "surface-missing", surfaceId, "Required surface is absent from the authoritative inventory.");
25
+ continue;
26
+ }
27
+ addEvidence(context, surface.evidence_ids);
28
+ for (const dependencyId of surface.dependency_surface_ids)
29
+ if (!surfaces.has(dependencyId))
30
+ addReason(context, "dependency-surface-missing", surfaceId, `Declared dependency surface is absent: ${dependencyId}`);
31
+ evaluateOwner(context, surfaceId);
32
+ }
33
+ };
34
+ const evaluateOwner = (context, surfaceId) => {
35
+ const owners = context.workspace.owners.filter(({ surface_id: id }) => id === surfaceId);
36
+ if (owners.length === 0) {
37
+ addReason(context, "owner-missing", surfaceId, "Required surface has no reconstructed owner or explicit disposition.");
38
+ return;
39
+ }
40
+ if (owners.length > 1) {
41
+ addReason(context, "owner-duplicate", surfaceId, "Required surface has conflicting ownership declarations.");
42
+ return;
43
+ }
44
+ const owner = owners[0]?.ownership;
45
+ if (owner === undefined)
46
+ return;
47
+ if (owner.disposition !== "implemented") {
48
+ if (!context.boundary.allowed_dispositions.includes(owner.disposition))
49
+ addReason(context, "disposition-not-allowed", surfaceId, `${owner.disposition} is not allowed by this completion boundary.`);
50
+ return;
51
+ }
52
+ const ownerChecks = [
53
+ [
54
+ owner.path_state === "missing",
55
+ "owner-path-missing",
56
+ "Declared owner path is missing.",
57
+ ],
58
+ [
59
+ owner.path_state === "unknown",
60
+ "owner-path-unknown",
61
+ "Declared owner path has not been checked.",
62
+ ],
63
+ [
64
+ owner.package_state === "missing",
65
+ "owner-undistributed",
66
+ "Declared owner is absent from the distributable.",
67
+ ],
68
+ [
69
+ owner.package_state === "unknown",
70
+ "owner-distribution-unknown",
71
+ "Owner distribution state is unknown.",
72
+ ],
73
+ [
74
+ owner.authority_route === "detected",
75
+ "authority-routing-detected",
76
+ "Reconstructed owner routes into the authority.",
77
+ ],
78
+ [
79
+ owner.authority_route === "unknown",
80
+ "authority-routing-unknown",
81
+ "Authority independence has not been established.",
82
+ ],
83
+ ];
84
+ for (const [matches, code, detail] of ownerChecks)
85
+ if (matches)
86
+ addReason(context, code, surfaceId, detail);
87
+ };
88
+ export const evaluateReconstructionClaims = (context) => {
89
+ const claims = indexUnique(context.workspace.claims, "claim_id");
90
+ for (const claimId of context.boundary.required_claim_ids) {
91
+ const claim = claims.get(claimId);
92
+ if (claim === undefined) {
93
+ addReason(context, "claim-missing", claimId, "Required finite claim is absent.");
94
+ continue;
95
+ }
96
+ const contracts = context.workspace.verifier_contracts.filter(({ claim_ids: ids }) => ids.includes(claimId));
97
+ if (contracts.length === 0) {
98
+ addReason(context, "verifier-missing", claimId, "No verifier contract covers this claim.");
99
+ continue;
100
+ }
101
+ if (contracts.length > 1) {
102
+ addReason(context, "verifier-duplicate", claimId, "Multiple verifier contracts claim primary coverage.");
103
+ continue;
104
+ }
105
+ const contract = contracts[0];
106
+ if (contract !== undefined)
107
+ evaluateVerifierResult(context, claim, contract);
108
+ }
109
+ };
110
+ const evaluateVerifierResult = (context, claim, contract) => {
111
+ const results = context.workspace.verifier_results
112
+ .filter(({ verifier_id: id }) => id === contract.verifier_id)
113
+ .sort((left, right) => Date.parse(right.observed_at) - Date.parse(left.observed_at));
114
+ const result = results[0];
115
+ if (result === undefined) {
116
+ addReason(context, "verifier-result-missing", claim.claim_id, "Verifier has no recorded result.");
117
+ return;
118
+ }
119
+ addEvidence(context, result.evidence_ids);
120
+ if (!verifierResultIsCompatible(context, claim, contract, result)) {
121
+ addReason(context, "verifier-result-incompatible", claim.claim_id, "Latest verifier result does not match current artifacts, owners, dimensions, authority, normalization, repeats, or contract.");
122
+ return;
123
+ }
124
+ const observedAt = Date.parse(result.observed_at);
125
+ if (observedAt > context.nowEpochMs ||
126
+ context.nowEpochMs - observedAt > contract.max_age_ms) {
127
+ addReason(context, "verifier-result-stale", claim.claim_id, "Latest compatible verifier result is stale.");
128
+ return;
129
+ }
130
+ if (result.status === "fail")
131
+ addReason(context, "verifier-failed", claim.claim_id, "Latest compatible verifier result failed.");
132
+ else if (result.status !== "pass")
133
+ addReason(context, "verifier-unknown", claim.claim_id, `Latest compatible verifier result is ${result.status}.`);
134
+ };
135
+ const verifierResultIsCompatible = (context, claim, contract, result) => {
136
+ const artifactDigests = new Set(context.workspace.artifacts.map(({ artifact_sha256: value }) => value));
137
+ const ownerDigests = new Set(context.workspace.owners.flatMap(({ ownership }) => ownership.disposition === "implemented" ? [ownership.owner_sha256] : []));
138
+ const surfaces = new Map(context.workspace.surfaces.map((surface) => [surface.surface_id, surface]));
139
+ const artifacts = new Map(context.workspace.artifacts.map((artifact) => [
140
+ artifact.artifact_id,
141
+ artifact,
142
+ ]));
143
+ const expectedArtifactDigests = claim.surface_ids.flatMap((surfaceId) => {
144
+ const surface = surfaces.get(surfaceId);
145
+ const artifact = surface === undefined ? undefined : artifacts.get(surface.artifact_id);
146
+ return artifact === undefined ? [] : [artifact.artifact_sha256];
147
+ });
148
+ const expectedOwnerDigests = context.workspace.owners.flatMap(({ surface_id: surfaceId, ownership }) => claim.surface_ids.includes(surfaceId) &&
149
+ ownership.disposition === "implemented"
150
+ ? [ownership.owner_sha256]
151
+ : []);
152
+ return (result.contract_sha256 === contract.contract_sha256 &&
153
+ result.normalization_sha256 === contract.normalization_sha256 &&
154
+ result.covered_claim_ids.includes(claim.claim_id) &&
155
+ result.covered_claim_ids.every((item) => contract.claim_ids.includes(item)) &&
156
+ claim.required_dimensions.every((item) => contract.dimensions.includes(item)) &&
157
+ claim.required_dimensions.every((item) => result.covered_dimensions.includes(item)) &&
158
+ result.covered_dimensions.every((item) => contract.dimensions.includes(item)) &&
159
+ result.artifact_sha256s.every((item) => artifactDigests.has(item)) &&
160
+ expectedArtifactDigests.every((item) => result.artifact_sha256s.includes(item)) &&
161
+ result.owner_sha256s.every((item) => ownerDigests.has(item)) &&
162
+ expectedOwnerDigests.every((item) => result.owner_sha256s.includes(item)) &&
163
+ result.repeats >= contract.minimum_repeats &&
164
+ claim.required_authority === contract.authority);
165
+ };
166
+ export const evaluateReconstructionWorkspaceRisks = (context) => {
167
+ for (const unknownId of context.workspace.residual_unknown_ids)
168
+ if (!context.boundary.allowed_unknown_ids.includes(unknownId))
169
+ addReason(context, "active-unknown", unknownId, "Active residual unknown is not permitted by the completion boundary.");
170
+ for (const contradiction of context.workspace.contradictions)
171
+ if (contradiction.status === "active" &&
172
+ (contradiction.surface_ids.some((id) => context.boundary.required_surface_ids.includes(id)) ||
173
+ contradiction.claim_ids.some((id) => context.boundary.required_claim_ids.includes(id)))) {
174
+ addEvidence(context, contradiction.evidence_ids);
175
+ addReason(context, "active-contradiction", contradiction.contradiction_id, "Active contradiction affects the completion boundary.");
176
+ }
177
+ };
178
+ export const evaluateReconstructionPackageProofs = (context) => {
179
+ const surfaces = new Map(context.workspace.surfaces.map((surface) => [surface.surface_id, surface]));
180
+ const artifacts = new Map(context.workspace.artifacts.map((artifact) => [
181
+ artifact.artifact_id,
182
+ artifact,
183
+ ]));
184
+ const requiredArtifactDigests = context.boundary.required_surface_ids.flatMap((surfaceId) => {
185
+ const surface = surfaces.get(surfaceId);
186
+ const artifact = surface === undefined ? undefined : artifacts.get(surface.artifact_id);
187
+ return artifact === undefined ? [] : [artifact.artifact_sha256];
188
+ });
189
+ for (const kind of context.boundary.required_package_proof_kinds) {
190
+ const proofs = context.workspace.package_proofs.filter((proof) => proof.kind === kind);
191
+ const passing = proofs.find(({ artifact_sha256s: digests, status }) => status === "pass" &&
192
+ requiredArtifactDigests.every((digest) => digests.includes(digest)));
193
+ if (passing !== undefined) {
194
+ addEvidence(context, passing.evidence_ids);
195
+ continue;
196
+ }
197
+ if (proofs.some(({ status }) => status === "fail"))
198
+ addReason(context, "package-proof-failed", kind, "Required package or integration proof failed.");
199
+ else if (proofs.length > 0)
200
+ addReason(context, "package-proof-unknown", kind, "Required package or integration proof is not passing.");
201
+ else
202
+ addReason(context, "package-proof-missing", kind, "Required package or integration proof is missing.");
203
+ }
204
+ };
205
+ const indexUnique = (items, key) => new Map(items.map((item) => [item[key], item]));
206
+ const addReason = (context, code, subjectId, detail) => {
207
+ context.reasons.push({ code, subject_id: subjectId, detail });
208
+ };
209
+ const addEvidence = (context, evidenceIds) => {
210
+ for (const evidenceId of evidenceIds)
211
+ context.evidenceIds.add(evidenceId);
212
+ };
@@ -1,5 +1,4 @@
1
1
  import { z } from "zod";
2
- import { evidenceBundleSchema } from "./evidenceBundle.js";
3
2
  const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
4
3
  const unknownIdSchema = z.string().regex(/^unk_[a-f0-9]{64}$/u);
5
4
  const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
@@ -69,9 +68,16 @@ export const reconstructionSpecificationSchema = z
69
68
  });
70
69
  });
71
70
  /** Bounded reconstruction-verification input. */
72
- export const reconstructionVerificationInputSchema = z.object({
71
+ export const reconstructionVerificationInputSchema = z.strictObject({
73
72
  specification: reconstructionSpecificationSchema,
74
- evidence_bundle: evidenceBundleSchema,
73
+ coverage: z
74
+ .strictObject({
75
+ workspace_id: z.string().regex(/^rcw_[a-f0-9]{64}$/u),
76
+ revision: z.number().int().min(1),
77
+ revision_sha256: digestSchema,
78
+ boundary_id: z.string().min(1).max(200),
79
+ })
80
+ .optional(),
75
81
  offset: z.number().int().min(0).default(0),
76
82
  limit: z.number().int().min(1).max(100).default(100),
77
83
  unknown_registry_approved: z.literal(true).optional(),
@@ -0,0 +1,85 @@
1
+ import { createHash } from "node:crypto";
2
+ import canonicalize from "canonicalize";
3
+ import { z } from "zod";
4
+ const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
5
+ const stableIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._:/-]{0,199}$/u);
6
+ const runtimeIdentitySchema = z.strictObject({
7
+ family: z.string().trim().min(1).max(100),
8
+ provider_id: stableIdSchema,
9
+ executable_path: z.string().min(1).max(4_096),
10
+ executable_sha256: digestSchema,
11
+ version: z.string().trim().min(1).max(500),
12
+ profile_sha256: digestSchema,
13
+ });
14
+ const artifactIdentitySchema = z.strictObject({
15
+ path: z.string().min(1).max(4_096),
16
+ sha256: digestSchema,
17
+ byte_length: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
18
+ });
19
+ const callableIdentitySchema = z.strictObject({
20
+ callable_id: stableIdSchema,
21
+ module_id: stableIdSchema,
22
+ export_name: z.string().min(1).max(1_000),
23
+ semantic_evidence_id: z
24
+ .string()
25
+ .regex(/^ev_[a-f0-9]{64}$/u)
26
+ .nullable(),
27
+ selector_sha256: digestSchema,
28
+ });
29
+ export const runtimeCharacterizationPlanSchema = z.strictObject({
30
+ schema_version: z.literal(1),
31
+ plan_sha256: digestSchema,
32
+ preparation_sha256: digestSchema,
33
+ artifact: artifactIdentitySchema,
34
+ runtime: runtimeIdentitySchema,
35
+ callable: callableIdentitySchema,
36
+ working_directory: z.string().min(1).max(4_096),
37
+ isolated_home: z.string().min(1).max(4_096),
38
+ expected_effect: z.enum(["pure", "bounded-effects", "observation-only"]),
39
+ allowed_boundaries: z.array(stableIdSchema).max(1_000),
40
+ limits: z.strictObject({
41
+ max_calls: z.number().int().min(1).max(10_000),
42
+ max_processes: z.number().int().min(0).max(1_000),
43
+ max_files: z.number().int().min(0).max(100_000),
44
+ max_bytes: z.number().int().min(1).max(Number.MAX_SAFE_INTEGER),
45
+ max_handles: z.number().int().min(0).max(100_000),
46
+ timeout_ms: z.number().int().min(1).max(300_000),
47
+ idle_timeout_ms: z.number().int().min(1).max(300_000),
48
+ }),
49
+ determinism: z.strictObject({
50
+ clock: z.enum(["fixed", "real"]),
51
+ randomness: z.enum(["seeded", "system"]),
52
+ identifiers: z.enum(["deterministic", "runtime"]),
53
+ seed: z.number().int().min(0).max(0xffff_ffff),
54
+ }),
55
+ authority: z.strictObject({
56
+ preparation_approved: z.literal(true),
57
+ execution_approved: z.literal(false),
58
+ network: z.enum(["none", "loopback"]),
59
+ provider_owned_process_only: z.literal(true),
60
+ }),
61
+ });
62
+ /** Commit a provider-neutral preparation plan; execution requires a later approval. */
63
+ export const createRuntimeCharacterizationPlan = (input) => {
64
+ const parsed = runtimeCharacterizationPlanSchema
65
+ .omit({ plan_sha256: true })
66
+ .parse(input);
67
+ return runtimeCharacterizationPlanSchema.parse({
68
+ ...parsed,
69
+ plan_sha256: digest(parsed),
70
+ });
71
+ };
72
+ /** Parse a characterization plan and reject altered commitments. */
73
+ export const parseRuntimeCharacterizationPlan = (input) => {
74
+ const parsed = runtimeCharacterizationPlanSchema.parse(input);
75
+ const { plan_sha256: planSha256, ...semantic } = parsed;
76
+ if (planSha256 !== digest(semantic))
77
+ throw new TypeError("Runtime characterization plan digest is invalid");
78
+ return parsed;
79
+ };
80
+ const digest = (value) => {
81
+ const encoded = canonicalize(value);
82
+ if (encoded === undefined)
83
+ throw new TypeError("Runtime characterization plan is not canonical JSON");
84
+ return createHash("sha256").update(encoded).digest("hex");
85
+ };