rea-agents 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/README.md +14 -16
  2. package/dist/application/AnalysisContextQueries.js +21 -9
  3. package/dist/application/ApplicationWorkflowEvidenceResolver.js +19 -11
  4. package/dist/application/ArtifactInventory/policy.js +17 -0
  5. package/dist/application/ArtifactInventory/reader.js +1 -4
  6. package/dist/application/ArtifactInventory/scanCanonical.js +0 -3
  7. package/dist/application/ArtifactInventory/scanReader.js +7 -7
  8. package/dist/application/ArtifactInventory/types.js +1 -5
  9. package/dist/application/BinarySession.js +14 -16
  10. package/dist/application/BinarySessionRecords.js +31 -5
  11. package/dist/application/BinarySessionStatus.js +11 -5
  12. package/dist/application/BrowserEvidence.js +3 -5
  13. package/dist/application/CapabilityClientRequirements.js +26 -0
  14. package/dist/application/CapabilityInventory.js +134 -63
  15. package/dist/application/CrossVersionInventory.js +7 -6
  16. package/dist/application/ElectronActiveEvidence.js +55 -0
  17. package/dist/application/ElectronActiveObservationPort.js +1 -0
  18. package/dist/application/ElectronActiveObservationService.js +81 -0
  19. package/dist/application/EnhancedTools.js +22 -20
  20. package/dist/application/EvidenceBundleCommands.js +5 -1
  21. package/dist/application/EvidenceLedger.js +8 -1
  22. package/dist/application/JavaScriptReplayPermission.js +1 -1
  23. package/dist/application/JavaScriptReplayService.js +23 -15
  24. package/dist/application/ManagedRuntimeCorrelationService.js +9 -5
  25. package/dist/application/NodeRuntimeCharacterizationService.js +8 -9
  26. package/dist/application/ProcessCaptureLifecycle.js +5 -0
  27. package/dist/application/ProcessCli.js +2 -1
  28. package/dist/application/ProcessHarness.js +8 -3
  29. package/dist/application/ProcessNormalization.js +2 -1
  30. package/dist/application/ProjectPermissionStore.js +1 -0
  31. package/dist/application/ReferenceSourceImport.js +2 -2
  32. package/dist/application/SetupClientConfiguration.js +6 -1
  33. package/dist/application/WindowsCapabilities.js +5 -4
  34. package/dist/artifacts/ArtifactProvider.js +8 -10
  35. package/dist/artifacts/SafeOutputTree.js +7 -8
  36. package/dist/browser/CdpCaptureStorageFingerprints.js +10 -7
  37. package/dist/browser/CdpElectronInspection.js +3 -1
  38. package/dist/browser/JavaScriptRuntimeScope.js +5 -0
  39. package/dist/browser/PlaywrightElectronActiveActions.js +324 -0
  40. package/dist/browser/PlaywrightElectronActiveProvider.js +294 -0
  41. package/dist/browser/PlaywrightScenarioBrowser.js +4 -4
  42. package/dist/browser/PlaywrightScenarioSession.js +4 -4
  43. package/dist/browser/SensitiveTextCapture.js +1 -1
  44. package/dist/browser/V8InspectorCaptureProjection.js +1 -0
  45. package/dist/browser/V8InspectorProvider.js +3 -3
  46. package/dist/catalogIdentity.js +12 -6
  47. package/dist/cli/managedCommands.js +1 -1
  48. package/dist/cliApplicationCommands.js +2 -2
  49. package/dist/cliBrowserAdvancedCommands.js +11 -5
  50. package/dist/cliBrowserCommands.js +14 -7
  51. package/dist/cliCommandNames.js +1 -0
  52. package/dist/cliElectronCommands.js +46 -4
  53. package/dist/cliJavaScriptRuntimeCommands.js +14 -6
  54. package/dist/cliObservationOptions.js +4 -0
  55. package/dist/cliPolicyCommands.js +1 -0
  56. package/dist/config/browserScenario.js +77 -0
  57. package/dist/config/electronAutomation.js +35 -0
  58. package/dist/config/environment.js +6 -0
  59. package/dist/config/javascriptReplay.js +41 -0
  60. package/dist/config/managedRuntime.js +25 -0
  61. package/dist/config/parseConfig.js +56 -200
  62. package/dist/config/parsers.js +10 -1
  63. package/dist/config/passiveObservation.js +157 -0
  64. package/dist/config/processCapture.js +47 -0
  65. package/dist/contracts/applicationToolContracts.js +2 -5
  66. package/dist/contracts/applicationWorkflowInputContracts.js +86 -96
  67. package/dist/contracts/artifactToolContracts.js +27 -34
  68. package/dist/contracts/browserToolContracts.js +2 -2
  69. package/dist/contracts/electronToolContracts.js +30 -1
  70. package/dist/contracts/enhancedInputs.js +13 -29
  71. package/dist/contracts/functionWorkflowToolContracts.js +2 -3
  72. package/dist/contracts/managedToolContracts.js +4 -9
  73. package/dist/contracts/managedWorkflowExamples.js +12 -9
  74. package/dist/contracts/managedWorkflowToolContracts.js +30 -27
  75. package/dist/contracts/nativeToolContracts.js +2 -3
  76. package/dist/contracts/sessionToolSchemas.js +61 -0
  77. package/dist/contracts/toolContractExamples.js +1 -0
  78. package/dist/contracts/toolContractHelpers.js +23 -0
  79. package/dist/contracts/toolContracts.js +5 -77
  80. package/dist/contracts/toolEffects.js +15 -0
  81. package/dist/contracts/toolOutputSchemaGroups.js +17 -2
  82. package/dist/contracts/toolOutputSchemaPrimitives.js +76 -26
  83. package/dist/contracts/toolSchemaMetadata.js +128 -0
  84. package/dist/doctorRuntime.js +1 -1
  85. package/dist/domain/androidApplication.js +2 -0
  86. package/dist/domain/appleApplication.js +2 -0
  87. package/dist/domain/binaryTarget.js +7 -5
  88. package/dist/domain/binaryTargetTypes.js +1 -0
  89. package/dist/domain/browserCaptureComparison.js +21 -69
  90. package/dist/domain/browserObservation.js +22 -9
  91. package/dist/domain/bytecodeProvider.js +33 -35
  92. package/dist/domain/callPath.js +3 -2
  93. package/dist/domain/conformanceReplay.js +3 -3
  94. package/dist/domain/conformanceTrustGate.js +151 -16
  95. package/dist/domain/customProtocolCapture.js +3 -3
  96. package/dist/domain/electronActiveObservation.js +277 -0
  97. package/dist/domain/electronObservation.js +15 -11
  98. package/dist/domain/electronStaticAnalysisValues.js +4 -1
  99. package/dist/domain/eventProcessTree.js +82 -79
  100. package/dist/domain/functionComparisonNormalization.js +15 -8
  101. package/dist/domain/functionDossierEvidence.js +9 -4
  102. package/dist/domain/hopperValues.js +68 -71
  103. package/dist/domain/inputIssueProjection.js +4 -1
  104. package/dist/domain/investigationWorkspace.js +16 -15
  105. package/dist/domain/javascriptExportShapeComparisonSchemas.js +2 -2
  106. package/dist/domain/javascriptReplay.js +79 -63
  107. package/dist/domain/javascriptRuntimeObservation.js +1 -0
  108. package/dist/domain/javascriptRuntimeReconciliationActive.js +89 -0
  109. package/dist/domain/javascriptRuntimeReconciliationGraph.js +11 -10
  110. package/dist/domain/javascriptRuntimeReconciliationMatching.js +57 -49
  111. package/dist/domain/javascriptRuntimeReconciliationParsing.js +5 -1
  112. package/dist/domain/javascriptRuntimeReconciliationResult.js +21 -14
  113. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
  114. package/dist/domain/knownPageCoverage.js +15 -7
  115. package/dist/domain/nativeApiBoundary.js +15 -7
  116. package/dist/domain/nodeRuntimeCharacterization.js +14 -13
  117. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  118. package/dist/domain/processCaptureValidation.js +7 -3
  119. package/dist/domain/processComparison.js +12 -7
  120. package/dist/domain/processObservation.js +5 -6
  121. package/dist/domain/processReactiveMatching.js +14 -7
  122. package/dist/domain/processReactiveTransition.js +9 -3
  123. package/dist/domain/processScenario.js +6 -3
  124. package/dist/domain/processTraceComparison.js +3 -2
  125. package/dist/domain/protocolCapture.js +8 -6
  126. package/dist/domain/reconstructionReadinessSchemas.js +30 -2
  127. package/dist/domain/referenceSourceImportParsing.js +2 -2
  128. package/dist/domain/replayMachineRuntime.js +5 -3
  129. package/dist/domain/sourceToBundleComparison.js +2 -2
  130. package/dist/domain/sourceToBundleComparisonSchemas.js +8 -8
  131. package/dist/domain/sourceToBundleSignals.js +7 -1
  132. package/dist/domain/staticRuntimeCorrelation.js +7 -5
  133. package/dist/domain/webBundleAnalysis.js +14 -14
  134. package/dist/domain/webCaptureDiff.js +15 -12
  135. package/dist/dotnet/ManagedNativeBoundaryInspector.js +2 -3
  136. package/dist/generatedMcpToolCatalog.js +1 -1
  137. package/dist/generatedPackageMetadata.js +1 -1
  138. package/dist/ghidra/GhidraClient.js +1 -1
  139. package/dist/ghidra/GhidraClientStartup.js +1 -1
  140. package/dist/ghidra/GhidraFunctionValues.js +17 -15
  141. package/dist/ghidra/GhidraInventoryValues.js +57 -47
  142. package/dist/ghidra/GhidraProvider.js +18 -10
  143. package/dist/ghidra/GhidraProviderCapabilities.js +5 -1
  144. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  145. package/dist/ghidra/protocol.js +19 -42
  146. package/dist/hopper/BridgeLauncher.js +3 -1
  147. package/dist/hopper/HopperAnalysisProfile.js +2 -4
  148. package/dist/hopper/HopperCleanup.js +5 -6
  149. package/dist/hopper/HopperClient.js +1 -1
  150. package/dist/hopper/HopperProvider.js +0 -14
  151. package/dist/hopper/LinuxPrivateDisplayProbe.js +16 -10
  152. package/dist/main/reload.js +1 -6
  153. package/dist/main/state.js +0 -14
  154. package/dist/main/transport.js +30 -37
  155. package/dist/main.js +17 -15
  156. package/dist/mcpDoctor.js +2 -24
  157. package/dist/process/PrivateRuntimeRoot.js +17 -0
  158. package/dist/process/ProcessOwnership.js +64 -128
  159. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  160. package/dist/process/ProcessOwnershipObservation.js +88 -0
  161. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  162. package/dist/process/ProviderDeadline.js +8 -12
  163. package/dist/process/WindowsAuthority.js +32 -0
  164. package/dist/reference/ReferenceSourceReader.js +3 -3
  165. package/dist/reference/ReferenceSourceReaderEntries.js +2 -2
  166. package/dist/replay/JavaScriptReplayWorker.js +95 -11
  167. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  168. package/dist/replay/LinuxJavaScriptReplayRunner.js +10 -15
  169. package/dist/replay/ReplayOutcome.js +26 -15
  170. package/dist/replay/ReplayWorkerProtocol.js +34 -29
  171. package/dist/server/createServer.js +158 -94
  172. package/dist/server/mcpClientMetadata.js +32 -0
  173. package/dist/server/registerApplicationTools/characterization.js +6 -13
  174. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -7
  175. package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -7
  176. package/dist/server/registerApplicationTools/compareVersions.js +3 -8
  177. package/dist/server/registerApplicationTools/controlledReplay.js +6 -11
  178. package/dist/server/registerApplicationTools/coverage.js +13 -19
  179. package/dist/server/registerApplicationTools/obligationLedger.js +1 -6
  180. package/dist/server/registerApplicationTools/readiness.js +1 -6
  181. package/dist/server/registerApplicationTools/traceFeature.js +3 -8
  182. package/dist/server/registerApplicationTools/traceSemantics.js +1 -6
  183. package/dist/server/registerArtifactComparisonTool.js +12 -16
  184. package/dist/server/registerBrowserScenarioTool.js +1 -6
  185. package/dist/server/registerBrowserTools.js +37 -79
  186. package/dist/server/registerBundleComparisonTool.js +10 -14
  187. package/dist/server/registerCloseLifecycleTool.js +6 -14
  188. package/dist/server/registerElectronTools.js +30 -47
  189. package/dist/server/registerEnhancedTools.js +114 -122
  190. package/dist/server/registerEvidenceTools.js +5 -9
  191. package/dist/server/registerFunctionComparisonTool.js +11 -15
  192. package/dist/server/registerInvestigationTools.js +41 -57
  193. package/dist/server/registerJavaScriptRuntimeObservationTools.js +13 -27
  194. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -9
  195. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  196. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  197. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  198. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +8 -13
  199. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +4 -9
  200. package/dist/server/registerOfficialTools.js +8 -9
  201. package/dist/server/registerProcessComparisonTool.js +19 -24
  202. package/dist/server/registerReplayMachineTool.js +4 -10
  203. package/dist/server/registerSessionRecordTools.js +69 -40
  204. package/dist/server/registerSessionStatusTool.js +13 -28
  205. package/dist/server/registerSessionTools.js +36 -52
  206. package/dist/server/sessionAvailabilityPolicy.js +2 -1
  207. package/dist/server/sessionToolPolicies.js +1 -5
  208. package/dist/server/toolRegistrationOptions.js +4 -192
  209. package/dist/server/toolResult.js +2 -18
  210. package/package.json +22 -14
  211. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  212. package/scripts/electron-active-hook.cjs +501 -0
  213. package/scripts/rea.mjs +1 -11
  214. package/skills/reverse-engineer-anything/SKILL.md +2 -2
  215. package/dist/server/DynamicToolAvailability.js +0 -70
  216. package/dist/server/LazyToolCatalog.js +0 -134
  217. package/dist/server/hydrateServerTools.js +0 -191
  218. package/dist/server/toolInputValidation.js +0 -77
  219. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -1,33 +1,30 @@
