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.
- package/README.md +20 -12
- package/bridge/ghidra/ReaGhidraBridge.java +477 -4
- package/bridge/hopper_bridge.py +54 -4
- package/dist/application/AnalysisContextQueries.js +142 -0
- package/dist/application/AnalysisSnapshotCache.js +4 -2
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +19 -11
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +0 -3
- package/dist/application/ArtifactInventory/scanReader.js +7 -7
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/BinarySession.js +19 -20
- package/dist/application/BinarySessionComposition.js +21 -0
- package/dist/application/BinarySessionRecords.js +106 -10
- package/dist/application/BinarySessionStatus.js +11 -5
- package/dist/application/BrowserEvidence.js +3 -5
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +140 -55
- package/dist/application/ClientRegistrationStatus.js +4 -1
- package/dist/application/CrossVersionInventory.js +7 -6
- package/dist/application/DirectAnalysis.js +6 -2
- package/dist/application/ElectronActiveEvidence.js +55 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +81 -0
- package/dist/application/EnhancedTools.js +49 -17
- package/dist/application/EvidenceBundleCommands.js +5 -1
- package/dist/application/EvidenceLedger.js +53 -17
- package/dist/application/JavaScriptArtifactAnalysis.js +13 -4
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayService.js +23 -15
- package/dist/application/LazyAnalysisProvider.js +77 -0
- package/dist/application/LoopbackReplay.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +9 -5
- package/dist/application/NativeApiInspection.js +80 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +8 -9
- package/dist/application/ProcessCaptureLifecycle.js +5 -0
- package/dist/application/ProcessCli.js +2 -1
- package/dist/application/ProcessHarness.js +8 -3
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProjectPermissionStore.js +1 -0
- package/dist/application/ReferenceSourceImport.js +2 -2
- package/dist/application/SessionProviderRouter.js +6 -6
- package/dist/application/SetupClientConfiguration.js +10 -3
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/application/runtime.js +26 -9
- package/dist/artifacts/ArtifactProvider.js +8 -10
- package/dist/artifacts/SafeOutputTree.js +7 -8
- package/dist/browser/CdpCaptureStorageFingerprints.js +10 -7
- package/dist/browser/CdpElectronInspection.js +3 -1
- package/dist/browser/JavaScriptRuntimeScope.js +5 -0
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +8 -2
- package/dist/browser/PlaywrightElectronActiveActions.js +324 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +294 -0
- package/dist/browser/PlaywrightScenarioBrowser.js +4 -4
- package/dist/browser/PlaywrightScenarioSession.js +4 -4
- package/dist/browser/SensitiveTextCapture.js +1 -1
- package/dist/browser/V8InspectorCaptureProjection.js +1 -0
- package/dist/browser/V8InspectorProvider.js +3 -3
- package/dist/catalogIdentity.js +15 -9
- package/dist/cli/artifactCommands.js +5 -3
- package/dist/cli/coreAnalysisCommands.js +41 -0
- package/dist/cli/managedCommands.js +1 -1
- package/dist/cliApplicationCommands.js +2 -2
- package/dist/cliBrowserAdvancedCommands.js +11 -5
- package/dist/cliBrowserCommands.js +14 -7
- package/dist/cliCommandNames.js +2 -0
- package/dist/cliElectronCommands.js +46 -4
- package/dist/cliJavaScriptRuntimeCommands.js +14 -6
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliPolicyCommands.js +1 -0
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -0
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -200
- package/dist/config/parsers.js +10 -1
- package/dist/config/passiveObservation.js +157 -0
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/applicationToolContracts.js +2 -5
- package/dist/contracts/applicationWorkflowInputContracts.js +86 -96
- package/dist/contracts/artifactToolContracts.js +35 -37
- package/dist/contracts/browserToolContracts.js +2 -2
- package/dist/contracts/electronToolContracts.js +30 -1
- package/dist/contracts/enhancedInputs.js +21 -27
- package/dist/contracts/functionWorkflowToolContracts.js +29 -0
- package/dist/contracts/managedToolContracts.js +4 -9
- package/dist/contracts/managedWorkflowExamples.js +12 -9
- package/dist/contracts/managedWorkflowToolContracts.js +30 -27
- package/dist/contracts/nativeToolContracts.js +2 -3
- package/dist/contracts/promptContracts.js +14 -15
- package/dist/contracts/sessionToolSchemas.js +61 -0
- package/dist/contracts/toolContractExamples.js +4 -0
- package/dist/contracts/toolContractHelpers.js +23 -0
- package/dist/contracts/toolContracts.js +12 -67
- package/dist/contracts/toolEffects.js +19 -0
- package/dist/contracts/toolOutputSchemaGroups.js +66 -11
- package/dist/contracts/toolOutputSchemaPrimitives.js +76 -26
- package/dist/contracts/toolSchemaMetadata.js +128 -0
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +8 -2
- package/dist/domain/analysisErrorProjection.js +1 -0
- package/dist/domain/androidApplication.js +2 -0
- package/dist/domain/appleApplication.js +2 -0
- package/dist/domain/binaryTarget.js +7 -5
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +21 -69
- package/dist/domain/browserObservation.js +22 -9
- package/dist/domain/bytecodeProvider.js +177 -0
- package/dist/domain/callPath.js +3 -2
- package/dist/domain/conformancePackage.js +169 -0
- package/dist/domain/conformanceReplay.js +104 -0
- package/dist/domain/conformanceTrustGate.js +328 -0
- package/dist/domain/customProtocolCapture.js +137 -0
- package/dist/domain/electronActiveObservation.js +277 -0
- package/dist/domain/electronObservation.js +15 -11
- package/dist/domain/electronStaticAnalysisValues.js +4 -1
- package/dist/domain/eventProcessTree.js +217 -0
- package/dist/domain/evidenceBundle.js +47 -0
- package/dist/domain/functionComparisonNormalization.js +15 -8
- package/dist/domain/functionDossierEvidence.js +9 -4
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +68 -68
- package/dist/domain/inputIssueProjection.js +11 -2
- package/dist/domain/investigationWorkspace.js +16 -15
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +2 -2
- package/dist/domain/javascriptReplay.js +79 -63
- package/dist/domain/javascriptRuntimeObservation.js +1 -0
- package/dist/domain/javascriptRuntimeReconciliationActive.js +89 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +11 -10
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +57 -49
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +5 -1
- package/dist/domain/javascriptRuntimeReconciliationResult.js +21 -14
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
- package/dist/domain/javascriptSemanticAnalysis.js +8 -12
- package/dist/domain/javascriptSourceParser.js +15 -0
- package/dist/domain/javascriptStaticAnalysis.js +8 -12
- package/dist/domain/knownPageCoverage.js +15 -7
- package/dist/domain/mobileApplicationInvestigation.js +159 -0
- package/dist/domain/nativeApiBoundary.js +138 -0
- package/dist/domain/nodeRuntimeCharacterization.js +14 -13
- package/dist/domain/objcSwiftMetadata.js +150 -0
- package/dist/domain/packageAnalysis.js +123 -0
- package/dist/domain/peInspection.js +196 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +7 -3
- package/dist/domain/processComparison.js +12 -7
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +14 -7
- package/dist/domain/processReactiveTransition.js +9 -3
- package/dist/domain/processScenario.js +6 -3
- package/dist/domain/processTraceComparison.js +3 -2
- package/dist/domain/protocolCapture.js +245 -0
- package/dist/domain/reconstructionReadinessSchemas.js +30 -2
- package/dist/domain/referenceSourceImportParsing.js +2 -2
- package/dist/domain/replayMachineRuntime.js +5 -3
- package/dist/domain/sourceToBundleComparison.js +2 -2
- package/dist/domain/sourceToBundleComparisonSchemas.js +8 -8
- package/dist/domain/sourceToBundleSignals.js +7 -1
- package/dist/domain/staticRuntimeCorrelation.js +7 -5
- package/dist/domain/webBundleAnalysis.js +14 -14
- package/dist/domain/webCaptureDiff.js +15 -12
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +2 -3
- package/dist/dotnet/ManagedStaticProvider.js +34 -5
- package/dist/generatedMcpToolCatalog.js +37 -0
- package/dist/generatedPackageMetadata.js +4 -4
- package/dist/ghidra/GhidraClient.js +1 -1
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraDefaults.js +1 -1
- package/dist/ghidra/GhidraFunctionValues.js +44 -16
- package/dist/ghidra/GhidraInventoryValues.js +57 -47
- package/dist/ghidra/GhidraProvider.js +18 -10
- package/dist/ghidra/GhidraProviderCapabilities.js +45 -39
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +3 -1
- package/dist/hopper/HopperAnalysisProfile.js +2 -4
- package/dist/hopper/HopperCleanup.js +5 -6
- package/dist/hopper/HopperClient.js +27 -3
- package/dist/hopper/HopperProvider.js +42 -44
- package/dist/hopper/HopperRequestQueue.js +32 -4
- package/dist/hopper/HopperResponseStream.js +2 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +16 -10
- package/dist/hopper/protocol.js +63 -21
- package/dist/main/reload.js +1 -6
- package/dist/main/state.js +0 -14
- package/dist/main/transport.js +31 -41
- package/dist/main.js +17 -13
- package/dist/mcpDoctor.js +4 -26
- package/dist/mcpStartupPolicy.js +14 -0
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +64 -128
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +88 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +3 -3
- package/dist/reference/ReferenceSourceReaderEntries.js +2 -2
- package/dist/replay/JavaScriptReplayWorker.js +95 -11
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +10 -15
- package/dist/replay/ReplayOutcome.js +26 -15
- package/dist/replay/ReplayWorkerProtocol.js +34 -29
- package/dist/server/createServer.js +101 -144
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/registerApplicationTools/characterization.js +6 -13
- package/dist/server/registerApplicationTools/compareExportShapes.js +2 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +2 -7
- package/dist/server/registerApplicationTools/compareVersions.js +3 -8
- package/dist/server/registerApplicationTools/controlledReplay.js +6 -11
- package/dist/server/registerApplicationTools/coverage.js +13 -19
- package/dist/server/registerApplicationTools/obligationLedger.js +1 -6
- package/dist/server/registerApplicationTools/readiness.js +1 -6
- package/dist/server/registerApplicationTools/traceFeature.js +3 -8
- package/dist/server/registerApplicationTools/traceSemantics.js +1 -6
- package/dist/server/registerArtifactComparisonTool.js +12 -16
- package/dist/server/registerBrowserScenarioTool.js +1 -6
- package/dist/server/registerBrowserTools.js +37 -79
- package/dist/server/registerBundleComparisonTool.js +10 -14
- package/dist/server/registerCloseLifecycleTool.js +6 -14
- package/dist/server/registerElectronTools.js +30 -47
- package/dist/server/registerEnhancedTools.js +124 -122
- package/dist/server/registerEvidenceResources.js +50 -101
- package/dist/server/registerEvidenceTools.js +5 -9
- package/dist/server/registerFunctionComparisonTool.js +11 -15
- package/dist/server/registerInvestigationTools.js +42 -59
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +13 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -9
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +8 -13
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +4 -9
- package/dist/server/registerOfficialTools.js +8 -9
- package/dist/server/registerProcessComparisonTool.js +19 -24
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -7
- package/dist/server/registerReconstructionReadinessResource.js +0 -7
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +146 -47
- package/dist/server/registerSessionStatusTool.js +14 -29
- package/dist/server/registerSessionTools.js +45 -41
- package/dist/server/sessionAvailabilityPolicy.js +2 -1
- package/dist/server/sessionToolPolicies.js +1 -5
- package/dist/server/toolRegistrationOptions.js +4 -177
- package/dist/server/toolResult.js +14 -18
- package/package.json +35 -16
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +501 -0
- package/skills/reverse-engineer-anything/SKILL.md +10 -3
- package/dist/server/DynamicToolAvailability.js +0 -70
- 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 {
|
|
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
|
-
|
|
9
|
-
|
|
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
|
|
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 {
|
|
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:
|
|
55
|
+
path: input.path,
|
|
27
56
|
access: "write",
|
|
28
|
-
operationIdentity: `export_evidence:${
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
93
|
-
|
|
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
|
-
})
|
|
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
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
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.
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return
|
|
125
|
-
? toCallToolResult(
|
|
126
|
-
|
|
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 {
|
|
5
|
+
import { mcpClientMetadata } from "./mcpClientMetadata.js";
|
|
6
6
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
7
|
-
import {
|
|
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
|
|
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
|
-
...(
|
|
19
|
+
...(input.expected_package_version === undefined
|
|
31
20
|
? {}
|
|
32
|
-
: { package_version:
|
|
33
|
-
...(
|
|
21
|
+
: { package_version: input.expected_package_version }),
|
|
22
|
+
...(input.expected_catalog_digest === undefined
|
|
34
23
|
? {}
|
|
35
|
-
: { catalog_digest:
|
|
36
|
-
...(
|
|
24
|
+
: { catalog_digest: input.expected_catalog_digest }),
|
|
25
|
+
...(input.expected_server_path === undefined
|
|
37
26
|
? {}
|
|
38
|
-
: { server_path:
|
|
27
|
+
: { server_path: input.expected_server_path }),
|
|
39
28
|
},
|
|
40
29
|
...(client === undefined ? {} : { client }),
|
|
41
|
-
...(
|
|
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:
|
|
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
|
-
"
|
|
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 {
|
|
3
|
-
import {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
29
|
-
import {
|
|
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
|
|
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 (
|
|
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: [
|
|
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:${
|
|
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(
|
|
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(
|
|
131
|
+
const opened = await logToolExecution(logger, openContract.name, () => session.open(input.path, {
|
|
141
132
|
signal: context.mcpReq.signal,
|
|
142
|
-
...(
|
|
133
|
+
...(input.provider_id === undefined
|
|
143
134
|
? {}
|
|
144
|
-
: { providerId:
|
|
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
|
-
|
|
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 = {
|