rea-agents 2.5.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 (253) hide show
  1. package/README.md +20 -12
  2. package/bridge/ghidra/ReaGhidraBridge.java +477 -4
  3. package/bridge/hopper_bridge.py +54 -4
  4. package/dist/application/AnalysisContextQueries.js +142 -0
  5. package/dist/application/AnalysisSnapshotCache.js +4 -2
  6. package/dist/application/ApplicationWorkflowEvidenceResolver.js +19 -11
  7. package/dist/application/ArtifactInventory/policy.js +17 -0
  8. package/dist/application/ArtifactInventory/reader.js +1 -4
  9. package/dist/application/ArtifactInventory/scanCanonical.js +0 -3
  10. package/dist/application/ArtifactInventory/scanReader.js +7 -7
  11. package/dist/application/ArtifactInventory/types.js +1 -5
  12. package/dist/application/BinarySession.js +19 -20
  13. package/dist/application/BinarySessionComposition.js +21 -0
  14. package/dist/application/BinarySessionRecords.js +106 -10
  15. package/dist/application/BinarySessionStatus.js +11 -5
  16. package/dist/application/BrowserEvidence.js +3 -5
  17. package/dist/application/CapabilityClientRequirements.js +26 -0
  18. package/dist/application/CapabilityInventory.js +140 -55
  19. package/dist/application/ClientRegistrationStatus.js +4 -1
  20. package/dist/application/CrossVersionInventory.js +7 -6
  21. package/dist/application/DirectAnalysis.js +6 -2
  22. package/dist/application/ElectronActiveEvidence.js +55 -0
  23. package/dist/application/ElectronActiveObservationPort.js +1 -0
  24. package/dist/application/ElectronActiveObservationService.js +81 -0
  25. package/dist/application/EnhancedTools.js +49 -17
  26. package/dist/application/EvidenceBundleCommands.js +5 -1
  27. package/dist/application/EvidenceLedger.js +53 -17
  28. package/dist/application/JavaScriptArtifactAnalysis.js +13 -4
  29. package/dist/application/JavaScriptReplayPermission.js +1 -1
  30. package/dist/application/JavaScriptReplayService.js +23 -15
  31. package/dist/application/LazyAnalysisProvider.js +77 -0
  32. package/dist/application/LoopbackReplay.js +1 -1
  33. package/dist/application/ManagedRuntimeCorrelationService.js +9 -5
  34. package/dist/application/NativeApiInspection.js +80 -0
  35. package/dist/application/NodeRuntimeCharacterizationService.js +8 -9
  36. package/dist/application/ProcessCaptureLifecycle.js +5 -0
  37. package/dist/application/ProcessCli.js +2 -1
  38. package/dist/application/ProcessHarness.js +8 -3
  39. package/dist/application/ProcessNormalization.js +2 -1
  40. package/dist/application/ProjectPermissionStore.js +1 -0
  41. package/dist/application/ReferenceSourceImport.js +2 -2
  42. package/dist/application/SessionProviderRouter.js +6 -6
  43. package/dist/application/SetupClientConfiguration.js +10 -3
  44. package/dist/application/WindowsCapabilities.js +5 -4
  45. package/dist/application/runtime.js +26 -9
  46. package/dist/artifacts/ArtifactProvider.js +8 -10
  47. package/dist/artifacts/SafeOutputTree.js +7 -8
  48. package/dist/browser/CdpCaptureStorageFingerprints.js +10 -7
  49. package/dist/browser/CdpElectronInspection.js +3 -1
  50. package/dist/browser/JavaScriptRuntimeScope.js +5 -0
  51. package/dist/browser/PlaywrightBrowserScenarioProvider.js +8 -2
  52. package/dist/browser/PlaywrightElectronActiveActions.js +324 -0
  53. package/dist/browser/PlaywrightElectronActiveProvider.js +294 -0
  54. package/dist/browser/PlaywrightScenarioBrowser.js +4 -4
  55. package/dist/browser/PlaywrightScenarioSession.js +4 -4
  56. package/dist/browser/SensitiveTextCapture.js +1 -1
  57. package/dist/browser/V8InspectorCaptureProjection.js +1 -0
  58. package/dist/browser/V8InspectorProvider.js +3 -3
  59. package/dist/catalogIdentity.js +15 -9
  60. package/dist/cli/artifactCommands.js +5 -3
  61. package/dist/cli/coreAnalysisCommands.js +41 -0
  62. package/dist/cli/managedCommands.js +1 -1
  63. package/dist/cliApplicationCommands.js +2 -2
  64. package/dist/cliBrowserAdvancedCommands.js +11 -5
  65. package/dist/cliBrowserCommands.js +14 -7
  66. package/dist/cliCommandNames.js +2 -0
  67. package/dist/cliElectronCommands.js +46 -4
  68. package/dist/cliJavaScriptRuntimeCommands.js +14 -6
  69. package/dist/cliObservationOptions.js +4 -0
  70. package/dist/cliPolicyCommands.js +1 -0
  71. package/dist/config/browserScenario.js +77 -0
  72. package/dist/config/electronAutomation.js +35 -0
  73. package/dist/config/environment.js +6 -0
  74. package/dist/config/javascriptReplay.js +41 -0
  75. package/dist/config/managedRuntime.js +25 -0
  76. package/dist/config/parseConfig.js +56 -200
  77. package/dist/config/parsers.js +10 -1
  78. package/dist/config/passiveObservation.js +157 -0
  79. package/dist/config/processCapture.js +47 -0
  80. package/dist/contracts/applicationToolContracts.js +2 -5
  81. package/dist/contracts/applicationWorkflowInputContracts.js +86 -96
  82. package/dist/contracts/artifactToolContracts.js +35 -37
  83. package/dist/contracts/browserToolContracts.js +2 -2
  84. package/dist/contracts/electronToolContracts.js +30 -1
  85. package/dist/contracts/enhancedInputs.js +21 -27
  86. package/dist/contracts/functionWorkflowToolContracts.js +29 -0
  87. package/dist/contracts/managedToolContracts.js +4 -9
  88. package/dist/contracts/managedWorkflowExamples.js +12 -9
  89. package/dist/contracts/managedWorkflowToolContracts.js +30 -27
  90. package/dist/contracts/nativeToolContracts.js +2 -3
  91. package/dist/contracts/promptContracts.js +14 -15
  92. package/dist/contracts/sessionToolSchemas.js +61 -0
  93. package/dist/contracts/toolContractExamples.js +4 -0
  94. package/dist/contracts/toolContractHelpers.js +23 -0
  95. package/dist/contracts/toolContracts.js +12 -67
  96. package/dist/contracts/toolEffects.js +19 -0
  97. package/dist/contracts/toolOutputSchemaGroups.js +66 -11
  98. package/dist/contracts/toolOutputSchemaPrimitives.js +76 -26
  99. package/dist/contracts/toolSchemaMetadata.js +128 -0
  100. package/dist/doctorRuntime.js +1 -1
  101. package/dist/domain/analysisErrorPresentation.js +8 -2
  102. package/dist/domain/analysisErrorProjection.js +1 -0
  103. package/dist/domain/androidApplication.js +2 -0
  104. package/dist/domain/appleApplication.js +2 -0
  105. package/dist/domain/binaryTarget.js +7 -5
  106. package/dist/domain/binaryTargetTypes.js +1 -0
  107. package/dist/domain/browserCaptureComparison.js +21 -69
  108. package/dist/domain/browserObservation.js +22 -9
  109. package/dist/domain/bytecodeProvider.js +177 -0
  110. package/dist/domain/callPath.js +3 -2
  111. package/dist/domain/conformancePackage.js +169 -0
  112. package/dist/domain/conformanceReplay.js +104 -0
  113. package/dist/domain/conformanceTrustGate.js +328 -0
  114. package/dist/domain/customProtocolCapture.js +137 -0
  115. package/dist/domain/electronActiveObservation.js +277 -0
  116. package/dist/domain/electronObservation.js +15 -11
  117. package/dist/domain/electronStaticAnalysisValues.js +4 -1
  118. package/dist/domain/eventProcessTree.js +217 -0
  119. package/dist/domain/evidenceBundle.js +47 -0
  120. package/dist/domain/functionComparisonNormalization.js +15 -8
  121. package/dist/domain/functionDossierEvidence.js +9 -4
  122. package/dist/domain/hopperStartupFailure.js +1 -1
  123. package/dist/domain/hopperValues.js +68 -68
  124. package/dist/domain/inputIssueProjection.js +11 -2
  125. package/dist/domain/investigationWorkspace.js +16 -15
  126. package/dist/domain/javascriptExportShapeComparisonSchemas.js +2 -2
  127. package/dist/domain/javascriptReplay.js +79 -63
  128. package/dist/domain/javascriptRuntimeObservation.js +1 -0
  129. package/dist/domain/javascriptRuntimeReconciliationActive.js +89 -0
  130. package/dist/domain/javascriptRuntimeReconciliationGraph.js +11 -10
  131. package/dist/domain/javascriptRuntimeReconciliationMatching.js +57 -49
  132. package/dist/domain/javascriptRuntimeReconciliationParsing.js +5 -1
  133. package/dist/domain/javascriptRuntimeReconciliationResult.js +21 -14
  134. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
  135. package/dist/domain/javascriptSemanticAnalysis.js +8 -12
  136. package/dist/domain/javascriptSourceParser.js +15 -0
  137. package/dist/domain/javascriptStaticAnalysis.js +8 -12
  138. package/dist/domain/knownPageCoverage.js +15 -7
  139. package/dist/domain/mobileApplicationInvestigation.js +159 -0
  140. package/dist/domain/nativeApiBoundary.js +138 -0
  141. package/dist/domain/nodeRuntimeCharacterization.js +14 -13
  142. package/dist/domain/objcSwiftMetadata.js +150 -0
  143. package/dist/domain/packageAnalysis.js +123 -0
  144. package/dist/domain/peInspection.js +196 -0
  145. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  146. package/dist/domain/processCaptureValidation.js +7 -3
  147. package/dist/domain/processComparison.js +12 -7
  148. package/dist/domain/processObservation.js +5 -6
  149. package/dist/domain/processReactiveMatching.js +14 -7
  150. package/dist/domain/processReactiveTransition.js +9 -3
  151. package/dist/domain/processScenario.js +6 -3
  152. package/dist/domain/processTraceComparison.js +3 -2
  153. package/dist/domain/protocolCapture.js +245 -0
  154. package/dist/domain/reconstructionReadinessSchemas.js +30 -2
  155. package/dist/domain/referenceSourceImportParsing.js +2 -2
  156. package/dist/domain/replayMachineRuntime.js +5 -3
  157. package/dist/domain/sourceToBundleComparison.js +2 -2
  158. package/dist/domain/sourceToBundleComparisonSchemas.js +8 -8
  159. package/dist/domain/sourceToBundleSignals.js +7 -1
  160. package/dist/domain/staticRuntimeCorrelation.js +7 -5
  161. package/dist/domain/webBundleAnalysis.js +14 -14
  162. package/dist/domain/webCaptureDiff.js +15 -12
  163. package/dist/dotnet/ManagedNativeBoundaryInspector.js +2 -3
  164. package/dist/dotnet/ManagedStaticProvider.js +34 -5
  165. package/dist/generatedMcpToolCatalog.js +37 -0
  166. package/dist/generatedPackageMetadata.js +4 -4
  167. package/dist/ghidra/GhidraClient.js +1 -1
  168. package/dist/ghidra/GhidraClientStartup.js +1 -1
  169. package/dist/ghidra/GhidraDefaults.js +1 -1
  170. package/dist/ghidra/GhidraFunctionValues.js +44 -16
  171. package/dist/ghidra/GhidraInventoryValues.js +57 -47
  172. package/dist/ghidra/GhidraProvider.js +18 -10
  173. package/dist/ghidra/GhidraProviderCapabilities.js +45 -39
  174. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  175. package/dist/ghidra/protocol.js +19 -42
  176. package/dist/hopper/BridgeLauncher.js +3 -1
  177. package/dist/hopper/HopperAnalysisProfile.js +2 -4
  178. package/dist/hopper/HopperCleanup.js +5 -6
  179. package/dist/hopper/HopperClient.js +27 -3
  180. package/dist/hopper/HopperProvider.js +42 -44
  181. package/dist/hopper/HopperRequestQueue.js +32 -4
  182. package/dist/hopper/HopperResponseStream.js +2 -2
  183. package/dist/hopper/LinuxPrivateDisplayProbe.js +16 -10
  184. package/dist/hopper/protocol.js +63 -21
  185. package/dist/main/reload.js +1 -6
  186. package/dist/main/state.js +0 -14
  187. package/dist/main/transport.js +31 -41
  188. package/dist/main.js +17 -13
  189. package/dist/mcpDoctor.js +4 -26
  190. package/dist/mcpStartupPolicy.js +14 -0
  191. package/dist/process/PrivateRuntimeRoot.js +17 -0
  192. package/dist/process/ProcessOwnership.js +64 -128
  193. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  194. package/dist/process/ProcessOwnershipObservation.js +88 -0
  195. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  196. package/dist/process/ProviderDeadline.js +8 -12
  197. package/dist/process/WindowsAuthority.js +32 -0
  198. package/dist/reference/ReferenceSourceReader.js +3 -3
  199. package/dist/reference/ReferenceSourceReaderEntries.js +2 -2
  200. package/dist/replay/JavaScriptReplayWorker.js +95 -11
  201. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  202. package/dist/replay/LinuxJavaScriptReplayRunner.js +10 -15
  203. package/dist/replay/ReplayOutcome.js +26 -15
  204. package/dist/replay/ReplayWorkerProtocol.js +34 -29
  205. package/dist/server/createServer.js +101 -144
  206. package/dist/server/mcpClientMetadata.js +32 -0
  207. package/dist/server/registerApplicationTools/characterization.js +6 -13
  208. package/dist/server/registerApplicationTools/compareExportShapes.js +2 -7
  209. package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -7
  210. package/dist/server/registerApplicationTools/compareVersions.js +3 -8
  211. package/dist/server/registerApplicationTools/controlledReplay.js +6 -11
  212. package/dist/server/registerApplicationTools/coverage.js +13 -19
  213. package/dist/server/registerApplicationTools/obligationLedger.js +1 -6
  214. package/dist/server/registerApplicationTools/readiness.js +1 -6
  215. package/dist/server/registerApplicationTools/traceFeature.js +3 -8
  216. package/dist/server/registerApplicationTools/traceSemantics.js +1 -6
  217. package/dist/server/registerArtifactComparisonTool.js +12 -16
  218. package/dist/server/registerBrowserScenarioTool.js +1 -6
  219. package/dist/server/registerBrowserTools.js +37 -79
  220. package/dist/server/registerBundleComparisonTool.js +10 -14
  221. package/dist/server/registerCloseLifecycleTool.js +6 -14
  222. package/dist/server/registerElectronTools.js +30 -47
  223. package/dist/server/registerEnhancedTools.js +124 -122
  224. package/dist/server/registerEvidenceResources.js +50 -101
  225. package/dist/server/registerEvidenceTools.js +5 -9
  226. package/dist/server/registerFunctionComparisonTool.js +11 -15
  227. package/dist/server/registerInvestigationTools.js +42 -59
  228. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -4
  229. package/dist/server/registerJavaScriptRuntimeObservationTools.js +13 -27
  230. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -9
  231. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  232. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  233. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  234. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +8 -13
  235. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +4 -9
  236. package/dist/server/registerOfficialTools.js +8 -9
  237. package/dist/server/registerProcessComparisonTool.js +19 -24
  238. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -7
  239. package/dist/server/registerReconstructionReadinessResource.js +0 -7
  240. package/dist/server/registerReplayMachineTool.js +4 -10
  241. package/dist/server/registerSessionRecordTools.js +146 -47
  242. package/dist/server/registerSessionStatusTool.js +14 -29
  243. package/dist/server/registerSessionTools.js +45 -41
  244. package/dist/server/sessionAvailabilityPolicy.js +2 -1
  245. package/dist/server/sessionToolPolicies.js +1 -5
  246. package/dist/server/toolRegistrationOptions.js +4 -177
  247. package/dist/server/toolResult.js +14 -18
  248. package/package.json +35 -16
  249. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  250. package/scripts/electron-active-hook.cjs +501 -0
  251. package/skills/reverse-engineer-anything/SKILL.md +10 -3
  252. package/dist/server/DynamicToolAvailability.js +0 -70
  253. package/dist/server/toolInputValidation.js +0 -77
