rea-agents 2.4.0 → 3.0.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 (231) hide show
  1. package/README.md +91 -19
  2. package/bridge/ghidra/ReaGhidraBridge.java +524 -4
  3. package/bridge/hopper_bridge.py +313 -28
  4. package/dist/application/AnalysisClientCleanup.js +14 -0
  5. package/dist/application/AnalysisContextQueries.js +130 -0
  6. package/dist/application/AnalysisSnapshotCache.js +4 -2
  7. package/dist/application/ApplicationWorkflowEvidenceResolver.js +31 -13
  8. package/dist/application/ArtifactInventory/scanCanonical.js +1 -1
  9. package/dist/application/BinarySession.js +20 -8
  10. package/dist/application/BinarySessionComposition.js +21 -0
  11. package/dist/application/BinarySessionRecords.js +79 -9
  12. package/dist/application/BinarySessionStatus.js +31 -1
  13. package/dist/application/BrowserEvidence.js +14 -0
  14. package/dist/application/BrowserScenarioCapturePort.js +1 -0
  15. package/dist/application/BrowserScenarioCaptureService.js +53 -0
  16. package/dist/application/BrowserScenarioEvidence.js +40 -0
  17. package/dist/application/CallPathTracing.js +160 -0
  18. package/dist/application/CapabilityInventory.js +84 -14
  19. package/dist/application/ClientRegistrationStatus.js +4 -1
  20. package/dist/application/CompositeProvider.js +10 -1
  21. package/dist/application/DirectAnalysis.js +13 -4
  22. package/dist/application/EnhancedLiteralTracing.js +118 -0
  23. package/dist/application/EnhancedTools.js +71 -127
  24. package/dist/application/EvidenceLedger.js +45 -16
  25. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +13 -0
  26. package/dist/application/JavaScriptApplicationWorkflowService.js +27 -1
  27. package/dist/application/JavaScriptArtifactAnalysis.js +13 -4
  28. package/dist/application/JavaScriptRuntimeObservationEvidence.js +34 -0
  29. package/dist/application/JavaScriptRuntimeObservationPort.js +1 -0
  30. package/dist/application/JavaScriptRuntimeObservationService.js +46 -0
  31. package/dist/application/JavaScriptSemanticGraphAsyncProjection.js +147 -0
  32. package/dist/application/JavaScriptSemanticGraphBuilder.js +34 -6
  33. package/dist/application/JavaScriptSemanticGraphChildProcessProjection.js +156 -0
  34. package/dist/application/JavaScriptSemanticGraphConstruction.js +2 -2
  35. package/dist/application/JavaScriptSemanticGraphDataProjection.js +203 -0
  36. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +25 -0
  37. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +129 -8
  38. package/dist/application/JavaScriptSemanticGraphObjectProjection.js +81 -0
  39. package/dist/application/JavaScriptSemanticGraphProjection.js +14 -7
  40. package/dist/application/JavaScriptSemanticGraphResourceProjection.js +59 -0
  41. package/dist/application/JavaScriptSemanticGraphValueProjection.js +77 -0
  42. package/dist/application/LazyAnalysisProvider.js +77 -0
  43. package/dist/application/LoopbackReplay.js +1 -1
  44. package/dist/application/NativeApiInspection.js +80 -0
  45. package/dist/application/ProcessReactiveEffects.js +6 -0
  46. package/dist/application/ProcessReactiveHarness.js +16 -1
  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/application/SessionProviderRouter.js +6 -6
  58. package/dist/application/SetupClientConfiguration.js +4 -2
  59. package/dist/application/runtime.js +26 -9
  60. package/dist/artifacts/ArtifactProvider.js +87 -22
  61. package/dist/browser/BrowserScenarioSecrets.js +53 -0
  62. package/dist/browser/BrowserScenarioSessionPort.js +1 -0
  63. package/dist/browser/CdpBrowserProvider.js +2 -2
  64. package/dist/browser/CdpCaptureDocuments.js +57 -0
  65. package/dist/browser/CdpCaptureStorage.js +71 -29
  66. package/dist/browser/CdpCaptureStorageFingerprints.js +328 -0
  67. package/dist/browser/CdpEndpoint.js +8 -6
  68. package/dist/browser/CdpPageCapture.js +2 -0
  69. package/dist/browser/JavaScriptRuntimeScope.js +38 -0
  70. package/dist/browser/PlaywrightBrowserScenarioProvider.js +259 -0
  71. package/dist/browser/PlaywrightExecutionBoundary.js +42 -0
  72. package/dist/browser/PlaywrightScenarioActions.js +62 -0
  73. package/dist/browser/PlaywrightScenarioArtifacts.js +238 -0
  74. package/dist/browser/PlaywrightScenarioBrowser.js +144 -0
  75. package/dist/browser/PlaywrightScenarioEvents.js +301 -0
  76. package/dist/browser/PlaywrightScenarioSession.js +300 -0
  77. package/dist/browser/V8InspectorCaptureProjection.js +110 -0
  78. package/dist/browser/V8InspectorEndpoint.js +72 -0
  79. package/dist/browser/V8InspectorProvider.js +267 -0
  80. package/dist/catalogIdentity.js +11 -3
  81. package/dist/cli/artifactCommands.js +44 -3
  82. package/dist/cli/coreAnalysisCommands.js +78 -0
  83. package/dist/cli.js +4 -0
  84. package/dist/cliApplicationCommands.js +30 -2
  85. package/dist/cliBrowserAdvancedCommands.js +17 -5
  86. package/dist/cliBrowserCommands.js +1 -0
  87. package/dist/cliBrowserScenarioCommands.js +43 -0
  88. package/dist/cliCommandNames.js +9 -0
  89. package/dist/cliJavaScriptRuntimeCommands.js +164 -0
  90. package/dist/cliObservationOptions.js +4 -0
  91. package/dist/cliPolicyCommands.js +1 -0
  92. package/dist/config/environment.js +12 -0
  93. package/dist/config/parseConfig.js +88 -17
  94. package/dist/contracts/analysisSearchContract.js +14 -0
  95. package/dist/contracts/applicationToolContracts.js +86 -2
  96. package/dist/contracts/applicationWorkflowInputContracts.js +18 -0
  97. package/dist/contracts/artifactToolContracts.js +29 -2
  98. package/dist/contracts/browserProviderToolContracts.js +7 -0
  99. package/dist/contracts/browserScenarioToolContracts.js +81 -0
  100. package/dist/contracts/browserToolContracts.js +88 -98
  101. package/dist/contracts/enhancedInputs.js +35 -6
  102. package/dist/contracts/functionInstructionContract.js +8 -0
  103. package/dist/contracts/functionWorkflowToolContracts.js +30 -0
  104. package/dist/contracts/hopperMemoryContracts.js +22 -0
  105. package/dist/contracts/javascriptApplicationWorkflowExamples.js +42 -0
  106. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +58 -0
  107. package/dist/contracts/promptContracts.js +14 -15
  108. package/dist/contracts/reconstructionReadinessExample.js +436 -0
  109. package/dist/contracts/toolContractExamples.js +8 -0
  110. package/dist/contracts/toolContractTypes.js +1 -0
  111. package/dist/contracts/toolContracts.js +34 -25
  112. package/dist/contracts/toolEffects.js +25 -0
  113. package/dist/contracts/toolOutputSchemaGroups.js +120 -30
  114. package/dist/contracts/toolOutputSchemaPrimitives.js +37 -0
  115. package/dist/domain/analysisErrorPresentation.js +8 -2
  116. package/dist/domain/analysisErrorProjection.js +9 -0
  117. package/dist/domain/artifactInspection.js +347 -0
  118. package/dist/domain/browserCaptureComparison.js +82 -0
  119. package/dist/domain/browserObservation.js +8 -1
  120. package/dist/domain/browserObservationErrors.js +1 -0
  121. package/dist/domain/browserObservationSchemas.js +26 -0
  122. package/dist/domain/browserScenario.js +165 -0
  123. package/dist/domain/browserScenarioCapture.js +57 -0
  124. package/dist/domain/browserScenarioCaptureValues.js +204 -0
  125. package/dist/domain/browserScenarioDiff.js +324 -0
  126. package/dist/domain/browserScenarioDiffValues.js +157 -0
  127. package/dist/domain/browserScenarioNormalization.js +45 -0
  128. package/dist/domain/browserScenarioValues.js +372 -0
  129. package/dist/domain/bytecodeProvider.js +179 -0
  130. package/dist/domain/conformancePackage.js +169 -0
  131. package/dist/domain/conformanceReplay.js +104 -0
  132. package/dist/domain/conformanceTrustGate.js +193 -0
  133. package/dist/domain/customProtocolCapture.js +137 -0
  134. package/dist/domain/eventProcessTree.js +214 -0
  135. package/dist/domain/evidenceBundle.js +47 -0
  136. package/dist/domain/hopperStartupFailure.js +1 -1
  137. package/dist/domain/hopperValues.js +14 -1
  138. package/dist/domain/inputIssueProjection.js +7 -1
  139. package/dist/domain/javascriptRuntimeObservation.js +170 -0
  140. package/dist/domain/javascriptRuntimeReconciliationParsing.js +120 -2
  141. package/dist/domain/javascriptRuntimeReconciliationResult.js +3 -3
  142. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +2 -2
  143. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +1 -1
  144. package/dist/domain/javascriptSemanticAnalysis.js +13 -16
  145. package/dist/domain/javascriptSemanticAsyncEffects.js +253 -0
  146. package/dist/domain/javascriptSemanticChildProcesses.js +237 -0
  147. package/dist/domain/javascriptSemanticDataEffectHelpers.js +125 -0
  148. package/dist/domain/javascriptSemanticDataEffects.js +284 -0
  149. package/dist/domain/javascriptSemanticDerivedAnalysis.js +41 -0
  150. package/dist/domain/javascriptSemanticFingerprints.js +174 -0
  151. package/dist/domain/javascriptSemanticIr.js +21 -1
  152. package/dist/domain/javascriptSemanticObjects.js +115 -0
  153. package/dist/domain/javascriptSemanticPromises.js +290 -0
  154. package/dist/domain/javascriptSemanticResources.js +136 -0
  155. package/dist/domain/javascriptSourceParser.js +15 -0
  156. package/dist/domain/javascriptStaticAnalysis.js +12 -15
  157. package/dist/domain/javascriptStaticAnalysisBundler.js +38 -0
  158. package/dist/domain/javascriptStaticAnalysisCalls.js +23 -1
  159. package/dist/domain/javascriptStaticAnalysisHelpers.js +8 -0
  160. package/dist/domain/mobileApplicationInvestigation.js +159 -0
  161. package/dist/domain/nativeApiBoundary.js +130 -0
  162. package/dist/domain/objcSwiftMetadata.js +150 -0
  163. package/dist/domain/packageAnalysis.js +123 -0
  164. package/dist/domain/peInspection.js +196 -0
  165. package/dist/domain/processCapture.js +8 -2
  166. package/dist/domain/processReactiveScenario.js +1 -0
  167. package/dist/domain/processReactiveTransition.js +9 -4
  168. package/dist/domain/protocolCapture.js +243 -0
  169. package/dist/domain/providerCleanupError.js +11 -0
  170. package/dist/domain/reconstructionObligationLedgerSchemas.js +278 -0
  171. package/dist/domain/reconstructionReadiness.js +121 -0
  172. package/dist/domain/reconstructionReadinessFindingHelpers.js +17 -0
  173. package/dist/domain/reconstructionReadinessIntegrityFindings.js +118 -0
  174. package/dist/domain/reconstructionReadinessJourneyFindings.js +193 -0
  175. package/dist/domain/reconstructionReadinessSchemas.js +240 -0
  176. package/dist/domain/sourceToBundleComparison.js +335 -0
  177. package/dist/domain/sourceToBundleComparisonSchemas.js +133 -0
  178. package/dist/domain/sourceToBundleSignals.js +202 -0
  179. package/dist/domain/webCaptureDiff.js +141 -27
  180. package/dist/domain/webScreenshot.js +1 -1
  181. package/dist/dotnet/ManagedStaticProvider.js +34 -5
  182. package/dist/generatedMcpToolCatalog.js +37 -0
  183. package/dist/generatedPackageMetadata.js +4 -4
  184. package/dist/ghidra/GhidraDefaults.js +1 -1
  185. package/dist/ghidra/GhidraFunctionValues.js +40 -2
  186. package/dist/ghidra/GhidraProviderCapabilities.js +47 -38
  187. package/dist/hopper/HopperCleanup.js +158 -0
  188. package/dist/hopper/HopperClient.js +93 -99
  189. package/dist/hopper/HopperProvider.js +61 -30
  190. package/dist/hopper/HopperRequestQueue.js +215 -0
  191. package/dist/hopper/HopperResponseStream.js +46 -0
  192. package/dist/hopper/protocol.js +63 -20
  193. package/dist/main/transport.js +24 -27
  194. package/dist/main.js +14 -6
  195. package/dist/mcpDoctor.js +27 -4
  196. package/dist/mcpStartupPolicy.js +14 -0
  197. package/dist/process/ProcessCommandIdentity.js +19 -0
  198. package/dist/process/ProcessOwnership.js +11 -8
  199. package/dist/server/DynamicToolAvailability.js +70 -0
  200. package/dist/server/LazyToolCatalog.js +134 -0
  201. package/dist/server/createServer.js +92 -154
  202. package/dist/server/hydrateServerTools.js +191 -0
  203. package/dist/server/lifecycleProgress.js +10 -0
  204. package/dist/server/permissionFailure.js +12 -0
  205. package/dist/server/registerApplicationTools/compareSourceToBundle.js +35 -0
  206. package/dist/server/registerApplicationTools/helpers.js +11 -7
  207. package/dist/server/registerApplicationTools/obligationLedger.js +27 -0
  208. package/dist/server/registerApplicationTools/readiness.js +55 -0
  209. package/dist/server/registerApplicationTools.js +6 -0
  210. package/dist/server/registerArtifactTools.js +9 -1
  211. package/dist/server/registerBrowserScenarioTool.js +25 -0
  212. package/dist/server/registerBrowserTools.js +2 -2
  213. package/dist/server/registerCloseLifecycleTool.js +57 -0
  214. package/dist/server/registerEnhancedTools.js +28 -7
  215. package/dist/server/registerEvidenceResources.js +54 -101
  216. package/dist/server/registerEvidenceTools.js +9 -2
  217. package/dist/server/registerInvestigationTools.js +1 -2
  218. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -4
  219. package/dist/server/registerJavaScriptRuntimeObservationTools.js +37 -0
  220. package/dist/server/registerReconstructionObligationLedgerResource.js +32 -0
  221. package/dist/server/registerReconstructionReadinessResource.js +32 -0
  222. package/dist/server/registerSessionRecordTools.js +82 -12
  223. package/dist/server/registerSessionStatusTool.js +11 -8
  224. package/dist/server/registerSessionTools.js +32 -58
  225. package/dist/server/sessionAvailabilityPolicy.js +10 -8
  226. package/dist/server/toolRegistrationOptions.js +21 -6
  227. package/dist/server/toolResult.js +12 -0
  228. package/package.json +28 -11
  229. package/scripts/package-runner-bootstrap.mjs +72 -0
  230. package/scripts/rea.mjs +11 -1
  231. package/skills/reverse-engineer-anything/SKILL.md +10 -3