1
1
  import { z } from "zod";
2
- import { addressContextInputSchema, navigationContextInputSchema, SESSION_TOOL_CONTRACTS, } from "../contracts/toolContracts.js";
3
- import { toCallToolResult } from "./toolResult.js";
4
- import { logToolExecution } from "./toolLogging.js";
5
- import { ok } from "../domain/result.js";
6
- import { processScenarioSchema } from "../domain/processCapture.js";
7
- import { captureProcessScenario } from "../application/ProcessHarness.js";
8
- import { processCapturePermissionRequest } from "../application/ProcessCapturePermission.js";
2
+ import { isInputRequiredResult } from "@modelcontextprotocol/server";
3
+ import { getNavigationContext, inspectAddressContext, } from "../application/AnalysisContextQueries.js";
9
4
  import { readAnalysisSnapshot } from "../application/AnalysisSnapshotFiles.js";
10
- import { UnknownRegistryError } from "../domain/errors.js";
11
- import { DENY_EVIDENCE_FILE_POLICY, DENY_PROCESS_POLICY, } from "./sessionToolPolicies.js";
5
+ import { processCapturePermissionRequest } from "../application/ProcessCapturePermission.js";
12
6
  import { createProcessCaptureEvidence } from "../application/ProcessEvidence.js";
