rea-agents 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +103 -38
  2. package/bridge/ghidra/ReaGhidraBridge.java +96 -11
  3. package/dist/application/AndroidApplicationService.js +17 -0
  4. package/dist/application/AppleApplicationService.js +17 -0
  5. package/dist/application/ArtifactExtraction.js +1 -1
  6. package/dist/application/ArtifactInventory/classify.js +42 -0
  7. package/dist/application/ArtifactInventory/hash.js +43 -0
  8. package/dist/application/ArtifactInventory/reader.js +41 -0
  9. package/dist/application/ArtifactInventory/scanCanonical.js +155 -0
  10. package/dist/application/ArtifactInventory/scanReader.js +124 -0
  11. package/dist/application/ArtifactInventory/types.js +10 -0
  12. package/dist/application/ArtifactInventory.js +9 -351
  13. package/dist/application/AuthorizedArtifactInventory.js +2 -2
  14. package/dist/application/BinarySession.js +47 -270
  15. package/dist/application/BinarySessionExecution.js +28 -0
  16. package/dist/application/BinarySessionOpen.js +39 -0
  17. package/dist/application/BinarySessionRecords.js +149 -0
  18. package/dist/application/BinarySessionStatus.js +75 -0
  19. package/dist/application/CapabilityInventory.js +24 -2
  20. package/dist/application/ClientRegistrationStatus.js +11 -4
  21. package/dist/application/CrossVersionInventory.js +8 -2
  22. package/dist/application/CrossVersionInvestigation.js +1 -23
  23. package/dist/application/CrossVersionInvestigationCollections.js +23 -0
  24. package/dist/application/DirectAnalysis.js +47 -44
  25. package/dist/application/Doctor.js +156 -238
  26. package/dist/application/DoctorDiagnostics.js +180 -0
  27. package/dist/application/ElectronBoundaryAnalysis.js +23 -7
  28. package/dist/application/ElectronBoundaryGraphWindows.js +32 -8
  29. package/dist/application/EnhancedToolPagination.js +22 -0
  30. package/dist/application/EnhancedToolTypes.js +4 -0
  31. package/dist/application/EnhancedTools.js +20 -37
  32. package/dist/application/InstrumentedJavaScriptReplayHost.js +36 -0
  33. package/dist/application/InventoryProjectionEvidence.js +41 -0
  34. package/dist/application/InvestigationProviders.js +12 -0
  35. package/dist/application/InvestigationWorkspaceStore.js +24 -10
  36. package/dist/application/JavaScriptArtifactAnalysis.js +45 -6
  37. package/dist/application/JavaScriptArtifactFiles.js +6 -2
  38. package/dist/application/JavaScriptArtifactGraphBuilder.js +23 -1
  39. package/dist/application/JavaScriptArtifactGraphBundlers.js +225 -0
  40. package/dist/application/JavaScriptArtifactGraphContext.js +37 -36
  41. package/dist/application/JavaScriptArtifactGraphDocuments.js +27 -4
  42. package/dist/application/JavaScriptArtifactGraphFindings.js +54 -8
  43. package/dist/application/JavaScriptArtifactGraphStructure.js +29 -101
  44. package/dist/application/JavaScriptArtifactPathResolution.js +269 -0
  45. package/dist/application/JavaScriptArtifactReconstruction.js +1 -1
  46. package/dist/application/JavaScriptJsonModules.js +39 -0
  47. package/dist/application/JavaScriptModuleRelationships.js +262 -0
  48. package/dist/application/JavaScriptReplayPermission.js +16 -0
  49. package/dist/application/JavaScriptReplayService.js +182 -156
  50. package/dist/application/LinuxHopper.js +10 -0
  51. package/dist/application/MacHopper.js +22 -11
  52. package/dist/application/NodeRuntimeCharacterizationService.js +196 -0
  53. package/dist/application/PermissionAuthority.js +106 -63
  54. package/dist/application/ProcessCaptureCapability.js +1 -1
  55. package/dist/application/ProcessCapturePermission.js +13 -0
  56. package/dist/application/ProcessCli.js +2 -12
  57. package/dist/application/ProcessHarness.js +1 -1
  58. package/dist/application/ProcessPairedExperiment.js +72 -0
  59. package/dist/application/ProjectPermissionStore.js +48 -9
  60. package/dist/application/RealHopperAssertions.js +76 -0
  61. package/dist/application/ReconstructionCoverageService.js +69 -0
  62. package/dist/application/ReconstructionCoverageWorkspaceStore.js +31 -0
  63. package/dist/application/RuntimeExecutableDiagnostics.js +172 -0
  64. package/dist/application/Setup.js +148 -260
  65. package/dist/application/SetupClientConfiguration.js +224 -0
  66. package/dist/application/SetupClients.js +24 -2
  67. package/dist/application/SetupPlan.js +124 -12
  68. package/dist/application/SetupSkill.js +54 -36
  69. package/dist/application/SupportedClients.js +1 -0
  70. package/dist/application/Uninstall.js +12 -3
  71. package/dist/application/Upgrade.js +16 -1
  72. package/dist/application/WindowsCapabilities.js +86 -0
  73. package/dist/artifacts/AsarArtifactReader.js +11 -0
  74. package/dist/browser/BrowserProcessStartup.js +88 -0
  75. package/dist/browser/CdpCaptureDocuments.js +12 -8
  76. package/dist/browser/CdpCaptureEventBodyShapes.js +75 -0
  77. package/dist/browser/CdpCaptureEventHandlers.js +336 -0
  78. package/dist/browser/CdpCaptureEventHelpers.js +71 -0
  79. package/dist/browser/CdpCaptureEventState.js +1 -0
  80. package/dist/browser/CdpCaptureEventTypes.js +1 -0
  81. package/dist/browser/CdpCaptureEvents.js +29 -496
  82. package/dist/browser/CdpObservationSession.js +51 -8
  83. package/dist/browser/CdpPageCapture.js +12 -133
  84. package/dist/browser/CdpPageCaptureScripts.js +97 -0
  85. package/dist/browser/CdpPageCaptureWorkers.js +46 -0
  86. package/dist/browser/CdpWebMcpDiscovery.js +38 -14
  87. package/dist/browser/PngVisualDiff.js +9 -2
  88. package/dist/catalogIdentity.js +4 -0
  89. package/dist/cli/artifactCommands.js +82 -0
  90. package/dist/cli/coreAnalysisCommands.js +232 -0
  91. package/dist/cli/managedCommands.js +397 -0
  92. package/dist/cli/managedProjectGraphCommand.js +24 -0
  93. package/dist/cli/options.js +9 -0
  94. package/dist/cli/setupCommands.js +113 -0
  95. package/dist/cli/types.js +1 -0
  96. package/dist/cli/utilityCommands.js +122 -0
  97. package/dist/cli.js +10 -768
  98. package/dist/cliApplicationCommands.js +118 -4
  99. package/dist/cliBrowserAdvancedCommands.js +73 -16
  100. package/dist/cliBrowserCommands.js +39 -115
  101. package/dist/cliCommandNames.js +4 -0
  102. package/dist/cliElectronCommands.js +33 -62
  103. package/dist/cliEvidenceCommands.js +13 -2
  104. package/dist/cliInvestigationCommands.js +53 -10
  105. package/dist/cliObservationOptions.js +137 -0
  106. package/dist/cliPolicyCommands.js +80 -46
  107. package/dist/cliSetup.js +306 -0
  108. package/dist/config/environment.js +107 -0
  109. package/dist/config/parseConfig.js +228 -0
  110. package/dist/config/parsers.js +68 -0
  111. package/dist/config/permissions.js +30 -0
  112. package/dist/config/types.js +1 -0
  113. package/dist/config.js +1 -375
  114. package/dist/contracts/applicationToolContracts.js +134 -0
  115. package/dist/contracts/electronToolContracts.js +51 -3
  116. package/dist/contracts/managedToolContracts.js +8 -3
  117. package/dist/contracts/managedWorkflowToolContracts.js +3 -3
  118. package/dist/contracts/providerSelection.js +2 -0
  119. package/dist/contracts/sessionStatusContract.js +26 -0
  120. package/dist/contracts/toolContractTypes.js +12 -1
  121. package/dist/contracts/toolContracts.js +5 -12
  122. package/dist/contracts/toolEffects.js +14 -0
  123. package/dist/contracts/toolOutputSchemaGroups.js +274 -0
  124. package/dist/contracts/toolOutputSchemaPrimitives.js +328 -0
  125. package/dist/contracts/toolOutputSchemas.js +2 -550
  126. package/dist/domain/analysisErrorPresentation.js +234 -0
  127. package/dist/domain/analysisErrorProjection.js +284 -0
  128. package/dist/domain/androidApplication.js +206 -0
  129. package/dist/domain/appleApplication.js +221 -0
  130. package/dist/domain/artifactComparison.js +34 -15
  131. package/dist/domain/binaryTarget.js +87 -37
  132. package/dist/domain/boundedCartesianProjection.js +15 -0
  133. package/dist/domain/browserObservation.js +1 -285
  134. package/dist/domain/browserObservationSchemas.js +286 -0
  135. package/dist/domain/electronStaticAnalysisBrowser.js +14 -2
  136. package/dist/domain/errors.js +4 -486
  137. package/dist/domain/functionComparison.js +4 -165
  138. package/dist/domain/functionComparisonDimensions.js +164 -0
  139. package/dist/domain/javascriptApplicationVersionItems.js +18 -6
  140. package/dist/domain/javascriptApplicationVersionKeys.js +8 -8
  141. package/dist/domain/javascriptExportInstrumentation.js +97 -0
  142. package/dist/domain/javascriptFeatureTraversal.js +19 -7
  143. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -1
  144. package/dist/domain/javascriptSemanticAnalysis.js +386 -0
  145. package/dist/domain/javascriptSemanticIr.js +30 -0
  146. package/dist/domain/javascriptSemanticProjection.js +366 -0
  147. package/dist/domain/javascriptSemanticState.js +40 -0
  148. package/dist/domain/javascriptSemanticTraversal.js +22 -0
  149. package/dist/domain/javascriptSemanticValues.js +352 -0
  150. package/dist/domain/javascriptStaticAnalysis.js +5 -221
  151. package/dist/domain/javascriptStaticAnalysisBundler.js +209 -0
  152. package/dist/domain/javascriptStaticAnalysisCalls.js +180 -0
  153. package/dist/domain/javascriptStaticAnalysisHelpers.js +71 -2
  154. package/dist/domain/knownPageCoverage.js +21 -0
  155. package/dist/domain/managedApplicationGraph.js +14 -364
  156. package/dist/domain/managedApplicationGraphCoverage.js +170 -0
  157. package/dist/domain/managedApplicationGraphNodeCoverage.js +6 -0
  158. package/dist/domain/managedApplicationGraphNodes.js +336 -0
  159. package/dist/domain/managedArtifact.js +16 -8
  160. package/dist/domain/managedMemberComparison.js +37 -391
  161. package/dist/domain/managedMemberComparisonCoverage.js +72 -0
  162. package/dist/domain/managedMemberComparisonMatch.js +356 -0
  163. package/dist/domain/managedNativeVerification.js +27 -389
  164. package/dist/domain/managedNativeVerificationMatch.js +272 -0
  165. package/dist/domain/managedNativeVerificationSchemas.js +141 -0
  166. package/dist/domain/managedReconstruction.js +82 -69
  167. package/dist/domain/managedRuntimeCorrelation.js +12 -3
  168. package/dist/domain/nodeRuntimeCharacterization.js +66 -0
  169. package/dist/domain/permissionPolicy.js +2 -0
  170. package/dist/domain/processComparison.js +19 -0
  171. package/dist/domain/processPairedExperiment.js +128 -0
  172. package/dist/domain/reconstructionCoverage.js +387 -0
  173. package/dist/domain/reconstructionCoverageEvaluation.js +212 -0
  174. package/dist/domain/reconstructionVerificationSchemas.js +8 -0
  175. package/dist/domain/replayMachine.js +316 -0
  176. package/dist/domain/replayMachineRuntime.js +215 -0
  177. package/dist/domain/runtimeCharacterization.js +85 -0
  178. package/dist/domain/runtimeIdentification.js +210 -0
  179. package/dist/domain/webBundleAnalyzer.js +3 -409
  180. package/dist/domain/webBundleAnalyzerAst.js +77 -0
  181. package/dist/domain/webBundleAnalyzerInspection.js +307 -0
  182. package/dist/domain/webBundleAnalyzerResult.js +120 -0
  183. package/dist/dotnet/ManagedArtifactInspector.js +50 -29
  184. package/dist/dotnet/ManagedMemberInspector.js +51 -785
  185. package/dist/dotnet/ManagedMemberInspectorCore.js +297 -0
  186. package/dist/dotnet/ManagedMemberInstructionDecoder.js +427 -0
  187. package/dist/dotnet/ManagedMemberRows.js +120 -0
  188. package/dist/dotnet/ManagedMetadataInventory.js +42 -306
  189. package/dist/dotnet/ManagedMetadataInventoryRows.js +292 -0
  190. package/dist/dotnet/ManagedMetadataLayout.js +48 -111
  191. package/dist/dotnet/ManagedMetadataRowSizes.js +54 -0
  192. package/dist/dotnet/ManagedMethodBodyReader.js +143 -0
  193. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +311 -0
  194. package/dist/dotnet/ManagedNativeBoundaryInspector.js +102 -350
  195. package/dist/dotnet/ManagedPeReader.js +59 -28
  196. package/dist/evaluation/CodexAgentEval.js +132 -0
  197. package/dist/generatedPackageMetadata.js +2 -2
  198. package/dist/ghidra/GhidraClient.js +76 -91
  199. package/dist/ghidra/GhidraClientStartup.js +29 -0
  200. package/dist/ghidra/GhidraClientWire.js +34 -0
  201. package/dist/ghidra/GhidraDefaults.js +1 -1
  202. package/dist/ghidra/GhidraDiagnostics.js +6 -1
  203. package/dist/ghidra/GhidraInstallation.js +20 -15
  204. package/dist/ghidra/GhidraLauncher.js +93 -29
  205. package/dist/ghidra/GhidraProvider.js +61 -161
  206. package/dist/ghidra/GhidraProviderCapabilities.js +173 -0
  207. package/dist/ghidra/GhidraSessionValues.js +2 -0
  208. package/dist/ghidra/GhidraSocketConnection.js +44 -7
  209. package/dist/ghidra/GhidraTargetSnapshot.js +30 -0
  210. package/dist/ghidra/GhidraTransport.js +71 -0
  211. package/dist/identity.js +4 -2
  212. package/dist/main/messages.js +5 -0
  213. package/dist/main/reload.js +49 -0
  214. package/dist/main/shutdown.js +25 -0
  215. package/dist/main/startup.js +14 -0
  216. package/dist/main/state.js +26 -0
  217. package/dist/main/transport.js +61 -0
  218. package/dist/main/types.js +1 -0
  219. package/dist/main.js +35 -146
  220. package/dist/process/PrivateRuntimeRoot.js +3 -2
  221. package/dist/process/ProcessOwnership.js +35 -0
  222. package/dist/process/ProviderProcess.js +2 -0
  223. package/dist/replay/JavaScriptReplayWorker.js +64 -50
  224. package/dist/replay/LinuxJavaScriptReplayRunner.js +173 -390
  225. package/dist/replay/LinuxJavaScriptReplaySandbox.js +140 -0
  226. package/dist/replay/ReplayOutcome.js +95 -0
  227. package/dist/replay/ReplayProcessLifecycle.js +71 -0
  228. package/dist/server/ProcessCaptureElicitation.js +157 -0
  229. package/dist/server/createServer.js +124 -56
  230. package/dist/server/javascriptApplicationResult.js +85 -0
  231. package/dist/server/registerApplicationTools/characterization.js +57 -0
  232. package/dist/server/registerApplicationTools/compareVersions.js +34 -0
  233. package/dist/server/registerApplicationTools/controlledReplay.js +38 -0
  234. package/dist/server/registerApplicationTools/coverage.js +84 -0
  235. package/dist/server/registerApplicationTools/helpers.js +42 -0
  236. package/dist/server/registerApplicationTools/traceFeature.js +26 -0
  237. package/dist/server/registerApplicationTools/types.js +1 -0
  238. package/dist/server/registerApplicationTools.js +10 -112
  239. package/dist/server/registerBrowserTools.js +59 -83
  240. package/dist/server/registerElectronTools.js +48 -49
  241. package/dist/server/registerEnhancedTools.js +34 -42
  242. package/dist/server/registerEvidenceResources.js +56 -0
  243. package/dist/server/registerInvestigationTools/helpers.js +74 -0
  244. package/dist/server/registerInvestigationTools/types.js +1 -0
  245. package/dist/server/registerInvestigationTools.js +83 -116
  246. package/dist/server/registerJavaScriptApplicationGraphResource.js +69 -0
  247. package/dist/server/registerManagedTools.js +18 -1
  248. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +65 -0
  249. package/dist/server/registerManagedWorkflowTools/contract.js +8 -0
  250. package/dist/server/registerManagedWorkflowTools/evidence.js +43 -0
  251. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +39 -0
  252. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +39 -0
  253. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +52 -0
  254. package/dist/server/registerManagedWorkflowTools/types.js +1 -0
  255. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +75 -0
  256. package/dist/server/registerManagedWorkflowTools.js +10 -274
  257. package/dist/server/registerOfficialTools.js +73 -59
  258. package/dist/server/registerSessionRecordTools.js +137 -0
  259. package/dist/server/registerSessionStatusTool.js +97 -26
  260. package/dist/server/registerSessionTools.js +60 -164
  261. package/dist/server/sessionAvailabilityPolicy.js +10 -0
  262. package/dist/server/toolRegistrationOptions.js +101 -3
  263. package/dist/server/toolResult.js +15 -4
  264. package/package.json +11 -11
  265. package/skills/reverse-engineer-anything/SKILL.md +76 -0
  266. package/skills/reverse-engineer-anything/references/controlled-replay.md +12 -0
  267. package/skills/reverse-engineer-anything/references/evidence-workflows.md +33 -0
  268. package/skills/reverse-engineer-anything/references/javascript-applications.md +25 -0
  269. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +36 -0
  270. package/skills/reverse-engineer-anything/references/runtime-observation.md +24 -0
  271. package/scripts/prepare-node-pty.mjs +0 -35
  272. package/scripts/rebuild-native.mjs +0 -22
  273. package/skills/rea-analysis/SKILL.md +0 -222