@@ -0,0 +1,436 @@
1
+ import { createEvidence } from "../domain/evidence.js";
2
+ import { createEvidenceBundle } from "../domain/evidenceBundle.js";
3
+ import { READINESS_REQUIRED_CHECKS, READINESS_STAGE_IDS, } from "../domain/reconstructionReadinessJourneyFindings.js";
4
+ const HASH = "a".repeat(64);
5
+ const sourceEvidence = (variant) => createEvidence(undefined, {
6
+ id: "rea-readiness-fixture",
7
+ name: "REA readiness fixture",
8
+ version: "1",
9
+ }, {
10
+ predicateType: "rea.reconstruction-readiness-fixture/v1",
11
+ operation: "run_reconstruction_readiness_fixture",
12
+ parameters: { variant },
13
+ result: { passed: true, variant },
14
+ confidence: "observed",
15
+ authority: "controlled-replay",
16
+ });
17
+ const SOURCE = sourceEvidence("authority");
18
+ const CONTRADICTING_SOURCE = sourceEvidence("contradiction");
19
+ const EVIDENCE_ID = SOURCE.evidence_id;
20
+ const CASES = [
21
+ "positive",
22
+ "negative",
23
+ "malformed",
24
+ "cancellation",
25
+ "teardown",
26
+ ];
27
+ const FIXTURES = [
28
+ "native",
29
+ "javascript-cli",
30
+ "electron",
31
+ "incomplete-reconstruction",
32
+ "broken-runtime",
33
+ ];
34
+ const STATUSES = [
35
+ "unowned",
36
+ "characterized",
37
+ "implemented",
38
+ "verified",
39
+ "contradicted",
40
+ "blocked",
41
+ "out-of-scope",
42
+ "unknown",
43
+ ];
44
+ const LAYERS = [
45
+ "cli",
46
+ "protocol",
47
+ "electron",
48
+ "persistence",
49
+ "process",
50
+ "runtime",
51
+ "packaging",
52
+ "native-abi",
53
+ "application",
54
+ "other",
55
+ ];
56
+ const EVIDENCE_STATES = [
57
+ "candidate",
58
+ "observed",
59
+ "reviewed",
60
+ "unknown",
61
+ ];
62
+ /** Complete synthetic input shared by docs, tests, CLI, MCP, and verifier. */
63
+ export const RECONSTRUCTION_READINESS_EXAMPLE = {
64
+ schema_version: 1,
65
+ identity: {
66
+ cli_version: "2.4.0",
67
+ server_version: "2.4.0",
68
+ catalog_digest: HASH,
69
+ skill_digest: HASH,
70
+ versions: [
71
+ {
72
+ component: "rea-cli",
73
+ version: "2.4.0",
74
+ digest: HASH,
75
+ state: "current",
76
+ remediation: null,
77
+ },
78
+ {
79
+ component: "rea-server",
80
+ version: "2.3.0",
81
+ digest: "b".repeat(64),
82
+ state: "stale",
83
+ remediation: "Restart the connected MCP server.",
84
+ },
85
+ {
86
+ component: "rea-server",
87
+ version: "2.4.0",
88
+ digest: HASH,
89
+ state: "current",
90
+ remediation: null,
91
+ },
92
+ ],
93
+ providers: [
94
+ {
95
+ provider_id: "javascript-application",
96
+ version: "1",
97
+ digest: HASH,
98
+ state: "available",
99
+ reason_code: null,
100
+ },
101
+ {
102
+ provider_id: "broken-runtime-probe",
103
+ version: null,
104
+ digest: null,
105
+ state: "broken-host",
106
+ reason_code: "host-runtime-linker-failure",
107
+ },
108
+ ],
109
+ },
110
+ client: {
111
+ name: "synthetic-mcp-client",
112
+ version: "1",
113
+ negotiated_capabilities: ["elicitation", "progress", "resources"],
114
+ },
115
+ capabilities: [
116
+ {
117
+ capability_id: "analyze-javascript-application",
118
+ available: true,
119
+ bounded: true,
120
+ side_effect: "reads-target",
121
+ authority_scopes: ["investigation-input"],
122
+ limits: [{ name: "max-ast-nodes", value: 2_000_000, unit: "count" }],
123
+ unavailable_reason: null,
124
+ },
125
+ ],
126
+ fixtures: FIXTURES.map((kind) => ({
127
+ fixture_id: `fixture.${kind}`,
128
+ kind,
129
+ artifact_sha256: HASH,
130
+ environment_id: "environment.synthetic",
131
+ deliberate_faults: [`fault.${kind}`],
132
+ })),
133
+ workflow_candidates: FIXTURES.map((kind) => ({
134
+ fixture_id: `fixture.${kind}`,
135
+ workflow_id: `workflow.${kind}`,
136
+ provider_id: kind === "broken-runtime" ? null : `provider.${kind}`,
137
+ selected: true,
138
+ invoked: true,
139
+ compatibility: "compatible",
140
+ reason_code: "compatible-artifact-family",
141
+ })),
142
+ grants: [
143
+ {
144
+ grant_id: "grant.denied",
145
+ scope: "process-capture",
146
+ decision: "denied",
147
+ launched_process: false,
148
+ evidence_ids: [EVIDENCE_ID],
149
+ },
150
+ {
151
+ grant_id: "grant.session",
152
+ scope: "process-capture",
153
+ decision: "granted",
154
+ launched_process: true,
155
+ evidence_ids: [EVIDENCE_ID],
156
+ },
157
+ ],
158
+ evidence_bundle: createEvidenceBundle([SOURCE, CONTRADICTING_SOURCE]),
159
+ comparisons: [
160
+ {
161
+ comparison_id: "comparison.concurrent",
162
+ verdict: "equivalent",
163
+ schedule_semantics: "partial-order",
164
+ concurrent: true,
165
+ truncated: false,
166
+ unavailable_authority: false,
167
+ unstable: false,
168
+ deliberate_divergence_ref: null,
169
+ divergence_refs: [],
170
+ contradiction_ids: [],
171
+ evidence_ids: [EVIDENCE_ID],
172
+ },
173
+ {
174
+ comparison_id: "comparison.divergence",
175
+ verdict: "different",
176
+ schedule_semantics: "finite-traces",
177
+ concurrent: true,
178
+ truncated: false,
179
+ unavailable_authority: false,
180
+ unstable: false,
181
+ deliberate_divergence_ref: "/events/primary",
182
+ divergence_refs: ["/events/primary"],
183
+ contradiction_ids: [],
184
+ evidence_ids: [EVIDENCE_ID],
185
+ },
186
+ {
187
+ comparison_id: "comparison.contradicted",
188
+ verdict: "unknown",
189
+ schedule_semantics: "finite-traces",
190
+ concurrent: false,
191
+ truncated: false,
192
+ unavailable_authority: false,
193
+ unstable: false,
194
+ deliberate_divergence_ref: null,
195
+ divergence_refs: [],
196
+ contradiction_ids: ["contradiction.artifact"],
197
+ evidence_ids: [EVIDENCE_ID],
198
+ },
199
+ ],
200
+ contradictions: [
201
+ {
202
+ contradiction_id: "contradiction.artifact",
203
+ declared_sha256: HASH,
204
+ observed_sha256: "b".repeat(64),
205
+ policy: "record-and-continue",
206
+ affected_comparison_ids: ["comparison.contradicted"],
207
+ evidence_ids: [EVIDENCE_ID, CONTRADICTING_SOURCE.evidence_id],
208
+ },
209
+ ],
210
+ obligation_ledger: {
211
+ schema: "ReconstructionObligationLedger",
212
+ schema_version: 1,
213
+ ledger_id: `rol_${HASH}`,
214
+ closure_digest: HASH,
215
+ status: "ready",
216
+ coverage: {
217
+ status: "complete",
218
+ truncated: false,
219
+ omitted_count: 0,
220
+ max_obligations: 100,
221
+ },
222
+ summary: {
223
+ total: 1,
224
+ required: 1,
225
+ verified: 1,
226
+ required_open: 0,
227
+ by_status: STATUSES.map((key) => ({
228
+ key,
229
+ count: key === "verified" ? 1 : 0,
230
+ })),
231
+ by_application_layer: LAYERS.map((key) => ({
232
+ key,
233
+ count: key === "process" ? 1 : 0,
234
+ })),
235
+ by_evidence_authority: EVIDENCE_STATES.map((key) => ({
236
+ key,
237
+ count: key === "observed" ? 1 : 0,
238
+ })),
239
+ },
240
+ reports: {
241
+ missing_owner_obligation_ids: [],
242
+ missing_verifier_obligation_ids: [],
243
+ contradicted_obligation_ids: [],
244
+ residual_unknown_ids: [],
245
+ },
246
+ ownership_graph: [
247
+ {
248
+ obligation_id: "obl.readiness",
249
+ module_path: "src/readiness.ts",
250
+ symbol: "runReadiness",
251
+ },
252
+ ],
253
+ dependency_graph: [],
254
+ obligations: [
255
+ {
256
+ obligation_id: "obl.readiness",
257
+ obligation_version: 1,
258
+ title: "Preserve the packaged readiness fixture lifecycle",
259
+ origin: "reviewed",
260
+ application_layer: "process",
261
+ family: "packaged-process-lifecycle",
262
+ target: {
263
+ artifact_sha256: HASH,
264
+ application_node_id: null,
265
+ semantic_node_id: null,
266
+ location: "/fixture",
267
+ },
268
+ authority_references: [
269
+ {
270
+ evidence_id: EVIDENCE_ID,
271
+ authority: "controlled-replay",
272
+ state: "observed",
273
+ location: "/fixture",
274
+ },
275
+ ],
276
+ source_state: "observed",
277
+ observed_cases: CASES.map((kind) => ({
278
+ kind,
279
+ evidence_id: EVIDENCE_ID,
280
+ location: `/original/${kind}`,
281
+ })),
282
+ required: true,
283
+ required_case_kinds: [...CASES],
284
+ required_original_authority: "process",
285
+ required_fixture_authority: "packaged-process",
286
+ required_verifier_authority: "packaged-process",
287
+ requires_parser_type: false,
288
+ dependency_obligation_ids: [],
289
+ residual_unknown_ids: [],
290
+ unavailable_authority: [],
291
+ required_next_evidence: [],
292
+ binding: {
293
+ obligation_id: "obl.readiness",
294
+ owner: {
295
+ module_path: "src/readiness.ts",
296
+ symbol: "runReadiness",
297
+ owner_sha256: HASH,
298
+ },
299
+ parser_type: null,
300
+ original_cases: CASES.map((kind) => ({
301
+ kind,
302
+ evidence_id: EVIDENCE_ID,
303
+ location: `/original/${kind}`,
304
+ })),
305
+ fixtures: CASES.map((kind) => ({
306
+ fixture_id: `fixture.${kind}`,
307
+ case_kind: kind,
308
+ authority: "packaged-process",
309
+ evidence_ids: [EVIDENCE_ID],
310
+ })),
311
+ verifier: {
312
+ verifier_id: "verifier.readiness",
313
+ claim_id: "claim.readiness",
314
+ command: "npm run verify:readiness",
315
+ authority: "packaged-process",
316
+ status: "pass",
317
+ result_evidence_id: EVIDENCE_ID,
318
+ enumerated_obligation_ids: ["obl.readiness"],
319
+ nondeterminism: {
320
+ mode: "partial-order",
321
+ specification: "Startup precedes teardown.",
322
+ },
323
+ },
324
+ },
325
+ status: "verified",
326
+ diagnostics: [],
327
+ },
328
+ ],
329
+ evidence_links: [EVIDENCE_ID],
330
+ limitations: [],
331
+ },
332
+ operation_outcomes: [
333
+ {
334
+ sequence: 0,
335
+ operation: "inspect-artifact",
336
+ surface: "cli",
337
+ call_kind: "valid",
338
+ expected_success: true,
339
+ cli_exit_code: 0,
340
+ mcp_status: null,
341
+ error_code: null,
342
+ recovered: false,
343
+ evidence_ids: [EVIDENCE_ID],
344
+ },
345
+ {
346
+ sequence: 1,
347
+ operation: "inspect-artifact",
348
+ surface: "mcp",
349
+ call_kind: "valid",
350
+ expected_success: true,
351
+ cli_exit_code: null,
352
+ mcp_status: "success",
353
+ error_code: null,
354
+ recovered: false,
355
+ evidence_ids: [EVIDENCE_ID],
356
+ },
357
+ {
358
+ sequence: 2,
359
+ operation: "capture-process",
360
+ surface: "cli",
361
+ call_kind: "permission",
362
+ expected_success: false,
363
+ cli_exit_code: 2,
364
+ mcp_status: null,
365
+ error_code: "permission-required",
366
+ recovered: true,
367
+ evidence_ids: [EVIDENCE_ID],
368
+ },
369
+ {
370
+ sequence: 3,
371
+ operation: "capture-process",
372
+ surface: "mcp",
373
+ call_kind: "permission",
374
+ expected_success: false,
375
+ cli_exit_code: null,
376
+ mcp_status: "non-success",
377
+ error_code: "permission-required",
378
+ recovered: true,
379
+ evidence_ids: [EVIDENCE_ID],
380
+ },
381
+ ],
382
+ cleanup: [
383
+ {
384
+ run_id: "run.cancelled",
385
+ cancelled: true,
386
+ owned_resources_remaining: 0,
387
+ diagnostic_evidence_ids: [EVIDENCE_ID],
388
+ },
389
+ ],
390
+ closure_history: [
391
+ {
392
+ sequence: 0,
393
+ ledger_digest: "b".repeat(64),
394
+ status: "open",
395
+ required_open: 1,
396
+ newly_verified_obligation_ids: [],
397
+ evidence_ids: [EVIDENCE_ID],
398
+ },
399
+ {
400
+ sequence: 1,
401
+ ledger_digest: HASH,
402
+ status: "ready",
403
+ required_open: 0,
404
+ newly_verified_obligation_ids: ["obl.readiness"],
405
+ evidence_ids: [EVIDENCE_ID],
406
+ },
407
+ ],
408
+ delegation_checks: [
409
+ {
410
+ candidate_id: "candidate.reconstructed",
411
+ delegates_to_authority: false,
412
+ evidence_ids: [EVIDENCE_ID],
413
+ },
414
+ ],
415
+ replay: {
416
+ expected_source_digest: null,
417
+ deterministic: true,
418
+ tamper_detected: true,
419
+ stale_input_detected: true,
420
+ evidence_ids: [EVIDENCE_ID],
421
+ },
422
+ stages: READINESS_STAGE_IDS.map((stageId) => ({
423
+ stage_id: stageId,
424
+ required: true,
425
+ status: "pass",
426
+ capability_issue: null,
427
+ next_action: null,
428
+ evidence_ids: [EVIDENCE_ID],
429
+ checks: READINESS_REQUIRED_CHECKS[stageId].map((checkId) => ({
430
+ check_id: checkId,
431
+ status: "pass",
432
+ detail: `Synthetic conformance proved ${checkId}.`,
433
+ evidence_ids: [EVIDENCE_ID],
434
+ })),
435
+ })),
436
+ };
@@ -13,6 +13,9 @@ export const TOOL_EXAMPLE_OVERRIDES = {
13
13
  procedure_callees: { procedure: "main" },
14
14
  procedure_callers: { procedure: "main" },
15
15
  procedure_info: { procedure: "main" },
16
+ read_function_instructions: { procedure: "main" },
17
+ read_bytes: { address: "0x1000", length: 16 },
18
+ address_to_file_offset: { address: "0x1000" },
16
19
  procedure_references: { procedure: "main" },
17
20
  procedure_pseudo_code: { procedure: "main" },
18
21
  resolve_containing_procedure: { address: "0x1000" },
@@ -28,8 +31,13 @@ export const TOOL_EXAMPLE_OVERRIDES = {
28
31
  get_call_graph: { address: "0x1000" },
29
32
  find_xrefs_to_name: { name: "malloc" },
30
33
  analyze_function: { procedure: "main" },
34
+ inspect_native_api: { procedure: "main" },
31
35
  trace_feature: { query: "license" },
36
+ find_code_for_string: { query: "authorization failed" },
37
+ trace_call_path: { start: "0x1000", goal: "0x1100" },
32
38
  open_binary: { path: "/tmp/fixture" },
39
+ export_evidence_bundle: { path: "/tmp/evidence.json" },
40
+ inspect_address_context: { address: "0x1000" },
33
41
  import_evidence_bundle: { path: "evidence.json" },
34
42
  capture_process_scenario: {
35
43
  approved: true,
@@ -7,6 +7,7 @@ export const TOOL_KINDS = [
7
7
  "managed-provider",
8
8
  "browser-provider",
9
9
  "electron-provider",
10
+ "runtime-provider",
10
11
  "application",
11
12
  "session",
12
13
  ];
@@ -18,12 +18,17 @@ import { NATIVE_TOOL_CONTRACTS } from "./nativeToolContracts.js";
18
18
  import { ARTIFACT_TOOL_CONTRACTS } from "./artifactToolContracts.js";
19
19
  import { MANAGED_TOOL_CONTRACTS } from "./managedToolContracts.js";
20
20
  import { MANAGED_WORKFLOW_TOOL_CONTRACTS } from "./managedWorkflowToolContracts.js";
21
- import { BROWSER_TOOL_CONTRACTS } from "./browserToolContracts.js";
21
+ import { BROWSER_PROVIDER_TOOL_CONTRACTS } from "./browserProviderToolContracts.js";
22
22
  import { ELECTRON_TOOL_CONTRACTS } from "./electronToolContracts.js";
23
+ import { JAVASCRIPT_RUNTIME_OBSERVATION_TOOL_CONTRACTS } from "./javascriptRuntimeObservationToolContracts.js";
23
24
  import { APPLICATION_TOOL_CONTRACTS } from "./applicationToolContracts.js";
24
25
  import { closeBinaryInputSchema, openBinaryInputSchema, } from "./sessionLifecycleInputs.js";
25
26
  import { toolContractMetadata } from "./toolEffects.js";
26
27
  import { binarySessionInputSchema } from "./sessionStatusContract.js";
28
+ import { functionInstructionInputSchema } from "./functionInstructionContract.js";
29
+ import { HOPPER_MEMORY_TOOL_DEFINITIONS } from "./hopperMemoryContracts.js";
30
+ import { analysisSearchInput } from "./analysisSearchContract.js";
31
+ import { FUNCTION_WORKFLOW_TOOL_CONTRACTS } from "./functionWorkflowToolContracts.js";
27
32
  export { binarySessionInputSchema } from "./sessionStatusContract.js";
28
33
  const document = z.string().optional().describe("The document name");
29
34
  const address = z
@@ -31,27 +36,10 @@ const address = z
31
36
  .describe("A provider-normalized address; default memory uses 0x-prefixed hexadecimal");
32
37
  const optionalAddress = address.optional();
33
38
  const procedure = z.string().describe("The procedure name or address");
34
- const searchPattern = z
35
- .string()
36
- .min(1)
37
- .max(256)
38
- .describe("The literal text or bounded regex pattern to search for");
39
- const caseSensitive = z
40
- .boolean()
41
- .default(false)
42
- .describe("Whether to match case");
43
39
  const pagination = {
44
40
  offset: z.number().int().min(0).default(0),
45
41
  limit: z.number().int().min(1).max(500).default(100),
46
42
  };
47
- const searchInput = {
48
- pattern: searchPattern,
49
- mode: z.enum(["literal", "regex"]).default("literal"),
50
- case_sensitive: caseSensitive,
51
- offset: z.number().int().min(0).default(0),
52
- limit: z.number().int().min(1).max(100).default(100),
53
- document,
54
- };
55
43
  const exampleInputSchema = z.record(z.string(), jsonValueSchema);
56
44
  const examplesFor = (name, inputSchema) => {
57
45
  const parsed = inputSchema.parse(TOOL_EXAMPLE_OVERRIDES[name] ?? {});
@@ -119,6 +107,8 @@ export const OFFICIAL_TOOL_CONTRACTS = [
119
107
  official("procedure_callees", "Return the provider's resolved direct callees for one procedure identified by symbol or address. Unresolved indirect calls may be absent; use analyze_function and typed references to preserve available edge uncertainty.", z.object({ procedure, document })),
120
108
  official("procedure_callers", "Return the provider's resolved direct callers for one procedure identified by symbol or address. Results reflect completed static analysis and may omit unresolved indirect references.", z.object({ procedure, document })),
121
109
  official("procedure_info", "Return bounded metadata for one procedure identified by symbol or address: entrypoint, signature, locals, size, and block count. Follow with decompilation or assembly for behavior.", z.object({ procedure, document })),
110
+ official("read_function_instructions", "Read one offset-paginated window of raw instructions for an analyzed procedure without decompilation, caller discovery, or whole-program string/name scans. Use this fast path for instruction-level orientation; follow next_offset when truncated.", functionInstructionInputSchema),
111
+ ...HOPPER_MEMORY_TOOL_DEFINITIONS.map(({ name, description, inputSchema }) => official(name, description, inputSchema)),
122
112
  official("procedure_references", "Return a bounded set of raw incoming or outgoing reference edges for one procedure. Endpoint procedures are resolved only from provider containment; Ghidra preserves observed reference kinds while providers without kind authority mark them unavailable.", z.object({
123
113
  procedure,
124
114
  direction: z.enum(["incoming", "outgoing"]).default("outgoing"),
@@ -129,8 +119,8 @@ export const OFFICIAL_TOOL_CONTRACTS = [
129
119
  })),
130
120
  official("procedure_pseudo_code", "Decompile one analyzed procedure by symbol name or provider-normalized address. Returns provider-specific pseudocode, never original source or cross-provider text equivalence, and may return null; request procedure_assembly when instruction precision matters.", z.object({ procedure, document })),
131
121
  official("resolve_containing_procedure", "Resolve an arbitrary address, including an interior instruction or exact external entry, to its provider-analyzed containing procedure. A negative result distinguishes outside segments from not in a procedure and is never guessed from nearby symbols.", z.object({ address, document })),
132
- official("search_procedures", "Search analyzed procedure names using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic and offset-paginated.", z.object(searchInput)),
133
- official("search_strings", "Search analyzed strings using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic, offset-paginated, and explicitly truncated.", z.object(searchInput)),
122
+ official("search_procedures", "Search analyzed procedure names using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic and offset-paginated.", z.object(analysisSearchInput)),
123
+ official("search_strings", "Search analyzed strings using literal matching by default or regex opt-in. Providers bound search work and reject regex constructs, paths, candidates, or cumulative work outside their finite budgets. Results are deterministic, offset-paginated, and explicitly truncated.", z.object(analysisSearchInput)),
134
124
  official("set_address_name", "Assign an analyst name to one hexadecimal address and report Hopper's boolean result. This mutates analysis metadata; read it back with address_name before relying on it.", z.object({ address, name: z.string(), document })),
135
125
  official("set_addresses_names", "Assign analyst names to an address/name map and return per-address success booleans. This mutates analysis metadata; use for bounded batches and verify failures individually.", z.object({ names: z.record(z.string(), z.string()), document })),
136
126
  official("set_bookmark", "Create or replace a bookmark at a hexadecimal address. This mutates navigation metadata; verify with list_bookmarks and do not treat bookmarks as binary evidence.", z.object({ address, name: z.string().optional(), document })),
@@ -150,14 +140,27 @@ export const ENHANCED_TOOL_CONTRACTS = [
150
140
  enhanced("analyze_swift_types", "Categorize exhaustively paged procedure names into Swift classes, structs, enums, protocols, extensions, and other symbols. Scans at most 5,000 names and returns at most 50 entries per category.", enhancedInputSchemas.analyze_swift_types),
151
141
  enhanced("find_xrefs_to_name", "Resolve an exact name through the bound provider's exhaustively paged name inventory and return a resolved or unresolved result. Unresolved names use the stable name_not_found reason; this compact xref workflow returns address-only projections.", enhancedInputSchemas.find_xrefs_to_name),
152
142
  enhanced("binary_overview", "Use immediately after opening a target to summarize document, exhaustive procedure/string counts, and a bounded segment sample. detail controls segment fields and limit controls only the returned segment sample.", enhancedInputSchemas.binary_overview),
153
- enhanced("analyze_function", "Preferred bounded analysis for one procedure symbol or address. Returns identity, provider-specific pseudocode, optional assembly, comments, calls, typed-or-explicitly-unavailable references, referenced strings/names, and local CFG blocks with exact truncation metadata.", enhancedInputSchemas.analyze_function),
143
+ ...FUNCTION_WORKFLOW_TOOL_CONTRACTS,
154
144
  enhanced("trace_feature", "Trace a bounded literal feature query through matching strings and procedures, xrefs, and truthful containing-procedure resolution. Returns the operation budget, truncation, and residual unknowns; unknown_registry_approved: true records them durably without inferring reference kinds.", enhancedInputSchemas.trace_feature),
145
+ enhanced("find_code_for_string", "Resolve one literal string query to bounded analyzed string entries, xrefs, and truthful containing-procedure candidates. Returns an Evidence ID, exact operation budget, truncation, and residual unknowns; it never infers reference kinds or runtime reachability.", enhancedInputSchemas.find_code_for_string),
146
+ enhanced("trace_call_path", "Trace a deterministic bounded caller or callee path from one exact procedure address, optionally stopping at a goal. Returns visited nodes, direct-call edges, one shortest traversal path, failures, frontier, consumed limits, an Evidence ID, and explicit residual unknowns without claiming unresolved indirect calls are absent.", enhancedInputSchemas.trace_call_path),
155
147
  ];
156
148
  /** Session-owned Evidence bundle export options. */
157
149
  export const exportEvidenceBundleInputSchema = z.strictObject({
158
- path: z.string().min(1).optional(),
150
+ path: z.string().min(1),
159
151
  overwrite: z.boolean().default(false),
160
152
  });
153
+ /** Retain the current canonical Evidence bundle as a session resource. */
154
+ export const snapshotEvidenceBundleInputSchema = z.strictObject({});
155
+ /** Optional document selection for volatile navigation context. */
156
+ export const navigationContextInputSchema = z.strictObject({
157
+ document: z.string().min(1).optional(),
158
+ });
159
+ /** Explicit reproducible address context query. */
160
+ export const addressContextInputSchema = z.strictObject({
161
+ address: z.string().min(1),
162
+ document: z.string().min(1).optional(),
163
+ });
161
164
  /** Session-owned Evidence bundle import options. */
162
165
  export const importEvidenceBundleInputSchema = z.strictObject({
163
166
  path: z.string().min(1),
@@ -180,6 +183,8 @@ export const listUnknownsInputSchema = z.strictObject({
180
183
  .optional(),
181
184
  severity: z.enum(["low", "medium", "high", "critical"]).optional(),
182
185
  domain: z.string().trim().min(1).max(100).optional(),
186
+ offset: z.number().int().min(0).default(0),
187
+ limit: z.number().int().min(1).max(500).default(100),
183
188
  });
184
189
  /** Exact residual-unknown identity to revalidate. */
185
190
  export const verifyUnknownResolutionInputSchema = z.strictObject({
@@ -190,7 +195,7 @@ export const SESSION_TOOL_CONTRACTS = [
190
195
  session("open_binary", "Open a local executable, application bundle, archive, JavaScript, source map, plist, or analysis database after validation. provider_id selects one deep provider or deterministic auto selection; the binding remains stable until close or an explicit switch, with no failure fallback. An optional snapshot v2 is imported atomically and must match the binary identity, concrete provider, and canonical analysis profile exactly.", openBinaryInputSchema),
191
196
  session("close_binary", "Optionally write a provider-neutral analysis snapshot atomically, then close the active target and every provider resource started for it. Snapshot files require an operator-approved root and explicit overwrite; a failed save leaves the session open so cached analysis is not lost.", closeBinaryInputSchema),
192
197
  session("binary_session", "Report compact target, provider, and alignment state without starting analysis. The default summary is the routing check agents should use; detail=capabilities returns one family-filtered availability page, while detail=full is reserved for complete provider diagnostics.", binarySessionInputSchema),
193
- session("export_evidence_bundle", "Return the session's deterministic Evidence v2 bundle, or atomically write it beneath an operator-approved root. Existing files require overwrite: true; records and manifests use canonical byte-stable ordering.", exportEvidenceBundleInputSchema),
198
+ session("export_evidence_bundle", "Atomically write the session's deterministic Evidence v2 bundle beneath an operator-approved root. Existing files require overwrite: true; records and manifests use canonical byte-stable ordering. For an in-session read, use snapshot_evidence_bundle and read its exact resource URI instead.", exportEvidenceBundleInputSchema),
194
199
  session("import_evidence_bundle", "Read a bounded local JSON bundle beneath an operator-approved root, validate every Evidence v2 ID and canonical manifest, then atomically merge it. Imported content is data only and is never executed.", importEvidenceBundleInputSchema),
195
200
  session("capture_process_scenario", "Run one bounded process under a PTY using operator-approved executable and working roots. Produces Process Capture v4; legacy v3 captures cannot be upgraded and must be recaptured with this tool. Requires approved: true; unknown_registry_approved: true separately records capture residuals. Captures raw and xterm-rendered terminal frames, scripted interactions, lifecycle filesystem checkpoints, process ownership, declarative command shims, and loopback replay. Disabled unless operator policy enables it; not a security sandbox.", processScenarioSchema),
196
201
  session("compare_process_captures", "Compare two compatible Process Capture v4 observations across terminal, interaction, lifecycle, process, filesystem, command-shim, HTTP, and WebSocket evidence. Optional trace_spec validates exact events against an explicit partial order or finite trace language; concurrency is never inferred from timestamps or broad sorting. Missing, journal-free, or truncated observations are never treated as equivalent.", processComparisonInputSchema),
@@ -201,11 +206,14 @@ export const SESSION_TOOL_CONTRACTS = [
201
206
  session("build_call_path", "Build bounded shortest-first direct-callee paths from explicit analyze_function Evidence groups using exact canonical addresses. Missing dossiers, incomplete callee pages, provider mixing, and depth frontiers remain unknown; every node and edge cites source Evidence.", callPathInputSchema),
202
207
  session("correlate_static_and_runtime", "Evaluate explicit caller-declared hypotheses between exact static comparison findings and runtime comparison dimensions. Similar names or paths are never auto-matched, consistent cochange never proves causality, and unknown or truncated inputs remain unresolved.", staticRuntimeCorrelationInputSchema),
203
208
  session("verify_reconstruction", "Verify a finite typed behavioral and structural specification against a canonical Evidence bundle. Pass means every declared claim has complete comparable authority—not global source equivalence; changed claims fail and missing, limited, or unresolved evidence stays unknown.", reconstructionVerificationInputSchema),
204
- session("list_unknowns", "List current residual-unknown heads in deterministic ID order, with optional exact status, severity, and domain filters. This is read-only; unresolved, contradicted, and non-truth dispositions remain distinct.", listUnknownsInputSchema),
209
+ session("list_unknowns", "List current residual-unknown heads in deterministic ID order, with optional exact status, severity, and domain filters. Pages default to 100 items; while has_more is true, pass next_offset as offset and continue until false. This is read-only; unresolved, contradicted, and non-truth dispositions remain distinct.", listUnknownsInputSchema),
205
210
  session("record_unknown", "Create one deterministic residual unknown and immutable mutation evidence. Requires approved: true, validates all evidence and relationship references, and rejects duplicate stable identity.", recordUnknownInputSchema),
206
211
  session("update_unknown", "Append one immutable full-state revision and mutation evidence. Requires approved: true and exact expected_revision; stale concurrent writers fail instead of overwriting newer analysis.", updateUnknownInputSchema),
207
212
  session("verify_unknown_resolution", "Revalidate the current residual-unknown head against live bundled evidence, exact authority/confidence/environment requirements, and revision integrity. Withdrawn and out-of-scope dispositions are not truth claims.", verifyUnknownResolutionInputSchema),
208
213
  session("run_replay_machine", "Evaluate ordered HTTP and WebSocket events directly against one validated finite replay machine without opening sockets or launching a target. Returns every decision, a capture-value-free transition journal, one redacted action table entry per used transition, captured aliases, final state, and exact configured and consumed limits.", replayMachineRunInputSchema),
214
+ session("snapshot_evidence_bundle", "Retain the current canonical Evidence v2 bundle as an immutable session resource. Returns a compact digest summary and exact opaque URI; copy that URI unchanged and call MCP resources/read (Codex: read_mcp_resource) for the full bundle. Repeating an unchanged snapshot is idempotent.", snapshotEvidenceBundleInputSchema),
215
+ session("get_navigation_context", "Return the selected document, current address, and containing/current procedure in one coherent provider-neutral request. A cursor outside any procedure returns procedure: null. Scalar navigation getters remain available for evaluation and compatibility.", navigationContextInputSchema),
216
+ session("inspect_address_context", "Inspect one explicit reproducible address for its analyzed name, containing procedure, regular and inline comments, and matching bookmarks. Each unsupported facet returns a typed unavailable outcome; xrefs, assembly, and pseudocode remain separate bounded follow-ups.", addressContextInputSchema),
209
217
  ];
210
218
  /** Complete ordered public inventory used by registration and verification. */
211
219
  export const TOOL_CONTRACTS = [
@@ -215,8 +223,9 @@ export const TOOL_CONTRACTS = [
215
223
  ...ARTIFACT_TOOL_CONTRACTS,
216
224
  ...MANAGED_TOOL_CONTRACTS,
217
225
  ...MANAGED_WORKFLOW_TOOL_CONTRACTS,
218
- ...BROWSER_TOOL_CONTRACTS,
226
+ ...BROWSER_PROVIDER_TOOL_CONTRACTS,
219
227
  ...ELECTRON_TOOL_CONTRACTS,
228
+ ...JAVASCRIPT_RUNTIME_OBSERVATION_TOOL_CONTRACTS,
220
229
  ...APPLICATION_TOOL_CONTRACTS,
221
230
  ...SESSION_TOOL_CONTRACTS,
222
231
  ];