13
- import { registerProcessComparisonTool } from "./registerProcessComparisonTool.js";
7
+ import { captureProcessScenario } from "../application/ProcessHarness.js";
8
+ import { SESSION_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
9
+ import { UnknownRegistryError } from "../domain/errors.js";
10
+ import { ok } from "../domain/result.js";
11
+ import { mcpProgressReporter } from "./mcpProgress.js";
12
+ import { permissionFailure } from "./permissionFailure.js";
13
+ import { authorizeProcessCaptureWithElicitation, } from "./ProcessCaptureElicitation.js";
14
14
  import { registerArtifactComparisonTool } from "./registerArtifactComparisonTool.js";
15
- import { registerFunctionComparisonTool } from "./registerFunctionComparisonTool.js";
16
- import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
17
- import { safeParseToolInput } from "./toolInputValidation.js";
18
15
  import { registerBundleComparisonTool } from "./registerBundleComparisonTool.js";
16
+ import { registerCloseLifecycleTool } from "./registerCloseLifecycleTool.js";
17
+ import { registerFunctionComparisonTool } from "./registerFunctionComparisonTool.js";
19
18
  import { registerInvestigationTools } from "./registerInvestigationTools.js";
20
- import { openBinaryInputSchema } from "../contracts/sessionLifecycleInputs.js";
21
- import { registerSessionStatusTool } from "./registerSessionStatusTool.js";
22
- import { mcpProgressReporter } from "./mcpProgress.js";
23
- import { authorizeProcessCaptureWithElicitation, } from "./ProcessCaptureElicitation.js";
24
- import { isInputRequiredResult } from "@modelcontextprotocol/server";
25
- import { registerEvidenceTools, registerUnknownTools, } from "./registerSessionRecordTools.js";
19
+ import { registerProcessComparisonTool } from "./registerProcessComparisonTool.js";
26
20
  import { registerReplayMachineTool } from "./registerReplayMachineTool.js";
21
+ import { registerEvidenceTools, registerUnknownTools, } from "./registerSessionRecordTools.js";
22
+ import { registerSessionStatusTool } from "./registerSessionStatusTool.js";
27
23
  import { sessionAvailabilityPolicy, } from "./sessionAvailabilityPolicy.js";
28
- import { permissionFailure } from "./permissionFailure.js";
29
- import { registerCloseLifecycleTool } from "./registerCloseLifecycleTool.js";
30
- import { getNavigationContext, inspectAddressContext, } from "../application/AnalysisContextQueries.js";
24
+ import { DENY_EVIDENCE_FILE_POLICY, DENY_PROCESS_POLICY, } from "./sessionToolPolicies.js";
25
+ import { logToolExecution } from "./toolLogging.js";
26
+ import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
27
+ import { toCallToolResult } from "./toolResult.js";
31
28
  const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) => {
32
29
  if (scenario.unknown_registry_approved !== true)
33
30
  return ok(null);
@@ -59,10 +56,7 @@ const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) =
59
56
  };