@@ -0,0 +1,234 @@
1
+ import { AnalysisInputError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, ConfigurationError, EvidenceFileError, EvidenceIntegrityError, EvidenceLimitError, HopperRemoteError, InvestigationWorkspaceError, NoBinaryOpenError, PermissionRequiredError, ProviderSelectionError, ReplayPlanStaleError, UnknownRegistryError, } from "./errors.js";
2
+ export const analysisErrorRemediationAction = (error) => {
3
+ if (error instanceof AnalysisInputError)
4
+ return "Correct the listed arguments and retry.";
5
+ if (error instanceof ReplayPlanStaleError)
6
+ return "Review the rebuilt replay plan and explicitly approve its new digest.";
7
+ if (error instanceof PermissionRequiredError)
8
+ return error.elicitationSupported
9
+ ? "Approve the exact missing scope, then retry the operation."
10
+ : "Add the exact missing scope beneath the administrator ceiling, then retry.";
11
+ return analysisErrorUserMessage(error);
12
+ };
13
+ export const analysisErrorCategory = (error) => {
14
+ if (error instanceof ReplayPlanStaleError)
15
+ return "integrity_mismatch";
16
+ if (error instanceof PermissionRequiredError)
17
+ return "permission_required";
18
+ if (error instanceof ProviderSelectionError &&
19
+ error.reason === "provider_unavailable")
20
+ return "unavailable";
21
+ if (error._tag === "ProcessCaptureError")
22
+ return error.userCategory ?? "execution_failure";
23
+ if (error instanceof BrowserObservationError)
24
+ return browserErrorCategory(error.reason);
25
+ if (error instanceof HopperRemoteError &&
26
+ error.diagnosticType === "authorization")
27
+ return "permission_required";
28
+ if (error instanceof ArtifactOperationError)
29
+ return artifactErrorCategory(error.reason);
30
+ if (error instanceof EvidenceFileError && error.reason === "disabled")
31
+ return "unavailable";
32
+ if (error instanceof InvestigationWorkspaceError)
33
+ return investigationWorkspaceCategory(error.reason);
34
+ return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
35
+ };
36
+ const browserErrorCategory = (reason) => {
37
+ if (reason === "payload_limit")
38
+ return "truncated";
39
+ if (reason === "target_not_found" ||
40
+ reason === "target_not_allowed" ||
41
+ reason === "target_changed" ||
42
+ reason === "endpoint_unreachable" ||
43
+ reason === "disconnected")
44
+ return "unavailable";
45
+ return "execution_failure";
46
+ };
47
+ const investigationWorkspaceCategory = (reason) => {
48
+ if (reason === "disabled" ||
49
+ reason === "outside-root" ||
50
+ reason === "not-file")
51
+ return "unavailable";
52
+ if (reason === "too-large")
53
+ return "truncated";
54
+ if (reason === "invalid-json" || reason === "integrity")
55
+ return "integrity_mismatch";
56
+ return "execution_failure";
57
+ };
58
+ const artifactErrorCategory = (reason) => {
59
+ if (reason === "integrity")
60
+ return "integrity_mismatch";
61
+ if (reason === "limit")
62
+ return "truncated";
63
+ if (reason === "cancelled")
64
+ return "cancelled";
65
+ if (reason === "unavailable")
66
+ return "unavailable";
67
+ return "execution_failure";
68
+ };
69
+ const STATIC_ERROR_CATEGORIES = {
70
+ AnalysisInputError: "invalid_input",
71
+ AnalysisCapabilityUnavailableError: "unsupported_provider",
72
+ ProviderSelectionError: "unsupported_provider",
73
+ EvidenceIntegrityError: "integrity_mismatch",
74
+ EvidenceLimitError: "truncated",
75
+ AnalysisCancelledError: "cancelled",
76
+ HopperCancelledError: "cancelled",
77
+ AnalysisTimeoutError: "timeout",
78
+ HopperTimeoutError: "timeout",
79
+ NoBinaryOpenError: "unavailable",
80
+ BinaryTargetError: "unavailable",
81
+ };
82
+ export const analysisErrorUserMessage = (error) => {
83
+ if (error instanceof ReplayPlanStaleError)
84
+ return "The controlled replay plan changed before execution. Refresh the current state and try again.";
85
+ if (error instanceof PermissionRequiredError)
86
+ return "This operation needs additional local permission. Review the requested scope and remediation.";
87
+ if (error instanceof AnalysisInputError)
88
+ return "Analysis input is invalid. Check the arguments and try again.";
89
+ if (error.userMessage !== undefined)
90
+ return error.userMessage;
91
+ const standardMessage = standardErrorMessage(error._tag);
92
+ if (standardMessage !== undefined)
93
+ return standardMessage;
94
+ if (error instanceof ArtifactOperationError)
95
+ return artifactMessage(error.reason);
96
+ if (error instanceof EvidenceIntegrityError)
97
+ return "Evidence is invalid or has changed. Recreate or re-import it, then try again.";
98
+ if (error instanceof EvidenceLimitError)
99
+ return "Evidence is too large for this session. Reduce the evidence set and try again.";
100
+ if (error instanceof EvidenceFileError)
101
+ return evidenceFileMessage(error.reason);
102
+ if (error instanceof InvestigationWorkspaceError)
103
+ return investigationWorkspaceMessage(error.reason);
104
+ if (error instanceof UnknownRegistryError)
105
+ return "Evidence state changed before the update completed. Refresh the current state and try again.";
106
+ if (error instanceof ConfigurationError)
107
+ return "REA configuration is invalid. Run `rea doctor` and fix the reported setting.";
108
+ if (error instanceof NoBinaryOpenError)
109
+ return error.message;
110
+ if (error instanceof BinaryTargetError)
111
+ return "REA could not open that app or binary. Check that the path exists, is readable, and points to a supported file.";
112
+ if (error._tag === "ProcessCaptureError")
113
+ return (error.userMessage ??
114
+ "Process capture could not complete. Run `rea doctor`, then review capture policy and try again.");
115
+ return "Analysis could not complete. Run `rea doctor`, then try again.";
116
+ };
117
+ const standardErrorMessage = (tag) => {
118
+ if (UNREADABLE_OUTPUT_TAGS.has(tag))
119
+ return "Analysis returned an unreadable result. Retry once; if it continues, run `rea doctor`.";
120
+ if (UNSUPPORTED_PROVIDER_TAGS.has(tag))
121
+ return "This analysis is unavailable for the current target. Choose another analysis or target.";
122
+ if (CANCELLED_TAGS.has(tag))
123
+ return "Analysis was cancelled. Start it again when ready.";
124
+ if (TIMEOUT_TAGS.has(tag))
125
+ return "Analysis took too long. Try a smaller request, then run `rea doctor` if it continues.";
126
+ if (ADAPTER_FAILURE_TAGS.has(tag))
127
+ return "Analysis could not complete. Retry once; if it continues, run `rea doctor`.";
128
+ if (START_FAILURE_TAGS.has(tag))
129
+ return "Analysis could not start or stopped unexpectedly. Run `rea doctor`, then try again.";
130
+ return undefined;
131
+ };
132
+ const UNREADABLE_OUTPUT_TAGS = new Set([
133
+ "AnalysisProtocolError",
134
+ "AnalysisOutputError",
135
+ "HopperProtocolError",
136
+ ]);
137
+ const UNSUPPORTED_PROVIDER_TAGS = new Set([
138
+ "AnalysisCapabilityUnavailableError",
139
+ "ProviderSelectionError",
140
+ ]);
141
+ const CANCELLED_TAGS = new Set([
142
+ "AnalysisCancelledError",
143
+ "HopperCancelledError",
144
+ ]);
145
+ const TIMEOUT_TAGS = new Set([
146
+ "AnalysisTimeoutError",
147
+ "HopperTimeoutError",
148
+ ]);
149
+ const ADAPTER_FAILURE_TAGS = new Set([
150
+ "ProviderAdapterError",
151
+ "HopperRemoteError",
152
+ ]);
153
+ const START_FAILURE_TAGS = new Set([
154
+ "HopperProcessError",
155
+ "HopperStartError",
156
+ ]);
157
+ const artifactMessage = (reason) => {
158
+ if (reason === "cancelled")
159
+ return "Artifact operation was cancelled. Start it again when ready.";
160
+ if (reason === "limit")
161
+ return "Artifact is too large to process safely. Narrow the requested path or use a smaller artifact.";
162
+ if (reason === "path")
163
+ return "Artifact path is not allowed. Choose a path inside the artifact and try again.";
164
+ if (reason === "unavailable")
165
+ return "Artifact format is not available on this system. Choose another artifact or supported environment.";
166
+ if (reason === "format" || reason === "integrity")
167
+ return "Artifact is invalid or has changed. Get a fresh copy and try again.";
168
+ return "Artifact could not be read or written. Check file access and try again.";
169
+ };
170
+ const evidenceFileMessage = (reason) => {
171
+ if (reason === "disabled")
172
+ return "Evidence file access is disabled. Enable an evidence directory or use inline evidence.";
173
+ if (reason === "outside-root")
174
+ return "Evidence path is outside the allowed directory. Choose a path inside the configured evidence directory.";
175
+ if (reason === "not-file")
176
+ return "Evidence path does not point to a file. Choose an evidence file and try again.";
177
+ if (reason === "too-large")
178
+ return "Evidence file is too large. Reduce its size and try again.";
179
+ if (reason === "exists")
180
+ return "Evidence file already exists. Choose another path or allow overwrite.";
181
+ if (reason === "invalid-json")
182
+ return "Evidence file is not valid JSON. Repair or recreate the file and try again.";
183
+ return "Evidence file could not be accessed. Check file permissions and try again.";
184
+ };
185
+ const investigationWorkspaceMessage = (reason) => {
186
+ if (reason === "disabled")
187
+ return "Investigation workspace access is disabled. Configure a workspace directory and try again.";
188
+ if (reason === "outside-root")
189
+ return "Investigation workspace is outside the allowed directory. Choose a configured workspace directory and try again.";
190
+ if (reason === "not-file")
191
+ return "Investigation workspace path is not a file. Choose a workspace file and try again.";
192
+ if (reason === "too-large")
193
+ return "Investigation workspace is too large. Reduce its size and try again.";
194
+ if (reason === "invalid-json" || reason === "integrity")
195
+ return "Investigation workspace is invalid or has changed. Recreate or repair it, then try again.";
196
+ if (reason === "locked")
197
+ return "Another investigation update is in progress. Try again when it finishes.";
198
+ if (reason === "revision-conflict" || reason === "name-conflict")
199
+ return "Investigation workspace state changed. Refresh the current state and try again.";
200
+ return "Investigation workspace could not be accessed. Check file permissions and try again.";
201
+ };
202
+ const KNOWN_ERROR_TAGS = {
203
+ AnalysisProtocolError: true,
204
+ AnalysisInputError: true,
205
+ AnalysisOutputError: true,
206
+ AnalysisCapabilityUnavailableError: true,
207
+ AnalysisCancelledError: true,
208
+ AnalysisTimeoutError: true,
209
+ ProviderSelectionError: true,
210
+ ProviderAdapterError: true,
211
+ BrowserObservationError: true,
212
+ ArtifactOperationError: true,
213
+ ProcessCaptureError: true,
214
+ EvidenceIntegrityError: true,
215
+ EvidenceLimitError: true,
216
+ EvidenceFileError: true,
217
+ InvestigationWorkspaceError: true,
218
+ UnknownRegistryError: true,
219
+ HopperTimeoutError: true,
220
+ HopperCancelledError: true,
221
+ HopperProtocolError: true,
222
+ HopperRemoteError: true,
223
+ HopperProcessError: true,
224
+ HopperStartError: true,
225
+ ConfigurationError: true,
226
+ NoBinaryOpenError: true,
227
+ BinaryTargetError: true,
228
+ PermissionRequiredError: true,
229
+ ReplayPlanStaleError: true,
230
+ };
231
+ export const assertKnownAnalysisErrorTag = (tag) => {
232
+ if (KNOWN_ERROR_TAGS[tag] !== true)
233
+ throw new TypeError("Unknown analysis error tag");
234
+ };
@@ -0,0 +1,284 @@
1
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisTimeoutError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, EvidenceFileError, EvidenceLimitError, EvidenceReferenceError, HopperCancelledError, HopperProcessError, HopperRemoteError, HopperTimeoutError, InvestigationWorkspaceError, PermissionRequiredError, ProviderAdapterError, ProviderSelectionError, ReplayPlanStaleError, UnknownRegistryError, } from "./errors.js";
2
+ import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
3
+ /** Project expected failures into exhaustive, secret-safe caller fields. */
4
+ export const projectAnalysisError = (error) => {
5
+ assertKnownAnalysisErrorTag(error._tag);
6
+ const code = errorCode(error);
7
+ const details = errorDetails(error);
8
+ return {
9
+ code,
10
+ category: analysisErrorCategory(error),
11
+ message: analysisErrorUserMessage(error),
12
+ retryable: RETRYABLE_CODES.has(code),
13
+ remediation: {
14
+ action: analysisErrorRemediationAction(error),
15
+ restart_required: error instanceof PermissionRequiredError && error.restartRequired,
16
+ ...(error instanceof PermissionRequiredError
17
+ ? { elicitation_supported: error.elicitationSupported }
18
+ : {}),
19
+ },
20
+ ...(details === undefined ? {} : { details }),
21
+ };
22
+ };
23
+ const errorCode = (error) => {
24
+ if (error instanceof ReplayPlanStaleError)
25
+ return "plan_stale";
26
+ if (error instanceof PermissionRequiredError)
27
+ return "permission_required";
28
+ if (error instanceof ProviderSelectionError)
29
+ return error.reason === "provider_unavailable"
30
+ ? "provider_unavailable"
31
+ : "capability_unavailable";
32
+ if (error instanceof BrowserObservationError)
33
+ return browserErrorCode(error.reason);
34
+ if (error instanceof ArtifactOperationError)
35
+ return artifactOperationCode(error);
36
+ if (error instanceof EvidenceFileError)
37
+ return evidenceFileCode(error.reason);
38
+ if (error instanceof InvestigationWorkspaceError)
39
+ return investigationWorkspaceCode(error.reason);
40
+ if (error instanceof UnknownRegistryError)
41
+ return unknownRegistryCode(error.reason);
42
+ if (error._tag === "ProcessCaptureError")
43
+ return processCaptureCode(error);
44
+ return staticErrorCode(error._tag);
45
+ };
46
+ const browserErrorCode = (reason) => {
47
+ if (reason === "payload_limit")
48
+ return "truncated";
49
+ if (reason === "target_not_found" ||
50
+ reason === "target_not_allowed" ||
51
+ reason === "target_changed")
52
+ return "target_unavailable";
53
+ if (reason === "endpoint_unreachable" || reason === "disconnected")
54
+ return "provider_unavailable";
55
+ return "unreadable_output";
56
+ };
57
+ const artifactOperationCode = (error) => {
58
+ if (error.reason === "integrity" && error.artifactDetails !== undefined)
59
+ return "artifact_integrity_mismatch";
60
+ if (error.reason === "limit")
61
+ return "truncated";
62
+ if (error.reason === "cancelled")
63
+ return "cancelled";
64
+ return "artifact_operation_failed";
65
+ };
66
+ const evidenceFileCode = (reason) => {
67
+ if (reason === "outside-root")
68
+ return "outside_approved_root";
69
+ if (reason === "too-large")
70
+ return "truncated";
71
+ if (reason === "disabled")
72
+ return "capability_unavailable";
73
+ return "execution_failure";
74
+ };
75
+ const investigationWorkspaceCode = (reason) => {
76
+ if (reason === "revision-conflict" || reason === "name-conflict")
77
+ return "revision_conflict";
78
+ if (reason === "too-large")
79
+ return "truncated";
80
+ if (reason === "disabled")
81
+ return "capability_unavailable";
82
+ if (reason === "outside-root")
83
+ return "outside_approved_root";
84
+ if (reason === "integrity" || reason === "invalid-json")
85
+ return "evidence_integrity_mismatch";
86
+ return "execution_failure";
87
+ };
88
+ const unknownRegistryCode = (reason) => {
89
+ if (reason === "revision-conflict" || reason === "already-exists")
90
+ return "revision_conflict";
91
+ if (reason === "limit")
92
+ return "truncated";
93
+ if (reason === "integrity")
94
+ return "evidence_integrity_mismatch";
95
+ return "execution_failure";
96
+ };
97
+ const processCaptureCode = (error) => {
98
+ if (error.cleanupIncomplete)
99
+ return "cleanup_incomplete";
100
+ if (error.userCategory === "cancelled")
101
+ return "cancelled";
102
+ if (error.userCategory === "permission_required")
103
+ return "permission_required";
104
+ return "process_capture_failed";
105
+ };
106
+ const STATIC_ERROR_CODES = {
107
+ AnalysisProtocolError: "unreadable_output",
108
+ AnalysisOutputError: "unreadable_output",
109
+ HopperProtocolError: "unreadable_output",
110
+ AnalysisInputError: "invalid_request",
111
+ AnalysisCapabilityUnavailableError: "capability_unavailable",
112
+ AnalysisCancelledError: "cancelled",
113
+ HopperCancelledError: "cancelled",
114
+ AnalysisTimeoutError: "provider_timeout",
115
+ HopperTimeoutError: "provider_timeout",
116
+ HopperProcessError: "provider_unavailable",
117
+ HopperStartError: "provider_unavailable",
118
+ ConfigurationError: "configuration_invalid",
119
+ NoBinaryOpenError: "target_unavailable",
120
+ BinaryTargetError: "target_unavailable",
121
+ EvidenceIntegrityError: "evidence_integrity_mismatch",
122
+ EvidenceLimitError: "truncated",
123
+ ProviderAdapterError: "execution_failure",
124
+ HopperRemoteError: "execution_failure",
125
+ };
126
+ const staticErrorCode = (tag) => {
127
+ switch (tag) {
128
+ case "ArtifactOperationError":
129
+ case "BrowserObservationError":
130
+ case "EvidenceFileError":
131
+ case "InvestigationWorkspaceError":
132
+ case "PermissionRequiredError":
133
+ case "ProcessCaptureError":
134
+ case "ProviderSelectionError":
135
+ case "ReplayPlanStaleError":
136
+ case "UnknownRegistryError":
137
+ throw new TypeError(`Unhandled specialized analysis error: ${tag}`);
138
+ default:
139
+ return STATIC_ERROR_CODES[tag];
140
+ }
141
+ };
142
+ const errorDetails = (error) => requestErrorDetails(error) ??
143
+ artifactStateErrorDetails(error) ??
144
+ providerErrorDetails(error) ??
145
+ lifecycleErrorDetails(error);
146
+ const requestErrorDetails = (error) => {
147
+ if (error instanceof AnalysisInputError && error.issues.length > 0)
148
+ return {
149
+ operation: error.operation,
150
+ issues: error.issues.map((issue) => ({
151
+ path: [...issue.path],
152
+ reason: issue.reason,
153
+ ...(issue.expected === undefined ? {} : { expected: issue.expected }),
154
+ ...(issue.minimum === undefined ? {} : { minimum: issue.minimum }),
155
+ ...(issue.maximum === undefined ? {} : { maximum: issue.maximum }),
156
+ })),
157
+ };
158
+ if (error instanceof EvidenceReferenceError)
159
+ return {
160
+ evidence_id: error.evidenceId,
161
+ reason: error.reason,
162
+ expected: error.expected,
163
+ actual: error.actual,
164
+ };
165
+ if (error instanceof ReplayPlanStaleError)
166
+ return {
167
+ approved_plan_digest: error.approvedDigest,
168
+ actual_plan_digest: error.actualDigest,
169
+ application_code_admitted: false,
170
+ };
171
+ if (error instanceof PermissionRequiredError)
172
+ return {
173
+ capability: error.requested.capability,
174
+ requested: scopeDetails(error.requested),
175
+ missing: missingScopeDetails(error.missing),
176
+ ceiling: error.ceiling === null ? null : scopeDetails(error.ceiling),
177
+ };
178
+ return undefined;
179
+ };
180
+ const artifactStateErrorDetails = (error) => {
181
+ if (error instanceof ArtifactOperationError && error.artifactDetails)
182
+ return {
183
+ logical_path: error.artifactDetails.logicalPath,
184
+ declared_sha256: error.artifactDetails.declaredSha256,
185
+ calculated_sha256: error.artifactDetails.calculatedSha256,
186
+ unpacked: error.artifactDetails.unpacked,
187
+ };
188
+ if (error instanceof ArtifactOperationError)
189
+ return {
190
+ operation: error.operation,
191
+ reason: error.reason,
192
+ ...(error.reason === "limit" ? { truncated: true } : {}),
193
+ };
194
+ if (error instanceof EvidenceLimitError)
195
+ return { limit: error.limit, maximum: error.maximum, truncated: true };
196
+ if (error instanceof InvestigationWorkspaceError)
197
+ return { operation: error.operation, reason: error.reason };
198
+ if (error instanceof UnknownRegistryError)
199
+ return { reason: error.reason };
200
+ if (error instanceof EvidenceFileError)
201
+ return { operation: error.operation, reason: error.reason };
202
+ return undefined;
203
+ };
204
+ const providerErrorDetails = (error) => {
205
+ if (error instanceof AnalysisCapabilityUnavailableError)
206
+ return { provider_id: error.providerId, operation: error.operation };
207
+ if (error instanceof ProviderSelectionError)
208
+ return {
209
+ operation: error.operation,
210
+ selection_reason: error.reason,
211
+ requested_provider_id: error.requestedProviderId,
212
+ candidate_ids: [...error.candidateIds],
213
+ rejections: error.rejections.map((rejection) => ({
214
+ provider_id: rejection.providerId,
215
+ code: rejection.code,
216
+ reason: rejection.reason,
217
+ diagnostics: rejection.diagnostics,
218
+ })),
219
+ };
220
+ if (error instanceof ProviderAdapterError)
221
+ return {
222
+ provider_id: error.providerId,
223
+ operation: error.operation,
224
+ ...(error.diagnostics === undefined
225
+ ? {}
226
+ : { diagnostics: error.diagnostics }),
227
+ };
228
+ if (error instanceof BrowserObservationError)
229
+ return { operation: error.operation, reason: error.reason };
230
+ if (error instanceof HopperRemoteError)
231
+ return { provider_code: error.code, diagnostic_type: error.diagnosticType };
232
+ if (error instanceof HopperProcessError && error.failureCode !== undefined)
233
+ return { failure_code: error.failureCode, exit_code: error.exitCode };
234
+ return undefined;
235
+ };
236
+ const lifecycleErrorDetails = (error) => {
237
+ if (error instanceof AnalysisCancelledError)
238
+ return { operation: error.operation, cleanup: "complete" };
239
+ if (error instanceof HopperCancelledError)
240
+ return { operation: "hopper", cleanup: "complete" };
241
+ if (error instanceof AnalysisTimeoutError)
242
+ return { operation: error.operation, timeout_ms: error.timeoutMs };
243
+ if (error instanceof HopperTimeoutError)
244
+ return { operation: "hopper", timeout_ms: error.timeoutMs };
245
+ if (error._tag === "ProcessCaptureError" && error.cleanupIncomplete)
246
+ return {
247
+ cleanup: "incomplete",
248
+ resources: [...error.cleanupResources],
249
+ };
250
+ if (error._tag === "ProcessCaptureError" &&
251
+ error.userCategory === "cancelled")
252
+ return { operation: "process_capture", cleanup: "complete" };
253
+ if (error instanceof BinaryTargetError)
254
+ return { path: error.path };
255
+ return undefined;
256
+ };
257
+ const scopeDetails = (scope) => ({
258
+ capability: scope.capability,
259
+ roots: [...scope.roots],
260
+ executables: [...scope.executables],
261
+ environment_names: [...scope.environment_names],
262
+ ...(scope.origins === undefined ? {} : { origins: [...scope.origins] }),
263
+ network: scope.network,
264
+ mount: scope.mount,
265
+ });
266
+ const missingScopeDetails = (scope) => ({
267
+ ...(scope.roots === undefined ? {} : { roots: [...scope.roots] }),
268
+ ...(scope.executables === undefined
269
+ ? {}
270
+ : { executables: [...scope.executables] }),
271
+ ...(scope.environment_names === undefined
272
+ ? {}
273
+ : { environment_names: [...scope.environment_names] }),
274
+ ...(scope.origins === undefined ? {} : { origins: [...scope.origins] }),
275
+ ...(scope.network === undefined ? {} : { network: scope.network }),
276
+ ...(scope.mount === undefined ? {} : { mount: scope.mount }),
277
+ });
278
+ const RETRYABLE_CODES = new Set([
279
+ "invalid_request",
280
+ "provider_timeout",
281
+ "cancelled",
282
+ "revision_conflict",
283
+ "provider_unavailable",
284
+ ]);