@@ -4,13 +4,6 @@ import { reconstructionObligationLedgerPageSchema } from "../domain/reconstructi
4
4
  export const registerReconstructionObligationLedgerResource = (server, session) => {
5
5
  server.registerResource("reconstruction-obligation-ledger-page", new ResourceTemplate("rea://evidence/{evidenceId}/reconstruction-obligation-ledger", {
6
6
  list: undefined,
7
- complete: {
8
- evidenceId: (prefix) => session
9
- .exportEvidenceBundle()
10
- .records.filter(({ predicate_type: predicateType }) => predicateType === "rea.reconstruction-obligation-ledger/v1")
11
- .map(({ evidence_id: evidenceId }) => evidenceId)
12
- .filter((evidenceId) => evidenceId.startsWith(prefix)),
13
- },
14
7
  }), {
15
8
  title: "Reconstruction obligation ledger page",
16
9
  description: "One deterministic Evidence v2-backed obligation page with full-ledger closure digest and summaries.",
@@ -4,13 +4,6 @@ import { reconstructionReadinessReportSchema } from "../domain/reconstructionRea
4
4
  export const registerReconstructionReadinessResource = (server, session) => {
5
5
  server.registerResource("reconstruction-readiness-report", new ResourceTemplate("rea://evidence/{evidenceId}/reconstruction-readiness-report", {
6
6
  list: undefined,
7
- complete: {
8
- evidenceId: (prefix) => session
9
- .exportEvidenceBundle()
10
- .records.filter(({ predicate_type: predicateType }) => predicateType === "rea.reconstruction-readiness-report/v1")
11
- .map(({ evidence_id: evidenceId }) => evidenceId)
12
- .filter((evidenceId) => evidenceId.startsWith(prefix)),
13
- },
14
7
  }), {
15
8
  title: "Reconstruction readiness report",
16
9
  description: "Full deterministic nine-stage conformance report and replay identity.",
@@ -1,20 +1,14 @@
1
1
  import { SESSION_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
2
- import { replayMachineRunInputSchema, runReplayMachine, } from "../domain/replayMachineRun.js";
2
+ import { runReplayMachine } from "../domain/replayMachineRun.js";
3
3
  import { ok } from "../domain/result.js";
4
- import { safeParseToolInput } from "./toolInputValidation.js";
5
4
  import { logToolExecution } from "./toolLogging.js";
6
- import { toCallToolResult } from "./toolResult.js";
7
5
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
8
- const contract = SESSION_TOOL_CONTRACTS.find(({ name }) => name === "run_replay_machine");
9
- if (contract === undefined)
10
- throw new TypeError("Missing run_replay_machine tool contract");
6
+ import { toCallToolResult } from "./toolResult.js";
7
+ const contract = SESSION_TOOL_CONTRACTS[18];
11
8
  /** Register direct execution-free finite replay-machine evaluation. */
12
9
  export const registerReplayMachineTool = (server, logger) => {
13
10
  server.registerTool(contract.name, toolRegistrationOptions(contract), async (input) => {
14
- const parsed = safeParseToolInput(replayMachineRunInputSchema, input, contract.name);
15
- if (!parsed.ok)
16
- return toCallToolResult(parsed, contract);
17
- const result = await logToolExecution(logger, contract.name, () => Promise.resolve(ok(runReplayMachine(parsed.value))));
11
+ const result = await logToolExecution(logger, contract.name, () => Promise.resolve(ok(runReplayMachine(input))));
18
12
  return toCallToolResult(result, contract);
19
13
  });
20
14
  };
@@ -1,50 +1,103 @@
1
1
  import { readEvidenceBundle, writeEvidenceBundle, } from "../application/EvidenceBundleFiles.js";
2
- import { exportEvidenceBundleInputSchema, importEvidenceBundleInputSchema, listUnknownsInputSchema, SESSION_TOOL_CONTRACTS, verifyUnknownResolutionInputSchema, } from "../contracts/toolContracts.js";
2
+ import { SESSION_TOOL_CONTRACTS } from "../contracts/toolContracts.js";
3
3
  import { AnalysisProtocolError, PermissionRequiredError, } from "../domain/errors.js";
4
- import { recordUnknownInputSchema, updateUnknownInputSchema, } from "../domain/residualUnknown.js";
5
4
  import { err, ok } from "../domain/result.js";
6
- import { safeParseToolInput } from "./toolInputValidation.js";
7
5
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
8
6
  import { toCallToolResult } from "./toolResult.js";
9
7
  /** Register evidence bundle import and export tools. */
10
8
  export const registerEvidenceTools = (registration) => {
11
9
  registerExportEvidenceTool(registration);
12
10
  registerImportEvidenceTool(registration);
11
+ registerSnapshotEvidenceTool(registration);
12
+ registerReleaseEvidenceTool(registration);
13
+ };
14
+ const registerReleaseEvidenceTool = ({ server, session, releaseContract, permissionAuthority, }) => {
15
+ server.registerTool(releaseContract.name, toolRegistrationOptions(releaseContract), async (input) => {
16
+ const denied = await authorizeEvidenceWrite({
17
+ authority: permissionAuthority,
18
+ operationIdentity: `release_evidence:${input.bundle_digest}`,
19
+ });
20
+ if (denied !== undefined)
21
+ return toCallToolResult(denied, releaseContract);
22
+ const released = session.releaseEvidenceBundle(input.bundle_digest);
23
+ if (released)
24
+ void server.server
25
+ .sendResourceUpdated({
26
+ uri: `rea://evidence-bundle/${input.bundle_digest}`,
27
+ })
28
+ .catch(() => undefined);
29
+ return toCallToolResult(ok({
30
+ bundle_digest: input.bundle_digest,
31
+ released,
32
+ }), releaseContract);
33
+ });
34
+ };
35
+ const authorizeEvidenceWrite = async ({ authority, operationIdentity, }) => {
36
+ if (authority === undefined)
37
+ return undefined;
38
+ const authorized = await authority.authorize({
39
+ capability: "evidence_write",
40
+ roots: [],
41
+ executables: [],
42
+ environment_names: [],
43
+ network: "none",
44
+ mount: false,
45
+ operation_identity: operationIdentity,
46
+ }, "write");
47
+ return authorized.ok ? undefined : permissionFailure(authorized);
13
48
  };
14
49
  const registerExportEvidenceTool = ({ server, session, exportContract, filePolicy, permissionAuthority, }) => {
15
50
  server.registerTool(exportContract.name, toolRegistrationOptions(exportContract), async (input) => {
16
- const parsedInput = safeParseToolInput(exportEvidenceBundleInputSchema, input, exportContract.name);
17
- if (!parsedInput.ok)
18
- return toCallToolResult(parsedInput, exportContract);
19
- const parsed = parsedInput.value;
20
51
  const bundle = session.exportEvidenceBundle();
21
- if (parsed.path === undefined)
22
- return toCallToolResult(ok(bundle), exportContract);
23
52
  const denied = await authorizeEvidencePath({
24
53
  authority: permissionAuthority,
25
54
  capability: "evidence_write",
26
- path: parsed.path,
55
+ path: input.path,
27
56
  access: "write",
28
- operationIdentity: `export_evidence:${parsed.path}`,
57
+ operationIdentity: `export_evidence:${input.path}`,
29
58
  });
30
59
  if (denied !== undefined)
31
60
  return toCallToolResult(denied, exportContract);
32
- const written = await writeEvidenceBundle(bundle, parsed.path, parsed.overwrite, filePolicy);
61
+ const written = await writeEvidenceBundle(bundle, input.path, input.overwrite, filePolicy);
33
62
  return written.ok
34
63
  ? toCallToolResult(ok({
35
64
  path: written.value.path,
36
65
  bytes: written.value.bytes,
37
66
  records: bundle.records.length,
67
+ unknowns: bundle.unknowns.length,
38
68
  }), exportContract)
39
69
  : toCallToolResult(written, exportContract);
40
70
  });
41
71
  };
72
+ const registerSnapshotEvidenceTool = ({ server, session, snapshotContract, }) => {
73
+ server.registerTool(snapshotContract.name, toolRegistrationOptions(snapshotContract), () => {
74
+ const snapshot = session.snapshotEvidenceBundle();
75
+ if (!snapshot.ok)
76
+ return toCallToolResult(snapshot, snapshotContract);
77
+ const value = {
78
+ bundle_digest: snapshot.value.bundleDigest,
79
+ bundle_version: snapshot.value.bundleVersion,
80
+ bytes: snapshot.value.bytes,
81
+ records: snapshot.value.records,
82
+ unknowns: snapshot.value.unknowns,
83
+ scope: snapshot.value.scope,
84
+ survives_session: snapshot.value.survivesSession,
85
+ bundle_uri: snapshot.value.uri,
86
+ };
87
+ return toCallToolResult(ok(value), snapshotContract, {
88
+ resourceLinks: [
89
+ {
90
+ uri: snapshot.value.uri,
91
+ name: snapshot.value.bundleDigest,
92
+ description: "Immutable session-retained Evidence v2 bundle",
93
+ },
94
+ ],
95
+ });
96
+ });
97
+ };
42
98
  const registerImportEvidenceTool = ({ server, session, importContract, filePolicy, permissionAuthority, }) => {
43
99
  server.registerTool(importContract.name, toolRegistrationOptions(importContract), async (input) => {
44
- const parsedInput = safeParseToolInput(importEvidenceBundleInputSchema, input, importContract.name);
45
- if (!parsedInput.ok)
46
- return toCallToolResult(parsedInput, importContract);
47
- const path = parsedInput.value.path;
100
+ const path = input.path;
48
101
  const denied = await authorizeEvidencePath({
49
102
  authority: permissionAuthority,
50
103
  capability: "evidence_read",
@@ -57,17 +110,20 @@ const registerImportEvidenceTool = ({ server, session, importContract, filePolic
57
110
  const loaded = await readEvidenceBundle(path, filePolicy);
58
111
  if (!loaded.ok)
59
112
  return toCallToolResult(loaded, importContract);
113
+ const retainedUnknownRevisions = new Set(session
114
+ .exportEvidenceBundle()
115
+ .unknowns.map((unknown) => unknownRevisionKey(unknown)));
60
116
  const imported = session.importEvidenceBundle(loaded.value);
61
- if (imported.ok && imported.value > 0)
62
- server.sendResourceListChanged();
63
117
  return imported.ok
64
118
  ? toCallToolResult(ok({
65
119
  imported: imported.value,
120
+ unknowns_added: loaded.value.unknowns.filter((unknown) => !retainedUnknownRevisions.has(unknownRevisionKey(unknown))).length,
66
121
  total: session.exportEvidenceBundle().records.length,
67
122
  }), importContract)
68
123
  : toCallToolResult(imported, importContract);
69
124
  });
70
125
  };
126
+ const unknownRevisionKey = (unknown) => `${unknown.unknown_id}:${String(unknown.revision)}`;
71
127
  const authorizeEvidencePath = async (input) => {
72
128
  if (input.authority === undefined)
73
129
  return undefined;
@@ -83,49 +139,92 @@ const authorizeEvidencePath = async (input) => {
83
139
  return authorized.ok ? undefined : permissionFailure(authorized);
84
140
  };
85
141
  /** Register residual-unknown query and mutation tools. */
86
- export const registerUnknownTools = ({ server, session, contracts, }) => {
142
+ const registerListUnknownsTool = ({ server, session, contracts, }) => {
87
143
  const listContract = contracts[14];
88
- const recordContract = contracts[15];
89
- const updateContract = contracts[16];
90
- const verifyContract = contracts[17];
91
144
  server.registerTool(listContract.name, toolRegistrationOptions(listContract), (input) => {
92
- const parsed = safeParseToolInput(listUnknownsInputSchema, input, listContract.name);
93
- if (!parsed.ok)
94
- return toCallToolResult(parsed, listContract);
95
- const filters = parsed.value;
96
- return toCallToolResult(ok(session.listUnknowns({
145
+ const filters = input;
146
+ const all = session.listUnknowns({
97
147
  ...(filters.status === undefined ? {} : { status: filters.status }),
98
148
  ...(filters.severity === undefined
99
149
  ? {}
100
150
  : { severity: filters.severity }),
101
151
  ...(filters.domain === undefined ? {} : { domain: filters.domain }),
102
- })), listContract);
152
+ });
153
+ const items = all
154
+ .slice(filters.offset, filters.offset + filters.limit)
155
+ .map((unknown) => ({
156
+ unknown,
157
+ uri: `rea://unknown/${unknown.unknown_id}`,
158
+ }));
159
+ const nextOffset = filters.offset + items.length < all.length
160
+ ? filters.offset + items.length
161
+ : null;
162
+ return toCallToolResult(ok({
163
+ items,
164
+ offset: filters.offset,
165
+ limit: filters.limit,
166
+ total: all.length,
167
+ next_offset: nextOffset,
168
+ has_more: nextOffset !== null,
169
+ }), listContract, {
170
+ resourceLinks: items.map((unknown) => ({
171
+ uri: unknown.uri,
172
+ name: unknown.unknown.unknown_id,
173
+ description: `Current ${unknown.unknown.status} residual unknown revision`,
174
+ })),
175
+ });
103
176
  });
177
+ };
178
+ const registerRecordUnknownTool = ({ server, session, contracts, }) => {
179
+ const recordContract = contracts[15];
104
180
  server.registerTool(recordContract.name, toolRegistrationOptions(recordContract), (input) => {
105
- const parsed = safeParseToolInput(recordUnknownInputSchema, input, recordContract.name);
106
- if (!parsed.ok)
107
- return toCallToolResult(parsed, recordContract);
108
- const result = session.recordUnknown(parsed.value);
109
- if (result.ok)
110
- server.sendResourceListChanged();
111
- return toCallToolResult(result, recordContract);
181
+ const result = session.recordUnknown(input);
182
+ return result.ok
183
+ ? toCallToolResult(result, recordContract, {
184
+ resourceLinks: [
185
+ {
186
+ uri: `rea://unknown/${result.value.unknown_id}`,
187
+ name: result.value.unknown_id,
188
+ description: "Current residual unknown head",
189
+ },
190
+ ],
191
+ })
192
+ : toCallToolResult(result, recordContract);
112
193
  });
194
+ };
195
+ const registerUpdateUnknownTool = ({ server, session, contracts, }) => {
196
+ const updateContract = contracts[16];
113
197
  server.registerTool(updateContract.name, toolRegistrationOptions(updateContract), (input) => {
114
- const parsed = safeParseToolInput(updateUnknownInputSchema, input, updateContract.name);
115
- if (!parsed.ok)
116
- return toCallToolResult(parsed, updateContract);
117
- const result = session.updateUnknown(parsed.value);
198
+ const result = session.updateUnknown(input);
118
199
  if (result.ok)
119
- server.sendResourceListChanged();
120
- return toCallToolResult(result, updateContract);
121
- });
122
- server.registerTool(verifyContract.name, toolRegistrationOptions(verifyContract), (input) => {
123
- const parsed = safeParseToolInput(verifyUnknownResolutionInputSchema, input, verifyContract.name);
124
- return parsed.ok
125
- ? toCallToolResult(session.verifyUnknownResolution(parsed.value.unknown_id), verifyContract)
126
- : toCallToolResult(parsed, verifyContract);
200
+ void server.server
201
+ .sendResourceUpdated({
202
+ uri: `rea://unknown/${result.value.unknown_id}`,
203
+ })
204
+ .catch(() => undefined);
205
+ return result.ok
206
+ ? toCallToolResult(result, updateContract, {
207
+ resourceLinks: [
208
+ {
209
+ uri: `rea://unknown/${result.value.unknown_id}`,
210
+ name: result.value.unknown_id,
211
+ description: "Updated residual unknown head",
212
+ },
213
+ ],
214
+ })
215
+ : toCallToolResult(result, updateContract);
127
216
  });
128
217
  };
218
+ const registerVerifyUnknownTool = ({ server, session, contracts, }) => {
219
+ const verifyContract = contracts[17];
220
+ server.registerTool(verifyContract.name, toolRegistrationOptions(verifyContract), (input) => toCallToolResult(session.verifyUnknownResolution(input.unknown_id), verifyContract));
221
+ };
222
+ export const registerUnknownTools = (registration) => {
223
+ registerListUnknownsTool(registration);
224
+ registerRecordUnknownTool(registration);
225
+ registerUpdateUnknownTool(registration);
226
+ registerVerifyUnknownTool(registration);
227
+ };
129
228
  const permissionFailure = (failure) => {
130
229
  if (failure.ok)
131
230
  return err(new AnalysisProtocolError("Expected a denied permission"));
@@ -1,53 +1,38 @@
1
+ import { buildCapabilityInventory } from "../application/CapabilityInventory.js";
1
2
  import { binarySessionInputSchema, SESSION_TOOL_CONTRACTS, } from "../contracts/toolContracts.js";
2
- import { toCallToolResult } from "./toolResult.js";
3
3
  import { jsonObjectSchema } from "../domain/jsonValue.js";
4
4
  import { createServerIdentity } from "../serverIdentity.js";
5
- import { buildCapabilityInventory } from "../application/CapabilityInventory.js";
5
+ import { mcpClientMetadata } from "./mcpClientMetadata.js";
6
6
  import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
7
- import { safeParseToolInput } from "./toolInputValidation.js";
7
+ import { toCallToolResult } from "./toolResult.js";
8
8
  /** Register the read-only provider and target status operation. */
9
9
  export const registerSessionStatusTool = (options) => {
10
10
  const { server, session, contract, startedAt, availabilityPolicy } = options;
11
- server.registerTool(contract.name, toolRegistrationOptions(contract), (input) => {
12
- const parsedInput = safeParseToolInput(binarySessionInputSchema, input, contract.name);
13
- if (!parsedInput.ok)
14
- return toCallToolResult(parsedInput, contract);
15
- const parsed = parsedInput.value;
16
- const client = server.server.getClientVersion();
17
- const clientCapabilities = server.server.getClientCapabilities();
18
- const clientFeatures = {
19
- elicitation_form: clientCapabilities?.elicitation?.form !== undefined,
20
- elicitation_url: clientCapabilities?.elicitation?.url !== undefined,
21
- roots: clientCapabilities?.roots !== undefined,
22
- sampling: clientCapabilities?.sampling !== undefined,
23
- };
11
+ server.registerTool(contract.name, toolRegistrationOptions(contract), (input, context) => {
12
+ const { client, clientFeatures, protocolVersion } = mcpClientMetadata(context);
24
13
  const status = session.status();
25
14
  const statusObject = jsonObjectSchema.parse(status);
26
15
  const toolAvailability = buildCapabilityInventory(status, availabilityPolicy(), clientFeatures);
27
16
  const serverIdentity = createServerIdentity({
28
17
  startedAt,
29
18
  expected: {
30
- ...(parsed.expected_package_version === undefined
19
+ ...(input.expected_package_version === undefined
31
20
  ? {}
32
- : { package_version: parsed.expected_package_version }),
33
- ...(parsed.expected_catalog_digest === undefined
21
+ : { package_version: input.expected_package_version }),
22
+ ...(input.expected_catalog_digest === undefined
34
23
  ? {}
35
- : { catalog_digest: parsed.expected_catalog_digest }),
36
- ...(parsed.expected_server_path === undefined
24
+ : { catalog_digest: input.expected_catalog_digest }),
25
+ ...(input.expected_server_path === undefined
37
26
  ? {}
38
- : { server_path: parsed.expected_server_path }),
27
+ : { server_path: input.expected_server_path }),
39
28
  },
40
29
  ...(client === undefined ? {} : { client }),
41
- ...(server.server.getNegotiatedProtocolVersion() === undefined
42
- ? {}
43
- : {
44
- protocolVersion: server.server.getNegotiatedProtocolVersion(),
45
- }),
30
+ ...(protocolVersion === undefined ? {} : { protocolVersion }),
46
31
  });
47
32
  return toCallToolResult({
48
33
  ok: true,
49
34
  value: projectSessionStatus({
50
- input: parsed,
35
+ input: input,
51
36
  status: statusObject,
52
37
  toolAvailability,
53
38
  serverIdentity,
@@ -118,7 +103,7 @@ const recommendedActions = (open, alignment) => [
118
103
  : []),
119
104
  ...(!open
120
105
  ? [
121
- "Route the supplied target directly: ASAR/JavaScript to analyze_javascript_application, unfamiliar packages to inspect_artifact, managed PE/CLI to inspect_managed_artifact, browser/Electron runtimes to their list-target tools, and native binaries to open_binary.",
106
+ "For a supplied target, route by format: ASAR/JavaScript to analyze_javascript_application; archive/package to open_binary(path), then inspect_artifact or inventory_artifact on the active target; managed PE/CLI to inspect_managed_artifact; browser/Electron runtimes to their list-target tools; native binaries to open_binary.",
122
107
  ]
123
108
  : [
124
109
  "Continue from the active target with binary_overview or a bounded target-specific query.",
@@ -1,32 +1,30 @@
1
1
  import { z } from "zod";
2
- import { 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";
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";
30
28
  const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) => {
31
29
  if (scenario.unknown_registry_approved !== true)
32
30
  return ok(null);
@@ -58,10 +56,7 @@ const recordProcessResidualUnknowns = (session, scenario, evidence, residuals) =
58
56
  };
59
57
  const registerProcessTools = ({ server, session, logger, processPolicy, captureContract, permissionAuthority, processCaptureElicitation, }) => {
60
58
  server.registerTool(captureContract.name, toolRegistrationOptions(captureContract), async (input, context) => {
61
- const parsedInput = safeParseToolInput(processScenarioSchema, input, captureContract.name);
62
- if (!parsedInput.ok)
63
- return toCallToolResult(parsedInput, captureContract);
64
- const scenario = parsedInput.value;
59
+ const scenario = input;
65
60
  if (permissionAuthority !== undefined) {
66
61
  const request = processCapturePermissionRequest(scenario);
67
62
  const authorized = processCaptureElicitation === undefined
@@ -79,7 +74,7 @@ const registerProcessTools = ({ server, session, logger, processPolicy, captureC
79
74
  total: 1,
80
75
  message: "started",
81
76
  });
82
- 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));
83
78
  await progress.report({
84
79
  phase: captureContract.name,
85
80
  completed: 1,
@@ -113,39 +108,33 @@ const registerLifecycleTools = (registration) => {
113
108
  };
114
109
  const registerOpenLifecycleTool = ({ server, session, logger, contracts: [openContract], snapshotFilePolicy, permissionAuthority, }) => {
115
110
  server.registerTool(openContract.name, toolRegistrationOptions(openContract), async (input, context) => {
116
- const parsedInput = safeParseToolInput(openBinaryInputSchema, input, openContract.name);
117
- if (!parsedInput.ok)
118
- return toCallToolResult(parsedInput, openContract);
119
- const parsed = parsedInput.value;
120
111
  let snapshot;
121
- if (parsed.snapshot_path !== undefined) {
112
+ if (input.snapshot_path !== undefined) {
122
113
  if (permissionAuthority !== undefined) {
123
114
  const authorized = await permissionAuthority.authorize({
124
115
  capability: "snapshot_read",
125
- roots: [parsed.snapshot_path],
116
+ roots: [input.snapshot_path],
126
117
  executables: [],
127
118
  environment_names: [],
128
119
  network: "none",
129
120
  mount: false,
130
- operation_identity: `open_binary:snapshot:${parsed.snapshot_path}`,
121
+ operation_identity: `open_binary:snapshot:${input.snapshot_path}`,
131
122
  }, "read");
132
123
  if (!authorized.ok)
133
124
  return toCallToolResult(permissionFailure(authorized), openContract);
134
125
  }
135
- const loaded = await readAnalysisSnapshot(parsed.snapshot_path, snapshotFilePolicy);
126
+ const loaded = await readAnalysisSnapshot(input.snapshot_path, snapshotFilePolicy);
136
127
  if (!loaded.ok)
137
128
  return toCallToolResult(loaded, openContract);
138
129
  snapshot = loaded.value;
139
130
  }
140
- const opened = await logToolExecution(logger, openContract.name, () => session.open(parsed.path, {
131
+ const opened = await logToolExecution(logger, openContract.name, () => session.open(input.path, {
141
132
  signal: context.mcpReq.signal,
142
- ...(parsed.provider_id === undefined
133
+ ...(input.provider_id === undefined
143
134
  ? {}
144
- : { providerId: parsed.provider_id }),
135
+ : { providerId: input.provider_id }),
145
136
  ...(snapshot === undefined ? {} : { snapshot }),
146
137
  }));
147
- if (opened.ok)
148
- server.sendToolListChanged();
149
138
  return opened.ok
150
139
  ? toCallToolResult({
151
140
  ok: true,
@@ -171,11 +160,23 @@ const registerRecordAndReplayTools = (server, session, logger) => {
171
160
  });
172
161
  registerReplayMachineTool(server, logger);
173
162
  };
163
+ const registerContextTools = (server, session) => {
164
+ const navigationContract = SESSION_TOOL_CONTRACTS[21];
165
+ const addressContract = SESSION_TOOL_CONTRACTS[22];
166
+ server.registerTool(navigationContract.name, toolRegistrationOptions(navigationContract), async (input, context) => {
167
+ return toCallToolResult(await getNavigationContext(session, input, context.mcpReq.signal), navigationContract);
168
+ });
169
+ server.registerTool(addressContract.name, toolRegistrationOptions(addressContract), async (input, context) => {
170
+ return toCallToolResult(await inspectAddressContext(session, input, context.mcpReq.signal), addressContract);
171
+ });
172
+ };
174
173
  export const registerSessionTools = (server, session, logger, options = {}) => {
175
- const processPolicy = options.processPolicy ?? DENY_PROCESS_POLICY;
174
+ const processPolicy = options.processPolicy ?? (() => DENY_PROCESS_POLICY);
176
175
  const evidenceFilePolicy = options.evidenceFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
177
176
  const analysisSnapshotFilePolicy = options.analysisSnapshotFilePolicy ?? DENY_EVIDENCE_FILE_POLICY;
178
177
  const [openContract, closeContract, statusContract, exportContract, importContract, captureContract, compareContract, compareArtifactsContract, compareFunctionsContract, compareBundlesContract, changedBehaviorContract, callPathContract, staticRuntimeContract, reconstructionContract,] = SESSION_TOOL_CONTRACTS;
178
+ const snapshotContract = SESSION_TOOL_CONTRACTS[19];
179
+ const releaseContract = SESSION_TOOL_CONTRACTS[20];
179
180
  registerLifecycleTools({
180
181
  server,
181
182
  session,
@@ -184,7 +185,7 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
184
185
  snapshotFilePolicy: analysisSnapshotFilePolicy,
185
186
  startedAt: options.startedAt ?? new Date().toISOString(),
186
187
  availabilityPolicy: sessionAvailabilityPolicy(options.availabilityPolicy, {
187
- processPolicy,
188
+ processPolicy: processPolicy(),
188
189
  evidenceFilePolicy,
189
190
  investigationInputRoots: options.investigationInputRoots ?? [],
190
191
  }),
@@ -197,6 +198,8 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
197
198
  session,
198
199
  exportContract,
199
200
  importContract,
201
+ snapshotContract,
202
+ releaseContract,
200
203
  filePolicy: evidenceFilePolicy,
201
204
  ...(options.permissionAuthority === undefined
202
205
  ? {}
@@ -238,4 +241,5 @@ export const registerSessionTools = (server, session, logger, options = {}) => {
238
241
  : { permissionAuthority: options.permissionAuthority }),
239
242
  });
240
243
  registerRecordAndReplayTools(server, session, logger);
244
+ registerContextTools(server, session);
241
245
  };
@@ -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 = {