rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -1,31 +1,16 @@
1
+ import { createStoreFileLock, removeStaleStoreFileLock, } from "./StoreFileLock.js";
1
2
  import { createHash } from "node:crypto";
2
3
  import { constants } from "node:fs";
3
- import { lstat, mkdir, open, readFile, realpath, unlink, } from "node:fs/promises";
4
+ import { lstat, mkdir, open, realpath, } from "node:fs/promises";
4
5
  import { dirname } from "node:path";
5
6
  import { setTimeout as delay } from "node:timers/promises";
6
7
  import writeFileAtomic from "write-file-atomic";
7
8
  import { z } from "zod";
9
+ import { PERMISSION_CAPABILITIES, } from "../domain/permissionPolicy.js";
8
10
  import { err, ok } from "../domain/result.js";
9
11
  const grantSchema = z.object({
10
12
  grant_id: z.string().min(1),
11
- capability: z.enum([
12
- "process_capture",
13
- "browser_observe",
14
- "browser_automate",
15
- "electron_observe",
16
- "evidence_read",
17
- "evidence_write",
18
- "investigation_input",
19
- "investigation_workspace_read",
20
- "investigation_workspace_write",
21
- "snapshot_read",
22
- "snapshot_write",
23
- "artifact_extract",
24
- "native_mount",
25
- "reference_read",
26
- "javascript_replay",
27
- "managed_runtime",
28
- ]),
13
+ capability: z.enum(PERMISSION_CAPABILITIES),
29
14
  roots: z.array(z.string()),
30
15
  executables: z.array(z.string()),
31
16
  environment_names: z.array(z.string()),
@@ -37,10 +22,9 @@ const grantSchema = z.object({
37
22
  expires_at: z.iso.datetime().nullable(),
38
23
  });
39
24
  const storeSchema = z.object({
40
- schema_version: z.literal(1),
41
25
  project_id: z.string().regex(/^project_[a-f0-9]{64}$/u),
42
26
  project_root: z.string(),
43
- grants: z.array(grantSchema).max(1_000),
27
+ grants: z.array(grantSchema),
44
28
  });
45
29
  /** Owner-only project policy persistence failure. */
46
30
  export class ProjectPermissionStoreError extends Error {
@@ -109,7 +93,6 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
109
93
  if (!project.ok)
110
94
  return project;
111
95
  const candidate = storeSchema.safeParse({
112
- schema_version: 1,
113
96
  project_id: project.value.id,
114
97
  project_root: project.value.root,
115
98
  grants,
@@ -118,26 +101,38 @@ export const writeProjectPermissionStore = async (path, projectRoot, grants) =>
118
101
  return err(new ProjectPermissionStoreError("invalid", { cause: candidate.error }));
119
102
  if (process.getuid === undefined)
120
103
  return err(new ProjectPermissionStoreError("not_owner_only"));
121
- try {
122
- await mkdir(dirname(path), { recursive: true, mode: 0o700 });
123
- await writeFileAtomic(path, `${JSON.stringify(candidate.data, null, 2)}\n`, {
124
- encoding: "utf8",
125
- mode: 0o600,
126
- });
127
- const verified = await readProjectPermissionStore(path, projectRoot);
128
- if (!verified.ok)
129
- return verified;
130
- if (verified.value === null ||
131
- JSON.stringify(verified.value) !== JSON.stringify(candidate.data))
132
- return err(new ProjectPermissionStoreError("invalid"));
133
- return ok(candidate.data);
134
- }
135
- catch (cause) {
136
- return err(new ProjectPermissionStoreError("io", { cause }));
137
- }
104
+ return withPermissionStoreLock(path, () => writePreparedPermissionStore(path, projectRoot, candidate.data));
105
+ };
106
+ const writePreparedPermissionStore = async (path, projectRoot, candidate) => {
107
+ await writeFileAtomic(path, `${JSON.stringify(candidate, null, 2)}\n`, {
108
+ encoding: "utf8",
109
+ mode: 0o600,
110
+ });
111
+ const verified = await readProjectPermissionStore(path, projectRoot);
112
+ if (!verified.ok)
113
+ return verified;
114
+ if (verified.value === null ||
115
+ JSON.stringify(verified.value) !== JSON.stringify(candidate))
116
+ return err(new ProjectPermissionStoreError("invalid"));
117
+ return ok(candidate);
138
118
  };
139
119
  /** Revoke one grant while serializing the complete read-modify-write cycle. */
140
- export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => {
120
+ export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) => withPermissionStoreLock(path, async () => {
121
+ const current = await readProjectPermissionStore(path, projectRoot);
122
+ if (!current.ok)
123
+ return current;
124
+ if (current.value === null)
125
+ return ok(false);
126
+ const retained = current.value.grants.filter(({ grant_id }) => grant_id !== grantId);
127
+ if (retained.length === current.value.grants.length)
128
+ return ok(false);
129
+ const written = await writePreparedPermissionStore(path, projectRoot, {
130
+ ...current.value,
131
+ grants: retained,
132
+ });
133
+ return written.ok ? ok(true) : written;
134
+ });
135
+ const withPermissionStoreLock = async (path, action) => {
141
136
  let lock;
142
137
  try {
143
138
  await mkdir(dirname(path), { recursive: true, mode: 0o700 });
@@ -145,34 +140,26 @@ export const revokeProjectPermissionGrant = async (path, projectRoot, grantId) =
145
140
  if (!acquired.ok)
146
141
  return acquired;
147
142
  lock = acquired.value;
148
- const current = await readProjectPermissionStore(path, projectRoot);
149
- if (!current.ok)
150
- return current;
151
- const grants = current.value?.grants ?? [];
152
- const retained = grants.filter(({ grant_id }) => grant_id !== grantId);
153
- if (retained.length === grants.length)
154
- return ok(false);
155
- const written = await writeProjectPermissionStore(path, projectRoot, retained);
156
- return written.ok ? ok(true) : written;
143
+ return await action();
157
144
  }
158
145
  catch (cause) {
159
146
  return err(new ProjectPermissionStoreError("io", { cause }));
160
147
  }
161
148
  finally {
162
149
  if (lock !== undefined)
163
- await releasePermissionStoreLock(lock);
150
+ await lock.release();
164
151
  }
165
152
  };
166
153
  const acquirePermissionStoreLock = async (destination) => {
167
154
  const path = `${destination}.lock`;
168
155
  for (let attempt = 0; attempt < 100; attempt += 1) {
169
156
  try {
170
- return ok(await createPermissionStoreLock(path));
157
+ return ok(await createStoreFileLock(path));
171
158
  }
172
159
  catch (cause) {
173
160
  if (!isAlreadyExists(cause))
174
161
  return err(new ProjectPermissionStoreError("io", { cause }));
175
- if (await removeStalePermissionStoreLock(path))
162
+ if (await removeStaleStoreFileLock(path))
176
163
  continue;
177
164
  if (attempt === 99)
178
165
  return err(new ProjectPermissionStoreError("locked", { cause }));
@@ -181,49 +168,6 @@ const acquirePermissionStoreLock = async (destination) => {
181
168
  }
182
169
  return err(new ProjectPermissionStoreError("locked"));
183
170
  };
184
- const createPermissionStoreLock = async (path) => {
185
- const handle = await open(path, "wx", 0o600);
186
- try {
187
- await handle.writeFile(`${String(process.pid)}\n`, "utf8");
188
- await handle.sync();
189
- return { path, handle };
190
- }
191
- catch (cause) {
192
- await handle.close().catch(() => undefined);
193
- await unlink(path).catch(() => undefined);
194
- throw cause;
195
- }
196
- };
197
- const removeStalePermissionStoreLock = async (path) => {
198
- try {
199
- const metadata = await lstat(path);
200
- if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 32)
201
- return false;
202
- const encoded = (await readFile(path, "utf8")).trim();
203
- if (!/^[1-9][0-9]{0,9}$/u.test(encoded))
204
- return false;
205
- if (processIsAlive(Number(encoded)))
206
- return false;
207
- await unlink(path);
208
- return true;
209
- }
210
- catch {
211
- return false;
212
- }
213
- };
214
- const processIsAlive = (pid) => {
215
- try {
216
- process.kill(pid, 0);
217
- return true;
218
- }
219
- catch (cause) {
220
- return errorCode(cause) !== "ESRCH";
221
- }
222
- };
223
- const releasePermissionStoreLock = async (lock) => {
224
- await lock.handle.close().catch(() => undefined);
225
- await unlink(lock.path).catch(() => undefined);
226
- };
227
171
  const isNotFound = (cause) => errorCode(cause) === "ENOENT";
228
172
  const openPrivateStore = async (path) => {
229
173
  let handle;
@@ -1,28 +1,14 @@
1
1
  import { z } from "zod";
2
2
  const addressSchema = z.string().regex(/^0x[0-9a-f]+$/iu);
3
3
  const identitySchema = z.object({ address: addressSchema, name: z.string() });
4
- const collectionSchema = z.object({
5
- items: z.array(z.unknown()),
6
- total: z.number().int().min(0).nullable(),
7
- returned: z.number().int().min(0),
8
- truncated: z.boolean(),
9
- next_offset: z.number().int().min(0).nullable(),
10
- });
11
- /** Extract a real address from the provider's exact procedure page. */
4
+ /** Extract one real procedure address from the complete inline inventory. */
12
5
  export const firstProcedureAddress = (input) => {
13
- const page = z
14
- .object({
15
- items: z.array(z.object({ address: addressSchema })).min(1),
16
- offset: z.number().int().min(0),
17
- limit: z.number().int().min(1),
18
- total: z.number().int().min(1),
19
- next_offset: z.number().int().min(0).nullable(),
20
- has_more: z.boolean(),
21
- })
22
- .parse(input);
23
- const first = page.items[0];
6
+ const first = z
7
+ .array(z.object({ address: addressSchema }))
8
+ .min(1)
9
+ .parse(input)[0];
24
10
  if (first === undefined)
25
- throw new TypeError("Procedure page was empty");
11
+ throw new TypeError("Procedure inventory was empty");
26
12
  return first.address;
27
13
  };
28
14
  /** Reject two target paths that resolve to the same binary content. */
@@ -44,7 +30,7 @@ export const requirePseudocode = (input, operation) => {
44
30
  throw new TypeError(`${operation} returned an embedded failure: ${input}`);
45
31
  return input;
46
32
  };
47
- /** Validate an exact bounded Hopper function dossier semantically. */
33
+ /** Validate a complete Hopper function dossier semantically. */
48
34
  export const requireFunctionDossier = (input, expectedAddress) => {
49
35
  const value = objectValue(input, "analyze_function returned no function dossier");
50
36
  const procedure = identitySchema.parse(value.procedure);
@@ -52,22 +38,19 @@ export const requireFunctionDossier = (input, expectedAddress) => {
52
38
  throw new TypeError("analyze_function returned the wrong procedure");
53
39
  if (procedure.name.trim().length === 0)
54
40
  throw new TypeError("analyze_function omitted the procedure name");
55
- validatePseudocodeBounds(value.pseudocode);
41
+ requirePseudocode(value.pseudocode, "analyze_function");
56
42
  for (const field of COLLECTION_FIELDS)
57
- validateCollection(value[field], field);
43
+ list(value, field);
58
44
  for (const field of ["callers", "callees"])
59
- z.array(identitySchema).parse(collectionSchema.parse(value[field]).items);
60
- validateBlocks(collectionSchema.parse(value.basic_blocks).items);
61
- validateInstructionScan(value.instruction_scan);
45
+ z.array(identitySchema).parse(list(value, field));
46
+ validateBlocks(list(value, "basic_blocks"));
62
47
  return value;
63
48
  };
64
49
  /** Reject a structurally valid dossier that omits fixture-proven semantics. */
65
50
  export const requireFunctionDossierOracle = (input, oracle) => {
66
51
  const value = requireFunctionDossier(input, oracle.procedure_address);
67
52
  if (oracle.callee_address !== undefined) {
68
- const callees = z
69
- .array(identitySchema)
70
- .parse(collectionSchema.parse(value.callees).items);
53
+ const callees = z.array(identitySchema).parse(list(value, "callees"));
71
54
  if (!callees.some(({ address }) => address === oracle.callee_address))
72
55
  throw new TypeError("analyze_function omitted the expected fixture callee");
73
56
  const references = z
@@ -75,14 +58,12 @@ export const requireFunctionDossierOracle = (input, oracle) => {
75
58
  source_address: addressSchema,
76
59
  target_address: addressSchema,
77
60
  }))
78
- .parse(collectionSchema.parse(value.outgoing_references).items);
61
+ .parse(list(value, "outgoing_references"));
79
62
  if (!references.some(({ target_address }) => target_address === oracle.callee_address))
80
63
  throw new TypeError("analyze_function omitted the expected fixture reference");
81
64
  }
82
65
  if (oracle.caller_address !== undefined) {
83
- const callers = z
84
- .array(identitySchema)
85
- .parse(collectionSchema.parse(value.callers).items);
66
+ const callers = z.array(identitySchema).parse(list(value, "callers"));
86
67
  if (!callers.some(({ address }) => address === oracle.caller_address))
87
68
  throw new TypeError("analyze_function omitted the expected fixture caller");
88
69
  }
@@ -97,19 +78,18 @@ export const requireFunctionDossierOracle = (input, oracle) => {
97
78
  kind: z.enum(["comment", "inline"]),
98
79
  text: z.string(),
99
80
  }))
100
- .parse(collectionSchema.parse(value.comments).items);
81
+ .parse(list(value, "comments"));
101
82
  if (!comments.some(({ address, kind, text }) => address === oracle.procedure_address &&
102
83
  kind === "comment" &&
103
84
  text === oracle.comment))
104
85
  throw new TypeError("analyze_function omitted the verifier comment");
105
86
  }
106
- if (oracle.require_assembly === true &&
107
- collectionSchema.parse(value.assembly).items.length === 0)
87
+ if (oracle.require_assembly === true && list(value, "assembly").length === 0)
108
88
  throw new TypeError("analyze_function omitted fixture assembly");
109
89
  if (oracle.require_cfg_successor) {
110
90
  const blocks = z
111
91
  .array(z.object({ successors: z.array(addressSchema) }))
112
- .parse(collectionSchema.parse(value.basic_blocks).items);
92
+ .parse(list(value, "basic_blocks"));
113
93
  if (!blocks.some(({ successors }) => successors.length > 0))
114
94
  throw new TypeError("analyze_function omitted a real CFG successor");
115
95
  }
@@ -125,12 +105,10 @@ const referenceEdgeSchema = z.object({
125
105
  target_address: addressSchema,
126
106
  });
127
107
  const requireReferencedValue = (dossier, field, expected, normalize) => {
128
- const values = z
129
- .array(referencedValueSchema)
130
- .parse(collectionSchema.parse(dossier[field]).items);
108
+ const values = z.array(referencedValueSchema).parse(list(dossier, field));
131
109
  const references = z
132
110
  .array(referenceEdgeSchema)
133
- .parse(collectionSchema.parse(dossier.outgoing_references).items);
111
+ .parse(list(dossier, "outgoing_references"));
134
112
  const found = values.some(({ address, value, source_address: sourceAddress }) => normalize(value) === expected &&
135
113
  references.some(({ source_address, target_address }) => source_address === sourceAddress && target_address === address));
136
114
  if (!found)
@@ -154,36 +132,12 @@ const COLLECTION_FIELDS = [
154
132
  "referenced_names",
155
133
  "basic_blocks",
156
134
  ];
157
- const validatePseudocodeBounds = (input) => {
158
- const pseudocode = z
159
- .object({
160
- text: z.string(),
161
- returned_chars: z.number().int().min(0),
162
- total_chars: z.number().int().min(0),
163
- })
164
- .parse(input);
165
- const text = requirePseudocode(pseudocode.text, "analyze_function");
166
- if (pseudocode.returned_chars !== [...text].length ||
167
- pseudocode.total_chars < pseudocode.returned_chars)
168
- throw new TypeError("analyze_function returned inconsistent pseudocode bounds");
169
- };
170
- const validateCollection = (input, field) => {
171
- const collection = collectionSchema.parse(input);
172
- if (collection.returned !== collection.items.length)
173
- throw new TypeError(`analyze_function returned an invalid ${field} result`);
174
- };
135
+ const list = (value, field) => z.array(z.unknown()).parse(value[field]);
175
136
  const validateBlocks = (items) => {
176
137
  for (const block of items)
177
138
  if (!Array.isArray(objectValue(block, "Invalid basic block").successors))
178
139
  throw new TypeError("analyze_function omitted CFG successor evidence");
179
140
  };
180
- const validateInstructionScan = (input) => {
181
- const scan = z
182
- .object({ scanned: z.number().int().min(0), truncated: z.boolean() })
183
- .parse(input);
184
- if (scan.scanned === 0 && !scan.truncated)
185
- throw new TypeError("analyze_function omitted instruction scan limitations");
186
- };
187
141
  const objectValue = (input, message) => {
188
142
  const parsed = z.record(z.string(), z.unknown()).safeParse(input);
189
143
  if (!parsed.success)
@@ -1,69 +1,23 @@
1
1
  import { z } from "zod";
2
- import { AnalysisCancelledError, AnalysisInputError, } from "../domain/errors.js";
2
+ import { AnalysisInputError } from "../domain/errors.js";
3
+ import { evaluateReconstructionClosure, reconstructionCoverageDataSchema, } from "../domain/reconstructionCoverage.js";
3
4
  import { jsonValueSchema } from "../domain/jsonValue.js";
4
- import { evaluateReconstructionClosure, reconstructionCoverageWorkspaceSchema, } from "../domain/reconstructionCoverage.js";
5
5
  import { err, ok } from "../domain/result.js";
6
- import { readReconstructionCoverageWorkspace, writeReconstructionCoverageWorkspace, } from "./ReconstructionCoverageWorkspaceStore.js";
7
- const COMMIT_OPERATION = "commit_reconstruction_coverage";
8
- const QUERY_OPERATION = "query_reconstruction_coverage";
9
- const isAborted = (signal) => signal?.aborted === true;
10
- export const reconstructionCoverageCommitInputSchema = z.strictObject({
11
- approved: z.literal(true),
12
- workspace_path: z.string().min(1).max(4_096),
13
- expected_revision: z.number().int().min(1).nullable(),
14
- workspace: reconstructionCoverageWorkspaceSchema,
6
+ export const reconstructionCoverageEvaluationInputSchema = z.strictObject({
7
+ coverage: reconstructionCoverageDataSchema,
8
+ boundary_id: z.string().min(1),
15
9
  });
16
- export const reconstructionCoverageQueryInputSchema = z.strictObject({
17
- workspace_path: z.string().min(1).max(4_096),
18
- boundary_id: z.string().min(1).max(200),
19
- });
20
- export const reconstructionCoverageCommitOutputSchema = z.strictObject({
21
- workspace_path: z.string(),
22
- bytes: z.number().int().min(0),
23
- workspace_id: z.string().regex(/^rcw_[a-f0-9]{64}$/u),
24
- revision: z.number().int().min(1),
25
- revision_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
26
- evidence_records: z.number().int().min(0),
27
- });
28
- /** Commit one caller-approved canonical reconstruction coverage CAS revision. */
29
- export const commitReconstructionCoverage = async (rawInput, policy, options = {}) => {
30
- const parsed = reconstructionCoverageCommitInputSchema.safeParse(rawInput);
31
- if (!parsed.success)
32
- return err(new AnalysisInputError(COMMIT_OPERATION, { cause: parsed.error }));
33
- if (isAborted(options.signal))
34
- return err(new AnalysisCancelledError(COMMIT_OPERATION));
35
- const written = await writeReconstructionCoverageWorkspace(parsed.data.workspace, parsed.data.workspace_path, parsed.data.expected_revision, policy);
36
- if (!written.ok)
37
- return written;
38
- return ok(jsonValueSchema.parse({
39
- workspace_path: written.value.path,
40
- bytes: written.value.bytes,
41
- workspace_id: parsed.data.workspace.workspace_id,
42
- revision: parsed.data.workspace.revision,
43
- revision_sha256: parsed.data.workspace.revision_sha256,
44
- evidence_records: parsed.data.workspace.evidence_bundle.records.length,
45
- }));
46
- };
47
- /** Read one coverage revision and evaluate a named fail-closed boundary. */
48
- export const queryReconstructionCoverage = async (rawInput, policy, nowEpochMs, options = {}) => {
49
- const parsed = reconstructionCoverageQueryInputSchema.safeParse(rawInput);
10
+ /** Evaluate inline reconstruction coverage against a named boundary. */
11
+ export const evaluateReconstructionCoverage = (rawInput, nowEpochMs = Date.now()) => {
12
+ const parsed = reconstructionCoverageEvaluationInputSchema.safeParse(rawInput);
50
13
  if (!parsed.success)
51
- return err(new AnalysisInputError(QUERY_OPERATION, { cause: parsed.error }));
52
- if (isAborted(options.signal))
53
- return err(new AnalysisCancelledError(QUERY_OPERATION));
54
- const loaded = await readReconstructionCoverageWorkspace(parsed.data.workspace_path, policy);
55
- if (!loaded.ok)
56
- return loaded;
57
- if (loaded.value === null)
58
- return err(new AnalysisInputError(QUERY_OPERATION, {
59
- cause: new TypeError("Reconstruction coverage workspace does not exist"),
14
+ return err(new AnalysisInputError("evaluate_reconstruction_coverage", {
15
+ cause: parsed.error,
60
16
  }));
61
- if (isAborted(options.signal))
62
- return err(new AnalysisCancelledError(QUERY_OPERATION));
63
17
  try {
64
- return ok(jsonValueSchema.parse(evaluateReconstructionClosure(loaded.value, parsed.data.boundary_id, nowEpochMs)));
18
+ return ok(jsonValueSchema.parse(evaluateReconstructionClosure(parsed.data.coverage, parsed.data.boundary_id, nowEpochMs)));
65
19
  }
66
20
  catch (cause) {
67
- return err(new AnalysisInputError(QUERY_OPERATION, { cause }));
21
+ return err(new AnalysisInputError("evaluate_reconstruction_coverage", { cause }));
68
22
  }
69
23
  };
@@ -42,7 +42,7 @@ export const proofAuthoritySatisfies = (actual, required) => {
42
42
  export const evidenceAuthoritySupportsProof = (evidence, authority, expected) => {
43
43
  if (evidence.confidence !== "observed" ||
44
44
  !proofEvidenceAuthorities[authority].includes(evidence.authority) ||
45
- evidence.predicate_type !== "rea.reconstruction-proof/v1" ||
45
+ evidence.predicate_type !== "rea.reconstruction-proof" ||
46
46
  evidence.operation !== "verify_reconstruction_obligations")
47
47
  return false;
48
48
  const result = evidence.normalized_result;
@@ -67,6 +67,6 @@ export const evidenceSupportsOriginalAuthority = (evidence, authority) => {
67
67
  return ["controlled-replay", "external-service"].includes(evidence.authority);
68
68
  if (authority === "process")
69
69
  return (evidence.operation === "capture_process_scenario" &&
70
- evidence.predicate_type === "rea.process-capture/v4");
70
+ evidence.predicate_type === "rea.process-capture");
71
71
  return evidence.authority === "external-service";
72
72
  };
@@ -73,7 +73,7 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
73
73
  };
74
74
  const deriveProcessCandidate = (evidence, candidates, limitations) => {
75
75
  if (evidence.operation !== "capture_process_scenario" ||
76
- evidence.predicate_type !== "rea.process-capture/v4")
76
+ evidence.predicate_type !== "rea.process-capture")
77
77
  return;
78
78
  try {
79
79
  const capture = parseProcessCapture(evidence.normalized_result);
@@ -146,7 +146,7 @@ const deriveProcessCandidate = (evidence, candidates, limitations) => {
146
146
  const generatedCandidate = ({ key, title, policy: candidatePolicy, artifactSha256, applicationNodeId, semanticNodeId, location, authorityReferences, }) => ({
147
147
  obligation_id: obligationId(key),
148
148
  obligation_version: 1,
149
- title: title.slice(0, 500),
149
+ title,
150
150
  origin: "generated",
151
151
  application_layer: candidatePolicy.applicationLayer,
152
152
  family: candidatePolicy.family,
@@ -218,7 +218,7 @@ const graphReference = (envelope, records, graphEvidence, location) => {
218
218
  };
219
219
  const reviewedEvidenceState = (evidence) => {
220
220
  if (evidence.operation === "capture_process_scenario" &&
221
- evidence.predicate_type === "rea.process-capture/v4" &&
221
+ evidence.predicate_type === "rea.process-capture" &&
222
222
  evidence.confidence === "observed")
223
223
  return "observed";
224
224
  if (evidence.authority === "external-service" &&
@@ -255,7 +255,7 @@ const sourceState = (references) => {
255
255
  return "unknown";
256
256
  };
257
257
  const uniqueBy = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => key(left).localeCompare(key(right)));
258
- const obligationId = (key) => `obl_${digest({ schema: "rea.reconstruction-obligation/v1", key })}`;
258
+ const obligationId = (key) => `obl_${digest({ schema: "ReconstructionObligation", key })}`;
259
259
  const digest = (value) => {
260
260
  const encoded = canonicalize(value);
261
261
  if (encoded === undefined)
@@ -4,12 +4,11 @@ import { evidenceAuthoritySupportsProof, evidenceSupportsOriginalAuthority, proo
4
4
  import { addObligationDiagnostic as addDiagnostic, contradictionDiagnostics, groupManifestBindings, groupManifestContradictions, hasObligationDiagnostic as hasDiagnostic, uniqueObligationDiagnostics as uniqueDiagnostics, } from "./ReconstructionObligationLedgerDiagnostics.js";
5
5
  import { originalCaseDiagnostics, originalCasesFor, } from "./ReconstructionObligationOriginalCases.js";
6
6
  import { digestObligationLedgerValue, obligationLedgerCoverage, obligationEdgeOrder, obligationLedgerEvidenceLinks, obligationLedgerStatus, obligationReports, summarizeObligations, } from "./ReconstructionObligationLedgerProjection.js";
7
- export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest, maxObligations, generationLimitations, }) => {
7
+ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest, generationLimitations, }) => {
8
8
  const bundle = parseEvidenceBundle(bundleInput);
9
9
  const allCandidates = [...candidatesInput].sort((left, right) => left.obligation_id.localeCompare(right.obligation_id));
10
10
  const orphanManifestIds = findOrphanManifestIds(allCandidates, manifest);
11
- const candidates = allCandidates.slice(0, maxObligations);
12
- const omittedCount = allCandidates.length - candidates.length;
11
+ const candidates = allCandidates;
13
12
  const context = createEvaluationContext(candidates, bundle, manifest);
14
13
  const obligations = applyDependencyDiagnostics(candidates.map((candidate) => evaluateObligation(candidate, context)), context);
15
14
  const ownershipGraph = obligations
@@ -30,8 +29,8 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
30
29
  })))
31
30
  .sort(obligationEdgeOrder);
32
31
  const evidenceLinks = obligationLedgerEvidenceLinks(obligations, manifest);
33
- const limitations = ledgerLimitations(generationLimitations, allCandidates.length, omittedCount, orphanManifestIds);
34
- const coverage = obligationLedgerCoverage(omittedCount, maxObligations, limitations.length > 0);
32
+ const limitations = ledgerLimitations(generationLimitations, allCandidates.length, orphanManifestIds);
33
+ const coverage = obligationLedgerCoverage(limitations.length > 0);
35
34
  const semantic = {
36
35
  coverage,
37
36
  summary: summarizeObligations(obligations),
@@ -42,22 +41,21 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
42
41
  evidence_links: evidenceLinks,
43
42
  limitations,
44
43
  };
45
- const evaluatedStatus = obligationLedgerStatus(obligations, omittedCount);
44
+ const evaluatedStatus = obligationLedgerStatus(obligations);
46
45
  const status = evaluatedStatus === "failed"
47
46
  ? evaluatedStatus
48
47
  : limitations.length > 0
49
48
  ? "unknown"
50
49
  : evaluatedStatus;
51
50
  const closureDigest = digestObligationLedgerValue({
52
- schema: "rea.reconstruction-obligation-closure/v1",
51
+ schema: "ReconstructionObligationClosure",
53
52
  status,
54
53
  ...semantic,
55
54
  });
56
55
  return reconstructionObligationLedgerSchema.parse({
57
56
  schema: "ReconstructionObligationLedger",
58
- schema_version: 1,
59
57
  ledger_id: `rol_${digestObligationLedgerValue({
60
- schema: "rea.reconstruction-obligation-ledger/v1",
58
+ schema: "ReconstructionObligationLedger",
61
59
  evidence_ids: bundle.records.map(({ evidence_id: id }) => id),
62
60
  obligation_ids: obligations.map(({ obligation_id: id }) => id),
63
61
  closure_digest: closureDigest,
@@ -82,7 +80,7 @@ const findOrphanManifestIds = (candidates, manifest) => {
82
80
  ].filter((obligationId) => !candidateIds.has(obligationId))),
83
81
  ].sort();
84
82
  };
85
- const ledgerLimitations = (generationLimitations, candidateCount, omittedCount, orphanManifestIds) => [
83
+ const ledgerLimitations = (generationLimitations, candidateCount, orphanManifestIds) => [
86
84
  ...new Set([
87
85
  ...generationLimitations,
88
86
  ...(candidateCount === 0
@@ -90,11 +88,6 @@ const ledgerLimitations = (generationLimitations, candidateCount, omittedCount,
90
88
  "No reconstruction obligations were derived; closure cannot be claimed.",
91
89
  ]
92
90
  : []),
93
- ...(omittedCount > 0
94
- ? [
95
- `${String(omittedCount)} obligation candidates were omitted by max_obligations; closure is unknown.`,
96
- ]
97
- : []),
98
91
  ...(orphanManifestIds.length > 0
99
92
  ? [
100
93
  `Manifest entries reference unknown obligations: ${orphanManifestIds.join(", ")}.`,
@@ -1,10 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
- export const obligationLedgerCoverage = (omittedCount, maxObligations, incomplete) => ({
3
+ export const obligationLedgerCoverage = (incomplete) => ({
4
4
  status: incomplete ? "partial" : "complete",
5
- truncated: omittedCount > 0,
6
- omitted_count: omittedCount,
7
- max_obligations: maxObligations,
8
5
  });
9
6
  export const summarizeObligations = (obligations) => ({
10
7
  total: obligations.length,
@@ -56,15 +53,14 @@ export const obligationLedgerEvidenceLinks = (obligations, manifest) => [
56
53
  ...manifest.contradictions.flatMap(({ evidence_ids: ids }) => ids),
57
54
  ]),
58
55
  ].sort();
59
- export const obligationLedgerStatus = (obligations, omittedCount) => {
56
+ export const obligationLedgerStatus = (obligations) => {
60
57
  if (obligations.length === 0)
61
58
  return "unknown";
62
59
  const requiredOpen = obligations.filter(({ required, status }) => required && status !== "verified");
63
60
  if (requiredOpen.some(({ status, diagnostics }) => status === "contradicted" ||
64
61
  hasDiagnostic(diagnostics, "verifier-failed")))
65
62
  return "failed";
66
- if (omittedCount > 0 ||
67
- requiredOpen.some(({ status }) => status === "unknown"))
63
+ if (requiredOpen.some(({ status }) => status === "unknown"))
68
64
  return "unknown";
69
65
  return requiredOpen.length === 0 ? "ready" : "open";
70
66
  };