rea-agents 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -16
- package/dist/application/AnalysisContextQueries.js +21 -9
- 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 +14 -16
- package/dist/application/BinarySessionRecords.js +31 -5
- 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 +134 -63
- package/dist/application/CrossVersionInventory.js +7 -6
- 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 +22 -20
- package/dist/application/EvidenceBundleCommands.js +5 -1
- package/dist/application/EvidenceLedger.js +8 -1
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayService.js +23 -15
- package/dist/application/ManagedRuntimeCorrelationService.js +9 -5
- 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/SetupClientConfiguration.js +6 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- 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/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 +12 -6
- 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 +1 -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 +27 -34
- package/dist/contracts/browserToolContracts.js +2 -2
- package/dist/contracts/electronToolContracts.js +30 -1
- package/dist/contracts/enhancedInputs.js +13 -29
- package/dist/contracts/functionWorkflowToolContracts.js +2 -3
- 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/sessionToolSchemas.js +61 -0
- package/dist/contracts/toolContractExamples.js +1 -0
- package/dist/contracts/toolContractHelpers.js +23 -0
- package/dist/contracts/toolContracts.js +5 -77
- package/dist/contracts/toolEffects.js +15 -0
- package/dist/contracts/toolOutputSchemaGroups.js +17 -2
- package/dist/contracts/toolOutputSchemaPrimitives.js +76 -26
- package/dist/contracts/toolSchemaMetadata.js +128 -0
- package/dist/doctorRuntime.js +1 -1
- 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 +33 -35
- package/dist/domain/callPath.js +3 -2
- package/dist/domain/conformanceReplay.js +3 -3
- package/dist/domain/conformanceTrustGate.js +151 -16
- package/dist/domain/customProtocolCapture.js +3 -3
- 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 +82 -79
- package/dist/domain/functionComparisonNormalization.js +15 -8
- package/dist/domain/functionDossierEvidence.js +9 -4
- package/dist/domain/hopperValues.js +68 -71
- package/dist/domain/inputIssueProjection.js +4 -1
- 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/knownPageCoverage.js +15 -7
- package/dist/domain/nativeApiBoundary.js +15 -7
- package/dist/domain/nodeRuntimeCharacterization.js +14 -13
- 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 +8 -6
- 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/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraClient.js +1 -1
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraFunctionValues.js +17 -15
- package/dist/ghidra/GhidraInventoryValues.js +57 -47
- package/dist/ghidra/GhidraProvider.js +18 -10
- package/dist/ghidra/GhidraProviderCapabilities.js +5 -1
- 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 +1 -1
- package/dist/hopper/HopperProvider.js +0 -14
- package/dist/hopper/LinuxPrivateDisplayProbe.js +16 -10
- package/dist/main/reload.js +1 -6
- package/dist/main/state.js +0 -14
- package/dist/main/transport.js +30 -37
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +2 -24
- 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 +158 -94
- 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 +114 -122
- package/dist/server/registerEvidenceTools.js +5 -9
- package/dist/server/registerFunctionComparisonTool.js +11 -15
- package/dist/server/registerInvestigationTools.js +41 -57
- 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/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +69 -40
- package/dist/server/registerSessionStatusTool.js +13 -28
- package/dist/server/registerSessionTools.js +36 -52
- package/dist/server/sessionAvailabilityPolicy.js +2 -1
- package/dist/server/sessionToolPolicies.js +1 -5
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +2 -18
- package/package.json +22 -14
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +501 -0
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +2 -2
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { fromJsonSchema, isCallToolResult, isInputRequiredResult, } from "@modelcontextprotocol/server";
|
|
2
|
-
import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
|
|
3
|
-
/**
|
|
4
|
-
* Advertise the generated MCP catalog immediately and hydrate its callbacks
|
|
5
|
-
* through the existing registrars on first execution.
|
|
6
|
-
*/
|
|
7
|
-
export class LazyToolCatalog {
|
|
8
|
-
#server;
|
|
9
|
-
#hydrateRegistrations;
|
|
10
|
-
#includeSessionTools;
|
|
11
|
-
#tools = new Map();
|
|
12
|
-
#hydrations = new Map();
|
|
13
|
-
#hydrationQueue = Promise.resolve();
|
|
14
|
-
#closed = false;
|
|
15
|
-
constructor(server, hydrateRegistrations, includeSessionTools = true) {
|
|
16
|
-
this.#server = server;
|
|
17
|
-
this.#hydrateRegistrations = hydrateRegistrations;
|
|
18
|
-
this.#includeSessionTools = includeSessionTools;
|
|
19
|
-
}
|
|
20
|
-
/** Register every generated tool with a lazy callback. */
|
|
21
|
-
register() {
|
|
22
|
-
for (const contract of GENERATED_MCP_TOOL_CATALOG) {
|
|
23
|
-
if (contract.requiresSession && !this.#includeSessionTools)
|
|
24
|
-
continue;
|
|
25
|
-
const inputSchema = advertisedSchema(contract.inputSchema);
|
|
26
|
-
const outputSchema = advertisedSchema(contract.outputSchema);
|
|
27
|
-
let registered;
|
|
28
|
-
const callback = async (input, context) => {
|
|
29
|
-
await this.#hydrate(contract.kind);
|
|
30
|
-
const handler = registered?.handler;
|
|
31
|
-
if (handler === undefined || handler === callback)
|
|
32
|
-
throw new Error(`MCP tool ${contract.name} was not hydrated`);
|
|
33
|
-
const result = await Reflect.apply(handler, undefined, [
|
|
34
|
-
input,
|
|
35
|
-
context,
|
|
36
|
-
]);
|
|
37
|
-
if (isCallToolResult(result) || isInputRequiredResult(result))
|
|
38
|
-
return result;
|
|
39
|
-
throw new TypeError(`MCP tool ${contract.name} returned an invalid result`);
|
|
40
|
-
};
|
|
41
|
-
registered = this.#server.registerTool(contract.name, {
|
|
42
|
-
title: contract.title,
|
|
43
|
-
description: contract.description,
|
|
44
|
-
inputSchema,
|
|
45
|
-
outputSchema,
|
|
46
|
-
annotations: contract.annotations,
|
|
47
|
-
}, callback);
|
|
48
|
-
this.#tools.set(contract.name, registered);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/** Wait for in-flight hydration and reject future first-use loading. */
|
|
52
|
-
async close() {
|
|
53
|
-
this.#closed = true;
|
|
54
|
-
await Promise.allSettled(this.#hydrations.values());
|
|
55
|
-
}
|
|
56
|
-
async #hydrate(kind) {
|
|
57
|
-
if (this.#closed)
|
|
58
|
-
throw new Error("MCP tool catalog is closed");
|
|
59
|
-
const existing = this.#hydrations.get(kind);
|
|
60
|
-
if (existing !== undefined) {
|
|
61
|
-
await existing;
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const hydration = this.#hydrationQueue
|
|
65
|
-
.catch(() => undefined)
|
|
66
|
-
.then(() => this.#runHydration(kind));
|
|
67
|
-
this.#hydrationQueue = hydration;
|
|
68
|
-
this.#hydrations.set(kind, hydration);
|
|
69
|
-
try {
|
|
70
|
-
await hydration;
|
|
71
|
-
}
|
|
72
|
-
catch (cause) {
|
|
73
|
-
if (this.#hydrations.get(kind) === hydration)
|
|
74
|
-
this.#hydrations.delete(kind);
|
|
75
|
-
throw cause;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
async #runHydration(kind) {
|
|
79
|
-
if (this.#closed)
|
|
80
|
-
throw new Error("MCP tool catalog is closed");
|
|
81
|
-
const expected = GENERATED_MCP_TOOL_CATALOG.filter((contract) => contract.kind === kind &&
|
|
82
|
-
(this.#includeSessionTools || !contract.requiresSession)).map((contract) => contract.name);
|
|
83
|
-
const expectedNames = new Set(expected);
|
|
84
|
-
const hydrated = new Set();
|
|
85
|
-
const originalRegisterTool = this.#server.registerTool;
|
|
86
|
-
const hydrationRegisterTool = (...args) => {
|
|
87
|
-
const [name, config, callback] = args;
|
|
88
|
-
if (typeof name !== "string" ||
|
|
89
|
-
!isRecord(config) ||
|
|
90
|
-
typeof callback !== "function")
|
|
91
|
-
throw new TypeError("Invalid lazy MCP tool registration");
|
|
92
|
-
const registered = this.#tools.get(name);
|
|
93
|
-
if (registered === undefined || !expectedNames.has(name))
|
|
94
|
-
throw new TypeError(`MCP tool ${name} is not in the ${kind} catalog family`);
|
|
95
|
-
if (hydrated.has(name))
|
|
96
|
-
throw new TypeError(`MCP tool ${name} was hydrated more than once`);
|
|
97
|
-
hydrated.add(name);
|
|
98
|
-
Reflect.apply(registered.update, registered, [
|
|
99
|
-
{
|
|
100
|
-
title: config.title,
|
|
101
|
-
description: config.description,
|
|
102
|
-
paramsSchema: config.inputSchema,
|
|
103
|
-
outputSchema: config.outputSchema,
|
|
104
|
-
annotations: config.annotations,
|
|
105
|
-
callback,
|
|
106
|
-
},
|
|
107
|
-
]);
|
|
108
|
-
return registered;
|
|
109
|
-
};
|
|
110
|
-
if (!Reflect.set(this.#server, "registerTool", hydrationRegisterTool))
|
|
111
|
-
throw new TypeError("Unable to install lazy MCP tool hydration");
|
|
112
|
-
try {
|
|
113
|
-
await this.#hydrateRegistrations(kind);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
Reflect.set(this.#server, "registerTool", originalRegisterTool);
|
|
117
|
-
}
|
|
118
|
-
const missing = expected.filter((name) => !hydrated.has(name));
|
|
119
|
-
if (missing.length > 0)
|
|
120
|
-
throw new TypeError(`Generated MCP tools were not hydrated: ${missing.join(", ")}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const advertisedSchema = (jsonSchema) => fromJsonSchema(jsonSchema, DEFERRED_VALIDATION_PROVIDER);
|
|
124
|
-
class DeferredValidationProvider {
|
|
125
|
-
getValidator() {
|
|
126
|
-
return (input) => ({
|
|
127
|
-
valid: true,
|
|
128
|
-
data: input,
|
|
129
|
-
errorMessage: undefined,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
const DEFERRED_VALIDATION_PROVIDER = new DeferredValidationProvider();
|
|
134
|
-
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install production callbacks on generated lazy tool registrations.
|
|
3
|
-
*/
|
|
4
|
-
export const hydrateServerToolFamily = async ({ kind, server, analysis, session, options, context, }) => {
|
|
5
|
-
const toolContext = {
|
|
6
|
-
server,
|
|
7
|
-
analysis,
|
|
8
|
-
session,
|
|
9
|
-
options,
|
|
10
|
-
logger: context.logger,
|
|
11
|
-
permissionAuthority: context.permissionAuthority,
|
|
12
|
-
activeTarget: context.activeTarget,
|
|
13
|
-
recordEvidence: context.recordEvidence,
|
|
14
|
-
recordEvidenceWithUnknown: context.recordEvidenceWithUnknown,
|
|
15
|
-
};
|
|
16
|
-
switch (kind) {
|
|
17
|
-
case "official-proxy": {
|
|
18
|
-
const { registerOfficialTools } = await import("./registerOfficialTools.js");
|
|
19
|
-
registerOfficialTools(server, analysis, analysisOptions(toolContext));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
case "enhanced": {
|
|
23
|
-
const { registerEnhancedTools } = await import("./registerEnhancedTools.js");
|
|
24
|
-
registerEnhancedTools(server, analysis, enhancedOptions(toolContext));
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
case "native-provider": {
|
|
28
|
-
const { registerNativeTools } = await import("./registerNativeTools.js");
|
|
29
|
-
registerNativeTools(server, analysis, evidenceOptions(toolContext));
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
case "artifact-provider": {
|
|
33
|
-
const { registerArtifactTools } = await import("./registerArtifactTools.js");
|
|
34
|
-
registerArtifactTools(server, analysis, {
|
|
35
|
-
...evidenceOptions(toolContext),
|
|
36
|
-
...(context.permissionAuthority === undefined
|
|
37
|
-
? {}
|
|
38
|
-
: { permissionAuthority: context.permissionAuthority }),
|
|
39
|
-
});
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
case "managed-provider": {
|
|
43
|
-
const { registerManagedTools } = await import("./registerManagedTools.js");
|
|
44
|
-
registerManagedTools(server, analysis, {
|
|
45
|
-
...evidenceOptions(toolContext),
|
|
46
|
-
session,
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
case "application":
|
|
51
|
-
await registerApplicationFamily(toolContext);
|
|
52
|
-
return;
|
|
53
|
-
case "browser-provider":
|
|
54
|
-
case "electron-provider":
|
|
55
|
-
case "runtime-provider": {
|
|
56
|
-
await hydrateObservationFamily(kind, toolContext);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
case "session": {
|
|
60
|
-
if (session === undefined)
|
|
61
|
-
throw new TypeError("Session tools require a binary session");
|
|
62
|
-
const { registerSessionTools } = await import("./registerSessionTools.js");
|
|
63
|
-
registerSessionTools(server, session, context.logger, {
|
|
64
|
-
...options,
|
|
65
|
-
...(context.availabilityPolicy === undefined
|
|
66
|
-
? {}
|
|
67
|
-
: { availabilityPolicy: context.availabilityPolicy }),
|
|
68
|
-
...(context.permissionAuthority === undefined
|
|
69
|
-
? {}
|
|
70
|
-
: { permissionAuthority: context.permissionAuthority }),
|
|
71
|
-
startedAt: context.startedAt,
|
|
72
|
-
processCaptureElicitation: context.processCaptureElicitation,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const hydrateObservationFamily = async (kind, context) => {
|
|
78
|
-
const common = {
|
|
79
|
-
logger: context.logger,
|
|
80
|
-
permissionAuthority: context.permissionAuthority,
|
|
81
|
-
recordEvidence: context.recordEvidence,
|
|
82
|
-
};
|
|
83
|
-
if (kind === "browser-provider") {
|
|
84
|
-
const [{ registerBrowserTools }, { registerBrowserScenarioTool }] = await Promise.all([
|
|
85
|
-
import("./registerBrowserTools.js"),
|
|
86
|
-
import("./registerBrowserScenarioTool.js"),
|
|
87
|
-
]);
|
|
88
|
-
registerBrowserTools(context.server, {
|
|
89
|
-
...common,
|
|
90
|
-
browser: context.options.browserObservation,
|
|
91
|
-
});
|
|
92
|
-
registerBrowserScenarioTool(context.server, {
|
|
93
|
-
...common,
|
|
94
|
-
provider: context.options.browserScenarioCapture,
|
|
95
|
-
});
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (kind === "electron-provider") {
|
|
99
|
-
const { registerElectronTools } = await import("./registerElectronTools.js");
|
|
100
|
-
registerElectronTools(context.server, {
|
|
101
|
-
...common,
|
|
102
|
-
electron: context.options.electronObservation,
|
|
103
|
-
});
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const { registerJavaScriptRuntimeObservationTools } = await import("./registerJavaScriptRuntimeObservationTools.js");
|
|
107
|
-
registerJavaScriptRuntimeObservationTools(context.server, {
|
|
108
|
-
...common,
|
|
109
|
-
runtime: context.options.javascriptRuntimeObservation,
|
|
110
|
-
});
|
|
111
|
-
};
|
|
112
|
-
const analysisOptions = ({ logger, activeTarget, recordEvidence, session, }) => {
|
|
113
|
-
const recordUnknown = session === undefined
|
|
114
|
-
? undefined
|
|
115
|
-
: (input) => session.recordUnknown(input);
|
|
116
|
-
return {
|
|
117
|
-
logger,
|
|
118
|
-
activeTarget,
|
|
119
|
-
recordEvidence,
|
|
120
|
-
recordUnknown,
|
|
121
|
-
};
|
|
122
|
-
};
|
|
123
|
-
const enhancedOptions = (context) => ({
|
|
124
|
-
...analysisOptions(context),
|
|
125
|
-
analysisProfile: context.session === undefined
|
|
126
|
-
? undefined
|
|
127
|
-
: () => context.session?.analysisProfile(),
|
|
128
|
-
});
|
|
129
|
-
const evidenceOptions = ({ logger, activeTarget, recordEvidence, }) => ({
|
|
130
|
-
logger,
|
|
131
|
-
activeTarget,
|
|
132
|
-
recordEvidence,
|
|
133
|
-
});
|
|
134
|
-
const registerApplicationFamily = async ({ server, session, options, logger, permissionAuthority, recordEvidence, recordEvidenceWithUnknown, }) => {
|
|
135
|
-
const [{ registerApplicationTools }, { registerManagedWorkflowTools }, { LinuxJavaScriptReplayRunner }, { SystemJavaScriptReplayHost },] = await Promise.all([
|
|
136
|
-
import("./registerApplicationTools.js"),
|
|
137
|
-
import("./registerManagedWorkflowTools.js"),
|
|
138
|
-
import("../replay/LinuxJavaScriptReplayRunner.js"),
|
|
139
|
-
import("../replay/SystemJavaScriptReplayHost.js"),
|
|
140
|
-
]);
|
|
141
|
-
if (session !== undefined)
|
|
142
|
-
registerManagedWorkflowTools(server, {
|
|
143
|
-
logger,
|
|
144
|
-
recordEvidence,
|
|
145
|
-
recordEvidenceWithUnknown,
|
|
146
|
-
session,
|
|
147
|
-
runtime: {
|
|
148
|
-
policy: options.managedRuntimePolicy ?? {
|
|
149
|
-
enabled: false,
|
|
150
|
-
roots: [],
|
|
151
|
-
executablePath: "/usr/bin/dotnet",
|
|
152
|
-
},
|
|
153
|
-
authority: permissionAuthority,
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
registerApplicationTools(server, {
|
|
157
|
-
logger,
|
|
158
|
-
recordEvidence,
|
|
159
|
-
recordEvidenceWithUnknown,
|
|
160
|
-
evidenceLookup: session === undefined
|
|
161
|
-
? undefined
|
|
162
|
-
: (evidenceId) => session.evidenceById(evidenceId),
|
|
163
|
-
evidenceFilePolicy: options.evidenceFilePolicy ?? {
|
|
164
|
-
roots: [],
|
|
165
|
-
maxBytes: 1,
|
|
166
|
-
maxDepth: 1,
|
|
167
|
-
maxStringLength: 1,
|
|
168
|
-
maxNodes: 1,
|
|
169
|
-
},
|
|
170
|
-
permissionAuthority,
|
|
171
|
-
retainCoverageWorkspace: session === undefined
|
|
172
|
-
? undefined
|
|
173
|
-
: (workspace) => {
|
|
174
|
-
return session.retainReconstructionCoverageWorkspace(workspace);
|
|
175
|
-
},
|
|
176
|
-
replay: {
|
|
177
|
-
policy: options.javascriptReplayPolicy ?? {
|
|
178
|
-
enabled: false,
|
|
179
|
-
roots: [],
|
|
180
|
-
nodePath: process.execPath,
|
|
181
|
-
bubblewrapPath: "/usr/bin/bwrap",
|
|
182
|
-
systemdRunPath: "/usr/bin/systemd-run",
|
|
183
|
-
systemctlPath: "/usr/bin/systemctl",
|
|
184
|
-
shellPath: "/usr/bin/bash",
|
|
185
|
-
},
|
|
186
|
-
host: options.javascriptReplayHost ?? new SystemJavaScriptReplayHost(),
|
|
187
|
-
runner: options.javascriptReplayRunner ?? new LinuxJavaScriptReplayRunner(),
|
|
188
|
-
authority: permissionAuthority,
|
|
189
|
-
},
|
|
190
|
-
});
|
|
191
|
-
};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { AnalysisInputError, } from "../domain/errors.js";
|
|
3
|
-
import { projectInputIssues } from "../domain/inputIssueProjection.js";
|
|
4
|
-
import { err, ok } from "../domain/result.js";
|
|
5
|
-
import { closeObjectSchemas } from "./toolRegistrationOptions.js";
|
|
6
|
-
/** Parse one MCP request exactly once and retain only schema-owned correction data. */
|
|
7
|
-
export const safeParseToolInput = (schema, input, operation) => {
|
|
8
|
-
const unknownIssues = unknownArgumentIssues(schema, input);
|
|
9
|
-
if (unknownIssues.length > 0)
|
|
10
|
-
return err(new AnalysisInputError(operation, undefined, unknownIssues));
|
|
11
|
-
const parsed = schema.safeParse(input);
|
|
12
|
-
return parsed.success
|
|
13
|
-
? ok(parsed.data)
|
|
14
|
-
: err(new AnalysisInputError(operation, undefined, projectInputIssues(parsed.error.issues, input)));
|
|
15
|
-
};
|
|
16
|
-
const schemaCache = new WeakMap();
|
|
17
|
-
const unknownArgumentIssues = (schema, input) => {
|
|
18
|
-
let jsonSchema = schemaCache.get(schema);
|
|
19
|
-
if (jsonSchema === undefined) {
|
|
20
|
-
const converter = schema["~standard"].jsonSchema?.input;
|
|
21
|
-
if (converter === undefined)
|
|
22
|
-
throw new TypeError("Tool input schema does not expose Standard JSON Schema");
|
|
23
|
-
jsonSchema = closeObjectSchemas(converter({ target: "draft-2020-12" }));
|
|
24
|
-
schemaCache.set(schema, jsonSchema);
|
|
25
|
-
}
|
|
26
|
-
return scanUnknownArguments(input, jsonSchema, jsonSchema, []);
|
|
27
|
-
};
|
|
28
|
-
const scanUnknownArguments = (value, schema, root, path) => {
|
|
29
|
-
const resolved = resolveSchema(schema, root);
|
|
30
|
-
if (Array.isArray(value)) {
|
|
31
|
-
const items = objectValue(resolved.items);
|
|
32
|
-
return items === undefined
|
|
33
|
-
? []
|
|
34
|
-
: value.flatMap((item, index) => scanUnknownArguments(item, items, root, [...path, index]));
|
|
35
|
-
}
|
|
36
|
-
if (!isObject(value))
|
|
37
|
-
return [];
|
|
38
|
-
const variants = schemaVariants(resolved, root);
|
|
39
|
-
const properties = Object.fromEntries(variants.flatMap((variant) => Object.entries(objectValue(variant.properties) ?? {})));
|
|
40
|
-
const closed = variants.length > 0 &&
|
|
41
|
-
variants.every((variant) => variant.additionalProperties !== true &&
|
|
42
|
-
!isObject(variant.additionalProperties));
|
|
43
|
-
const issues = [];
|
|
44
|
-
for (const [key, child] of Object.entries(value)) {
|
|
45
|
-
const propertySchema = objectValue(properties[key]);
|
|
46
|
-
if (propertySchema === undefined) {
|
|
47
|
-
if (closed)
|
|
48
|
-
issues.push({ path: [...path, key], reason: "unknown_argument" });
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
issues.push(...scanUnknownArguments(child, propertySchema, root, [...path, key]));
|
|
52
|
-
}
|
|
53
|
-
return issues;
|
|
54
|
-
};
|
|
55
|
-
const schemaVariants = (schema, root) => {
|
|
56
|
-
const resolved = resolveSchema(schema, root);
|
|
57
|
-
const variants = [resolved.oneOf, resolved.anyOf, resolved.allOf]
|
|
58
|
-
.flatMap((value) => (Array.isArray(value) ? value : []))
|
|
59
|
-
.flatMap((value) => {
|
|
60
|
-
const object = objectValue(value);
|
|
61
|
-
return object === undefined ? [] : schemaVariants(object, root);
|
|
62
|
-
});
|
|
63
|
-
if (variants.length > 0)
|
|
64
|
-
return variants;
|
|
65
|
-
return resolved.type === "object" || isObject(resolved.properties)
|
|
66
|
-
? [resolved]
|
|
67
|
-
: [];
|
|
68
|
-
};
|
|
69
|
-
const resolveSchema = (schema, root) => {
|
|
70
|
-
const reference = schema.$ref;
|
|
71
|
-
if (typeof reference !== "string" || !reference.startsWith("#/$defs/"))
|
|
72
|
-
return schema;
|
|
73
|
-
const definition = objectValue(objectValue(root.$defs)?.[reference.slice(8)]);
|
|
74
|
-
return definition === undefined ? schema : definition;
|
|
75
|
-
};
|
|
76
|
-
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
77
|
-
const objectValue = (value) => isObject(value) ? value : undefined;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
|
|
4
|
-
const BOOTSTRAP_MARKER = "REA_PACKAGE_RUNNER_BOOTSTRAPPED";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Plan a current-release setup bootstrap when bare npx selected a project-local
|
|
8
|
-
* package. Explicit `npm exec --package=<name>@<version>` rollbacks bypass it.
|
|
9
|
-
*/
|
|
10
|
-
export function packageRunnerSetupPlan(input) {
|
|
11
|
-
if (input.args[0] !== "setup") return undefined;
|
|
12
|
-
if (input.environment[BOOTSTRAP_MARKER] === "1") return undefined;
|
|
13
|
-
if (input.environment.npm_lifecycle_event !== "npx") return undefined;
|
|
14
|
-
|
|
15
|
-
const localPrefix = input.environment.npm_config_local_prefix;
|
|
16
|
-
if (localPrefix === undefined || localPrefix.length === 0) return undefined;
|
|
17
|
-
if (
|
|
18
|
-
!isPackageBelowLocalPrefix(
|
|
19
|
-
input.packageRoot,
|
|
20
|
-
localPrefix,
|
|
21
|
-
input.packageName,
|
|
22
|
-
)
|
|
23
|
-
)
|
|
24
|
-
return undefined;
|
|
25
|
-
|
|
26
|
-
const requestedPackage = input.environment.npm_config_package;
|
|
27
|
-
if (
|
|
28
|
-
requestedPackage !== undefined &&
|
|
29
|
-
isExactPackageVersion(requestedPackage, input.packageName)
|
|
30
|
-
)
|
|
31
|
-
return undefined;
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
command: "npm",
|
|
35
|
-
args: [
|
|
36
|
-
"exec",
|
|
37
|
-
"--yes",
|
|
38
|
-
`--package=${input.packageName}@latest`,
|
|
39
|
-
"--",
|
|
40
|
-
"rea",
|
|
41
|
-
...input.args,
|
|
42
|
-
],
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** Execute a planned package-runner bootstrap and return its exit status. */
|
|
47
|
-
export async function runPackageRunnerSetupBootstrap(input) {
|
|
48
|
-
const plan = packageRunnerSetupPlan(input);
|
|
49
|
-
if (plan === undefined) return undefined;
|
|
50
|
-
|
|
51
|
-
return await new Promise((resolveExitCode) => {
|
|
52
|
-
const child = spawn(plan.command, plan.args, {
|
|
53
|
-
stdio: "inherit",
|
|
54
|
-
env: { ...input.environment, [BOOTSTRAP_MARKER]: "1" },
|
|
55
|
-
});
|
|
56
|
-
child.once("error", () => resolveExitCode(1));
|
|
57
|
-
child.once("exit", (code) => resolveExitCode(code ?? 1));
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function isPackageBelowLocalPrefix(packageRoot, localPrefix, packageName) {
|
|
62
|
-
const expectedRoot = resolve(localPrefix, "node_modules", packageName);
|
|
63
|
-
return resolve(packageRoot) === expectedRoot;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function isExactPackageVersion(packageSpecifier, packageName) {
|
|
67
|
-
const version = packageSpecifier.slice(`${packageName}@`.length);
|
|
68
|
-
return (
|
|
69
|
-
packageSpecifier.startsWith(`${packageName}@`) &&
|
|
70
|
-
/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u.test(version)
|
|
71
|
-
);
|
|
72
|
-
}
|