60
57
  const registerProcessTools = ({ server, session, logger, processPolicy, captureContract, permissionAuthority, processCaptureElicitation, }) => {
61
58
  server.registerTool(captureContract.name, toolRegistrationOptions(captureContract), async (input, context) => {
62
- const parsedInput = safeParseToolInput(processScenarioSchema, input, captureContract.name);
63
- if (!parsedInput.ok)
64
- return toCallToolResult(parsedInput, captureContract);
65
- const scenario = parsedInput.value;
59
+ const scenario = input;
66
60
  if (permissionAuthority !== undefined) {
67
61
  const request = processCapturePermissionRequest(scenario);
68
62
  const authorized = processCaptureElicitation === undefined
@@ -80,7 +74,7 @@ const registerProcessTools = ({ server, session, logger, processPolicy, captureC
80
74
  total: 1,
81
75
  message: "started",
82
76
  });
83
- const captured = await logToolExecution(logger, captureContract.name, () => captureProcessScenario(scenario, processPolicy, context.mcpReq.signal));
77
+ const captured = await logToolExecution(logger, captureContract.name, () => captureProcessScenario(scenario, processPolicy(), context.mcpReq.signal));
84
78
  await progress.report({
85
79
  phase: captureContract.name,
86
80
  completed: 1,
@@ -114,39 +108,33 @@ const registerLifecycleTools = (registration) => {
114
108
  };
115
109
  const registerOpenLifecycleTool = ({ server, session, logger, contracts: [openContract], snapshotFilePolicy, permissionAuthority, }) => {
116
110
  server.registerTool(openContract.name, toolRegistrationOptions(openContract), async (input, context) => {
117
- const parsedInput = safeParseToolInput(openBinaryInputSchema, input, openContract.name);
118
- if (!parsedInput.ok)
119
- return toCallToolResult(parsedInput, openContract);
120
- const parsed = parsedInput.value;
121
111
  let snapshot;
122
- if (parsed.snapshot_path !== undefined) {
112
+ if (input.snapshot_path !== undefined) {
123
113
  if (permissionAuthority !== undefined) {
124
114
  const authorized = await permissionAuthority.authorize({
125
115
  capability: "snapshot_read",
126
- roots: [parsed.snapshot_path],
116
+ roots: [input.snapshot_path],
127
117
  executables: [],
128
118
  environment_names: [],
129
119
  network: "none",
130
120
  mount: false,
131
- operation_identity: `open_binary:snapshot:${parsed.snapshot_path}`,
121
+ operation_identity: `open_binary:snapshot:${input.snapshot_path}`,
132
122
  }, "read");
133
123
  if (!authorized.ok)
134
124
  return toCallToolResult(permissionFailure(authorized), openContract);
135
125
  }
136
- const loaded = await readAnalysisSnapshot(parsed.snapshot_path, snapshotFilePolicy);
126
+ const loaded = await readAnalysisSnapshot(input.snapshot_path, snapshotFilePolicy);
137
127
  if (!loaded.ok)
138
128
  return toCallToolResult(loaded, openContract);
139
129
  snapshot = loaded.value;
140
130
  }
141
- const opened = await logToolExecution(logger, openContract.name, () => session.open(parsed.path, {
131
+ const opened = await logToolExecution(logger, openContract.name, () => session.open(input.path, {
142
132
  signal: context.mcpReq.signal,
143
- ...(parsed.provider_id === undefined
133
+ ...(input.provider_id === undefined
144
134
  ? {}
145
- : { providerId: parsed.provider_id }),
135
+ : { providerId: input.provider_id }),
146
136
  ...(snapshot === undefined ? {} : { snapshot }),
147
137
  }));
148
- if (opened.ok)
149
- server.sendToolListChanged();
150
138
  return opened.ok
151
139
  ? toCallToolResult({
152
140
  ok: true,
@@ -173,27 +161,22 @@ const registerRecordAndReplayTools = (server, session, logger) => {
173
161
  registerReplayMachineTool(server, logger);
174
162
  };
175
163
  const registerContextTools = (server, session) => {
176
- const navigationContract = SESSION_TOOL_CONTRACTS[20];
177
- const addressContract = SESSION_TOOL_CONTRACTS[21];
164
+ const navigationContract = SESSION_TOOL_CONTRACTS[21];
165
+ const addressContract = SESSION_TOOL_CONTRACTS[22];
178
166
  server.registerTool(navigationContract.name, toolRegistrationOptions(navigationContract), async (input, context) => {
179
- const parsed = safeParseToolInput(navigationContextInputSchema, input, navigationContract.name);
180
- if (!parsed.ok)
181
- return toCallToolResult(parsed, navigationContract);
182
- return toCallToolResult(await getNavigationContext(session, parsed.value, context.mcpReq.signal), navigationContract);
167
+ return toCallToolResult(await getNavigationContext(session, input, context.mcpReq.signal), navigationContract);
183
168
  });
184
169
  server.registerTool(addressContract.name, toolRegistrationOptions(addressContract), async (input, context) => {
185
- const parsed = safeParseToolInput(addressContextInputSchema, input, addressContract.name);
186
- if (!parsed.ok)
187
- return toCallToolResult(parsed, addressContract);
188
- return toCallToolResult(await inspectAddressContext(session, parsed.value, context.mcpReq.signal), addressContract);
170
+ return toCallToolResult(await inspectAddressContext(session, input, context.mcpReq.signal), addressContract);
189
171
  });
190
172
  };
191
173
  export const registerSessionTools = (server, session, logger, options = {}) => {
192
- const processPolicy = options.processPolicy ?? DENY_PROCESS_POLICY;
174
+ const processPolicy = options.processPolicy ?? (() => DENY_PROCESS_POLICY);
193
175
  const evidenceFilePolicy = options.evidenceFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
194
176
  const analysisSnapshotFilePolicy = options.analysisSnapshotFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
195
177
  const [openContract, closeContract, statusContract, exportContract, importContract, captureContract, compareContract, compareArtifactsContract, compareFunctionsContract, compareBundlesContract, changedBehaviorContract, callPathContract, staticRuntimeContract, reconstructionContract,] = SESSION_TOOL_CONTRACTS;
196
178
  const snapshotContract = SESSION_TOOL_CONTRACTS[19];
179
+ const releaseContract = SESSION_TOOL_CONTRACTS[20];
197
180
  registerLifecycleTools({
198
181
  server,
199
182
  session,
@@ -202,7 +185,7 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
202
185
  snapshotFilePolicy: analysisSnapshotFilePolicy,
203
186
  startedAt: options.startedAt ?? new Date().toISOString(),
204
187
  availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy, {
205
- processPolicy,
188
+ processPolicy: processPolicy(),
206
189
  evidenceFilePolicy,
207
190
  investigationInputRoots: options.investigationInputRoots ?? [],
208
191
  }),
@@ -216,6 +199,7 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
216
199
  exportContract,
217
200
  importContract,
218
201
  snapshotContract,
202
+ releaseContract,
219
203
  filePolicy: evidenceFilePolicy,
220
204
  ...(options.permissionAuthority === undefined
221
205
  ? {}
@@ -1,12 +1,13 @@
1
1
  /** Select configured availability reporting or the target-free defaults. */
2
2
  export const sessionAvailabilityPolicy = (configured, defaults) => configured ??
3
3
  (() => ({
4
- processCaptureEnabled: defaults.processPolicy.enabled,
4
+ processCaptureEnabled: defaults.processPolicy.status === "enabled",
5
5
  evidenceFileRoots: defaults.evidenceFilePolicy.roots.length,
6
6
  investigationInputRoots: defaults.investigationInputRoots.length,
7
7
  browserObservationEnabled: defaults.optionalFeatures?.browserObservationEnabled ?? false,
8
8
  browserScenarioEnabled: defaults.optionalFeatures?.browserScenarioEnabled ?? false,
9
9
  electronObservationEnabled: defaults.optionalFeatures?.electronObservationEnabled ?? false,
10
+ electronAutomationEnabled: defaults.optionalFeatures?.electronAutomationEnabled ?? false,
10
11
  v8InspectorObservationEnabled: defaults.optionalFeatures?.v8InspectorObservationEnabled ?? false,
11
12
  javascriptReplayEnabled: defaults.optionalFeatures?.javascriptReplayEnabled ?? false,
12
13
  managedRuntimeEnabled: defaults.optionalFeatures?.managedRuntimeEnabled ?? false,
@@ -1,10 +1,6 @@
1
1
  /** Fail-closed process policy used when operator configuration is absent. */
2
2
  export const DENY_PROCESS_POLICY = {
3
- enabled: false,
4
- executableRoots: [],
5
- workingRoots: [],
6
- allowedEnvironment: [],
7
- allowExternalNetwork: false,
3
+ status: "disabled",
8
4
  };
9
5
  /** Fail-closed evidence filesystem policy used without approved roots. */
10
6
  export const DENY_EVIDENCE_FILE_POLICY = {
@@ -1,197 +1,9 @@
1
- import { z } from "zod";
2
- const ADVERTISED_INPUT_SCHEMAS = new WeakMap();
3
- const ADVERTISED_OUTPUT_SCHEMAS = new WeakMap();
4
- /** Project the public contract fields accepted by MCP tool registration. */
1
+ import { toolInputSchemaWithMetadata } from "../contracts/toolSchemaMetadata.js";
2
+ /** Project the canonical Zod contracts directly into SDK registration. */
5
3
  export const toolRegistrationOptions = (contract) => ({
6
4
  title: contract.title,
7
5
  description: contract.description,
8
- inputSchema: advertisedInputSchema(contract),
9
- outputSchema: advertisedOutputSchema(contract.outputSchema),
6
+ inputSchema: toolInputSchemaWithMetadata(contract),
7
+ outputSchema: contract.outputSchema,
10
8
  annotations: contract.annotations,
11
9
  });
12
- /**
13
- * Advertise the exact Zod contract while leaving validation to REA's adapter.
14
- * The SDK otherwise converts validation failures to text-only JSON-RPC errors
15
- * before REA can return its stable structured error envelope.
16
- */
17
- const advertisedInputSchema = (contract) => ({
18
- "~standard": {
19
- version: 1,
20
- vendor: "rea",
21
- validate: (input) => ({ value: input }),
22
- jsonSchema: {
23
- input: () => advertisedInputJsonSchema(contract),
24
- output: () => advertisedInputJsonSchema(contract),
25
- },
26
- },
27
- });
28
- const advertisedOutputSchema = (schema) => {
29
- const standard = schema["~standard"];
30
- const converter = standard.jsonSchema?.output;
31
- if (converter === undefined)
32
- throw new TypeError("Tool output schema does not expose Standard JSON Schema");
33
- return {
34
- "~standard": {
35
- ...standard,
36
- jsonSchema: {
37
- input: () => advertisedOutputJsonSchema(schema, converter),
38
- output: () => advertisedOutputJsonSchema(schema, converter),
39
- },
40
- },
41
- };
42
- };
43
- const advertisedInputJsonSchema = (contract) => cachedJsonSchema(ADVERTISED_INPUT_SCHEMAS, contract.inputSchema, () => ({
44
- ...describeProperties(closeObjectSchemas(inputJsonSchema(contract.inputSchema))),
45
- examples: contract.examples.map(({ input }) => input),
46
- }));
47
- const advertisedOutputJsonSchema = (schema, converter) => cachedJsonSchema(ADVERTISED_OUTPUT_SCHEMAS, schema, () => describeRootProperties(closeObjectSchemas(converter({ target: "draft-2020-12" }))));
48
- const cachedJsonSchema = (cache, schema, create) => {
49
- const cached = cache.get(schema);
50
- if (cached !== undefined)
51
- return cached;
52
- const created = create();
53
- cache.set(schema, created);
54
- return created;
55
- };
56
- const inputJsonSchema = (schema) => {
57
- const converter = schema["~standard"].jsonSchema?.input;
58
- if (converter === undefined)
59
- throw new TypeError("Tool input schema does not expose Standard JSON Schema");
60
- return converter({ target: "draft-2020-12" });
61
- };
62
- /** Close fixed-shape JSON Schema objects while preserving explicit maps. */
63
- export const closeObjectSchemas = (value) => {
64
- const closed = Object.fromEntries(Object.entries(value).map(([key, child]) => [key, closeSchemaValue(child)]));
65
- return value.type === "object" &&
66
- isObject(value.properties) &&
67
- value.additionalProperties === undefined
68
- ? { ...closed, additionalProperties: false }
69
- : closed;
70
- };
71
- const closeSchemaValue = (value) => {
72
- if (Array.isArray(value))
73
- return value.map(closeSchemaValue);
74
- if (!isObject(value))
75
- return value;
76
- return closeObjectSchemas(value);
77
- };
78
- const describeProperties = (value) => Object.fromEntries(Object.entries(value).map(([key, child]) => {
79
- if (key !== "properties" || typeof child !== "object" || child === null)
80
- return [key, describeValue(child)];
81
- return [
82
- key,
83
- Object.fromEntries(Object.entries(child).map(([property, schema]) => [
84
- property,
85
- isObject(schema) && typeof schema.description !== "string"
86
- ? {
87
- ...describeProperties(schema),
88
- description: fallbackPropertyDescription(property),
89
- }
90
- : describeValue(schema),
91
- ])),
92
- ];
93
- }));
94
- const describeValue = (value) => {
95
- if (Array.isArray(value))
96
- return value.map(describeValue);
97
- return isObject(value) ? describeProperties(value) : value;
98
- };
99
- const describeRootProperties = (value) => {
100
- const properties = value.properties;
101
- if (!isObject(properties))
102
- return { ...value };
103
- return {
104
- ...value,
105
- properties: Object.fromEntries(Object.entries(properties).map(([property, schema]) => [
106
- property,
107
- isObject(schema) && typeof schema.description !== "string"
108
- ? {
109
- ...schema,
110
- description: fallbackPropertyDescription(property),
111
- }
112
- : schema,
113
- ])),
114
- };
115
- };
116
- const PROPERTY_DESCRIPTIONS = {
117
- addresses: "Ordered provider-normalized procedure addresses to analyze.",
118
- approved: "Explicit operator approval to perform this operation.",
119
- after: "The later or right-hand observation to compare.",
120
- before: "The earlier or left-hand observation to compare.",
121
- boundary_id: "Exact reconstruction boundary identifier to evaluate.",
122
- case_sensitive: "Whether text matching distinguishes uppercase and lowercase.",
123
- cdp_endpoint: "Approved literal loopback Chrome DevTools Protocol endpoint.",
124
- comment: "Exact analyst comment text to write.",
125
- comparisons: "Validated comparison Evidence records to aggregate.",
126
- coverage: "Exact reconstruction-coverage commitment to verify.",
127
- detail: "Requested response detail level.",
128
- direction: "Direction in which to traverse or compare relationships.",
129
- document: "Exact provider document or program identity.",
130
- error: "Structured, caller-actionable error when the operation fails.",
131
- evidence: "Evidence v2 record produced by this operation.",
132
- evidence_id: "Stable identifier of the recorded Evidence v2 observation.",
133
- evidence_uri: "Session resource URI for the recorded Evidence v2 observation.",
134
- executable: "Approved absolute path of the executable to run.",
135
- format: "Declared input artifact format.",
136
- name: "Exact name used by this operation.",
137
- pattern: "Text or bounded pattern used to filter matching results.",
138
- phase: "Current plan or execution phase of the operation.",
139
- plan: "Content-bound execution plan and its approval commitment.",
140
- query: "Non-empty feature or text query to investigate.",
141
- question: "Concrete unresolved question to retain for later investigation.",
142
- result: "Primary structured result returned by this operation.",
143
- left: "Left-hand input used for comparison or differential execution.",
144
- limit: "Maximum number of results to return in this page.",
145
- limits: "Bounded resource-consumption and result-size limits for this operation.",
146
- mode: "Operation mode that selects the requested behavior.",
147
- offset: "Zero-based index of the first result to return.",
148
- overwrite: "Whether an existing destination may be replaced.",
149
- path: "Local filesystem path used by this operation.",
150
- provider_id: "Exact deep-analysis provider ID, or automatic selection when omitted.",
151
- right: "Right-hand input used for comparison or differential execution.",
152
- schema_version: "Version of this structured result schema.",
153
- source_evidence: "Evidence records supporting the prepared source transformation.",
154
- status: "Current lifecycle or verification status.",
155
- summary: "Concise evidence-backed summary of the result.",
156
- symbols: "Ordered bounded Swift symbols to demangle.",
157
- target_id: "Exact authorized CDP target identifier.",
158
- unknown_id: "Exact residual-unknown identifier.",
159
- unknown_registry_approved: "Explicit approval to record bounded residual uncertainty in the session registry.",
160
- workspace_path: "Approved local path of the persistent investigation workspace.",
161
- };
162
- const fallbackPropertyDescription = (property) => {
163
- const explicit = PROPERTY_DESCRIPTIONS[property];
164
- if (explicit !== undefined)
165
- return explicit;
166
- const words = property.replaceAll("_", " ");
167
- if (property.endsWith("_approved"))
168
- return `Explicit operator approval for ${words.slice(0, -9)}.`;
169
- if (property.endsWith("_offset"))
170
- return `Zero-based index of the first ${words.slice(0, -7)} to return.`;
171
- if (property.endsWith("_limit"))
172
- return `Maximum number of ${words.slice(0, -6)} entries to return.`;
173
- if (property.startsWith("max_"))
174
- return `Maximum permitted ${words.slice(4)} for this operation.`;
175
- if (property.startsWith("include_"))
176
- return `Whether to include ${words.slice(8)} in the result.`;
177
- if (property.startsWith("expected_"))
178
- return `Expected ${words.slice(9)} used to reject stale or mismatched input.`;
179
- if (property.endsWith("_sha256"))
180
- return `Exact SHA-256 digest of ${words.slice(0, -7)}.`;
181
- if (property.endsWith("_evidence_id"))
182
- return `Exact Evidence v2 identifier for the ${words.slice(0, -12)} observation.`;
183
- if (property.endsWith("_evidence_ids"))
184
- return `Ordered Evidence v2 identifiers for the ${words.slice(0, -13)} observations.`;
185
- if (property.endsWith("_path"))
186
- return `Local filesystem path for ${words.slice(0, -5)}.`;
187
- if (property.endsWith("_uri"))
188
- return `Canonical URI for ${words.slice(0, -4)}.`;
189
- if (property.endsWith("_bytes"))
190
- return `Bounded byte count for ${words.slice(0, -6)}.`;
191
- if (property.endsWith("_root") || property.endsWith("_roots"))
192
- return `Approved canonical filesystem ${words}.`;
193
- if (property.startsWith("is_") || property.startsWith("has_"))
194
- return `Whether ${words}.`;
195
- return `Value for ${words}.`;
196
- };
197
- const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -1,4 +1,4 @@
1
- import { AnalysisOutputError, projectAnalysisError, } from "../domain/errors.js";
1
+ import { projectAnalysisError } from "../domain/errors.js";
2
2
  /**
3
3
  * Translate an application result into MCP text content.
4
4
  * Error tags and safe messages remain visible while underlying causes, process
@@ -24,28 +24,12 @@ const errorResult = (error) => {
24
24
  const successResult = (value, contract, options) => {
25
25
  const candidate = compactEvidence(value, options.evidenceResultProjection) ??
26
26
  (contract.kind === "session" ? { result: value } : value);
27
- const parsed = contract.outputSchema.safeParse(candidate);
28
- if (!parsed.success) {
29
- const structuredContent = {
30
- error: projectAnalysisError(new AnalysisOutputError(contract.name, "output does not match the tool contract")),
31
- };
32
- return {
33
- content: [
34
- {
35
- type: "text",
36
- text: JSON.stringify(structuredContent),
37
- },
38
- ],
39
- structuredContent,
40
- isError: true,
41
- };
42
- }
43
27
  return {
44
28
  content: [
45
29
  {
46
30
  type: "text",
47
31
  text: JSON.stringify(options.evidenceTextProjection === undefined
48
- ? parsed.data
32
+ ? candidate
49
33
  : (compactEvidence(value, options.evidenceTextProjection) ??
50
34
  options.evidenceTextProjection)),
51
35
  },
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "rea-agents",
3
- "version": "3.0.0",
3
+ "mcpName": "io.github.morluto/rea",
4
+ "version": "3.1.0",
4
5
  "description": "Reverse engineer anything from your terminal or agent with one CLI and MCP server.",
5
6
  "license": "MIT",
6
7
  "repository": {
@@ -43,7 +44,8 @@
43
44
  "bridge/hopper_bridge.py",
44
45
  "bridge/ghidra/ReaGhidraBridge.java",
45
46
  "scripts/rea.mjs",
46
- "scripts/package-runner-bootstrap.mjs",
47
+ "scripts/electron-active-hook.cjs",
48
+ "scripts/electron-active-hook-boundaries.cjs",
47
49
  "scripts/hopper-demo-x11.py",
48
50
  "scripts/prepack.mjs",
49
51
  "scripts/prepare.mjs",
@@ -55,9 +57,10 @@
55
57
  "deps:check": "node scripts/check-dependency-install.mjs",
56
58
  "metadata:generate": "node scripts/generate-package-metadata.mjs",
57
59
  "metadata:check": "node scripts/generate-package-metadata.mjs --check",
60
+ "mcp-registry:check": "node scripts/verify-mcp-registry-metadata.mjs",
58
61
  "mcp-catalog:generate": "npm run build:cached && node scripts/generate-mcp-tool-catalog.mjs",
59
62
  "mcp-catalog:check": "node scripts/generate-mcp-tool-catalog.mjs --check",
60
- "prebuild": "npm run deps:check && npm run metadata:check",
63
+ "prebuild": "npm run deps:check && npm run metadata:check && node scripts/clean-build-output.mjs",
61
64
  "build": "tsc -p tsconfig.build.json",
62
65
  "precheck": "npm run deps:check",
63
66
  "check": "turbo run typecheck lint format:check knip metadata:check",
@@ -68,7 +71,7 @@
68
71
  "precheck:test": "npm run deps:check",
69
72
  "check:test": "turbo run typecheck lint format:check knip metadata:check test:run",
70
73
  "precheck:pr": "npm run deps:check",
71
- "check:pr": "turbo run typecheck lint format:check knip metadata:check test:run docs:check:built",
74
+ "check:pr": "turbo run typecheck lint format:check knip metadata:check test:run && npm run docs:check",
72
75
  "precheck:ci": "npm run deps:check",
73
76
  "check:ci": "turbo run typecheck lint format:check knip metadata:check jscpd scan:todos",
74
77
  "build:cached": "turbo run build",
@@ -81,19 +84,22 @@
81
84
  "jscpd": "jscpd src/ tests/",
82
85
  "scan:todos": "node scripts/scan-todos.mjs",
83
86
  "start": "node scripts/rea.mjs mcp",
84
- "pretest": "npm run build:cached",
85
- "test": "vitest run",
86
- "test:run": "vitest run",
87
+ "test": "node scripts/run-exclusive.mjs test npm run test:with-build",
88
+ "test:with-build": "npm run build:cached && vitest run",
89
+ "test:run": "node scripts/run-exclusive.mjs test vitest run",
90
+ "test:local": "node scripts/run-exclusive.mjs test vitest run --changed --passWithNoTests --maxWorkers=1",
87
91
  "pretest:fast": "npm run build:cached",
88
- "test:fast": "vitest run --project domain --project services --project adapters --project composition --project boundary --project conformance",
92
+ "test:fast": "vitest run --project domain --project services --project adapters --project composition --project boundary --project mcp-boundary --project conformance",
89
93
  "pretest:boundary": "npm run build:cached",
90
- "test:boundary": "vitest run --project boundary --project process-global",
94
+ "test:boundary": "vitest run --project boundary --project mcp-boundary --project process-global",
95
+ "pretest:mcp": "npm run build:cached",
96
+ "test:mcp": "vitest run --project mcp-boundary",
91
97
  "pretest:acceptance": "npm run build:cached",
92
98
  "test:acceptance": "vitest run --project acceptance",
93
99
  "pretest:changed": "npm run build:cached",
94
- "test:changed": "vitest run --project domain --project services --project adapters --project composition --project boundary --project conformance --project evaluation --changed",
100
+ "test:changed": "vitest run --project domain --project services --project adapters --project composition --project boundary --project mcp-boundary --project conformance --project evaluation --changed",
95
101
  "pretest:integration": "npm run build:cached",
96
- "test:integration": "vitest run --project boundary --project process-global --project acceptance",
102
+ "test:integration": "vitest run --project boundary --project mcp-boundary --project process-global --project acceptance",
97
103
  "pretest:coverage": "npm run build:cached",
98
104
  "test:coverage": "vitest run --coverage.enabled --coverage.provider=v8",
99
105
  "test:ci": "npm run test:coverage -- --reporter=default --reporter=junit --outputFile.junit=test-results.xml",
@@ -104,7 +110,7 @@
104
110
  "pretest:verbose": "npm run build:cached",
105
111
  "test:verbose": "vitest run --reporter=verbose",
106
112
  "pretest:watch": "npm run build:cached",
107
- "test:watch": "vitest --project domain --project services --project adapters --project composition --project boundary --project conformance --project evaluation --changed",
113
+ "test:watch": "vitest --project domain --project services --project adapters --project composition --project boundary --project mcp-boundary --project conformance --project evaluation --changed",
108
114
  "pretest:watch:all": "npm run build:cached",
109
115
  "test:watch:all": "vitest --changed",
110
116
  "typecheck": "tsc --noEmit",
@@ -113,6 +119,7 @@
113
119
  "verify:ghidra": "npm run build:cached && node scripts/verify-real-ghidra.mjs",
114
120
  "verify:ghidra:windows": "npm run build:cached && npm run build:ghidra-windows-fixture && node scripts/verify-real-ghidra-windows.mjs",
115
121
  "verify:browser": "npm run build:cached && node scripts/verify-real-browser.mjs",
122
+ "verify:electron": "npm run build:cached && node scripts/verify-real-electron.mjs",
116
123
  "verify:inspector": "npm run build:cached && node scripts/verify-real-javascript-runtime-observation.mjs",
117
124
  "verify:javascript-runtime": "npm run build:cached && node scripts/verify-local-javascript-runtime.mjs",
118
125
  "verify:application-workflows": "npm run build:cached && node scripts/verify-local-application-workflows.mjs",
@@ -134,8 +141,9 @@
134
141
  "evidence:check": "npm run build:cached && node scripts/generate-completion-ledger.mjs --check",
135
142
  "docs:api": "typedoc",
136
143
  "docs:api:cached": "turbo run docs:api",
137
- "docs:generate": "npm run metadata:generate && npm run build:cached && node scripts/generate-mcp-tool-catalog.mjs && node scripts/generate-skill-metadata.mjs && node scripts/generate-product-catalog.mjs && node scripts/generate-completion-ledger.mjs && npm run docs:api:cached && node scripts/generate-error-schema.mjs",
138
- "docs:check": "turbo run docs:check:built",
144
+ "docs:generate": "node scripts/run-exclusive.mjs docs npm run docs:generate:unlocked",
145
+ "docs:generate:unlocked": "npm run metadata:generate && npm run build:cached && node scripts/generate-mcp-tool-catalog.mjs && node scripts/generate-skill-metadata.mjs && node scripts/generate-product-catalog.mjs && node scripts/generate-completion-ledger.mjs && npm run docs:api:cached && node scripts/generate-error-schema.mjs",
146
+ "docs:check": "node scripts/run-exclusive.mjs docs turbo run docs:check:built",
139
147
  "docs:check:built": "node scripts/generate-package-metadata.mjs --check && node scripts/generate-mcp-tool-catalog.mjs --check && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/generate-completion-ledger.mjs --check && node scripts/check-doc-facts.mjs && node scripts/generate-error-schema.mjs --check",
140
148
  "docs:error-schema": "npm run build:cached && node scripts/generate-error-schema.mjs",
141
149
  "prepack": "node scripts/prepack.mjs",