rea-agents 2.3.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.
Files changed (209) hide show
  1. package/README.md +80 -18
  2. package/bridge/ghidra/ReaGhidraBridge.java +48 -1
  3. package/bridge/hopper_bridge.py +259 -24
  4. package/dist/application/AnalysisClientCleanup.js +14 -0
  5. package/dist/application/ApplicationWorkflowEvidenceResolver.js +31 -13
  6. package/dist/application/ArtifactExtraction.js +5 -1
  7. package/dist/application/ArtifactGraphConstruction.js +3 -15
  8. package/dist/application/ArtifactInventory/classify.js +5 -1
  9. package/dist/application/ArtifactInventory/reader.js +2 -0
  10. package/dist/application/BinarySession.js +15 -4
  11. package/dist/application/BinarySessionStatus.js +32 -1
  12. package/dist/application/BrowserEvidence.js +14 -0
  13. package/dist/application/BrowserScenarioCapturePort.js +1 -0
  14. package/dist/application/BrowserScenarioCaptureService.js +53 -0
  15. package/dist/application/BrowserScenarioEvidence.js +40 -0
  16. package/dist/application/CallPathTracing.js +160 -0
  17. package/dist/application/CapabilityInventory.js +79 -15
  18. package/dist/application/CompositeProvider.js +10 -1
  19. package/dist/application/DirectAnalysis.js +7 -2
  20. package/dist/application/EnhancedLiteralTracing.js +118 -0
  21. package/dist/application/EnhancedTools.js +35 -121
  22. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +13 -0
  23. package/dist/application/JavaScriptApplicationWorkflowService.js +27 -1
  24. package/dist/application/JavaScriptRuntimeObservationEvidence.js +34 -0
  25. package/dist/application/JavaScriptRuntimeObservationPort.js +1 -0
  26. package/dist/application/JavaScriptRuntimeObservationService.js +46 -0
  27. package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +147 -0
  28. package/dist/application/JavaScriptSemanticGraphBuilder.js +34 -6
  29. package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +156 -0
  30. package/dist/application/JavaScriptSemanticGraphConstruction.js +2 -2
  31. package/dist/application/JavaScriptSemanticGraphDataProjection.js +203 -0
  32. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +25 -0
  33. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +129 -8
  34. package/dist/application/JavaScriptSemanticGraphObjectProjection.js +81 -0
  35. package/dist/application/JavaScriptSemanticGraphProjection.js +14 -7
  36. package/dist/application/JavaScriptSemanticGraphResourceProjection.js +59 -0
  37. package/dist/application/JavaScriptSemanticGraphValueProjection.js +77 -0
  38. package/dist/application/ProcessCaptureEnvironment.js +26 -0
  39. package/dist/application/ProcessCaptureLifecycle.js +1 -0
  40. package/dist/application/ProcessCheckpoints.js +5 -0
  41. package/dist/application/ProcessHarness.js +45 -34
  42. package/dist/application/ProcessNormalization.js +6 -0
  43. package/dist/application/ProcessReactiveCoordinator.js +10 -3
  44. package/dist/application/ProcessReactiveEffects.js +15 -1
  45. package/dist/application/ProcessReactiveHarness.js +100 -0
  46. package/dist/application/ProcessReactiveObservations.js +101 -16
  47. package/dist/application/ProjectPermissionStore.js +1 -0
  48. package/dist/application/ReconstructionObligationAuthority.js +72 -0
  49. package/dist/application/ReconstructionObligationCandidates.js +265 -0
  50. package/dist/application/ReconstructionObligationLedgerDiagnostics.js +47 -0
  51. package/dist/application/ReconstructionObligationLedgerEvaluation.js +263 -0
  52. package/dist/application/ReconstructionObligationLedgerProjection.js +86 -0
  53. package/dist/application/ReconstructionObligationLedgerService.js +72 -0
  54. package/dist/application/ReconstructionObligationOriginalCases.js +33 -0
  55. package/dist/application/ReconstructionObligationPolicies.js +132 -0
  56. package/dist/application/ReconstructionReadinessService.js +48 -0
  57. package/dist/artifacts/ArtifactProvider.js +87 -22
  58. package/dist/browser/BrowserScenarioSecrets.js +53 -0
  59. package/dist/browser/BrowserScenarioSessionPort.js +1 -0
  60. package/dist/browser/CdpBrowserProvider.js +2 -2
  61. package/dist/browser/CdpCaptureDocuments.js +57 -0
  62. package/dist/browser/CdpCaptureStorage.js +71 -29
  63. package/dist/browser/CdpCaptureStorageFingerprints.js +328 -0
  64. package/dist/browser/CdpEndpoint.js +8 -6
  65. package/dist/browser/CdpPageCapture.js +2 -0
  66. package/dist/browser/JavaScriptRuntimeScope.js +38 -0
  67. package/dist/browser/PlaywrightBrowserScenarioProvider.js +253 -0
  68. package/dist/browser/PlaywrightExecutionBoundary.js +42 -0
  69. package/dist/browser/PlaywrightScenarioActions.js +62 -0
  70. package/dist/browser/PlaywrightScenarioArtifacts.js +238 -0
  71. package/dist/browser/PlaywrightScenarioBrowser.js +144 -0
  72. package/dist/browser/PlaywrightScenarioEvents.js +301 -0
  73. package/dist/browser/PlaywrightScenarioSession.js +300 -0
  74. package/dist/browser/V8InspectorCaptureProjection.js +110 -0
  75. package/dist/browser/V8InspectorEndpoint.js +72 -0
  76. package/dist/browser/V8InspectorProvider.js +267 -0
  77. package/dist/catalogIdentity.js +8 -0
  78. package/dist/cli/artifactCommands.js +39 -0
  79. package/dist/cli/coreAnalysisCommands.js +37 -0
  80. package/dist/cli.js +4 -0
  81. package/dist/cliApplicationCommands.js +30 -2
  82. package/dist/cliBrowserAdvancedCommands.js +17 -5
  83. package/dist/cliBrowserCommands.js +1 -0
  84. package/dist/cliBrowserScenarioCommands.js +43 -0
  85. package/dist/cliCommandNames.js +8 -0
  86. package/dist/cliJavaScriptRuntimeCommands.js +164 -0
  87. package/dist/cliObservationOptions.js +4 -0
  88. package/dist/cliPolicyCommands.js +1 -0
  89. package/dist/config/environment.js +12 -0
  90. package/dist/config/parseConfig.js +88 -17
  91. package/dist/contracts/analysisSearchContract.js +14 -0
  92. package/dist/contracts/applicationToolContracts.js +86 -2
  93. package/dist/contracts/applicationWorkflowInputContracts.js +18 -0
  94. package/dist/contracts/artifactToolContracts.js +22 -0
  95. package/dist/contracts/browserProviderToolContracts.js +7 -0
  96. package/dist/contracts/browserScenarioToolContracts.js +81 -0
  97. package/dist/contracts/browserToolContracts.js +88 -98
  98. package/dist/contracts/enhancedInputs.js +25 -6
  99. package/dist/contracts/functionInstructionContract.js +8 -0
  100. package/dist/contracts/hopperMemoryContracts.js +22 -0
  101. package/dist/contracts/javascriptApplicationWorkflowExamples.js +42 -0
  102. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +58 -0
  103. package/dist/contracts/reconstructionReadinessExample.js +436 -0
  104. package/dist/contracts/toolContractExamples.js +5 -0
  105. package/dist/contracts/toolContractTypes.js +1 -0
  106. package/dist/contracts/toolContracts.js +13 -21
  107. package/dist/contracts/toolEffects.js +21 -0
  108. package/dist/contracts/toolOutputSchemaGroups.js +70 -20
  109. package/dist/contracts/toolOutputSchemaPrimitives.js +40 -0
  110. package/dist/domain/analysisErrorProjection.js +8 -0
  111. package/dist/domain/analysisSnapshot.js +2 -0
  112. package/dist/domain/artifactGraph.js +2 -0
  113. package/dist/domain/artifactInspection.js +347 -0
  114. package/dist/domain/binaryTarget.js +3 -6
  115. package/dist/domain/browserCaptureComparison.js +82 -0
  116. package/dist/domain/browserObservation.js +8 -1
  117. package/dist/domain/browserObservationErrors.js +1 -0
  118. package/dist/domain/browserObservationSchemas.js +26 -0
  119. package/dist/domain/browserScenario.js +165 -0
  120. package/dist/domain/browserScenarioCapture.js +57 -0
  121. package/dist/domain/browserScenarioCaptureValues.js +204 -0
  122. package/dist/domain/browserScenarioDiff.js +324 -0
  123. package/dist/domain/browserScenarioDiffValues.js +157 -0
  124. package/dist/domain/browserScenarioNormalization.js +45 -0
  125. package/dist/domain/browserScenarioValues.js +372 -0
  126. package/dist/domain/evidence.js +2 -0
  127. package/dist/domain/hopperValues.js +10 -0
  128. package/dist/domain/javascriptRuntimeObservation.js +170 -0
  129. package/dist/domain/javascriptRuntimeReconciliationParsing.js +120 -2
  130. package/dist/domain/javascriptRuntimeReconciliationResult.js +3 -3
  131. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +2 -2
  132. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
  133. package/dist/domain/javascriptSemanticAnalysis.js +5 -4
  134. package/dist/domain/javascriptSemanticAsyncEffects.js +253 -0
  135. package/dist/domain/javascriptSemanticChildProcesses.js +237 -0
  136. package/dist/domain/javascriptSemanticDataEffectHelpers.js +125 -0
  137. package/dist/domain/javascriptSemanticDataEffects.js +284 -0
  138. package/dist/domain/javascriptSemanticDerivedAnalysis.js +41 -0
  139. package/dist/domain/javascriptSemanticFingerprints.js +174 -0
  140. package/dist/domain/javascriptSemanticIr.js +21 -1
  141. package/dist/domain/javascriptSemanticObjects.js +115 -0
  142. package/dist/domain/javascriptSemanticPromises.js +290 -0
  143. package/dist/domain/javascriptSemanticResources.js +136 -0
  144. package/dist/domain/javascriptStaticAnalysis.js +4 -3
  145. package/dist/domain/javascriptStaticAnalysisBundler.js +38 -0
  146. package/dist/domain/javascriptStaticAnalysisCalls.js +23 -1
  147. package/dist/domain/javascriptStaticAnalysisHelpers.js +8 -0
  148. package/dist/domain/processCapture.js +71 -1
  149. package/dist/domain/processCaptureReactiveValidation.js +175 -0
  150. package/dist/domain/processCaptureValidation.js +2 -0
  151. package/dist/domain/processObservation.js +15 -6
  152. package/dist/domain/processReactiveRuntime.js +21 -10
  153. package/dist/domain/processReactiveScenario.js +1 -0
  154. package/dist/domain/processReactiveTransition.js +17 -10
  155. package/dist/domain/processScenario.js +21 -0
  156. package/dist/domain/providerCleanupError.js +11 -0
  157. package/dist/domain/reconstructionObligationLedgerSchemas.js +278 -0
  158. package/dist/domain/reconstructionReadiness.js +121 -0
  159. package/dist/domain/reconstructionReadinessFindingHelpers.js +17 -0
  160. package/dist/domain/reconstructionReadinessIntegrityFindings.js +118 -0
  161. package/dist/domain/reconstructionReadinessJourneyFindings.js +193 -0
  162. package/dist/domain/reconstructionReadinessSchemas.js +240 -0
  163. package/dist/domain/sourceToBundleComparison.js +335 -0
  164. package/dist/domain/sourceToBundleComparisonSchemas.js +133 -0
  165. package/dist/domain/sourceToBundleSignals.js +202 -0
  166. package/dist/domain/webCaptureDiff.js +141 -27
  167. package/dist/domain/webScreenshot.js +1 -1
  168. package/dist/domain/zipPackageFormat.js +20 -0
  169. package/dist/generatedPackageMetadata.js +1 -1
  170. package/dist/ghidra/GhidraDefaults.js +1 -1
  171. package/dist/ghidra/GhidraFunctionValues.js +13 -1
  172. package/dist/ghidra/GhidraProviderCapabilities.js +7 -0
  173. package/dist/hopper/HopperCleanup.js +158 -0
  174. package/dist/hopper/HopperClient.js +69 -99
  175. package/dist/hopper/HopperProvider.js +20 -1
  176. package/dist/hopper/HopperRequestQueue.js +187 -0
  177. package/dist/hopper/HopperResponseStream.js +46 -0
  178. package/dist/hopper/protocol.js +1 -0
  179. package/dist/main/transport.js +24 -24
  180. package/dist/main.js +6 -0
  181. package/dist/mcpDoctor.js +25 -2
  182. package/dist/native/NativeMacOSProvider.js +1 -0
  183. package/dist/process/ProcessCommandIdentity.js +19 -0
  184. package/dist/process/ProcessOwnership.js +11 -8
  185. package/dist/server/DynamicToolAvailability.js +70 -0
  186. package/dist/server/createServer.js +46 -1
  187. package/dist/server/lifecycleProgress.js +10 -0
  188. package/dist/server/permissionFailure.js +12 -0
  189. package/dist/server/registerApplicationTools/compareSourceToBundle.js +35 -0
  190. package/dist/server/registerApplicationTools/helpers.js +11 -7
  191. package/dist/server/registerApplicationTools/obligationLedger.js +27 -0
  192. package/dist/server/registerApplicationTools/readiness.js +55 -0
  193. package/dist/server/registerApplicationTools.js +6 -0
  194. package/dist/server/registerArtifactTools.js +9 -1
  195. package/dist/server/registerBrowserScenarioTool.js +25 -0
  196. package/dist/server/registerBrowserTools.js +2 -2
  197. package/dist/server/registerCloseLifecycleTool.js +57 -0
  198. package/dist/server/registerEnhancedTools.js +16 -5
  199. package/dist/server/registerEvidenceResources.js +4 -0
  200. package/dist/server/registerEvidenceTools.js +9 -2
  201. package/dist/server/registerJavaScriptRuntimeObservationTools.js +37 -0
  202. package/dist/server/registerReconstructionObligationLedgerResource.js +39 -0
  203. package/dist/server/registerReconstructionReadinessResource.js +39 -0
  204. package/dist/server/registerSessionStatusTool.js +11 -8
  205. package/dist/server/registerSessionTools.js +11 -57
  206. package/dist/server/sessionAvailabilityPolicy.js +10 -8
  207. package/package.json +12 -6
  208. package/skills/reverse-engineer-anything/SKILL.md +4 -3
  209. package/skills/reverse-engineer-anything/references/native-and-artifacts.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 { compareWebCapturesInputSchema } from "./domain/webCaptureDiff.js";
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 web capture JSON values",
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 parsed = compareWebCapturesInputSchema.safeParse({
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
+ });
@@ -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),
@@ -9,6 +9,7 @@ import { CLI_COMMANDS } from "./cliCommandNames.js";
9
9
  const capabilitySchema = z.enum([
10
10
  "process_capture",
11
11
  "browser_observe",
12
+ "browser_automate",
12
13
  "electron_observe",
13
14
  "evidence_read",
14
15
  "evidence_write",
@@ -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 browserEndpoints = parseBrowserArray(env.REA_BROWSER_CDP_ENDPOINTS_JSON, "REA_BROWSER_CDP_ENDPOINTS_JSON", browserEndpointSchema, 16);
41
- if (!browserEndpoints.ok)
42
- return browserEndpoints;
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
- javascriptReplayRoots: javascriptReplayRoots.value,
73
- managedRuntimeRoots: managedRuntimeRoots.value,
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(env.REA_PROCESS_CAPTURE_AUTO_GRANT === "true"
208
- ? permissionCeilings
209
- : permissionCeilings.filter(({ capability }) => capability !== "process_capture")),
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 { compareApplicationVersionsRequestSchema, compareJavaScriptExportShapesRequestSchema, traceApplicationFeatureRequestSchema, traceJavaScriptSemanticsRequestSchema, } from "./applicationWorkflowInputContracts.js";
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"),