rea-agents 2.4.0 → 2.5.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 +80 -18
- package/bridge/ghidra/ReaGhidraBridge.java +48 -1
- package/bridge/hopper_bridge.py +259 -24
- package/dist/application/AnalysisClientCleanup.js +14 -0
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +31 -13
- package/dist/application/BinarySession.js +15 -4
- package/dist/application/BinarySessionStatus.js +31 -1
- package/dist/application/BrowserEvidence.js +14 -0
- package/dist/application/BrowserScenarioCapturePort.js +1 -0
- package/dist/application/BrowserScenarioCaptureService.js +53 -0
- package/dist/application/BrowserScenarioEvidence.js +40 -0
- package/dist/application/CallPathTracing.js +160 -0
- package/dist/application/CapabilityInventory.js +68 -12
- package/dist/application/CompositeProvider.js +10 -1
- package/dist/application/DirectAnalysis.js +7 -2
- package/dist/application/EnhancedLiteralTracing.js +118 -0
- package/dist/application/EnhancedTools.js +35 -121
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +13 -0
- package/dist/application/JavaScriptApplicationWorkflowService.js +27 -1
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +34 -0
- package/dist/application/JavaScriptRuntimeObservationPort.js +1 -0
- package/dist/application/JavaScriptRuntimeObservationService.js +46 -0
- package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +147 -0
- package/dist/application/JavaScriptSemanticGraphBuilder.js +34 -6
- package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +156 -0
- package/dist/application/JavaScriptSemanticGraphConstruction.js +2 -2
- package/dist/application/JavaScriptSemanticGraphDataProjection.js +203 -0
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +25 -0
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +129 -8
- package/dist/application/JavaScriptSemanticGraphObjectProjection.js +81 -0
- package/dist/application/JavaScriptSemanticGraphProjection.js +14 -7
- package/dist/application/JavaScriptSemanticGraphResourceProjection.js +59 -0
- package/dist/application/JavaScriptSemanticGraphValueProjection.js +77 -0
- package/dist/application/ProcessReactiveEffects.js +6 -0
- package/dist/application/ProcessReactiveHarness.js +16 -1
- package/dist/application/ProjectPermissionStore.js +1 -0
- package/dist/application/ReconstructionObligationAuthority.js +72 -0
- package/dist/application/ReconstructionObligationCandidates.js +265 -0
- package/dist/application/ReconstructionObligationLedgerDiagnostics.js +47 -0
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +263 -0
- package/dist/application/ReconstructionObligationLedgerProjection.js +86 -0
- package/dist/application/ReconstructionObligationLedgerService.js +72 -0
- package/dist/application/ReconstructionObligationOriginalCases.js +33 -0
- package/dist/application/ReconstructionObligationPolicies.js +132 -0
- package/dist/application/ReconstructionReadinessService.js +48 -0
- package/dist/artifacts/ArtifactProvider.js +87 -22
- package/dist/browser/BrowserScenarioSecrets.js +53 -0
- package/dist/browser/BrowserScenarioSessionPort.js +1 -0
- package/dist/browser/CdpBrowserProvider.js +2 -2
- package/dist/browser/CdpCaptureDocuments.js +57 -0
- package/dist/browser/CdpCaptureStorage.js +71 -29
- package/dist/browser/CdpCaptureStorageFingerprints.js +328 -0
- package/dist/browser/CdpEndpoint.js +8 -6
- package/dist/browser/CdpPageCapture.js +2 -0
- package/dist/browser/JavaScriptRuntimeScope.js +38 -0
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +253 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +42 -0
- package/dist/browser/PlaywrightScenarioActions.js +62 -0
- package/dist/browser/PlaywrightScenarioArtifacts.js +238 -0
- package/dist/browser/PlaywrightScenarioBrowser.js +144 -0
- package/dist/browser/PlaywrightScenarioEvents.js +301 -0
- package/dist/browser/PlaywrightScenarioSession.js +300 -0
- package/dist/browser/V8InspectorCaptureProjection.js +110 -0
- package/dist/browser/V8InspectorEndpoint.js +72 -0
- package/dist/browser/V8InspectorProvider.js +267 -0
- package/dist/catalogIdentity.js +8 -0
- package/dist/cli/artifactCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +37 -0
- package/dist/cli.js +4 -0
- package/dist/cliApplicationCommands.js +30 -2
- package/dist/cliBrowserAdvancedCommands.js +17 -5
- package/dist/cliBrowserCommands.js +1 -0
- package/dist/cliBrowserScenarioCommands.js +43 -0
- package/dist/cliCommandNames.js +8 -0
- package/dist/cliJavaScriptRuntimeCommands.js +164 -0
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliPolicyCommands.js +1 -0
- package/dist/config/environment.js +12 -0
- package/dist/config/parseConfig.js +88 -17
- package/dist/contracts/analysisSearchContract.js +14 -0
- package/dist/contracts/applicationToolContracts.js +86 -2
- package/dist/contracts/applicationWorkflowInputContracts.js +18 -0
- package/dist/contracts/artifactToolContracts.js +22 -0
- package/dist/contracts/browserProviderToolContracts.js +7 -0
- package/dist/contracts/browserScenarioToolContracts.js +81 -0
- package/dist/contracts/browserToolContracts.js +88 -98
- package/dist/contracts/enhancedInputs.js +25 -6
- package/dist/contracts/functionInstructionContract.js +8 -0
- package/dist/contracts/hopperMemoryContracts.js +22 -0
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +42 -0
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +58 -0
- package/dist/contracts/reconstructionReadinessExample.js +436 -0
- package/dist/contracts/toolContractExamples.js +5 -0
- package/dist/contracts/toolContractTypes.js +1 -0
- package/dist/contracts/toolContracts.js +13 -21
- package/dist/contracts/toolEffects.js +21 -0
- package/dist/contracts/toolOutputSchemaGroups.js +70 -20
- package/dist/contracts/toolOutputSchemaPrimitives.js +37 -0
- package/dist/domain/analysisErrorProjection.js +8 -0
- package/dist/domain/artifactInspection.js +347 -0
- package/dist/domain/browserCaptureComparison.js +82 -0
- package/dist/domain/browserObservation.js +8 -1
- package/dist/domain/browserObservationErrors.js +1 -0
- package/dist/domain/browserObservationSchemas.js +26 -0
- package/dist/domain/browserScenario.js +165 -0
- package/dist/domain/browserScenarioCapture.js +57 -0
- package/dist/domain/browserScenarioCaptureValues.js +204 -0
- package/dist/domain/browserScenarioDiff.js +324 -0
- package/dist/domain/browserScenarioDiffValues.js +157 -0
- package/dist/domain/browserScenarioNormalization.js +45 -0
- package/dist/domain/browserScenarioValues.js +372 -0
- package/dist/domain/hopperValues.js +10 -0
- package/dist/domain/javascriptRuntimeObservation.js +170 -0
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +120 -2
- package/dist/domain/javascriptRuntimeReconciliationResult.js +3 -3
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +2 -2
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
- package/dist/domain/javascriptSemanticAnalysis.js +5 -4
- package/dist/domain/javascriptSemanticAsyncEffects.js +253 -0
- package/dist/domain/javascriptSemanticChildProcesses.js +237 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +125 -0
- package/dist/domain/javascriptSemanticDataEffects.js +284 -0
- package/dist/domain/javascriptSemanticDerivedAnalysis.js +41 -0
- package/dist/domain/javascriptSemanticFingerprints.js +174 -0
- package/dist/domain/javascriptSemanticIr.js +21 -1
- package/dist/domain/javascriptSemanticObjects.js +115 -0
- package/dist/domain/javascriptSemanticPromises.js +290 -0
- package/dist/domain/javascriptSemanticResources.js +136 -0
- package/dist/domain/javascriptStaticAnalysis.js +4 -3
- package/dist/domain/javascriptStaticAnalysisBundler.js +38 -0
- package/dist/domain/javascriptStaticAnalysisCalls.js +23 -1
- package/dist/domain/javascriptStaticAnalysisHelpers.js +8 -0
- package/dist/domain/processCapture.js +8 -2
- package/dist/domain/processReactiveScenario.js +1 -0
- package/dist/domain/processReactiveTransition.js +9 -4
- package/dist/domain/providerCleanupError.js +11 -0
- package/dist/domain/reconstructionObligationLedgerSchemas.js +278 -0
- package/dist/domain/reconstructionReadiness.js +121 -0
- package/dist/domain/reconstructionReadinessFindingHelpers.js +17 -0
- package/dist/domain/reconstructionReadinessIntegrityFindings.js +118 -0
- package/dist/domain/reconstructionReadinessJourneyFindings.js +193 -0
- package/dist/domain/reconstructionReadinessSchemas.js +240 -0
- package/dist/domain/sourceToBundleComparison.js +335 -0
- package/dist/domain/sourceToBundleComparisonSchemas.js +133 -0
- package/dist/domain/sourceToBundleSignals.js +202 -0
- package/dist/domain/webCaptureDiff.js +141 -27
- package/dist/domain/webScreenshot.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraDefaults.js +1 -1
- package/dist/ghidra/GhidraFunctionValues.js +13 -1
- package/dist/ghidra/GhidraProviderCapabilities.js +7 -0
- package/dist/hopper/HopperCleanup.js +158 -0
- package/dist/hopper/HopperClient.js +69 -99
- package/dist/hopper/HopperProvider.js +20 -1
- package/dist/hopper/HopperRequestQueue.js +187 -0
- package/dist/hopper/HopperResponseStream.js +46 -0
- package/dist/hopper/protocol.js +1 -0
- package/dist/main/transport.js +24 -24
- package/dist/main.js +6 -0
- package/dist/mcpDoctor.js +25 -2
- package/dist/process/ProcessCommandIdentity.js +19 -0
- package/dist/process/ProcessOwnership.js +11 -8
- package/dist/server/DynamicToolAvailability.js +70 -0
- package/dist/server/createServer.js +46 -1
- package/dist/server/lifecycleProgress.js +10 -0
- package/dist/server/permissionFailure.js +12 -0
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +35 -0
- package/dist/server/registerApplicationTools/helpers.js +11 -7
- package/dist/server/registerApplicationTools/obligationLedger.js +27 -0
- package/dist/server/registerApplicationTools/readiness.js +55 -0
- package/dist/server/registerApplicationTools.js +6 -0
- package/dist/server/registerArtifactTools.js +9 -1
- package/dist/server/registerBrowserScenarioTool.js +25 -0
- package/dist/server/registerBrowserTools.js +2 -2
- package/dist/server/registerCloseLifecycleTool.js +57 -0
- package/dist/server/registerEnhancedTools.js +16 -5
- package/dist/server/registerEvidenceResources.js +4 -0
- package/dist/server/registerEvidenceTools.js +9 -2
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +37 -0
- package/dist/server/registerReconstructionObligationLedgerResource.js +39 -0
- package/dist/server/registerReconstructionReadinessResource.js +39 -0
- package/dist/server/registerSessionStatusTool.js +11 -8
- package/dist/server/registerSessionTools.js +11 -57
- package/dist/server/sessionAvailabilityPolicy.js +10 -8
- package/package.json +12 -6
- package/skills/reverse-engineer-anything/SKILL.md +2 -2
|
@@ -5,7 +5,7 @@ import { CdpBrowserProvider } from "./browser/CdpBrowserProvider.js";
|
|
|
5
5
|
import { logCliCommand } from "./cliLogging.js";
|
|
6
6
|
import { parseConfig } from "./config.js";
|
|
7
7
|
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
8
|
-
import {
|
|
8
|
+
import { browserCaptureComparisonInputSchema } from "./domain/browserCaptureComparison.js";
|
|
9
9
|
import { discoverWebMcpToolsInputSchema } from "./domain/webMcpDiscovery.js";
|
|
10
10
|
import { captureWebScreenshotInputSchema, compareWebScreenshotsInputSchema, } from "./domain/webScreenshot.js";
|
|
11
11
|
import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
@@ -92,7 +92,7 @@ const registerWebMcp = (cli, logger) => {
|
|
|
92
92
|
};
|
|
93
93
|
const registerCaptureDiff = (cli, logger) => {
|
|
94
94
|
cli.command(CLI_COMMANDS.compareWebCaptures, {
|
|
95
|
-
description: "Compare two normalized
|
|
95
|
+
description: "Compare two normalized passive captures or recorded browser scenarios",
|
|
96
96
|
args: z.object({
|
|
97
97
|
beforeJson: z.string().describe("Earlier normalized web capture JSON"),
|
|
98
98
|
afterJson: z.string().describe("Later normalized web capture JSON"),
|
|
@@ -105,15 +105,27 @@ const registerCaptureDiff = (cli, logger) => {
|
|
|
105
105
|
.max(20_000)
|
|
106
106
|
.default(2_000)
|
|
107
107
|
.describe("Maximum normalized changes to return"),
|
|
108
|
+
normalizationJson: z
|
|
109
|
+
.string()
|
|
110
|
+
.default('{"rules":[]}')
|
|
111
|
+
.describe("Recorded literal normalization policy for browser scenarios"),
|
|
108
112
|
}),
|
|
109
113
|
run: ({ args, options }) => logCliCommand(logger, "compare-web-captures", async () => {
|
|
110
114
|
const before = parseJson(args.beforeJson);
|
|
111
115
|
const after = parseJson(args.afterJson);
|
|
112
|
-
const
|
|
113
|
-
before,
|
|
114
|
-
after,
|
|
116
|
+
const scenarioComparison = browserCaptureComparisonInputSchema.safeParse({
|
|
117
|
+
before_scenario: before,
|
|
118
|
+
after_scenario: after,
|
|
119
|
+
normalization: parseJson(options.normalizationJson),
|
|
115
120
|
max_changes: options.maxChanges,
|
|
116
121
|
});
|
|
122
|
+
const parsed = scenarioComparison.success
|
|
123
|
+
? scenarioComparison
|
|
124
|
+
: browserCaptureComparisonInputSchema.safeParse({
|
|
125
|
+
before,
|
|
126
|
+
after,
|
|
127
|
+
max_changes: options.maxChanges,
|
|
128
|
+
});
|
|
117
129
|
if (!parsed.success)
|
|
118
130
|
return inputError("compare_web_captures");
|
|
119
131
|
const result = await compareWebCaptureEvidence(new CdpBrowserProvider(), parsed.data);
|
|
@@ -93,6 +93,7 @@ const registerPageInspection = (cli, logger) => {
|
|
|
93
93
|
websocket_shape_approved: options.websocketShapeApproved,
|
|
94
94
|
include_script_sources: options.includeScriptSources,
|
|
95
95
|
include_storage_keys: options.includeStorageKeys,
|
|
96
|
+
include_storage_fingerprints: options.includeStorageFingerprints,
|
|
96
97
|
limits: {
|
|
97
98
|
max_frames: options.maxFrames,
|
|
98
99
|
max_dom_nodes: options.maxDomNodes,
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Cli } from "incur";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { captureBrowserScenario } from "./application/BrowserScenarioCaptureService.js";
|
|
4
|
+
import { loadConfiguredPermissionAuthority } from "./application/PermissionConfiguration.js";
|
|
5
|
+
import { PlaywrightBrowserScenarioProvider } from "./browser/PlaywrightBrowserScenarioProvider.js";
|
|
6
|
+
import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
7
|
+
import { parseCliJsonInput } from "./cliJsonInput.js";
|
|
8
|
+
import { logCliCommand } from "./cliLogging.js";
|
|
9
|
+
import { parseConfig } from "./config.js";
|
|
10
|
+
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
11
|
+
import { browserScenarioSchema } from "./domain/browserScenario.js";
|
|
12
|
+
const OPERATION = "capture_browser_scenario";
|
|
13
|
+
/** Register the one-shot controlled browser scenario command. */
|
|
14
|
+
export const registerBrowserScenarioCommands = (cli, logger) => {
|
|
15
|
+
cli.command(CLI_COMMANDS.captureBrowserScenario, {
|
|
16
|
+
description: "Run one approved, bounded Playwright browser scenario and return Evidence",
|
|
17
|
+
args: z.object({
|
|
18
|
+
inputJson: z
|
|
19
|
+
.string()
|
|
20
|
+
.describe("Inline browser scenario JSON or JSON file path"),
|
|
21
|
+
}),
|
|
22
|
+
run: ({ args }) => logCliCommand(logger, CLI_COMMANDS.captureBrowserScenario, async () => {
|
|
23
|
+
const input = await parseCliJsonInput(args.inputJson, OPERATION);
|
|
24
|
+
if (!input.ok)
|
|
25
|
+
return input.error;
|
|
26
|
+
const scenario = browserScenarioSchema.safeParse(input.value);
|
|
27
|
+
if (!scenario.success)
|
|
28
|
+
return cliError(new AnalysisInputError(OPERATION));
|
|
29
|
+
const config = parseConfig(process.env);
|
|
30
|
+
if (!config.ok)
|
|
31
|
+
return cliError(config.error);
|
|
32
|
+
const authority = await loadConfiguredPermissionAuthority(config.value);
|
|
33
|
+
if (!authority.ok)
|
|
34
|
+
return cliError(authority.error);
|
|
35
|
+
const result = await captureBrowserScenario(new PlaywrightBrowserScenarioProvider(), authority.value, scenario.data);
|
|
36
|
+
return result.ok ? result.value : cliError(result.error);
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const cliError = (error) => ({
|
|
41
|
+
error: "Browser scenario capture failed",
|
|
42
|
+
...projectAnalysisError(error),
|
|
43
|
+
});
|
package/dist/cliCommandNames.js
CHANGED
|
@@ -12,9 +12,11 @@ export const CLI_COMMANDS = Object.freeze({
|
|
|
12
12
|
capabilities: "capabilities",
|
|
13
13
|
providers: "providers",
|
|
14
14
|
function: "function",
|
|
15
|
+
instructions: "instructions",
|
|
15
16
|
search: "search",
|
|
16
17
|
importReferenceSource: "import-reference-source",
|
|
17
18
|
inventoryArtifact: "inventory-artifact",
|
|
19
|
+
inspectArtifact: "inspect-artifact",
|
|
18
20
|
extractArtifact: "extract-artifact",
|
|
19
21
|
inspectManagedArtifact: "inspect-managed-artifact",
|
|
20
22
|
inspectManagedMembers: "inspect-managed-members",
|
|
@@ -44,18 +46,24 @@ export const CLI_COMMANDS = Object.freeze({
|
|
|
44
46
|
compareWebCaptures: "compare-web-captures",
|
|
45
47
|
captureWebScreenshot: "capture-web-screenshot",
|
|
46
48
|
compareWebScreenshots: "compare-web-screenshots",
|
|
49
|
+
captureBrowserScenario: "capture-browser-scenario",
|
|
47
50
|
listElectronTargets: "list-electron-targets",
|
|
48
51
|
inspectElectronPage: "inspect-electron-page",
|
|
52
|
+
listJavaScriptRuntimeTargets: "list-javascript-runtime-targets",
|
|
53
|
+
observeJavaScriptRuntime: "observe-javascript-runtime",
|
|
49
54
|
analyzeJavaScriptApplication: "analyze-javascript-application",
|
|
50
55
|
reconcileJavaScriptRuntime: "reconcile-javascript-runtime",
|
|
51
56
|
traceApplicationFeature: "trace-application-feature",
|
|
52
57
|
traceJavaScriptSemantics: "trace-javascript-semantics",
|
|
53
58
|
compareApplicationVersions: "compare-application-versions",
|
|
59
|
+
compareSourceToBundle: "compare-source-to-bundle",
|
|
54
60
|
compareJavaScriptExportShapes: "compare-javascript-export-shapes",
|
|
55
61
|
runReplayMachine: "run-replay-machine",
|
|
56
62
|
runControlledReplay: "run-controlled-replay",
|
|
57
63
|
prepareNodeCharacterization: "prepare-node-characterization",
|
|
58
64
|
executeNodeCharacterization: "execute-node-characterization",
|
|
65
|
+
buildReconstructionObligationLedger: "build-reconstruction-obligation-ledger",
|
|
66
|
+
evaluateReconstructionReadiness: "evaluate-reconstruction-readiness",
|
|
59
67
|
commitReconstructionCoverage: "commit-reconstruction-coverage",
|
|
60
68
|
queryReconstructionCoverage: "query-reconstruction-coverage",
|
|
61
69
|
});
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Cli, z } from "incur";
|
|
2
|
+
import { listJavaScriptRuntimeTargets, observeJavaScriptRuntime, } from "./application/JavaScriptRuntimeObservationService.js";
|
|
3
|
+
import { loadConfiguredPermissionAuthority } from "./application/PermissionConfiguration.js";
|
|
4
|
+
import { V8InspectorProvider } from "./browser/V8InspectorProvider.js";
|
|
5
|
+
import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
6
|
+
import { logCliCommand } from "./cliLogging.js";
|
|
7
|
+
import { parseConfig } from "./config.js";
|
|
8
|
+
import { javascriptRuntimeKindSchema, listJavaScriptRuntimeTargetsInputSchema, observeJavaScriptRuntimeInputSchema, } from "./domain/javascriptRuntimeObservation.js";
|
|
9
|
+
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
10
|
+
const scopeOptions = {
|
|
11
|
+
allowedFileRoots: z
|
|
12
|
+
.array(z.string().min(1))
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Exact roots; defaults to REA_V8_INSPECTOR_FILE_ROOTS_JSON"),
|
|
15
|
+
allowedOrigins: z
|
|
16
|
+
.array(z.string().min(1))
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Exact origins; defaults to REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON"),
|
|
19
|
+
approved: z.boolean().default(false).describe("Approve passive attachment"),
|
|
20
|
+
};
|
|
21
|
+
const listOptionsSchema = z.object({
|
|
22
|
+
...scopeOptions,
|
|
23
|
+
offset: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.min(0)
|
|
27
|
+
.default(0)
|
|
28
|
+
.describe("Zero-based target offset"),
|
|
29
|
+
limit: z
|
|
30
|
+
.number()
|
|
31
|
+
.int()
|
|
32
|
+
.min(1)
|
|
33
|
+
.max(200)
|
|
34
|
+
.default(100)
|
|
35
|
+
.describe("Maximum targets to return"),
|
|
36
|
+
});
|
|
37
|
+
const observeOptionsSchema = z.object({
|
|
38
|
+
...scopeOptions,
|
|
39
|
+
runtimeKind: javascriptRuntimeKindSchema.describe("Declared target role; Inspector cannot authenticate the Electron role"),
|
|
40
|
+
observationMs: z
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.min(0)
|
|
44
|
+
.max(10_000)
|
|
45
|
+
.default(100)
|
|
46
|
+
.describe("Bounded observation window in milliseconds"),
|
|
47
|
+
maxEvents: z
|
|
48
|
+
.number()
|
|
49
|
+
.int()
|
|
50
|
+
.min(1)
|
|
51
|
+
.max(50_000)
|
|
52
|
+
.default(10_000)
|
|
53
|
+
.describe("Maximum retained protocol events"),
|
|
54
|
+
maxScripts: z
|
|
55
|
+
.number()
|
|
56
|
+
.int()
|
|
57
|
+
.min(1)
|
|
58
|
+
.max(10_000)
|
|
59
|
+
.default(2_000)
|
|
60
|
+
.describe("Maximum retained scripts"),
|
|
61
|
+
maxExecutionContexts: z
|
|
62
|
+
.number()
|
|
63
|
+
.int()
|
|
64
|
+
.min(1)
|
|
65
|
+
.max(5_000)
|
|
66
|
+
.default(1_000)
|
|
67
|
+
.describe("Maximum retained execution contexts"),
|
|
68
|
+
maxLocationBytes: z
|
|
69
|
+
.number()
|
|
70
|
+
.int()
|
|
71
|
+
.min(64)
|
|
72
|
+
.max(65_536)
|
|
73
|
+
.default(16_384)
|
|
74
|
+
.describe("Maximum bytes in one protocol location"),
|
|
75
|
+
maxTotalMetadataBytes: z
|
|
76
|
+
.number()
|
|
77
|
+
.int()
|
|
78
|
+
.min(1_024)
|
|
79
|
+
.max(32 * 1_024 * 1_024)
|
|
80
|
+
.default(4 * 1_024 * 1_024)
|
|
81
|
+
.describe("Maximum retained metadata bytes"),
|
|
82
|
+
});
|
|
83
|
+
/** Register CLI equivalents of passive V8 Inspector tools. */
|
|
84
|
+
export const registerJavaScriptRuntimeObservationCommands = (cli, logger) => {
|
|
85
|
+
cli.command(CLI_COMMANDS.listJavaScriptRuntimeTargets, {
|
|
86
|
+
description: "List approved Node/Electron V8 Inspector targets",
|
|
87
|
+
args: z.object({
|
|
88
|
+
endpoint: z.string().describe("Configured literal-loopback endpoint"),
|
|
89
|
+
}),
|
|
90
|
+
options: listOptionsSchema,
|
|
91
|
+
run: ({ args, options }) => logCliCommand(logger, CLI_COMMANDS.listJavaScriptRuntimeTargets, async () => {
|
|
92
|
+
const context = await runtimeContext();
|
|
93
|
+
if (!context.ok)
|
|
94
|
+
return context.error;
|
|
95
|
+
const parsed = listJavaScriptRuntimeTargetsInputSchema.safeParse({
|
|
96
|
+
inspector_endpoint: args.endpoint,
|
|
97
|
+
allowed_file_roots: options.allowedFileRoots ?? context.allowedFileRoots,
|
|
98
|
+
allowed_origins: options.allowedOrigins ?? context.allowedOrigins,
|
|
99
|
+
approved: options.approved,
|
|
100
|
+
offset: options.offset,
|
|
101
|
+
limit: options.limit,
|
|
102
|
+
});
|
|
103
|
+
if (!parsed.success)
|
|
104
|
+
return inputError("list_javascript_runtime_targets");
|
|
105
|
+
const result = await listJavaScriptRuntimeTargets(context.provider, context.authority, parsed.data);
|
|
106
|
+
return result.ok ? result.value : cliError(result.error);
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
cli.command(CLI_COMMANDS.observeJavaScriptRuntime, {
|
|
110
|
+
description: "Passively observe one exact Node/Electron Inspector target",
|
|
111
|
+
args: z.object({
|
|
112
|
+
endpoint: z.string().describe("Configured literal-loopback endpoint"),
|
|
113
|
+
targetId: z
|
|
114
|
+
.string()
|
|
115
|
+
.describe("Target from list-javascript-runtime-targets"),
|
|
116
|
+
}),
|
|
117
|
+
options: observeOptionsSchema,
|
|
118
|
+
run: ({ args, options }) => logCliCommand(logger, CLI_COMMANDS.observeJavaScriptRuntime, async () => {
|
|
119
|
+
const context = await runtimeContext();
|
|
120
|
+
if (!context.ok)
|
|
121
|
+
return context.error;
|
|
122
|
+
const parsed = observeJavaScriptRuntimeInputSchema.safeParse({
|
|
123
|
+
inspector_endpoint: args.endpoint,
|
|
124
|
+
allowed_file_roots: options.allowedFileRoots ?? context.allowedFileRoots,
|
|
125
|
+
allowed_origins: options.allowedOrigins ?? context.allowedOrigins,
|
|
126
|
+
target_id: args.targetId,
|
|
127
|
+
runtime_kind: options.runtimeKind,
|
|
128
|
+
approved: options.approved,
|
|
129
|
+
observation_ms: options.observationMs,
|
|
130
|
+
limits: {
|
|
131
|
+
max_events: options.maxEvents,
|
|
132
|
+
max_scripts: options.maxScripts,
|
|
133
|
+
max_execution_contexts: options.maxExecutionContexts,
|
|
134
|
+
max_location_bytes: options.maxLocationBytes,
|
|
135
|
+
max_total_metadata_bytes: options.maxTotalMetadataBytes,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
if (!parsed.success)
|
|
139
|
+
return inputError("observe_javascript_runtime");
|
|
140
|
+
const result = await observeJavaScriptRuntime(context.provider, context.authority, parsed.data);
|
|
141
|
+
return result.ok ? result.value : cliError(result.error);
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
const runtimeContext = async () => {
|
|
146
|
+
const config = parseConfig(process.env);
|
|
147
|
+
if (!config.ok)
|
|
148
|
+
return { ok: false, error: cliError(config.error) };
|
|
149
|
+
const authority = await loadConfiguredPermissionAuthority(config.value);
|
|
150
|
+
if (!authority.ok)
|
|
151
|
+
return { ok: false, error: cliError(authority.error) };
|
|
152
|
+
return {
|
|
153
|
+
ok: true,
|
|
154
|
+
authority: authority.value,
|
|
155
|
+
provider: new V8InspectorProvider(),
|
|
156
|
+
allowedFileRoots: config.value.v8InspectorFileRoots,
|
|
157
|
+
allowedOrigins: config.value.v8InspectorAllowedOrigins,
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
const inputError = (operation) => cliError(new AnalysisInputError(operation));
|
|
161
|
+
const cliError = (error) => ({
|
|
162
|
+
error: "JavaScript runtime observation failed",
|
|
163
|
+
...projectAnalysisError(error),
|
|
164
|
+
});
|
|
@@ -54,6 +54,10 @@ export const browserPageInspectionOptions = z.object({
|
|
|
54
54
|
.boolean()
|
|
55
55
|
.default(false)
|
|
56
56
|
.describe("Include storage key names without values"),
|
|
57
|
+
includeStorageFingerprints: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.default(false)
|
|
60
|
+
.describe("Include content-derived storage fingerprints"),
|
|
57
61
|
maxFrames: boundedCount("page frames", 1_000, 200),
|
|
58
62
|
maxDomNodes: boundedCount("DOM nodes", 10_000, 2_000),
|
|
59
63
|
maxAxNodes: boundedCount("accessibility nodes", 10_000, 2_000),
|
|
@@ -52,9 +52,21 @@ const environmentSchema = z
|
|
|
52
52
|
REA_BROWSER_OBSERVE_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
53
53
|
REA_BROWSER_CDP_ENDPOINTS_JSON: z.string().default("[]"),
|
|
54
54
|
REA_BROWSER_ALLOWED_ORIGINS_JSON: z.string().default("[]"),
|
|
55
|
+
REA_BROWSER_SCENARIO_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
56
|
+
REA_BROWSER_SCENARIO_AUTO_GRANT: z.enum(["true", "false"]).default("false"),
|
|
57
|
+
REA_BROWSER_SCENARIO_EXECUTABLE_ROOTS_JSON: z.string().default("[]"),
|
|
58
|
+
REA_BROWSER_SCENARIO_CDP_ENDPOINTS_JSON: z.string().default("[]"),
|
|
59
|
+
REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON: z.string().default("[]"),
|
|
60
|
+
REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON: z.string().default("[]"),
|
|
55
61
|
REA_ELECTRON_OBSERVE_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
56
62
|
REA_ELECTRON_CDP_ENDPOINTS_JSON: z.string().default("[]"),
|
|
57
63
|
REA_ELECTRON_FILE_ROOTS_JSON: z.string().default("[]"),
|
|
64
|
+
REA_V8_INSPECTOR_OBSERVE_ENABLED: z
|
|
65
|
+
.enum(["true", "false"])
|
|
66
|
+
.default("false"),
|
|
67
|
+
REA_V8_INSPECTOR_ENDPOINTS_JSON: z.string().default("[]"),
|
|
68
|
+
REA_V8_INSPECTOR_FILE_ROOTS_JSON: z.string().default("[]"),
|
|
69
|
+
REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON: z.string().default("[]"),
|
|
58
70
|
REA_JAVASCRIPT_REPLAY_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
59
71
|
REA_JAVASCRIPT_REPLAY_ROOTS_JSON: z.string().default("[]"),
|
|
60
72
|
REA_JAVASCRIPT_REPLAY_NODE_PATH: z
|
|
@@ -37,18 +37,9 @@ const parseAllArrays = (env) => {
|
|
|
37
37
|
const secretPatterns = parseStringArray(env.REA_REFERENCE_SECRET_PATTERNS_JSON, "REA_REFERENCE_SECRET_PATTERNS_JSON");
|
|
38
38
|
if (!secretPatterns.ok)
|
|
39
39
|
return secretPatterns;
|
|
40
|
-
const
|
|
41
|
-
if (!
|
|
42
|
-
return
|
|
43
|
-
const browserOrigins = parseBrowserArray(env.REA_BROWSER_ALLOWED_ORIGINS_JSON, "REA_BROWSER_ALLOWED_ORIGINS_JSON", browserOriginSchema, 32);
|
|
44
|
-
if (!browserOrigins.ok)
|
|
45
|
-
return browserOrigins;
|
|
46
|
-
const electronEndpoints = parseBrowserArray(env.REA_ELECTRON_CDP_ENDPOINTS_JSON, "REA_ELECTRON_CDP_ENDPOINTS_JSON", browserEndpointSchema, 16);
|
|
47
|
-
if (!electronEndpoints.ok)
|
|
48
|
-
return electronEndpoints;
|
|
49
|
-
const electronFileRoots = parseElectronFileRoots(env.REA_ELECTRON_FILE_ROOTS_JSON);
|
|
50
|
-
if (!electronFileRoots.ok)
|
|
51
|
-
return electronFileRoots;
|
|
40
|
+
const observations = parseObservationArrays(env);
|
|
41
|
+
if (!observations.ok)
|
|
42
|
+
return observations;
|
|
52
43
|
const javascriptReplayRoots = parseAbsoluteRoots(env.REA_JAVASCRIPT_REPLAY_ROOTS_JSON, "REA_JAVASCRIPT_REPLAY_ROOTS_JSON");
|
|
53
44
|
if (!javascriptReplayRoots.ok)
|
|
54
45
|
return javascriptReplayRoots;
|
|
@@ -65,12 +56,57 @@ const parseAllArrays = (env) => {
|
|
|
65
56
|
analysisSnapshotRoots: analysisSnapshotRoots.value,
|
|
66
57
|
referenceRoots: referenceRoots.value,
|
|
67
58
|
secretPatterns: secretPatterns.value,
|
|
59
|
+
...observations.value,
|
|
60
|
+
javascriptReplayRoots: javascriptReplayRoots.value,
|
|
61
|
+
managedRuntimeRoots: managedRuntimeRoots.value,
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const parseObservationArrays = (env) => {
|
|
65
|
+
const browserEndpoints = parseBrowserArray(env.REA_BROWSER_CDP_ENDPOINTS_JSON, "REA_BROWSER_CDP_ENDPOINTS_JSON", browserEndpointSchema, 16);
|
|
66
|
+
if (!browserEndpoints.ok)
|
|
67
|
+
return browserEndpoints;
|
|
68
|
+
const browserOrigins = parseBrowserArray(env.REA_BROWSER_ALLOWED_ORIGINS_JSON, "REA_BROWSER_ALLOWED_ORIGINS_JSON", browserOriginSchema, 32);
|
|
69
|
+
if (!browserOrigins.ok)
|
|
70
|
+
return browserOrigins;
|
|
71
|
+
const browserScenarioExecutableRoots = parseAbsoluteRoots(env.REA_BROWSER_SCENARIO_EXECUTABLE_ROOTS_JSON, "REA_BROWSER_SCENARIO_EXECUTABLE_ROOTS_JSON");
|
|
72
|
+
if (!browserScenarioExecutableRoots.ok)
|
|
73
|
+
return browserScenarioExecutableRoots;
|
|
74
|
+
const browserScenarioEndpoints = parseBrowserArray(env.REA_BROWSER_SCENARIO_CDP_ENDPOINTS_JSON, "REA_BROWSER_SCENARIO_CDP_ENDPOINTS_JSON", browserEndpointSchema, 16);
|
|
75
|
+
if (!browserScenarioEndpoints.ok)
|
|
76
|
+
return browserScenarioEndpoints;
|
|
77
|
+
const browserScenarioOrigins = parseBrowserArray(env.REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON, "REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON", browserOriginSchema, 32);
|
|
78
|
+
if (!browserScenarioOrigins.ok)
|
|
79
|
+
return browserScenarioOrigins;
|
|
80
|
+
const browserScenarioEnvironment = parseStringArray(env.REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON, "REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON");
|
|
81
|
+
if (!browserScenarioEnvironment.ok)
|
|
82
|
+
return browserScenarioEnvironment;
|
|
83
|
+
const electronEndpoints = parseBrowserArray(env.REA_ELECTRON_CDP_ENDPOINTS_JSON, "REA_ELECTRON_CDP_ENDPOINTS_JSON", browserEndpointSchema, 16);
|
|
84
|
+
if (!electronEndpoints.ok)
|
|
85
|
+
return electronEndpoints;
|
|
86
|
+
const electronFileRoots = parseElectronFileRoots(env.REA_ELECTRON_FILE_ROOTS_JSON);
|
|
87
|
+
if (!electronFileRoots.ok)
|
|
88
|
+
return electronFileRoots;
|
|
89
|
+
const v8InspectorEndpoints = parseBrowserArray(env.REA_V8_INSPECTOR_ENDPOINTS_JSON, "REA_V8_INSPECTOR_ENDPOINTS_JSON", browserEndpointSchema, 16);
|
|
90
|
+
if (!v8InspectorEndpoints.ok)
|
|
91
|
+
return v8InspectorEndpoints;
|
|
92
|
+
const v8InspectorFileRoots = parseAbsoluteRoots(env.REA_V8_INSPECTOR_FILE_ROOTS_JSON, "REA_V8_INSPECTOR_FILE_ROOTS_JSON");
|
|
93
|
+
if (!v8InspectorFileRoots.ok)
|
|
94
|
+
return v8InspectorFileRoots;
|
|
95
|
+
const v8InspectorOrigins = parseBrowserArray(env.REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON, "REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON", browserOriginSchema, 32);
|
|
96
|
+
if (!v8InspectorOrigins.ok)
|
|
97
|
+
return v8InspectorOrigins;
|
|
98
|
+
return ok({
|
|
68
99
|
browserEndpoints: browserEndpoints.value,
|
|
69
100
|
browserOrigins: browserOrigins.value,
|
|
101
|
+
browserScenarioExecutableRoots: browserScenarioExecutableRoots.value,
|
|
102
|
+
browserScenarioEndpoints: browserScenarioEndpoints.value,
|
|
103
|
+
browserScenarioOrigins: browserScenarioOrigins.value,
|
|
104
|
+
browserScenarioEnvironment: browserScenarioEnvironment.value,
|
|
70
105
|
electronEndpoints: electronEndpoints.value,
|
|
71
106
|
electronFileRoots: electronFileRoots.value,
|
|
72
|
-
|
|
73
|
-
|
|
107
|
+
v8InspectorEndpoints: v8InspectorEndpoints.value,
|
|
108
|
+
v8InspectorFileRoots: v8InspectorFileRoots.value,
|
|
109
|
+
v8InspectorOrigins: v8InspectorOrigins.value,
|
|
74
110
|
});
|
|
75
111
|
};
|
|
76
112
|
const parseAbsoluteRoots = (value, name) => {
|
|
@@ -98,6 +134,19 @@ const appendBrowserObservationCeiling = (ceilings, env, arrays) => {
|
|
|
98
134
|
network: browserNetworkScope(arrays.browserOrigins),
|
|
99
135
|
}));
|
|
100
136
|
};
|
|
137
|
+
const appendBrowserScenarioCeiling = (ceilings, env, arrays) => {
|
|
138
|
+
if (env.REA_BROWSER_SCENARIO_ENABLED !== "true")
|
|
139
|
+
return;
|
|
140
|
+
ceilings.push(permissionScope("browser_automate", [], {
|
|
141
|
+
executables: arrays.browserScenarioExecutableRoots,
|
|
142
|
+
environment_names: arrays.browserScenarioEnvironment,
|
|
143
|
+
origins: [
|
|
144
|
+
...arrays.browserScenarioEndpoints,
|
|
145
|
+
...arrays.browserScenarioOrigins,
|
|
146
|
+
],
|
|
147
|
+
network: browserNetworkScope(arrays.browserScenarioOrigins),
|
|
148
|
+
}));
|
|
149
|
+
};
|
|
101
150
|
const appendElectronObservationCeiling = (ceilings, env, arrays) => {
|
|
102
151
|
if (env.REA_ELECTRON_OBSERVE_ENABLED !== "true")
|
|
103
152
|
return;
|
|
@@ -106,6 +155,14 @@ const appendElectronObservationCeiling = (ceilings, env, arrays) => {
|
|
|
106
155
|
network: "loopback",
|
|
107
156
|
}));
|
|
108
157
|
};
|
|
158
|
+
const appendV8InspectorObservationCeiling = (ceilings, env, arrays) => {
|
|
159
|
+
if (env.REA_V8_INSPECTOR_OBSERVE_ENABLED !== "true")
|
|
160
|
+
return;
|
|
161
|
+
ceilings.push(permissionScope("v8_inspector_observe", arrays.v8InspectorFileRoots, {
|
|
162
|
+
origins: [...arrays.v8InspectorEndpoints, ...arrays.v8InspectorOrigins],
|
|
163
|
+
network: "loopback",
|
|
164
|
+
}));
|
|
165
|
+
};
|
|
109
166
|
const appendNativeMountCeiling = (ceilings, env) => {
|
|
110
167
|
if (env.REA_ARTIFACT_NATIVE_MOUNT_ENABLED === "true")
|
|
111
168
|
ceilings.push(permissionScope("native_mount", [], { mount: true }));
|
|
@@ -147,7 +204,9 @@ const buildPermissionCeilings = (env, arrays) => {
|
|
|
147
204
|
];
|
|
148
205
|
appendProcessCaptureCeiling(ceilings, env, arrays);
|
|
149
206
|
appendBrowserObservationCeiling(ceilings, env, arrays);
|
|
207
|
+
appendBrowserScenarioCeiling(ceilings, env, arrays);
|
|
150
208
|
appendElectronObservationCeiling(ceilings, env, arrays);
|
|
209
|
+
appendV8InspectorObservationCeiling(ceilings, env, arrays);
|
|
151
210
|
appendNativeMountCeiling(ceilings, env);
|
|
152
211
|
appendJavaScriptReplayCeiling(ceilings, env, arrays);
|
|
153
212
|
appendManagedRuntimeCeiling(ceilings, env, arrays);
|
|
@@ -186,9 +245,20 @@ const buildAppConfig = (env, arrays, permissionCeilings) => ({
|
|
|
186
245
|
browserObservationEnabled: env.REA_BROWSER_OBSERVE_ENABLED === "true",
|
|
187
246
|
browserCdpEndpoints: arrays.browserEndpoints,
|
|
188
247
|
browserAllowedOrigins: arrays.browserOrigins,
|
|
248
|
+
browserScenarioPolicy: {
|
|
249
|
+
enabled: env.REA_BROWSER_SCENARIO_ENABLED === "true",
|
|
250
|
+
executableRoots: arrays.browserScenarioExecutableRoots,
|
|
251
|
+
cdpEndpoints: arrays.browserScenarioEndpoints,
|
|
252
|
+
allowedOrigins: arrays.browserScenarioOrigins,
|
|
253
|
+
allowedEnvironment: arrays.browserScenarioEnvironment,
|
|
254
|
+
},
|
|
189
255
|
electronObservationEnabled: env.REA_ELECTRON_OBSERVE_ENABLED === "true",
|
|
190
256
|
electronCdpEndpoints: arrays.electronEndpoints,
|
|
191
257
|
electronFileRoots: arrays.electronFileRoots,
|
|
258
|
+
v8InspectorObservationEnabled: env.REA_V8_INSPECTOR_OBSERVE_ENABLED === "true",
|
|
259
|
+
v8InspectorEndpoints: arrays.v8InspectorEndpoints,
|
|
260
|
+
v8InspectorFileRoots: arrays.v8InspectorFileRoots,
|
|
261
|
+
v8InspectorAllowedOrigins: arrays.v8InspectorOrigins,
|
|
192
262
|
javascriptReplayPolicy: {
|
|
193
263
|
enabled: env.REA_JAVASCRIPT_REPLAY_ENABLED === "true",
|
|
194
264
|
roots: arrays.javascriptReplayRoots,
|
|
@@ -204,9 +274,10 @@ const buildAppConfig = (env, arrays, permissionCeilings) => ({
|
|
|
204
274
|
executablePath: env.REA_MANAGED_RUNTIME_EXECUTABLE_PATH,
|
|
205
275
|
},
|
|
206
276
|
permissionCeilings,
|
|
207
|
-
administratorPermissionGrants: administratorGrants(
|
|
208
|
-
|
|
209
|
-
|
|
277
|
+
administratorPermissionGrants: administratorGrants(permissionCeilings.filter(({ capability }) => (capability !== "process_capture" ||
|
|
278
|
+
env.REA_PROCESS_CAPTURE_AUTO_GRANT === "true") &&
|
|
279
|
+
(capability !== "browser_automate" ||
|
|
280
|
+
env.REA_BROWSER_SCENARIO_AUTO_GRANT === "true"))),
|
|
210
281
|
permissionProjectRoot: env.REA_PERMISSION_PROJECT_ROOT,
|
|
211
282
|
permissionProjectStore: env.REA_PERMISSION_PROJECT_STORE,
|
|
212
283
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** Shared bounded provider search input fields. */
|
|
3
|
+
export const analysisSearchInput = {
|
|
4
|
+
pattern: z
|
|
5
|
+
.string()
|
|
6
|
+
.min(1)
|
|
7
|
+
.max(256)
|
|
8
|
+
.describe("The literal text or bounded regex pattern to search for"),
|
|
9
|
+
mode: z.enum(["literal", "regex"]).default("literal"),
|
|
10
|
+
case_sensitive: z.boolean().default(false).describe("Whether to match case"),
|
|
11
|
+
offset: z.number().int().min(0).default(0),
|
|
12
|
+
limit: z.number().int().min(1).max(100).default(100),
|
|
13
|
+
document: z.string().optional().describe("The document name"),
|
|
14
|
+
};
|
|
@@ -1,20 +1,43 @@
|
|
|
1
1
|
import { applicationVersionComparisonResultSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
|
|
2
|
+
import { z } from "zod";
|
|
2
3
|
import { applicationFeatureTraceResultSchema } from "../domain/javascriptFeatureTraceSchemas.js";
|
|
3
4
|
import { javaScriptSemanticTraceResultSchema } from "../domain/javascriptSemanticTraceSchemas.js";
|
|
4
5
|
import { javaScriptExportShapeComparisonResultSchema } from "../domain/javascriptExportShapeComparisonSchemas.js";
|
|
5
|
-
import {
|
|
6
|
+
import { sourceToBundleComparisonResultSchema } from "../domain/sourceToBundleComparisonSchemas.js";
|
|
7
|
+
import { compareApplicationVersionsRequestSchema, compareJavaScriptExportShapesRequestSchema, compareSourceToBundleRequestSchema, traceApplicationFeatureRequestSchema, traceJavaScriptSemanticsRequestSchema, } from "./applicationWorkflowInputContracts.js";
|
|
6
8
|
import { controlledReplayInputSchema, controlledReplayOutputSchema, } from "../domain/javascriptReplay.js";
|
|
7
9
|
import { nodeCharacterizationExecutionInputSchema, nodeCharacterizationExecutionOutputSchema, nodeCharacterizationPreparationInputSchema, nodeCharacterizationPreparationOutputSchema, } from "../domain/nodeRuntimeCharacterization.js";
|
|
8
10
|
import { reconstructionCoverageCommitInputSchema, reconstructionCoverageCommitOutputSchema, reconstructionCoverageQueryInputSchema, } from "../application/ReconstructionCoverageService.js";
|
|
9
11
|
import { reconstructionClosureResultSchema } from "../domain/reconstructionCoverage.js";
|
|
12
|
+
import { reconstructionObligationLedgerInputSchema, reconstructionObligationLedgerPageSchema, } from "../domain/reconstructionObligationLedgerSchemas.js";
|
|
13
|
+
import { reconstructionReadinessInputSchema, reconstructionReadinessReportSchema, } from "../domain/reconstructionReadinessSchemas.js";
|
|
10
14
|
import { jsonObjectSchema } from "../domain/jsonValue.js";
|
|
11
15
|
import { toolContractMetadata } from "./toolEffects.js";
|
|
12
16
|
import { evidenceResultOf } from "./toolOutputSchemas.js";
|
|
13
|
-
import { JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE, JAVASCRIPT_EXPORT_SHAPE_COMPARISON_EXAMPLE, JAVASCRIPT_FEATURE_TRACE_EXAMPLE, } from "./javascriptApplicationWorkflowExamples.js";
|
|
17
|
+
import { JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE, JAVASCRIPT_EXPORT_SHAPE_COMPARISON_EXAMPLE, JAVASCRIPT_FEATURE_TRACE_EXAMPLE, SOURCE_TO_BUNDLE_COMPARISON_EXAMPLE, } from "./javascriptApplicationWorkflowExamples.js";
|
|
18
|
+
import { RECONSTRUCTION_READINESS_EXAMPLE } from "./reconstructionReadinessExample.js";
|
|
14
19
|
const traceOutputSchema = evidenceResultOf(applicationFeatureTraceResultSchema);
|
|
15
20
|
const semanticTraceOutputSchema = evidenceResultOf(javaScriptSemanticTraceResultSchema);
|
|
16
21
|
const comparisonOutputSchema = evidenceResultOf(applicationVersionComparisonResultSchema);
|
|
22
|
+
const sourceToBundleOutputSchema = evidenceResultOf(sourceToBundleComparisonResultSchema);
|
|
17
23
|
const exportShapeComparisonOutputSchema = evidenceResultOf(javaScriptExportShapeComparisonResultSchema);
|
|
24
|
+
const reconstructionObligationLedgerOutputSchema = evidenceResultOf(reconstructionObligationLedgerPageSchema);
|
|
25
|
+
const reconstructionReadinessOutputSchema = evidenceResultOf(reconstructionReadinessReportSchema
|
|
26
|
+
.pick({
|
|
27
|
+
schema: true,
|
|
28
|
+
schema_version: true,
|
|
29
|
+
report_id: true,
|
|
30
|
+
source_digest: true,
|
|
31
|
+
report_digest: true,
|
|
32
|
+
status: true,
|
|
33
|
+
summary: true,
|
|
34
|
+
metrics: true,
|
|
35
|
+
})
|
|
36
|
+
.extend({
|
|
37
|
+
report_resource_uri: z
|
|
38
|
+
.string()
|
|
39
|
+
.regex(/^rea:\/\/evidence\/ev_[a-f0-9]{64}\/reconstruction-readiness-report$/u),
|
|
40
|
+
}));
|
|
18
41
|
const HASH = "0".repeat(64);
|
|
19
42
|
const NODE_PREPARATION_EXAMPLE = jsonObjectSchema.parse({
|
|
20
43
|
preparation_approved: true,
|
|
@@ -128,6 +151,20 @@ export const APPLICATION_TOOL_CONTRACTS = [
|
|
|
128
151
|
},
|
|
129
152
|
],
|
|
130
153
|
},
|
|
154
|
+
{
|
|
155
|
+
name: "compare_source_to_bundle",
|
|
156
|
+
...toolContractMetadata("compare_source_to_bundle"),
|
|
157
|
+
description: "Compare a cryptographically committed HistoricalSourceGraph/v1 with authenticated JavaScript Application Graph Evidence supplied directly or by session Evidence ID. Uses explicit exact-digest, source-map path, current-path, suffix, and basename signals with stable weights. Classifies unchanged, modified, removed, split, merged, duplicated, and unknown; incomplete coverage and ambiguous weak signals never become absence or forced matches.",
|
|
158
|
+
kind: "application",
|
|
159
|
+
inputSchema: compareSourceToBundleRequestSchema,
|
|
160
|
+
outputSchema: sourceToBundleOutputSchema,
|
|
161
|
+
examples: [
|
|
162
|
+
{
|
|
163
|
+
title: "Compare committed historical source with a shipped bundle graph",
|
|
164
|
+
input: SOURCE_TO_BUNDLE_COMPARISON_EXAMPLE,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
},
|
|
131
168
|
{
|
|
132
169
|
name: "compare_javascript_export_shapes",
|
|
133
170
|
...toolContractMetadata("compare_javascript_export_shapes"),
|
|
@@ -226,6 +263,53 @@ export const APPLICATION_TOOL_CONTRACTS = [
|
|
|
226
263
|
},
|
|
227
264
|
],
|
|
228
265
|
},
|
|
266
|
+
{
|
|
267
|
+
name: "build_reconstruction_obligation_ledger",
|
|
268
|
+
...toolContractMetadata("build_reconstruction_obligation_ledger"),
|
|
269
|
+
description: "Generate one deterministic page of a ReconstructionObligationLedger/v1 from an authenticated Evidence v2 bundle, reviewed obligations, and an explicit reconstruction manifest. Static candidates remain candidates; duplicate ownership, missing original or reconstruction cases, missing parser/type, weak verifier authority, unenumerated claims, contradictions, dependencies, and residual unknowns fail closed. Every page carries the same full-ledger closure digest and typed per-obligation diagnostics.",
|
|
270
|
+
kind: "application",
|
|
271
|
+
inputSchema: reconstructionObligationLedgerInputSchema,
|
|
272
|
+
outputSchema: reconstructionObligationLedgerOutputSchema,
|
|
273
|
+
examples: [
|
|
274
|
+
{
|
|
275
|
+
title: "Generate the first obligation-ledger page",
|
|
276
|
+
input: {
|
|
277
|
+
evidence_bundle: {
|
|
278
|
+
bundle_version: 2,
|
|
279
|
+
artifacts: [],
|
|
280
|
+
providers: [],
|
|
281
|
+
environments: [],
|
|
282
|
+
scenarios: [],
|
|
283
|
+
captures: [],
|
|
284
|
+
unknowns: [],
|
|
285
|
+
records: [],
|
|
286
|
+
},
|
|
287
|
+
reviewed_obligations: [],
|
|
288
|
+
manifest: {
|
|
289
|
+
schema_version: 1,
|
|
290
|
+
bindings: [],
|
|
291
|
+
contradictions: [],
|
|
292
|
+
},
|
|
293
|
+
limits: { max_obligations: 1_000 },
|
|
294
|
+
page: { offset: 0, limit: 50 },
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: "evaluate_reconstruction_readiness",
|
|
301
|
+
...toolContractMetadata("evaluate_reconstruction_readiness"),
|
|
302
|
+
description: "Evaluate the fixed nine-stage public reconstruction journey into a deterministic ReconstructionReadinessReport/v1. Exact capability limits, provider routing, CLI/MCP status parity, bounded authority, partial-order comparison, contradictions, obligation closure, cleanup, and replay digests fail closed. Aggregate pass is emitted only when every required stage and check passes with attributable Evidence.",
|
|
303
|
+
kind: "application",
|
|
304
|
+
inputSchema: reconstructionReadinessInputSchema,
|
|
305
|
+
outputSchema: reconstructionReadinessOutputSchema,
|
|
306
|
+
examples: [
|
|
307
|
+
{
|
|
308
|
+
title: "Evaluate the complete synthetic reconstruction journey",
|
|
309
|
+
input: RECONSTRUCTION_READINESS_EXAMPLE,
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
},
|
|
229
313
|
{
|
|
230
314
|
name: "commit_reconstruction_coverage",
|
|
231
315
|
...toolContractMetadata("commit_reconstruction_coverage"),
|