From 778b995bbfd4b4bb28ace9bf0f7428e50cd1be50 Mon Sep 17 00:00:00 2001
From: N0zoM1z0 <1705004398@qq.com>
Date: Thu, 16 Jul 2026 10:21:41 +0800
Subject: [PATCH] feat(application): add cross-layer graph workflows
---
.github/pull_request_template.md | 2 +-
AGENTS.md | 6 +-
CONTRIBUTING.md | 4 +-
README.md | 12 +-
README_ar.md | 7 +-
README_ja.md | 7 +-
README_ko.md | 7 +-
README_zh.md | 7 +-
docs/api/assets/hierarchy.js | 2 +-
docs/api/assets/navigation.js | 2 +-
docs/api/assets/search.js | 2 +-
...or.JavaScriptArtifactGraphAccumulator.html | 16 +-
...rmissionAuthority.PermissionPathError.html | 2 +-
...ocessCaptureError.ProcessCaptureError.html | 2 +-
...sionStore.ProjectPermissionStoreError.html | 2 +-
...permissionPolicy.PermissionGrantError.html | 2 +-
...idra_GhidraLauncher.GhidraLaunchError.html | 2 +-
...GhidraSessionError.GhidraSessionError.html | 2 +-
.../ghidra_protocol.GhidraRemoteError.html | 2 +-
...ityInventory.buildCapabilityInventory.html | 4 +-
.../application_Doctor.runDoctor.html | 4 +-
...raphContext.electronFindingSourceNode.html | 4 +-
...e.createJavaScriptApplicationEvidence.html | 4 +-
...ceGraph.parseApplicationGraphEvidence.html | 44 +++
...eGraph.parseNativeApplicationEvidence.html | 44 +++
...createApplicationFeatureTraceEvidence.html | 45 +++
...eApplicationVersionComparisonEvidence.html | 45 +++
...ce.compareApplicationVersionsEvidence.html | 44 +++
...rvice.traceApplicationFeatureEvidence.html | 44 +++
...hBuilder.buildJavaScriptArtifactGraph.html | 4 +-
...ctGraphContext.createElectronRoleNode.html | 4 +-
...iptArtifactGraphContext.sourceNodeFor.html | 4 +-
...hEvidence.artifactObservationEvidence.html | 4 +-
...tGraphEvidence.astObservationEvidence.html | 4 +-
...GraphEvidence.staticInferenceEvidence.html | 4 +-
...tGraphEvidence.unavailableAstEvidence.html | 4 +-
...phStructure.addJavaScriptPackageNodes.html | 4 +-
...ture.createJavaScriptArtifactRootNode.html | 4 +-
...vaScriptRuntimeReconciliationEvidence.html | 4 +-
docs/api/functions/cli.createCli.html | 2 +-
...buildJavaScriptApplicationChangeGraph.html | 44 +++
...Graph.createJavaScriptApplicationEdge.html | 4 +-
...raph.createJavaScriptApplicationGraph.html | 4 +-
...Graph.createJavaScriptApplicationNode.html | 4 +-
...Graph.parseJavaScriptApplicationGraph.html | 4 +-
....compareJavaScriptApplicationVersions.html | 44 +++
...classifyJavaScriptApplicationVersions.html | 45 +++
...ys.matchJavaScriptApplicationVersions.html | 45 +++
...atureSeed.findApplicationFeatureSeeds.html | 45 +++
...tFeatureTrace.traceApplicationFeature.html | 44 +++
...eTraversal.traverseApplicationFeature.html | 47 +++
...Handoff.buildJavaScriptNativeHandoffs.html | 46 +++
...nciliation.reconcileJavaScriptRuntime.html | 4 +-
...JavaScriptRuntimeReconciliationResult.html | 4 +-
...ndidates.staticNodeWithinRuntimeScope.html | 4 +-
.../server_createServer.createServer.html | 2 +-
...icationTools.registerApplicationTools.html | 45 +++
docs/api/hierarchy.html | 56 +--
docs/api/index.html | 4 +-
...ation_AnalysisProvider.AnalysisClient.html | 2 +-
...nalysisProvider.AnalysisOperationPort.html | 2 +-
...ion_AnalysisProvider.AnalysisProvider.html | 2 +-
...sisProvider.AnalysisProviderCandidate.html | 2 +-
...n_BinarySessionPort.BinarySessionPort.html | 2 +-
...ryGraphContext.ElectronGraphEdgeInput.html | 6 +-
...eGraph.ApplicationGraphEvidenceSource.html | 76 ++++
...riptArtifactGraphContext.AstEdgeInput.html | 8 +-
...rtifactGraphContext.ContainsEdgeInput.html | 6 +-
...tifactGraphContext.InferenceEdgeInput.html | 8 +-
...ontext.JavaScriptArtifactGraphContext.html | 12 +-
...tifactGraphContext.RoleAssetLinkInput.html | 4 +-
...actGraphContext.UnavailableParseInput.html | 4 +-
...avaScriptArtifactReconstructionResult.html | 4 +-
.../application_Setup.SetupHost.html | 6 +-
.../application_Setup.SetupResult.html | 4 +-
...tracts_toolContractTypes.ToolContract.html | 16 +-
...raph.ApplicationChangeGraphProjection.html | 76 ++++
...ationVersionComparisonProjectionInput.html | 82 ++++
...tems.ApplicationVersionItemProjection.html | 64 +++
....ApplicationVersionMatchingProjection.html | 82 ++++
...ersionKeys.ApplicationVersionNodePair.html | 76 ++++
...atureSeed.ApplicationFeatureSeedMatch.html | 76 ++++
...pplicationFeatureTraceProjectionInput.html | 88 +++++
...Traversal.ApplicationFeatureTraversal.html | 94 +++++
....ReconciledApplicationGraphProjection.html | 4 +-
...ionMatching.RuntimeMatchingProjection.html | 4 +-
...conciliationParsing.ParsedStaticLayer.html | 6 +-
...conciliationRuntime.RuntimeProjection.html | 8 +-
...onRuntime.RuntimeReconciliationEntity.html | 4 +-
...aticCandidates.StaticRuntimeCandidate.html | 4 +-
...main_permissionPolicy.PermissionGrant.html | 2 +-
...in_permissionPolicy.PermissionRequest.html | 2 +-
...main_permissionPolicy.PermissionScope.html | 2 +-
...domain_webInventory.StableWebResource.html | 2 +-
...ebInventory.WebInventoryResourceInput.html | 2 +-
.../ghidra_GhidraLauncher.GhidraLaunch.html | 2 +-
...essionError.GhidraSessionErrorOptions.html | 2 +-
.../hopper_BridgeLauncher.BridgeLaunch.html | 2 +-
...ProviderProcess.ProviderProcessLaunch.html | 2 +-
...rver_createServer.CreateServerOptions.html | 22 +-
.../application_InvestigationProviders.html | 4 +-
...on_JavaScriptApplicationEvidenceGraph.html | 40 ++
...JavaScriptApplicationWorkflowEvidence.html | 36 ++
..._JavaScriptApplicationWorkflowService.html | 36 ++
.../contracts_applicationToolContracts.html | 36 ++
...javascriptApplicationWorkflowExamples.html | 36 ++
...avascriptRuntimeReconciliationExample.html | 4 +-
...main_javascriptApplicationChangeGraph.html | 40 ++
...avascriptApplicationVersionComparison.html | 40 ++
...ptApplicationVersionComparisonSchemas.html | 40 ++
...ain_javascriptApplicationVersionItems.html | 40 ++
...main_javascriptApplicationVersionKeys.html | 40 ++
.../modules/domain_javascriptFeatureSeed.html | 40 ++
.../domain_javascriptFeatureTrace.html | 40 ++
.../domain_javascriptFeatureTraceSchemas.html | 40 ++
.../domain_javascriptFeatureTraversal.html | 40 ++
.../domain_javascriptNativeHandoff.html | 36 ++
.../server_registerApplicationTools.html | 36 ++
.../contracts_toolContractTypes.ToolKind.html | 2 +-
...tracts_toolContracts.OfficialToolName.html | 2 +-
...denceSchemas.ApplicationGraphEvidence.html | 2 +-
...idenceSchemas.ApplicationNodeIdentity.html | 2 +-
...emas.ApplicationVersionComparisonItem.html | 33 ++
...as.ApplicationVersionComparisonResult.html | 33 ++
...nSchemas.ApplicationVersionMatchBasis.html | 33 ++
...hemas.CompareApplicationVersionsInput.html | 33 ++
...reTraceSchemas.ApplicationFeatureSeed.html | 33 ++
...Schemas.ApplicationFeatureTraceResult.html | 33 ++
...eSchemas.TraceApplicationFeatureInput.html | 33 ++
...roviders.ARTIFACT_COMPARISON_PROVIDER.html | 2 +-
...nProviders.BUNDLE_COMPARISON_PROVIDER.html | 2 +-
...stigationProviders.CALL_PATH_PROVIDER.html | 2 +-
...onProviders.CHANGED_BEHAVIOR_PROVIDER.html | 2 +-
...roviders.FUNCTION_COMPARISON_PROVIDER.html | 2 +-
...ASCRIPT_APPLICATION_WORKFLOW_PROVIDER.html | 44 +++
...tionProviders.RECONSTRUCTION_PROVIDER.html | 2 +-
...tionProviders.STATIC_RUNTIME_PROVIDER.html | 2 +-
...lContracts.APPLICATION_TOOL_CONTRACTS.html | 35 ++
...PPLICATION_VERSION_COMPARISON_EXAMPLE.html | 42 ++
...ples.JAVASCRIPT_FEATURE_TRACE_EXAMPLE.html | 44 +++
...VASCRIPT_APPLICATION_EVIDENCE_EXAMPLE.html | 35 ++
...SCRIPT_RUNTIME_RECONCILIATION_EXAMPLE.html | 2 +-
...acts_promptContracts.PROMPT_CONTRACTS.html | 2 +-
...toolContracts.ENHANCED_TOOL_CONTRACTS.html | 2 +-
...toolContracts.OFFICIAL_TOOL_CONTRACTS.html | 2 +-
..._toolContracts.SESSION_TOOL_CONTRACTS.html | 2 +-
...ontracts_toolContracts.TOOL_CONTRACTS.html | 4 +-
...oolContracts.binarySessionInputSchema.html | 2 +-
...scriptApplicationAnalysisResultSchema.html | 2 +-
...enceSchemas.applicationCoverageSchema.html | 2 +-
...chemas.applicationGraphEvidenceSchema.html | 4 +-
...Schemas.applicationNodeIdentitySchema.html | 2 +-
...raph.javascriptApplicationGraphSchema.html | 2 +-
...aphSchemas.applicationEdgeInputSchema.html | 2 +-
...ionGraphSchemas.applicationEdgeSchema.html | 2 +-
...aphSchemas.applicationNodeInputSchema.html | 2 +-
...emas.applicationNodeObservationSchema.html | 2 +-
...ionGraphSchemas.applicationNodeSchema.html | 2 +-
...javascriptApplicationGraphInputSchema.html | 2 +-
...avascriptApplicationGraphRecordSchema.html | 2 +-
...licationVersionComparisonResultSchema.html | 35 ++
...compareApplicationVersionsInputSchema.html | 35 ++
...s.applicationFeatureTraceResultSchema.html | 35 ++
...as.traceApplicationFeatureInputSchema.html | 35 ++
...riptRuntimeReconciliationResultSchema.html | 2 +-
docs/architecture.mermaid | 2 +-
docs/javascript-application-workflows.md | 74 ++++
docs/mcp-prompts.md | 2 +-
docs/product-catalog.json | 41 +-
package.json | 1 +
scripts/lib/product-catalog.mjs | 25 ++
.../verify-local-application-workflows.mjs | 134 +++++++
skills/rea-analysis/SKILL.md | 22 +-
src/application/InvestigationProviders.ts | 7 +
.../JavaScriptApplicationEvidenceGraph.ts | 141 +++++++
.../JavaScriptApplicationWorkflowEvidence.ts | 45 +++
.../JavaScriptApplicationWorkflowService.ts | 121 ++++++
src/cli.ts | 2 +
src/cliApplicationCommands.ts | 68 ++++
src/cliCommandNames.ts | 2 +
src/cliElectronCommands.ts | 64 +--
src/cliJsonInput.ts | 63 +++
src/contracts/applicationToolContracts.ts | 65 +++
.../javascriptApplicationWorkflowExamples.ts | 64 +++
.../javascriptRuntimeReconciliationExample.ts | 3 +
src/contracts/promptContracts.ts | 22 +-
src/contracts/toolContractTypes.ts | 1 +
src/contracts/toolContracts.ts | 2 +
.../javascriptApplicationChangeGraph.ts | 324 +++++++++++++++
.../javascriptApplicationEvidenceSchemas.ts | 10 +
.../javascriptApplicationVersionComparison.ts | 187 +++++++++
...riptApplicationVersionComparisonSchemas.ts | 161 ++++++++
.../javascriptApplicationVersionItems.ts | 371 ++++++++++++++++++
.../javascriptApplicationVersionKeys.ts | 273 +++++++++++++
src/domain/javascriptFeatureSeed.ts | 191 +++++++++
src/domain/javascriptFeatureTrace.ts | 349 ++++++++++++++++
src/domain/javascriptFeatureTraceSchemas.ts | 157 ++++++++
src/domain/javascriptFeatureTraversal.ts | 143 +++++++
src/domain/javascriptNativeHandoff.ts | 132 +++++++
src/generatedPackageMetadata.ts | 2 +-
src/server/createServer.ts | 17 +
src/server/registerApplicationTools.ts | 131 +++++++
tests/applicationWorkflowCli.test.ts | 67 ++++
tests/applicationWorkflowMcp.test.ts | 78 ++++
tests/applicationWorkflowVerifier.test.ts | 61 +++
tests/browserMcp.test.ts | 2 +-
tests/contractSnapshot.test.ts | 9 +-
.../fixtures/javascriptArtifactApplication.ts | 95 +++++
tests/integration/serverIntegration.test.ts | 4 +-
tests/javascriptApplicationWorkflows.test.ts | 291 ++++++++++++++
tests/productCatalog.test.ts | 7 +
tests/promptMcp.test.ts | 2 +-
tests/readmeConsistency.test.ts | 2 +
tests/runtime.test.ts | 6 +-
tests/serverIdentity.test.ts | 10 +-
tests/sessionMcp.test.ts | 2 +-
tests/setupSkill.test.ts | 2 +-
tests/toolContracts.test.ts | 11 +-
218 files changed, 6783 insertions(+), 325 deletions(-)
create mode 100644 docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseApplicationGraphEvidence.html
create mode 100644 docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseNativeApplicationEvidence.html
create mode 100644 docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationFeatureTraceEvidence.html
create mode 100644 docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationVersionComparisonEvidence.html
create mode 100644 docs/api/functions/application_JavaScriptApplicationWorkflowService.compareApplicationVersionsEvidence.html
create mode 100644 docs/api/functions/application_JavaScriptApplicationWorkflowService.traceApplicationFeatureEvidence.html
create mode 100644 docs/api/functions/domain_javascriptApplicationChangeGraph.buildJavaScriptApplicationChangeGraph.html
create mode 100644 docs/api/functions/domain_javascriptApplicationVersionComparison.compareJavaScriptApplicationVersions.html
create mode 100644 docs/api/functions/domain_javascriptApplicationVersionItems.classifyJavaScriptApplicationVersions.html
create mode 100644 docs/api/functions/domain_javascriptApplicationVersionKeys.matchJavaScriptApplicationVersions.html
create mode 100644 docs/api/functions/domain_javascriptFeatureSeed.findApplicationFeatureSeeds.html
create mode 100644 docs/api/functions/domain_javascriptFeatureTrace.traceApplicationFeature.html
create mode 100644 docs/api/functions/domain_javascriptFeatureTraversal.traverseApplicationFeature.html
create mode 100644 docs/api/functions/domain_javascriptNativeHandoff.buildJavaScriptNativeHandoffs.html
create mode 100644 docs/api/functions/server_registerApplicationTools.registerApplicationTools.html
create mode 100644 docs/api/interfaces/application_JavaScriptApplicationEvidenceGraph.ApplicationGraphEvidenceSource.html
create mode 100644 docs/api/interfaces/domain_javascriptApplicationChangeGraph.ApplicationChangeGraphProjection.html
create mode 100644 docs/api/interfaces/domain_javascriptApplicationVersionComparison.ApplicationVersionComparisonProjectionInput.html
create mode 100644 docs/api/interfaces/domain_javascriptApplicationVersionItems.ApplicationVersionItemProjection.html
create mode 100644 docs/api/interfaces/domain_javascriptApplicationVersionKeys.ApplicationVersionMatchingProjection.html
create mode 100644 docs/api/interfaces/domain_javascriptApplicationVersionKeys.ApplicationVersionNodePair.html
create mode 100644 docs/api/interfaces/domain_javascriptFeatureSeed.ApplicationFeatureSeedMatch.html
create mode 100644 docs/api/interfaces/domain_javascriptFeatureTrace.ApplicationFeatureTraceProjectionInput.html
create mode 100644 docs/api/interfaces/domain_javascriptFeatureTraversal.ApplicationFeatureTraversal.html
create mode 100644 docs/api/modules/application_JavaScriptApplicationEvidenceGraph.html
create mode 100644 docs/api/modules/application_JavaScriptApplicationWorkflowEvidence.html
create mode 100644 docs/api/modules/application_JavaScriptApplicationWorkflowService.html
create mode 100644 docs/api/modules/contracts_applicationToolContracts.html
create mode 100644 docs/api/modules/contracts_javascriptApplicationWorkflowExamples.html
create mode 100644 docs/api/modules/domain_javascriptApplicationChangeGraph.html
create mode 100644 docs/api/modules/domain_javascriptApplicationVersionComparison.html
create mode 100644 docs/api/modules/domain_javascriptApplicationVersionComparisonSchemas.html
create mode 100644 docs/api/modules/domain_javascriptApplicationVersionItems.html
create mode 100644 docs/api/modules/domain_javascriptApplicationVersionKeys.html
create mode 100644 docs/api/modules/domain_javascriptFeatureSeed.html
create mode 100644 docs/api/modules/domain_javascriptFeatureTrace.html
create mode 100644 docs/api/modules/domain_javascriptFeatureTraceSchemas.html
create mode 100644 docs/api/modules/domain_javascriptFeatureTraversal.html
create mode 100644 docs/api/modules/domain_javascriptNativeHandoff.html
create mode 100644 docs/api/modules/server_registerApplicationTools.html
create mode 100644 docs/api/types/domain_javascriptApplicationVersionComparisonSchemas.ApplicationVersionComparisonItem.html
create mode 100644 docs/api/types/domain_javascriptApplicationVersionComparisonSchemas.ApplicationVersionComparisonResult.html
create mode 100644 docs/api/types/domain_javascriptApplicationVersionComparisonSchemas.ApplicationVersionMatchBasis.html
create mode 100644 docs/api/types/domain_javascriptApplicationVersionComparisonSchemas.CompareApplicationVersionsInput.html
create mode 100644 docs/api/types/domain_javascriptFeatureTraceSchemas.ApplicationFeatureSeed.html
create mode 100644 docs/api/types/domain_javascriptFeatureTraceSchemas.ApplicationFeatureTraceResult.html
create mode 100644 docs/api/types/domain_javascriptFeatureTraceSchemas.TraceApplicationFeatureInput.html
create mode 100644 docs/api/variables/application_InvestigationProviders.JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER.html
create mode 100644 docs/api/variables/contracts_applicationToolContracts.APPLICATION_TOOL_CONTRACTS.html
create mode 100644 docs/api/variables/contracts_javascriptApplicationWorkflowExamples.JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE.html
create mode 100644 docs/api/variables/contracts_javascriptApplicationWorkflowExamples.JAVASCRIPT_FEATURE_TRACE_EXAMPLE.html
create mode 100644 docs/api/variables/contracts_javascriptRuntimeReconciliationExample.JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE.html
create mode 100644 docs/api/variables/domain_javascriptApplicationVersionComparisonSchemas.applicationVersionComparisonResultSchema.html
create mode 100644 docs/api/variables/domain_javascriptApplicationVersionComparisonSchemas.compareApplicationVersionsInputSchema.html
create mode 100644 docs/api/variables/domain_javascriptFeatureTraceSchemas.applicationFeatureTraceResultSchema.html
create mode 100644 docs/api/variables/domain_javascriptFeatureTraceSchemas.traceApplicationFeatureInputSchema.html
create mode 100644 docs/javascript-application-workflows.md
create mode 100644 scripts/verify-local-application-workflows.mjs
create mode 100644 src/application/JavaScriptApplicationEvidenceGraph.ts
create mode 100644 src/application/JavaScriptApplicationWorkflowEvidence.ts
create mode 100644 src/application/JavaScriptApplicationWorkflowService.ts
create mode 100644 src/cliApplicationCommands.ts
create mode 100644 src/cliJsonInput.ts
create mode 100644 src/contracts/applicationToolContracts.ts
create mode 100644 src/contracts/javascriptApplicationWorkflowExamples.ts
create mode 100644 src/domain/javascriptApplicationChangeGraph.ts
create mode 100644 src/domain/javascriptApplicationVersionComparison.ts
create mode 100644 src/domain/javascriptApplicationVersionComparisonSchemas.ts
create mode 100644 src/domain/javascriptApplicationVersionItems.ts
create mode 100644 src/domain/javascriptApplicationVersionKeys.ts
create mode 100644 src/domain/javascriptFeatureSeed.ts
create mode 100644 src/domain/javascriptFeatureTrace.ts
create mode 100644 src/domain/javascriptFeatureTraceSchemas.ts
create mode 100644 src/domain/javascriptFeatureTraversal.ts
create mode 100644 src/domain/javascriptNativeHandoff.ts
create mode 100644 src/server/registerApplicationTools.ts
create mode 100644 tests/applicationWorkflowCli.test.ts
create mode 100644 tests/applicationWorkflowMcp.test.ts
create mode 100644 tests/applicationWorkflowVerifier.test.ts
create mode 100644 tests/javascriptApplicationWorkflows.test.ts
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 457c811c6..c94765858 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -27,7 +27,7 @@
## Tool Contract Impact
-
+
## Related Issues
diff --git a/AGENTS.md b/AGENTS.md
index 66033dcf4..1c2353288 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -26,7 +26,7 @@ See [docs/architecture.mermaid](docs/architecture.mermaid) for a visual architec
- `src/cli.ts`: one-shot CLI adapter for setup, diagnostics, analysis, and decompilation.
- `src/config.ts`: Zod-validated parsing of environment configuration into `AppConfig`.
- `src/domain/`: pure, side-effect-free modules. `errors.ts` owns the tagged error algebra; `result.ts` owns `Result`/`ok`/`err`; `hopperValues.ts` owns shared function-dossier values plus Hopper boundary parsers; `symbolAnalysis.ts` parses Swift/ObjC names; `javascriptApplicationGraph.ts` validates and canonically commits the provider-neutral JavaScript Application Graph; `javascriptStaticAnalysis.ts` performs bounded AST-only JavaScript structure recovery.
-- `src/contracts/`: caller-visible schemas for 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, and 18 session tools; `enhancedInputs.ts` owns enhanced input parsing.
+- `src/contracts/`: caller-visible schemas for 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, 2 application, and 18 session tools; `enhancedInputs.ts` owns enhanced input parsing.
- `src/process/`: provider-neutral process ownership and lifecycle primitives. It owns private runtime roots, absolute startup deadlines, correlated request waits, bounded output capture, and TERM-to-KILL cleanup without defining any provider wire protocol.
- `src/browser/`: loopback CDP discovery, bounded WebSocket transport, exact-origin target authorization, and passive browser observation normalization.
- `src/hopper/`: Hopper launch and Unix-socket protocol mechanics. `BridgeLauncher.ts` spawns the Hopper app with the in-process bridge, `HopperClient.ts` correlates request/response over the socket with timeouts and cancellation, `protocol.ts` frames bridge messages.
@@ -58,7 +58,7 @@ See [docs/architecture.mermaid](docs/architecture.mermaid) for a visual architec
- `npm run verify:hopper`: build and run the real-Hopper verifier with two distinct binaries.
- `npm run verify:ghidra`: build and run the real-Ghidra verifier against `GHIDRA_INSTALL_DIR` and optional `GHIDRA_TARGET_PATH`.
- `npm run verify:browser`: build and run the real Chrome verifier against `REA_BROWSER_EXECUTABLE` or a platform-default Chrome-family executable.
-- `npm run verify:package`: pack and test the CLI, setup transaction, skill, and 80-tool target-free MCP server in an isolated environment.
+- `npm run verify:package`: pack and test the CLI, setup transaction, skill, and 82-tool target-free MCP server in an isolated environment.
- `npm run docs:generate`: generate API documentation from JSDoc comments into `docs/api/` using TypeDoc.
- `npm run docs:check`: verify generated package metadata, the canonical product catalog, caller-visible documentation facts, TypeDoc output, and the error JSON schema without rewriting them.
- `npm run config:print -- /path/to/binary`: print an MCP server config with absolute paths.
@@ -89,7 +89,7 @@ Use ESM TypeScript, two-space indentation, and Prettier defaults. Keep compiler
## Testing Guidelines
-Name tests `*.test.ts`. Use Vitest and production seams (`tests/fixtures/`) rather than module mocks. Domain tests assert pure behavior; adapter tests use fake launcher/socket seams; MCP tests connect with the beta.3 client. Preserve the 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, and 18 session tool inventory (80 total). Cover malformed input, cancellation, timeouts, process exit, concurrency, limits, and clean shutdown. Real Hopper, Ghidra, and browser claims cannot be replaced by mocks; use `npm run verify:hopper` with two distinct binaries, `npm run verify:ghidra` with the exact supported BYO installation, and `npm run verify:browser` with Chrome.
+Name tests `*.test.ts`. Use Vitest and production seams (`tests/fixtures/`) rather than module mocks. Domain tests assert pure behavior; adapter tests use fake launcher/socket seams; MCP tests connect with the beta.3 client. Preserve the 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, 2 application, and 18 session tool inventory (82 total). Cover malformed input, cancellation, timeouts, process exit, concurrency, limits, and clean shutdown. Real Hopper, Ghidra, and browser claims cannot be replaced by mocks; use `npm run verify:hopper` with two distinct binaries, `npm run verify:ghidra` with the exact supported BYO installation, and `npm run verify:browser` with Chrome.
## Commit & Pull Request Guidelines
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2ed47b710..666caaedf 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,7 +17,7 @@ the package `prepare` lifecycle, and prepares the Husky hook. Run
`npm run build` again after source changes when you need the standalone CLI or
MCP server without running the test prebuild.
-Keep dependencies flowing inward through the existing domain, contracts, provider, application, server, and adapter layers. Parse unknown values at process and protocol boundaries, model expected failures with `Result`, and preserve the 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, and 18 session tools (80 total) unless a deliberate contract change updates every verifier and snapshot.
+Keep dependencies flowing inward through the existing domain, contracts, provider, application, server, and adapter layers. Parse unknown values at process and protocol boundaries, model expected failures with `Result`, and preserve the 33 direct, 10 enhanced, 5 native, 2 artifact, 8 browser, 4 Electron, 2 application workflow, and 18 session tools (82 total) unless a deliberate contract change updates every verifier and snapshot.
Before submitting a pull request, run:
@@ -75,7 +75,7 @@ Publish the public package:
npm publish --access public
```
-After npm registry propagation, verify the published CLI and connect a beta.3 MCP client to the published server to confirm all 80 tools:
+After npm registry propagation, verify the published CLI and connect a beta.3 MCP client to the published server to confirm all 82 tools:
```bash
npx -y rea-agents --help
diff --git a/README.md b/README.md
index 3feee1f3b..ceda38ae5 100644
--- a/README.md
+++ b/README.md
@@ -10,11 +10,11 @@
[](https://www.npmjs.com/package/rea-agents)
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
-[](#80-tools-for-investigation)
+[](#82-tools-for-investigation)
[](https://nodejs.org/)
[](LICENSE)
-[Quick start](#quick-start) · [Current status](#current-status) · [Investigation model](#the-investigation-model) · [80 tools](#80-tools-for-investigation) · [Roadmap](#roadmap) · [How it works](#how-it-works)
+[Quick start](#quick-start) · [Current status](#current-status) · [Investigation model](#the-investigation-model) · [82 tools](#82-tools-for-investigation) · [Roadmap](#roadmap) · [How it works](#how-it-works)
@@ -320,7 +320,7 @@ REA handles the app analysis in steps 1–5. The agent performs step 6 with its
- Analyze Swift and Objective-C metadata without manually untangling every mangled symbol.
- Leave names, comments, and bookmarks in Hopper so human and agent analysis reinforce each other.
-## 80 tools for investigation
+## 82 tools for investigation
| Tool family | Count | Examples |
| ------------------------- | ----: | -------------------------------------------------------------------------------------------------------------------------------- |
@@ -330,6 +330,7 @@ REA handles the app analysis in steps 1–5. The agent performs step 6 with its
| Artifact graph | 2 | deterministic directory, ZIP/APK/IPA, and ASAR inventory; explicitly selected extraction into an absent owned tree |
| Browser observation | 8 | exact-origin CDP capture, bundle and source-map analysis, WebMCP discovery, session timelines, capture diff, and visual evidence |
| Electron analysis | 4 | passive root-confined observation, bounded static application mapping, and evidence-backed static/runtime reconciliation |
+| Application workflows | 2 | bounded cross-layer feature traces and unique-only cross-version graph matching with native provider handoffs |
| Workspace and observation | 18 | target lifecycle, Evidence v2 bundles, process/artifact/function comparison, evidence-linked residual-unknown lifecycle |
The public interface describes what the agent is trying to learn. Providers decide how to answer. macOS utilities handle common semantic inspection without launching Hopper; Hopper handles deeper native analysis; the process harness implements controlled behavioral capture.
@@ -345,6 +346,7 @@ REA is already useful for native application, browser, and Electron investigatio
- Validate and canonically serialize a provider-neutral [JavaScript Application Graph v1](docs/javascript-application-graph.md) spanning packages, ASAR entries, Electron roles, JavaScript/source-map entities, browser/runtime instances, IPC, endpoints, storage, and native add-ons. This shipped domain contract performs no extraction or I/O by itself.
- Reconstruct bounded static package, entrypoint, Webpack/Rspack module, import, worker, endpoint, storage, source-map, BrowserWindow, preload, contextBridge, IPC, utility-process, and native-add-on structure from an approved local directory or ASAR through `analyze_javascript_application` or `rea analyze-javascript-application`. The AST-only [application service](docs/javascript-artifact-reconstruction.md) never executes bootstrap code, pairs only unique exact literal IPC channels, and reports dynamic or ambiguous channels as unresolved.
- Reconcile that static graph with existing passive web or Electron Evidence through `reconcile_javascript_runtime` or `rea reconcile-javascript-runtime`. Exact captured bytes outrank caller-declared file/URL mappings; target, frame, script, worker, cache, and asset ambiguity stays explicit, source-map authority stays separate, and a module resident in an observed bundle is never reported as executed. See [JavaScript static/runtime reconciliation](docs/javascript-runtime-reconciliation.md).
+- Trace a literal route, string, API, IPC channel, module, or native export through authenticated application Evidence with explicit traversal bounds, then hand exact native artifact digests and requested exports to retained Ghidra or Hopper Evidence without automatic provider switching. Compare application versions using unique-only digest, source-map, structural, and semantic tiers; duplicate, incomplete, and truncated matches stay unknown. See [cross-layer JavaScript application workflows](docs/javascript-application-workflows.md).
- Traverse content-addressed artifact graphs without extraction; on macOS, read-only DMG traversal additionally requires `native_mount_approved: true` and `REA_ARTIFACT_NATIVE_MOUNT_ENABLED=true`. Materialize only approved occurrences into absent output roots.
- Build bounded function dossiers with pseudocode, assembly, CFG edges, comments, calls, references, strings, and names.
- Search and trace features across symbols, strings, metadata, references, and call paths.
@@ -393,8 +395,8 @@ REA is growing into a toolkit for understanding software across static artifacts
### Next
-1. **Cross-layer tracing and version comparison** — trace renderer behavior through preload, IPC, main-process, storage, network, and native boundaries, then compare those paths across application versions.
-2. **Deeper JavaScript and source recovery** — add historical-source matching and rechunked/minified cross-version matching on top of the shipped AST-only reconstruction and exact static/runtime reconciliation.
+1. **Deeper JavaScript and source recovery** — add historical-source matching on top of the shipped AST-only reconstruction, exact static/runtime reconciliation, and rechunked/minified cross-version matching.
+2. **Broader application graph evidence** — extend authenticated cross-layer traces with additional static extractors and separately approved runtime authorities.
3. **Deterministic behavior harnesses** — extend process ownership, protocol fixtures, filesystem observation, reconnects, and cross-version behavioral comparison.
### Later
diff --git a/README_ar.md b/README_ar.md
index 531003116..a8a578436 100644
--- a/README_ar.md
+++ b/README_ar.md
@@ -10,11 +10,11 @@
[](https://www.npmjs.com/package/rea-agents)
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
-[](#منصة-من-80-أداة)
+[](#منصة-من-82-أداة)
[](https://nodejs.org/)
[](LICENSE)
-[البدء السريع](#البدء-السريع) · [من الملف التنفيذي إلى السلوك](#من-الملف-التنفيذي-إلى-السلوك) · [80 أداة](#منصة-من-80-أداة) · [كيف يعمل](#كيف-يعمل) · [الأسئلة الشائعة](#الأسئلة-الشائعة)
+[البدء السريع](#البدء-السريع) · [من الملف التنفيذي إلى السلوك](#من-الملف-التنفيذي-إلى-السلوك) · [82 أداة](#منصة-من-82-أداة) · [كيف يعمل](#كيف-يعمل) · [الأسئلة الشائعة](#الأسئلة-الشائعة)
@@ -157,7 +157,7 @@ rea uninstall --purge-data
افحص التحقق من الإدخال، والتشفير، والصلاحيات، والتخزين، ومسارات الأخطاء من دون رفع الملف التنفيذي إلى خدمة بعيدة.
-## منصة من 80 أداة
+## منصة من 82 أداة
| عائلة الأدوات | العدد | أمثلة |
| --------------------- | ----: | ----------------------------------------------------------------------------------------------------- |
@@ -167,6 +167,7 @@ rea uninstall --purge-data
| رسم القطع الأثرية | 2 | جرد حتمي للدلائل وZIP/APK/IPA وASAR واستخراج معاملاتي محدد صراحة |
| مراقبة المتصفح | 8 | التقاط CDP محدود الأصل وتحليل الحزم وخرائط المصدر واكتشاف WebMCP والفروق والأدلة المرئية |
| تحليل Electron | 4 | مراقبة سلبية ضمن جذور canonical، ورسم ثابت ومحدود للتطبيق، ومطابقة ثابتة/وقت تشغيل قائمة على Evidence |
+| سير عمل التطبيقات | 2 | تتبع محدود عبر الطبقات ومقارنة إصدارات ذات مطابقة فريدة مع تسليم للتحليل الأصلي |
| جلسة الملف التنفيذي | 18 | فتح الأهداف وحزم الأدلة ومقارنة العمليات والقطع والدوال وسجل المجهولات المتبقية |
## استخدام REA مع وكلاء برمجة آخرين
diff --git a/README_ja.md b/README_ja.md
index f57e6df7a..3174ea626 100644
--- a/README_ja.md
+++ b/README_ja.md
@@ -10,11 +10,11 @@
[](https://www.npmjs.com/package/rea-agents)
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
-[](#80-ツールのワークベンチ)
+[](#82-ツールのワークベンチ)
[](https://nodejs.org/)
[](LICENSE)
-[クイックスタート](#クイックスタート) · [バイナリから動作へ](#バイナリから動作へ) · [80 ツール](#80-ツールのワークベンチ) · [仕組み](#仕組み) · [FAQ](#faq)
+[クイックスタート](#クイックスタート) · [バイナリから動作へ](#バイナリから動作へ) · [82 ツール](#82-ツールのワークベンチ) · [仕組み](#仕組み) · [FAQ](#faq)
@@ -147,7 +147,7 @@ REA は手順 1〜5 のバイナリ解析を処理し、手順 6 はエージェ
- Swift / Objective-C のメタデータを解析する。
- Hopper に名前、コメント、ブックマークを残し、人間とエージェントの調査を共有する。
-## 80 ツールのワークベンチ
+## 82 ツールのワークベンチ
| ツール群 | 数 | 例 |
| ---------------------- | --: | ------------------------------------------------------------------------------------------------------------------- |
@@ -157,6 +157,7 @@ REA は手順 1〜5 のバイナリ解析を処理し、手順 6 はエージェ
| アーティファクトグラフ | 2 | ディレクトリ、ZIP/APK/IPA、ASAR の決定的一覧と明示選択されたトランザクション抽出 |
| ブラウザ観察 | 8 | origin 限定 CDP 取得、bundle/source map 解析、WebMCP 検出、セッション、capture diff、視覚証拠 |
| Electron 解析 | 4 | canonical ファイルルート内の受動観察、有界な静的アプリマッピング、Evidence に基づく静的/実行時の照合 |
+| アプリケーション | 2 | 有界なクロスレイヤー機能追跡と、ネイティブ解析への引き継ぎを含む一意限定のバージョン比較 |
| バイナリセッション | 18 | `open_binary`、`binary_session`、証拠バンドル、プロセス/成果物/関数比較、残余未知レジストリ |
## 他のコーディングエージェントで使う
diff --git a/README_ko.md b/README_ko.md
index 224c8df47..2bd0281c8 100644
--- a/README_ko.md
+++ b/README_ko.md
@@ -10,11 +10,11 @@
[](https://www.npmjs.com/package/rea-agents)
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
-[](#80개-도구로-구성된-워크벤치)
+[](#82개-도구로-구성된-워크벤치)
[](https://nodejs.org/)
[](LICENSE)
-[빠른 시작](#빠른-시작) · [바이너리에서 동작까지](#바이너리에서-동작까지) · [80개 도구](#80개-도구로-구성된-워크벤치) · [작동 방식](#작동-방식) · [FAQ](#faq)
+[빠른 시작](#빠른-시작) · [바이너리에서 동작까지](#바이너리에서-동작까지) · [82개 도구](#82개-도구로-구성된-워크벤치) · [작동 방식](#작동-방식) · [FAQ](#faq)
@@ -147,7 +147,7 @@ REA는 1–5단계의 바이너리 분석을 처리합니다. 6단계는 에이
- Swift 및 Objective-C 메타데이터를 분석합니다.
- Hopper에 이름, 주석, 북마크를 남겨 사람과 에이전트의 분석을 연결합니다.
-## 80개 도구로 구성된 워크벤치
+## 82개 도구로 구성된 워크벤치
| 도구 그룹 | 수 | 예시 |
| ------------------- | --: | -------------------------------------------------------------------------------------------------------------------- |
@@ -157,6 +157,7 @@ REA는 1–5단계의 바이너리 분석을 처리합니다. 6단계는 에이
| 아티팩트 그래프 | 2 | 디렉터리, ZIP/APK/IPA, ASAR 결정적 인벤토리와 명시적으로 선택한 트랜잭션 추출 |
| 브라우저 관찰 | 8 | origin 제한 CDP 캡처, bundle/source map 분석, WebMCP 검색, 세션 타임라인, capture diff 및 시각 증거 |
| Electron 분석 | 4 | canonical 파일 루트 내 수동 관찰, 제한된 정적 앱 매핑, Evidence 기반 정적/런타임 조정 |
+| 애플리케이션 | 2 | 제한된 교차 계층 기능 추적과 네이티브 분석 인계를 포함한 고유 일치 버전 비교 |
| 바이너리 세션 | 18 | `open_binary`, `binary_session`, 증거 번들, 프로세스·아티팩트·함수 비교, 잔여 미지수 레지스트리 |
## 다른 코딩 에이전트에서 사용하기
diff --git a/README_zh.md b/README_zh.md
index 49ab3316a..1f3baf74c 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -10,11 +10,11 @@
[](https://www.npmjs.com/package/rea-agents)
[](https://github.com/morluto/rea/actions/workflows/ci.yml)
-[](#80-个工具组成的工作台)
+[](#82-个工具组成的工作台)
[](https://nodejs.org/)
[](LICENSE)
-[快速开始](#快速开始) · [从二进制到行为](#从二进制到行为) · [80 个工具](#80-个工具组成的工作台) · [工作原理](#工作原理) · [常见问题](#常见问题)
+[快速开始](#快速开始) · [从二进制到行为](#从二进制到行为) · [82 个工具](#82-个工具组成的工作台) · [工作原理](#工作原理) · [常见问题](#常见问题)
@@ -147,7 +147,7 @@ REA 负责第 1–5 步中的二进制分析。第 6 步由智能体使用其常
- 分析 Swift 和 Objective-C 元数据。
- 在 Hopper 中留下名称、注释与书签,使人与智能体的分析互相增强。
-## 80 个工具组成的工作台
+## 82 个工具组成的工作台
| 工具类别 | 数量 | 示例 |
| -------------- | ---: | -------------------------------------------------------------------------------------------------------------------- |
@@ -157,6 +157,7 @@ REA 负责第 1–5 步中的二进制分析。第 6 步由智能体使用其常
| 制品图谱 | 2 | 确定性目录、ZIP/APK/IPA 与 ASAR 清单,以及显式选择的事务式提取 |
| 浏览器观察 | 8 | 精确来源 CDP 抓取、bundle/source map 分析、WebMCP 发现、会话时间线、capture diff 与视觉证据 |
| Electron 分析 | 4 | 限定 canonical 文件根的被动观察、有界静态应用映射,以及基于 Evidence 的静态/运行时对账 |
+| 应用工作流 | 2 | 有界跨层功能追踪,以及带原生分析交接的唯一匹配跨版本图比较 |
| 二进制会话 | 18 | `open_binary`、`binary_session`、证据包、进程、制品与函数比较、残余未知项注册表 |
## 与其他编程智能体一起使用
diff --git a/docs/api/assets/hierarchy.js b/docs/api/assets/hierarchy.js
index aee4534d3..0aff83122 100644
--- a/docs/api/assets/hierarchy.js
+++ b/docs/api/assets/hierarchy.js
@@ -1 +1 @@
-window.hierarchyData = "eJy1mVFv3CgQx7+LnznfGmPAeUtXuTan6hIlrfpwiiJikw2qF3yYTS+q+t1PeDcJXnCMHd1LEhP/Z37AMMD4Z6KVMl1y8jcqSAlyTBGxP0sMClJgCnKYQQIQIiUERVbgFcghxhRkGKEVyPMMUgAzROkNSDS/b3hlhJJdcvIzsRbtb8m2PDlJTiVrnjrRnWmtdAKS70LWyYnVJzvdJCdJ1bCu493vtdoyIW+5fa9LB7L0wWybBOxfTU4S09W/WTu/7RtAUj2IptZc9h0qM4DwKgcIZwVAGGKAcF4ChAvbhu0PSgAi9hWSUYBIngFEigIggu0/SAn6jiO6KgCiNAOIljlA5SoDqIQY4BXF5c0vkFhnTl8/qbblemZPHdGsftIMA0Rt72iOALIziCi2rAT2bHiVB+bhUiujKtUsnI+BfIK3h8iKAMS5bHdmIcGrNsY9xAH3Fzuz3L8jjgHIQ4thzVp2Jxphnr5K9shEw+4avpBn3FYMXhGKkTWTFW8aXi9GcvUxGDiE8UVsuVo8T646BoESB+FSq0dRc33ND6ltJkRYH4FBBov22cxpzVozO7OE1DEIGXUQPmj1o+P64q7j+pEtGIoRAzEguZtcT7UR96wyFy3XSzjC+hiMwk1hZ3ZIZcXPpeEbLczTTIywPgYDkwDGZ7EVc1eIr41xP9jVn038IWbnLU8a47yEjvNz+cg7Izb9LH5T+nvXsmouxhtGIoDoyo2Jr/K7VD/kFd+Izui5ERFSxyBk2Dt6LMuYvjbGPfTdL903QuoYhBx5CAuPNwFxDAAiHsAV3yozNxg9aYxz7B89L7WqeDf3rO1rY9wT6Lm/NkwvC75XZYxr6vZ8reS92OwW7Qm+NsZ96W7Rf6kPQjL9dNHyud49aYTzcuX2fa//wvSGzx13TxrjfLDmL7neiq4TSl7xf3ZCz172IwamQfpbaJDkulItfyGABX4mENJwfc+qV4j2RXSpGlE9pUdWRjFeTA0vZBaqvyAX9ObASEdHi3fm3ZQHOxGce5wijPNRM/l+mN5KHEpfN3BQvvE7uxlLo/TTFe/UTtvTUbuLhPrhyNNRW3NnE2bFKrvpaYvBkrs29n71jd89m19A6dmIGzhblFkNjuai3vDPbCerhwmKhz7L3roKrlP3MR6BjCBw/W4IPr74R+Yphxnq56n/w9uRTtu2EVWf3j3IQH4KE46ams5UOYRkFdqm+4tZBMpQkB49RvjHhXtu//ggas2iQmbTv3rrKrhO3cfYkMGYjiBMhsw0xJKQwRTtQwZT5JF94qxueNfFxMtbeMd2YiaLZNDjiQmWAcdLdBw9Tvu3Zd1A9eFwMoyKmnb/7u2RNg3aWrDYYV+JLvrqa57DQflqXbeHYkPMmN3tX731VWmgaXrwClKQIcyZrf1oJWfSHMvSUNs0Dx7eTl7Kl8/lj0ulp3ZY9prybp0C8J4gaHD2jGJqq/IQovxmDx0uSDaCTx5Somj3liIzl/0gEi6hD+fzHTyTEzoycPbyC0GOy8PuZ/94A3XNZC1qZqZOK7OYX4zOX8ckg6DfG3v4EpHcu9Vc8/5g+daicWkHonT4NH2zsQE4RjBzoXja1G+ZO152gPpvOkeVML+2Ohc2aCBQs12EbfPzzaFSAwdX9m2rOmF4TGZ0cT1h6rdMTnb/PdOtZR5y6/JRHLGQjrXPHUe7tdhx7L/Nuqu8M2f1Juqy5OL+yR7ZdaVFa55r4h81ax/WShr+r0ldq3NRC0JztEcdVufO5T3Xtuz7PwD7tuPye/8Zd3jesWeTNWvNTk+X8FzCgDQNtU0E569f/wGGhs0E"
\ No newline at end of file
+window.hierarchyData = "eJy1mVFPpTgUx78Lzx22QFvAN8e4zmwmq9GZ+LAxpkK9NsOlbOnVNRO/+6Tg1WKLtJh9cS4M/3N+nJ6etodfkRRC9dHBPwjnJUCIZFj/LRAgpEgJyMoywQCnuIAAlxkqAIIIE5AmCUYAwTIhICUpTK9AJNltwyrFRdtHB78ibVH/29Itiw6iw5Y2jz3vj6UUMgLRT97W0UGSFiDaySY6iKqG9j3r/6jFlvL2munn+ngii+/UtonA+Gh0EKm+/qTtfBpvgKi6400tWTu8UJkARGAGEEkwQCQlAJGsBIhgfY/oP0UOUK4fyZMCoDxLAMoxBign+j90RPIyBaiAGKCiSAAqygygEiYAlSkBOUzS/OoJRNqZ8a5fRNcxGfimhijoPYuEAKTHChUZAqhAOUAF0ax5OrARmDnG4UwKJSrRrByPiXyBd4BIsAPia9vt1EqCV62P+5Q43J/u1Hr/htgHIHNNhiPa0RvecPX4o6X3lDf0pmEreeZt+eBhV44c0bZiTcPq1Uim3geDuDC+8y0Tq8fJVPsgFLmBcCbFPa+ZvGDPpS0Qwq33wMgnk3Zv5rCmnQquLC61D0JSGAifpXjomTy96Zm8pytCMWPAByQzi+uhVPyWVuq0Y3INh1vvg4HNEnasQ9pW7Gur2EZy9RiI4db7YJDcgfGNb3noDLG1Pu4nq/rexJ88uG5ZUh/nZWo4/9res17xzTCKl0L+7DtahWK8Y8QDqIBmTvxof7bioT1nG94rGZoRLrUPQkKsrce6imlrfdyntvu164ZL7YOQIQth5fbGIfYBQLkFcM62QoUmoyX1cU7sreeZFBXrQ/fattbHfZ5a7i8UleuS71Xp47ow3/xItLd8s1u1JthaH/eluUT/LT7zlsrH046FerekHs5LaL77qP9O5YaFxt2S+jifzPkzJre877loz9m/Oy6Dp/2MgWWQ4RTqJLmoRMdeCFJM9gS8VUze0uoVonsRnYmGV4/xGyuzGC+mpgeyNElIqg/I4/FruJyNFuvVhymf7Xhwjji5G+dE0vbjMIMVTxTdNzBQLtmNXoxbJeTjOevFTurdUbfzhHow5PGsreDRJGmCr0bayRH2Qunz1SW72ZtfQWnZ8AtcVpZwujXn9YZ9o7u2uluguBuq7LWpYDI2L70RJtGYGvwwBJuf/DPjlJVlWl6NZGlprUiHXdfwaijvFqSjPrkJZ015lEwIceFapoeDmQfKVBC/ufTwjyZ7lJM7XkvqlTKb4dFrU8FkbF76pczQOJxBWEyZZYjwlEEQPXfI9A+L7AujdcP63idf3sN7a8dnsDCEFo9Pskw4XrLjzaWH/3Jyptgrn3eGXlnTjc9ev9HGTlsrJjscOtFo7L4mEE12gnX33GzwidnN+Oi1rYodt5aDl2GEpzDHuvcjRRtI81YWu+4t8+ievqv3uW9/nAm5tMLS15J3bTSARwKnweC5iAhKAIYwS65G6MmIvjQUG84WNyletKMlz8qlP4i4W+jT8fwAz+KAzgQOkySDAKF8XP2GH++gHtG25jVVS7uVIOYXo+EVGEMIhrVxgM9TYp9qLtiwsXxv0pi0E1E8vVqcLEMCzhEEThRLG9t3QuOlA6QjNXyQe7c5GwrrNODo2a7C1vV5wNbJOjmybzvRc8V8KqOJawlj+87yYOvvmWYv87m2ro/ijIV47n5oHPXSouM4fJs1Z3mvjuuN12HJxP2L3tOLSvJO7XviJ5J2d0eiVew/FZtWQ1FJDsthbzX8mPRsb5nUbd//Adi27Vffh8+40/2O3psc0U7t5HILzyR0SGPXvYXkfHr6DUfhzKI="
\ No newline at end of file
diff --git a/docs/api/assets/navigation.js b/docs/api/assets/navigation.js
index 50d656812..29b666914 100644
--- a/docs/api/assets/navigation.js
+++ b/docs/api/assets/navigation.js
@@ -1 +1 @@
-window.navigationData = "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"
\ No newline at end of file
+window.navigationData = "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"
\ No newline at end of file
diff --git a/docs/api/assets/search.js b/docs/api/assets/search.js
index c96510a0e..a9a57800f 100644
--- a/docs/api/assets/search.js
+++ b/docs/api/assets/search.js
@@ -1 +1 @@
-window.searchData = "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Y/yqd/9pvtbf/td//e28r93/+q//+9PfzttJzR/O3XDzh9LH6cdPdvlJ9fKTyeUnr+un83OULz9d/t35cajrp/rjp3b5v+eHxV1+8stP/cf/HT/+nbYfP/34d/Yjnl/+3Xmj+vVT+euny7vXH+/gvFXr+unHOzhvWLh++vG6592t5k+16vwf//eny3cRv798CXPs/K3c/fL8+n73y9eHP+8e318f3r5/fd9++rMw7MfHPyu/bo768GUbaROm3Bbj/v77t+9f796fX7dxpNW/Io3L51dLfAs3RH1//OPh51++//rrw1XcMnRs/tJm9oF473evvz1cfXDnW+S//uBx+XJtfbdzpW/+NO+Pb3qlL1/uXt8ff727f79/fnq/e3x6e/jy28PVZ9Pb5rNp9ea4bwchZRuy3Rryl+fvT18evvz6+PTl8enqgC79pJsP+uR+a8zde6ubVOh685/78PXh/v31+enu7R1DttPma2v+4ZDzz757fXx4uzqK3DZR9fY/eEV9fPr14fXh6f5h93bLaft2b/52fgR+uefvuJWxDfzhd/x0dz4sstibT0NON84Gf8X+8/Hpy/OfSex62sa++QP5j7s/7t7uXx9f3uEYe3i9ii+2iX9+Ityn4//6+PUBQpdt6PHx0L98f/ry9eH16fkLRt5OmePGiXIb+ff3b19fn/ENj02OnJ87+uGwL3f3/7j77YG84e08Nm6cibeR356/v94/fLt7eX59/O3x6e4rvHPdvvNPfNRv73fvj/drdruOrbZ97zdn4Nfn+7v3bMLchDwvZt0a8/zBXk+YbTth3vzeXh/e3q5PbrI9u52Lyj8Q6cvj2/vd0/3DdcQh24i3n2jOER++zP95/Q7t6h1+MN7L3W8Qr5+u4t2cM5Ep6QwuvW/Przd/kN+f7v64e/x6vnKLV3i5e317eLt/foHw22O03XqMfnt8enx7fz1fe708vH57fHt7fH767fXu6f0qD86PUfnrQ6m3TuW/PTy9//4IsdQ377Scbp2lvn59/vPhy8PTH4+vz09zaPut6fZ0XkVufIMR9O3u6fH98T8fvnx//bqNanWb/OXWvzqC/vnwy9vz/T8e8I/Xqz/+xhlvhvzn+8Pr093Xp4f3P59f/3H9528vD6rIjZczT3df//X2eD2rte2MfPpYoPvz0f7168OXh9fX64v5Uuv2vqD3G//wH4Ff7n55/Pr4/q/N4cBeZJum/dZT6+VFvj5CWm1mqhuP16tQ57P/8+u/ri5bNpPArUm6YrI/dzuVdv3Ynzvj/cfb89Pb/e8P3+6uDvfRtod7v3E22QZ+eX3+j4f798fnp+u3fDX7n7cB/m9EZm9crt74Jz4RWJUoVbfnA/vgEfHwz4f77/gpbKaAGye/Fe3x6eX7O8uDvs2DD36ozy8Pr3f4Fttmjv7gbPIj3svz6/UkffUuPxbz+3vyl2/PJd1vvGBaUV9en88X51dT/l/hLosz47IOY5cFHrss4cwinE+84vkfP77vTmJn3Prrr2m3nhmvY78+vD1/3aXc9i6v/DfjPr/Mg+8q/Pbs+6kvYX8sl9N2QbC0ceO9KcR9+D/f775exx3bU1HTj03DL6/P78/3z19ZMupVMn74/f7x+OV6qWp7zqyXNKwfnIIugX/Z33BcX5J+Kur93dOXxy9371dH0faorB/Otuu4D3/cff2+m59kc6KXDx+D169wvqz+fpXO2+Pw42k3oz9+YRl9NQW2jx+IM/Trw2/na/ar6wrZvOMPnq4vYd/msgt8zttD5daFZhoXjpXz9hnbT+K/F5p+1OPqBT6WI//n+8Prvx6/wLRxNR3duri3Ir493b28/f4ME/7V5UrTj11kXkKSA7ucC+S3kT/2+V4i39/d/351YG+j2sfm+UvMhydI3XIaV1/VBy9jL3HPk/3L89fH+6vgfpVn9dQuJ+6+/GRWq3zm9VjODbv6Qz6Wc5fAhBhO4+rCQD82b7w/fnt45ldP2/c7buWJc9j/fPj51+9Pu+ni/OiNzcctHzin/OfDz29/Pv76/vP7v16uFwnPj+LYBv3AUfKfD7FUCv6zXWS7XNSdKw0+EPf+7uX9++u8zScvodsl3tpvXY6J0Mka8tXluW4mjv6xL+73h7svXx/e3l7u3n+/etPnR//+9abH5bp3PuX3A/E37/7l5evj/f7eYntH1W9dVTkIPm+Lrhfx7GrZsn9grj56DXLMnzcc27zS+MC12dUrZVjQdEtftzoHho+Vw1grhxXn7Xd+8g/MLP/5kOT+9uKvfuiT/xFw/43qVdjePjBpY1zyLep2Lb/2W0H16f53MGvZImpZZ5tRbv0Unp7f7/Y3V+d9IzbT/6334y+PP//j4fpUW7aqVfqtwBCRfn7458t50RxvLYtdLe3dekC/PP68v/Iuxa6W8G6913l52Wdib5svQ2+9D3l5uX9++vXxt+uriKvT2s0f24/Z4//5UX3x8vr87fHt6n1uvpJPBD64fdxc+tw4bxwETu7DNh+M3PwJpy9Cb202B36/8UxEXiK/pt1myY0H6kH83Qy+PaveWmewjb/ODA//fH+9211wbectv/EygAT/7fXu5ff756e399fvu9ew7exz67UGeZFzCdgTLoiX61viT+Tp9/ffn1/PenP8Ou1q9fHjf8Uvj093r/96I/Nfu1r2+fhBcBV5v2i6vZKxG69Rt9GjPue80L9LzTK2bFQ+npy/vD7/+XaeGx6/PCD0bg2h3nqDv4/9/Mvbw+sffEF5eztab11NOXyJ8w+P8IdcXRbXG2/qNq/yF17xzNzWQNT28b8isCnOWvuL+u1lk3z8/BLB17wcH9H+pL2dIerNlyebF3n+9u3u6cvb74/fXh9evt5dfz5+deX3iT/h+dvL89vj+wNdYj1tP/1bWfIq+vlzP98Kvj4/X2Nvvap/u3U5fxv79fnt7Y+H17d5A0Jyp16x961LlQev8Pb++NvuJH+lLPVWZLnlVdjEUbfzaTt9/Iyfvto+t6psy+pOH/+Gvjz8er5q+XKeWi9nov3nt70raJ+YZr88vj7cvzOur9v6nJsXlLehn3Fttm5rS1u99Wr+r5BQIvkv+r5t+5Hcetd88CLzCua6FHObRreuxf27VzgXCz7887py2rdfwa2rov/uhR5f7q9LKTcnoeb/Q39NFG9ev87mU5NP3OjQ14lCTqgN9e0LfT4B2BTStnAmn5hCLsEPLj7atsROTh+/MCOvQa4+Wr2qGPnE0fj0+7kq58v78/NXqKDdVufeusa3jbw++bjzvpzDr16ibYt0bzWY9CX2i2PbO3ypn0iiFf/ruVrv+t55exaS+vHL1/lm//X2/vCN0U+T7df6iUum35+/Pfzy+vDnddDtMfWJ2/Grs+UPZLuuX9oeWfLxC46rlzjXsb293N0/vL0/v16n/fauXD5xZ0sXcelcseUA+cTMSl+JHclbP7x96Y2+0LrTZWfWpmX7Mh/PrPxldjLTdFtm/Il59pZq+dP277lVlA5fY56Tsq6jbV9B/8QVdfJyv3x//Aq3HrKd2vutqPfvX4pco8i2NKV/YpUreanL/4Gi+21Zya1c9+9fjB29siXX8YkpL3ktXvC/LQv5xDVr8lqx6Pb9egIU9e2L/U98iK8P2Qqf2PYb0/+Jqen6xXaeI9ub+nFrxSJ9xdfvT2fhni94//j1MZ3p+2nb0vOJpbR/85pkzu+nbUPOrcWCm5f8+vj0/Z+/P7+8XE8d/bR1pk/ckX99fn755e7+H/tb4r6dKvQTd5Tf7u7JG942c+onLqf+6k5Yt9nv1+96WwClnzhL/BX/sqCzu43vV1Jwa73c9jVen+8f3t5W6QD/O7a1MHpr21n6Gn8tPV6/yLbT+tYehPRFdoUlfWvWemt9ZRr/6+OvD/f/ugfc286Pap9/jd8f7v/x8oxNKt23hW/+8en3Ev7r43XYzbu2WzV/H5ZNb2O72mifuFNcsX+/e32CNrCxbS+xT8wJK/TT8+u3u69khWxs+4vsE2tO6wXe7r69fIVauLGtBLTPTD2vz7+d3fv14bwGcD2vje0qgN1aN3Ad/NzN8Nf0s7sVGtuOHPvE1Pb6cPc1ZuS7t7eH1119wdh2sJ8fbfvxF1g9b1Fg8vgN10rG9m7XPrHITl/h7BLQFTy2zXv2iSmavtC+rHBsu+3sEzMcfZ3d/dXYlt/aJ9Yw4WX+uH+7+3L3gjm8na7PD0P78KvE1dB1zO03fmsp/CbmhUMvhQGzgPH6FTbTnd9cdLJ9hffvL1cRt4zlt9bsYMQAs+sKgO1ap38iK2fgx7O8ff36693jV7hX0O1yp3/iomHGf/l6d11asL099U/cFMyob/94/Pr1Ouz2e7t1L4dt2O8v8+j/wj7p7Zqm31r1vAn+fp6Hn+6+vj48nWterjJOtxPxeU/jjwb//rS+w+uo27fsH8/j70//eHr+k97x6LbB41xz//HgL7+93n2BoH4V9MNXA/fPfzy83v3GWn7kqlz7E58xdl0XueoQc79sm3P6+ALcOXZWQCjble7zA4I/E5zGLVdxP3whmq6cFLkqanO77FzjtxaBJi9Cv9arnn/78F+B+xuUqwWt81O7f3ytHz6AzrHP7/wd7pKKXDW9+8cXKbaR6afSr+J/eLaa8dOErFeJ86ngW5piL9GuXuLDFw5zOxAWV67ifjgdX17PPajvjw+sxn1bynDzrh3n2A9fovzu+oSzXYjx29c6X5//gF2zylWLx9oFzG+t2Hm9//3x/WG3iljKdgGqSLnsYGb1csT82Musjls7b15/m7/YHZS9XJV83ZpzKxzUPJ+umoJO6wOp7ceh7vVjb/dcv4rvV67e763xYoXz53Nd0d3r49vz088P/zzfeF5F96ui7ZvrxkhwWtq77YmRvra3m1tdfuhl5sydvMLWt28tvL3Eve6d823V+a3H8yXUGa5/PpvGufz1ujFIrsqyby0e/bHv0wTr66yzq2rUW93xr4jrO8tm5dNVqXy79WpvF3+/f185XZX2t1vXhJPQ9L3Xqxe48XS4XuDLw/vd43UBQqnbi5sybr2SvBRE46Xeya6mjFtvZHf11Tus0Kvbt/9OVLJjhVw1t926L9AuPM2Iq1PKrZd1SWiWEb69Wr95E7atfX27e3r89eEN3/hVv8utJv+j/Pv94bfzuvp5znh8+v7w8HRuvLiekK4uSOvpcgr0/mOzxlsXIfFV94tF5boV+WPf8I+yzzR/rhpcb+00xOg0fa76nW9dw+GRafbIVfZ88nOhjdX1epr9UOSvj98e399+fX498NLtMv649cL9Ev/5/u4ru+GQq20Hbm1HXVGjlO/b8/end5rv/SrfP/aON7FJdl81Ed+6F8MlMl5Cnq4uFW4uQFzhNvcrtFhgWxozbt0c6BL7/v776+vuLvq0haJy8yaXl6CXvXJIc/Z2RaGMW+vzLoHnhjlx1MGFtVztOfDBC7uX14dfH/8JXSSy3fX0/BidD4U8X9/N/3w1q52uZrUbrzUmbzyde7zWPmTX6rkl4lv3Bpshz4JyvpVMyNa2cW88y769Xff4y7awbtzarHiOst9Uc3v/PG49K8cWuftCje3h3W+tbn57//Xx6beH15fXR9jjSORqoezWJcm3f39sbystbu3Cev/5GzRE9W0qt7Z2B6hN64+ffvzOfvzkl59uLgR+fz/3IV4lqF3t8lBuhbgZ6bffH7+83sWGg1d/kG9Xa6veekczg84z4fV7vNrYoJxu7cZhx02petXadmtfxKXf77r8Y1sNcOs+rz86By+l2LvdwHx72iy3rlte4sa2WXdf/nx8//3SKPLn6yPslbStXLl5I5zLS8zj9fwaVyG3x2y99UbtEvJC6fcPT3evj8/Xh4ddbbP5Yx806Tee9y4vcu6V+su8rz+P7Rbat26/eon7o6J4/zlvN/Ost+6g/SPu/mvb7pt969n5+/vzt/NODD+/fn/6eR5epNlqO0HemnKxJ+a+0md7arrxWN2E2l/t1as96uYzqS/3Szem2WX3zquo21XZ1i9T7c3bbl9ibpdBYVuB09Wt6q2tCOdnJVxI8OGfj+/Xn+0mpN5YTvjLHZRrF/GrhfobK5l+uXu///3nL+euixeYtLxf3RHeuF33Lw/n3bN/zIi/vsIVmZ2uNq69sRZhRv31/OmtWq7rkFeN5TdWJUe39M9nQ/zj8br/wfvVXf2Np4EI+P+X9m3LjePYsv/Szx0xBHg/v3Jih4IWaZtdEqmhJLtqIs6/nwAJQCsBSE7OfhpPV1WSJkFgXXJlvqigyzOg0NwH+WJaXP7SJBUG0J7WFkEFNCdDyB+Gz+XNNs6apNkDnZCzUhnkTOQeL+FS6ZKso1X8a+pt6LQ9gQS7QoGola7JLTmhylZJWqRtRLdk2GPhDr/GoGStIEYpybLV2zhFvTHI4sjo8228haPgsqdSsdvZJlLwRGBGQwGtZG9tw7wO03VcrVuCmYhW0sGVVXdlUUOwBrJ1RY7dmAGujZkXvgwt10pO5r9vy9h/DKfuPh2DNytTVN1k5K8q4AILnbaGIIUMfzZA5wgRrr4MREOdT5OuyZDYgieWTyvLPrpht5tNG+Jfx/5if0x1yeoaGDZkC0pgO6L2bPqHtyFk3oIwlcrYIy3Cd38FwaFBkJFJcww+fEXIUNvNyPGVGNmQYQODhgaOOVaxLIZe28FXRIbHQRa8JfI8TbGEagO1LMXu9w/YhznQ9ZKAB78KpXevQAefWt4NSC8qkjydAN8++nihNMBQU/RG9+QCAbb8dhQ5ZJvANkllMAfbVPDUSeKHxJ76deoAQeFp7//YYZQ82ggbKRqpFDnAJuFX4e/ulOicA69Gqf0fvPFhSeUIsP8psmorcK/d+3Aebl3f3SBcbmT2phRJ4ZbAx2UYprDz1ACBQJHOOwJ2i29Tbw82a0VyWwXy9/B2Pl768bryLyGrb0DEUrFBm8WW1bPIl6aBk0CRjE4HfZk+vsbrvTv14/s7wsLTYLNvCwsxYWrVtWD8Qs7tOfTV+cW6Ur0PtzB4aoGSpUgOiAV/yYaBHh/JBHK4CYkOozQv426yt2wRrQ3OZssVmAnJvUKTFfMkbCINVhoqPft2fbExB7dcwy3verbPYjulpHqTKkiKWAI19Rig41uQrAOL3S8mKenX4zpOOBW0aEmF1wRy8DCAjlyQAq9OgM69tNR6AJoBOT/lcH8fT/dY8BSIwUW+6wv2kMvQXSNgWLv7oiFx+AcVW+gGkFrIMWiSVgAcx2zXApbQiXKOfBKsw2mMnDS3UVpmhIqdw2QECWUOSxaZHey2o6UWMHzJ+0LNa8KDSQH5qdiXs27xyWkMKFsKVkKx7/B5YCZ//Qp+/V2HUOpUK3N4SezXa/Q7DsfudDqEpQsohhiHKx7Q4EWVECU7gqpgY94N7wepSSllSfKiHLAJkmKaWCnrfTVbGTaQT9QwkHwgtX/ZnoMBd8oMQx+OqWDzpQT5c3abWdWofqZoSwmjR6MsZ38Nq6r1A6UY/acLtqMQoCf4f9ipKNjqUBI4dd9QFinYY2lzvsUPGup7dCF3QzqAtGnQ/JCdOc1WTf/cQgEjKZJU2CZK6Tj7FVnB8lvPk8Um9cScdUOekd+4ATc82XM4IAECu2TYu4LhrK7UAm7IBorbG2MvAAWc14IsZABeckHCOUtu4w419QEB064gZ40QMHmfcCCSPXIDa3JHPA6AKFK2jgbdkEF9kmenM6SfkN+Nx/oK53TMOKUs4JOlj6QzmVw5pHqdxxn7ID0GHzkr1vL3X6omGTcPAzK4Q6kSZ5sgtWOlk+zCwNosEBWAcQYy9j120zyNx+7kij2R2HEDtr6KJEV73PE/w0slZbmkSMUaiS3kfYbxFCp7lWBzVnGpZxp+Gf59D+YZSuz7cvGmR/8nTBJzcCVuyLFUjxeGmzV4vbJjDx5une+fhqG/pmbb5flhM8+//2rJqqgPZgORD2nyq52hlw2vasdIc0dg60xYdJ27ycGGLAql1ZNUBbPeunEj5bl3F2M1nh8X6G1bFNNg0CClH1pYzSzlmE7dusZqRp+bm1zV0bACx/h51DAnkpGBnOt7Pi+kw3ZCWuP5bucZu5Ewf0h/3xtW6BDfAG1V0VvyhrYMsQtTHThssNvbhrgtHLhDSPAzeivemrmvGmrwm+9bkS+baQpwd93vylQLms/AUaY33BUuetsw9ahIEqUDe06lrWS5syFLRWnYkLVcyZn0hizKPRL8dXkGD1TDA921b6Q/bwWMFG1zIcXOL7+iB8h9IyNnBy2eo3rGa6qUlZOabAhZVNMPSj8EKWGkyYp3CjROkRoYxWdLJ0+xE2lIoyB3IBt7x+42fKwU09XsMVK8UjUk8yXJOLCwqNElWYZN5qPzxp3SGZuI9peDa5O53PuQGuCrayCQsPtYfzm4zfE1fgP8VrZyafA/uysWvmrZ4dQlu0f+wIWCT49sOTEcKAgwSJHf1/Qk4BCxKfRzhg+cX+RM04/UGyAokGIXooGZ7vRDtK/4Z+lQYzpvA/a9ipwEMZDmveBzBCRSge01aQLoI6TAiUdcO/nhSFUDzSPFxrsrAWNDS3J/oInAEsNtMotlCVg4rBZuKi1WVY5enuRNfXbTx9Af3obP7muclycFSwFtexymYEkK3thruEs8rekBOa4g5dwD8GRpD4rubEEihZu8a2iFszHnZzdNAxb4FORmJSkKa5Ge+n1COlWyua4R2sU8Xh6XeemO5YpseB0/1z5PoCMrvveGHIE4ft6nX8bgNCj/y4lSrcip5hUsIYipSgVtRzYsP3XX6/iecFHWsuKfuzpIzgYdG+6fh/6L0Q0IBCBgnyM/nQA3am4CpYi0XnegP/JpgFhUkHwlh+5ptpfjpRuXcDPUsoqSs/UIi/0wgxne34djqDUtFy05OuCQA4XX6HnXUKwq2BPQom++0ae5681P4di/3AR1xobqp6GbUHi1lIyiOrPJYO1rei5iV7qxf6YfQ4K18mU95f60JTkN9l7GyS0puCtJl61rlz/YWHn9yXnH2/zK/OSHpMrW3XWVKf+T+3uV8j9pp8lWOdU3VRX+37o2oZlMdz/5TkNVF+6nxv+9xuO1PufJtPtJPX5yd1/7O6jzyv1UOOS69CiV/1PSrMQ+X6NO2tuixccy48vXmRRr0S0p+WGhk/WKUg5l1G7SSpWuJqzKOvM/+XfY+L/X+qfqn1uVub9X+edWaf9G/HOr/HOrSv/WS/8v/BOs/HqqvPCm9YdY35x/0q6mrGrlf/LlEv+JqDr377Dw76v0KJX/U7YS4B9vEProTLZJdcuW0s1wLraE5UG9/SuWAbmC2Wj/Y+lC6X4Z89VshiMghRY7RsPwm+fkwHPgANDC0Ktim/+r1DHcTQv7OnscPZxircFF/IZrOenbsuncirz2gXwbD163LCG29HuOvGdhKcpcNqe3fMbPFlQO9gAH4qCy/eW/S1Z6+Hia0She2kX5ncf+0Lqzz330tQsJDd/P/Zk7EbTtUZtTM3f/km4lmvvapnGfziIr0A5jm4oG+GU6D5mHIifGj4HIlJYHe17Y59W4E7QtHpuvPwQb/5PXH618CNKwL3Q+mRjT+nNtA4vn4fwWtEOUBrZ5WZILcEMXYawpqS19EMXK351lUmzIYR5Yons429X1YPhL51BEo8OADe3BJRx+G1JuGKiCUDGbymzQWwhsM7o0ZUOBs5TOWP7HfLqfg0daY1uEfqT3c3hYYW+BzV7n89s4DU6hHV8Q8P4btu6VUFmV/TnttkWd164CUGQ+kGdT+NcG4vJRsAfa9qfWniUScYBhhYbtKM/ns9ET6V1BLCk7Dnx9lbO1pRA7tSvD0GLO1pVWLufgMvpATQ7G6HJSVsdCbhTMIIeHbaDgn6wBdG1B/BLkYa5dsM3ScB3y3A/xWJAq4JxrvSCYYklvGzra3F4T30wupXILegdb0d/vU2q/BYHtpmSPghXyMn08OoQBDQziW5IQ7mDB9yt8jRDwujxWs7MGeAn3xCO70UrGbKxSgsV+8kgUiCVo7VfgLvDv4c33sxJuDnBwsJ3BEDm47Qb2zeK/BY2703UD3el9bzBETmx0Ncw5lLsf9ONFpp+13FHImYEUeOLJAHVHs06tz8GTjXto/bJNcM/o3/KlBHCF57on3rHDh+slbgmGGYTDNvz29HkbmLekBkmq0mdUJOSh47RHVOPzpZYcEHfwsHlXUliiIYV9PRI4ZsfRjZYHZs62FZ612mH3zth+mUVDweRUEFlIw+iKbXJu8GEMlkErISeVdw3YfB1vQ6opqTP4+vjfHhBTUZ3O0HeERjYNuKE/XAPBS6S48c/xfhs+R0ObWrm7a+l08yD+7EzlADsH8kgpduwT99uQNEV/diXw3FYtnatM7wk7d9m1yl1l0fCheNAPfNJQcyBVYTacaFRQgdgfKfCxYUW8bUkDb9mCvCz9paZuJcGook98W/CLq5SVbJq17FSJnwPAqo3UBSVlqx9Qg9H2e+IZJ15wy479eOAn+l2SKpvv/sVTW0glDT5aUi7fQ5oxgvj91HJxt3sf6m0+n1KY0o2QzitWYhWygUBKhaXIbkBSD3kO47cWClc1aelhkbf3/QwZQiDW6fQJqwy4G4r/wq8z8oGB66cyOu23RznuEVKd15WafQfLNbp0ZaMzq+1oWjs2pirdhIbvU/k2Ve0KQLVrfzXu77S+rZr5JmlWuOZX5ttqyrcyS990K33zq/SN5LJ9tGR9S075orp+lNd9I7Z4tF/9f6t9e7B5tFp9c049fvLtN49c576iXLh7qUvf4vPX8I1nretHGd/PtLjWsq69Q5ZvBeq6cO+jLv1/c89KP5BrL1/euKehHwZhjbs/3VTee8vL87E+qWY53c9Df1gbdodwlq6Soy5a86esAU0LSatK0gl1Tiqjmep8N07DcogjlUJGcSVdSbSACaF+scNV/I6+wSGU3HRLOnJdoa5PhP/lICJdx4loRLncfUqW3rfhJF9BJuH4V7DCBVG0Ap1CXbpvXJf8sWVaOYetl3PoLoG4swbZ6ZJO/USDKMIs4VNhJfO8ZNS/YsuvpHsdCB7RZfjwImbkOK1WBbIFfMXKXcBJhzzFh+FrvePJb/iujfbiAqBiRZeT/QWmTzPx3G9lGkQGVZ0dn4xFNnF9wvqlBXlBzUd7FtfVkV8vnApUyEjViMdFoNph8YPfAlYmO7ngL/DITG1Pz0mFjPKScEUY69B0JchdcbNPer6QwFJD0z1ZB49F89T9N/ApsAwgeYHz5Za8d8NlkNj8uf3A3rpVQ6rDnIHQFuuy8EC3FILT+D4c/xxPQ/ytqQyEi3KWkeovIV9rarmqDL3IdkQh8QVCZOi9sfzLJHI8iJWBAlfOkmkB/ZULFaDTFAeHbk3PXz95IP/ndCvxgkNdUqempRucyzKcuttw2OgDh27qDwlWOEhTK80OIjn0Dbyb+hThvIbGZ0kvvLhqm8tKa+6SqNKlfT4dqRzRqNK+Ok9uCMsQCHUY32eZSrPzhStQN3WnP9fxOvwejvfIvE+8T7YCB6iXJRq5NUOx0FongzLAdU6Ghp8WUAJgOCgnXbgsehzuJXpaWhZ7c9IfEC+wOtgHW4hc3OSxCZixPyAcZXue8lNHjkqOLdK8ow3TSjqmmoQVeEvvWWfBmFD6dcnyIqmgatFDPipUmdgRLwcVJHvyRNLeVNX+r6tptJ6xX3t/tYZlWa4XdsF56tHkUh6k2LWSH9o2pyFceYVk5VRsx3qDTS0PDTP1DduiBsCNLhKwOoCYRPqzbbBbzbQfu49pvt7GY8CJhaJpxWYlK3Ky5RQ0m4Byy0pWJNGTnsJwjOuCFIy2F5jxaC1lxM76wWxQXpbRvUOjNxGo22AJeSf4o1N8n5L0shwELVrSTCVxAW+1FsDnAL/nsxZNQ3skdsfj/Xw/dUERWoFgk6Zr4+FVHq3JyEy8gLC9JVW6X10htVdJFYyCTZ6eXyMhcKnhbbPM1OeXiE7kArIQOkAOr2APfKP8FW29Mn+tWE5CcIF0sp94J6XcQSu27slcLTFHXECMnu36Wk7DR3f8Q37zBXyUe3as1fa5H5fhGKrJlrJ8XbM9zhX0mZkyKtjvAHy0AJ549EoJLFbAJkBOeF9XBbCsSdcxC4x1m8RSrGRsxvoWefAPQx1ZBkOHD9Q4pVUarYXmYNdSkCPkxFpWOgMN7HZXJmQoff29O9nsHg9wMLKlR9k33MSuooD/uuvNLfcpFWOUUrKsJmVoN0SjKB5SkeCIa1nKkIDb7FoCHcUS3g7b5thQ5SREZPShYOPU2a6D4DacL/PSLX/SG41sbvmWZ80KJuEVzFrAtybVGXfFW8C3dCcYBs2gVUh30Ry66QIlcUHiTJfs0P8yX69fw7K5SEKdPVEn0RqcXtnv7cklYqprDnZELZ0AvrpAgpWag4NQW7AJ7pPLzHez/QXJuHzJbBR3X67zcviNxwmyuNlnvkEFJxOSlNnA7zuQ8gUOIDu3GXotqQr2svwx8uPn+YuH3x+5cfRD15/GKdiD4LvQZAjRD8dTt6RYlqB7x71YB+adJ3A4WXavyadpAUOKWSFjj4osrzmw+wJCMS3U1RT9CsxYjJeCfeuuQ1UE+x8Q/UndvH547+6n28FrWxy2OOMwfkzzMhhW5W1Y8MFWMpVqyOX+9EKrNXeAL2Mx+gGt+FtzC1NYKfFD0jWchbwpPq9+5M6uOdaGkdS5nKS+9sOp+2Os6q0Sd4Ta5CAIQw4n9qYe83Ha9P5SUwOgI6hJOdV+mP4cXMx8ME/kkDArBz+dPCN7WCu2jc7TqAWgcpGZIYZ/+aA/mKbAJ4IkYT+9XZAcA6clHBPmoefmtS1yT4HLyUP4oVacsHGVUUNNUtN7c8BO0YoDq5aa5IgIrOG38ZRBxFoistuEHWr4Gj7HUCQJKNM5WRjuh1s3wg6sZWCeu9p5XthjsX0MLnqiX0WWC7aLhdr1MtVmw96NRZ3iUMtGfVuyX8RTTnYleVktGehveNPlbJXIo+VU13Ce74INdJZO3fRxDyek6xwGoMiq5Ib/NUz9HOgAlAqYXoq83ycFfKCkK88IVXXreaqeB1q2D5Yo+TL9VQ2VAC8MTKmabMn048dwvfngIuiHAsfI3mpGNps35MdOfB5v65/jHgydLEcN1gVZL9+uEQwLA9mQleXux7Nxq4xMAORe3pBVFo+1/kvAk7U81bCBmsNLlDZzcERn+/cBYiJrhIJ2Q5KxtrJCRBCW02g6J21PkyUK1YJaYKPIb99qtD4zBIYNS5EMFgc6v/1zXIXcIollKEqQyrIS9bLMt/k4n0JcCPZJzqjDXePD9O0CR5fNQS3s5noLD7UFCVxS9AbxDLkpuEtIPL0RhKPxs7qmicskhoTBDaUkhVeeQSdHhDO4ALtTXS+dsbvtD93tcA6C2gpcO0jijYEMRZDkLurVeFrvwtF6ZYCWzYmNFNT4FhXAShnU1KQuYz+HmV4lxabb3MZxLSlMtuGt4qkYLsochCTCbFifM5attWQ25OzntUI59mZ8e3IryEl1MsRMu91rKe2XkxMY/XzuxulfL/lbMvxWOVltD4AdgStoM0DWxX6sFjkibwVxEMhskS2HADtuGmfQLsxb9vUBbMR0wEuAAjtL07GX2KhcsRK5UsBGtlEbjfqjWzP4IbLHG4A/8ehVCiQOCrakANgJaptSsjStin3fS2jlGCDDHbMp34b8xPYU7pUk9jtE5MwFwPDi2ArTBuw4YU/fHKitF2wgjuCOx7ttI4gP20fBRiuv8O16CS4D3yPJaXp5mfFyDC4BK4ZkYL28xDZZEVwFlNnZRObVVWJuPER7qiAFC15e5Mu4HoYygPKdsOOG7irrEBDigcxCSY7mOLwkiREmY1i1pAAxwWIElULVkFN+FjceUwoYkpDpklyYp9jTvJyNBWC8M+TArGVnwZ9eyLoFBMkwsD3Jye6nl0gNauRQ32zIDnZwiX6+XscnPOkcbIbpzsp2ATuMb5rk98t7N54C2VmVQ+2J9SIF9MSXmYNDd0s6IFhUhkRZA6eOpOhY/CRtL3m25OCO0u5boS9JjqmVVICQSksOMby6WoLuCA4A7b4z5oVmTerX0fDwyLZ/fKnr7X2cPoyjUthaKIATne1bZREX0Yv44zVA05p1/3x2DeQ74oVKkEhli07UhVK+7hqu9l+u7OTVzqbGEZruFMCrykgxau6Cl265RtcDNj4rJchdL8lTlRWnjC2Cc5dLzK4VIJmY7Tukf7he8mMGQcJsXxQfXW+L7J5oBRegY5mRCn/RpV6kDCWomGWkvM0PV3gfpz7yhypB1Yw1W/zhSp/D6RIqYgMDUNPUg9cXinfDMoehLZLS/MNl4vQBDKG1Igey3WWuZqA5pKeoCiSoWWkxgXn97IK+XQW263rnR3+dp6/QyV2B66nWbENjg9yyvXRd0Kj3APKuHeM1xxs4THrf3oAkb8QtofvEdqNTuF/dyew04TMB/wHNumsEV0hnUWASoYt9590LW1xVQ2+j2HewoQClZZGHfRpo7O6rWyH+17AknbmM3pO8xr5V/vwaqYOr1igouKviGXAannuNGaMZYDbs+rqCy6SG/+Cd7DsSA/TR0LxvqZCploowemfRJrTZireJGkZBinbnm3g1+ABc731nXyKWq4GMW7LsQIu3RTiWGR3gQvuX7YBvuOiyYPUN4iuArDOpPOau8Of8Np+SAVMN0WZJzoJY3O/hbatgPYGGW94XUSD0f4KSbd3AXZMiyw9o5x8/vr8HuEAP2NeLMLib2FZ6bqGBzvW+wsa3meG3TSVEBcJkuS/22drhSbNc1cApV+47+p/bfjcK7pflic3fk0nisUUt59qcV1jNHsfLDMwIePMqYwvOiymT9Yd0hgCJlWYpbBtkGhFGEtSOX/Uy9Lf5hlQy+IgUyyCLpS6AlVRYQl3p7fkKZ/ynvX6lGcXiLhY7RhpLOWBTcI/VdR6CN1TAG+Jeujcsv97P5w4/m0L6BlTkR+MBDTHl8ERxDWh/ZGjogN/m+9QbBZD4hlUOvlItGbB55K2f9j1O/fxt12zQLoLVQY71OHjBDcPHAd4jmixte1SpMZi+aWikkfVNB28IFmbSDu8YGlDsZhBBJh2TocVL7qgP5G2fWUO7cE4UrH5YLoRDXmPdpLxmLvN1lnoovL2Srwzq+eXO5/vwvQXCjbTSyCtut01Y6Ya1Fi3vleXbRN5miCg1cchemEPcagtd38/T2/Zkkw8Y+pIlKRb3A4VAZ7CZ7919BOowdW8nVE1voUO4d3cX2CldgVzGMTmZ8SSwTcYGuFo8ZjsZSOMaQZUnNSIlSXOqIKlYaeDkJgQ7JlnW86JDhsDiFHnxKUsuHVnNBdRfQ/DaJHeQdCD1rIW1wtkv3TsylYE/x0ZlHnSY+rXRaqtY6W8PNjeSfoVki2RAqUEyic2jEDiudGoFW4W3cS7JXobXn11ZbqcxkDNSJfB1yIJMDJpaxuASx1ZjHPT9ttr32BJf6kVq4NGxEs4O/3t4u/hiTPDENeCyC2Q8jretvna/rGIZaFYITFtVk8nlcL7cHkOENtU+JMVZQfOEfdrxTq9QyNTRoQtypG+YjsufS/DLI1OePJcCs8ccnp+fY9PK+ahrTerXuSi4Wz62P8AOEaSF7EGXCqxVCY135ZT6tSZb8MP0PhsdsvAeFRgxsJMMTij6RWakMg305Z3IYgwA43UQUNVktcahvhJ/lWs+J0VIHK55DOs/htQQciF2TwkQ482wrSB8IgcuJa50msaoD8p3LFVFQmOUIOX6WebzGtKNYYMaxoMykiZoREsDpApcz7Z/15AdilUD9fBrxM0Ewm/6E//C5w4fN+tJNExf4zJP0SetoX7U+Fntho2GH7iHdQkGrUfZX7eHg9mIGqeWkTuLas2O+Q9LUEaGZnTJrpzQO6qSGsEPG5GaTZhNBIUau9tkiSNRQIFJGqGTv7XFf2oVAsIrpJT28BXOLcMOr52dS012KtJKryBh4MLIJnfT+623gMnYbe8V8RY4q6RYDgK+z0tiNAM0pFVD1pZDY9xY3QcmPhq2futg/4wYrEiRUOWsJRVbsLOow/Q1nOZL6nZ1A4RpNtcQZrUp07YSbprcrwVm3M1soZ6t3UidsmpxZrjOhW95RqrsuCvGTjOSsl/tXHPjdBs+jNxf6sHIoKhiy+0W+GTKdgAITOWCZDAiXEzcyeXUC0t38KAGLvWLy1VWkXKHD9DpV5Ahg0NFwx4RDm9OEAp0A+7TbL0ggEx+YUAnJyVfHPCzKR8wHzTjsbtQU1ajSsOQXbPzI9rKn8nfH3ZwsnuLvO3gSIAdlhQ48YD3t3+G4y1xIEBhWTVsPSdp9ABeQuy46fD7eLpjrR98qRVLc7VAZqAtkIwSb7gh5R42KT6T3WMmJgNfuwfn3kKudabimvXUfVwm6tIoMHDUBf04HWIYw4Kzm1d8041rieZe0YZ1eNmuhVqp4gixT8X/b+kf0/ZDQXJTvCyibZa9L2GE3kD4kZFqFCFuUJ9tYO4rc5PtSrHhgoNPCYDKHgkLN8KX28LWrZ0LiGZNXAzeMRRj1TD8WTUu02nZ/eb3ZdUSCiqNMPDGpnoWyvytbgr0EIG50YjbJE8Ei23c2qfbZQzRJVmiIRlqw+/LuAzXQxco2IAYkSZnw4ffl1M3ogyC5J/VbHj2O2zqgD6f3bgK/pWYpOLVmL10QVfeD5ScJtvwX+RFuDqdchKb2ybQE4srl7PaBdtbXLFDejmw2MlBK4t0MEMMxy78lEqg3im2X/179S8Po6myBck/Nkb7bUQfkb5TyeCkJWUwht9rBTVFUIP0jDTkNBjz8mcZ/n0flyGsTKpSQTGZLCGbWcbuhKpXLRQX2GlPgzT03OCI5GcY8UT6Av++D/dgxbRw7tekE4md4UycDzIyq8it8X24HT8jqVOIpchveEUyjD7rMHLBQjkIkimyRxuKkECknTuf5NxtlqUrqpXO1b50IVTZeuMtbns2l07Y0cogipTkMEhBQiuehQ0ezc3bo7J01tA6J8tV6xUO3XugYt/Ct6rdM9GsNfwG+2bKVUFDDtw3Gy/lRLYpVty3P5Far8zJK7LjtWJh3lTIIkRFciNWnGjaqZKdOZ2T8por1p/rbTgfVtmfBDENUlDd+Ao1WYERV0hwH1vIR3XjcweyUfFAf9x+8FjA04EUXX0fJyMDsJUmnlFXMzgKMvaBT/3B6pscUgInID2nNMmlWmF/L8P79XCbD1FDDfgFmiwqGsyXSiwlECHJdClBItBS55t120u9k1wqWLCMOTGwDYPcGDLCuElGxnPv4zReYeMoZe5fkzTM93GxCpf9fTG0tiVQM6pkpbshM7d3o3WBu5HcLKvaGbzV9lxShbLbvmrIUH/Nsd+Nf7F5qJhry20lI8PaFS9IsFVRw9wqyWqM0/9alt5b15QzxU2/KZG7hxXKODzG7Q6pblBbweFEVnaT6CnrZkjs/xe3nip45nJbLWobBeRs0+qhVnJKOQXnUAJs2KgukkB56iIBEV5TugSzIXtDz/Rcgl8CiuJkyv5UKib1W0AZ20sAs3r5Xs8lrUkLbQe2fBFoxATcIdDYIGvEAWLqOQBTk7W1cLirAATiAfWsIaXLHF6ynpFDK7Ih9/2gyA5fRUHWqD6G28EItB2iQc22RMsk7rEZPCMae0iIu7YlBPFk+9YjJnVoW1g0mkw8N/PLf23/80opstEgR0t+pAAf+6aqBpgeJbmrJFBjtYFGHlK6IqsaAO18LBBXpuS6IjkOiPvMaxQyk4pduAAd6bCa71KikgcPoLpP9ivWhGqg6laRXRNAf6Zbb5S9JPZ/s6T95GTq1kHsvPpvFt+pu0/Hz2D7bsERrGL3MImbbJ3CHJGuyfoh4Jpq3XC9rXWrAFt+LTWZ+ATY14vhtL/d39/DO4eifE2WFJLoy3y/ReiyrlqTGhiAbkVEY05BK4XUdE3OTqSwEwuwBbkm1o0Cwefjr+F2nKcpER3CMaNrMjKx+O6QQUTYS2pyiGJDPLjj5WCG3ef77XA1gx99uL3CfkLmj/YK21jfITWm34DiF+sbZXH7VQ7WuO3YD8j/Cufw7iu4ChdfRld5/YBquMSeFXnwWUvapks14GJZkax/C+732qfoLbwDsktl0c/d78Pxcg+eRQPPYs+XvwJ+Dt0lQGwBcc8nuSIab7bD259Q/qoBHbiKZFEJ3K3V4NZfCA4HDpkvWHB31BySFrotqADVpONiCP2Cwt9CXMnOmdgL/PQ1wv7KNgkstt22zRBL92aGe0LCeAvRWk1KhDr0Tbvz+Z1DaEIWkTbsdeJ76LfX+Z7OBJsWvnOybmDx103WncfB8QCdfLLSa+N4Z3ljy3bJu4atj+Sav0g+QOaCLAZIuATTRIFdnK4cdVmznaUwRQjAYUV7DnRFUnui/CP5G5SwTZMNEswU/AkQHC+AvGs3+TTGl8P16sagUncOTU5dk+2mNH6ADO3smuQQIfKTZAFiwGxPvBMCJx8JsNpqsrkdJ2aR14UxIYLsbM8ykchPs2FQjKxISfMYPzT+UGAvpCuygRYDPxm3bsC4pyKrYjF88tMEkaKKdKgB7H7ELho4aumd68MGfE++djD+qnbtr6bB9Gz4qAG322pXKcrgfgZGxhCCmAnmnXjP2NMNiABVZOdGFhaCLxl2il07fnrrAe3Ielf07ACjfBlEWOtdVbcNM+Xn0SrIwndFz6f5I+HWCRUDR9LQ7MTShvxk1eegT7ar+vOk7AM7OEltR8AtXLGUrQAdVtWu+t2Wk9ggPNHYaUE+sSZ55QLb0qLS9w0HMtnKdbWk83xLjBS1MBNYk7q+UFnbSMghLiyJmmTqAG460oT9JfNk+F072IuSIHx0bNvj51ogPGSSHJOCTYY7IGVck6IyQYkxsZKhyt2QpmhE5RIWMTkknIJNPosCNo5qzwt8URCFmiKpwBGDpm8YHseuA9Ni2x0jnKBWMNOva9KWE6DH6X0OMKE2Qo6yy7rtZ2dI0UtYV4Bdc1dbYi0rJNZvA59F5RQTdaXIRXGa37qTUSAZfwMTRH4XKmPrnSuamcBBLJj/YAubS4fhYSmLPjXbWjUoh2AqtoKdSrPlcwP1dN4a9AvZOMYgBtNF0PLI2awx7GwXkrJYOdlGbS2i19lq8o3ex37oL8t8vtys9AOax2eS+55nZJphvw9AkmM4OdnrsTiRsIJSLYgg7butQ3LEU7Wgx0OexRYyukEN8jYl2Tn7ROURIFUUzopTsy7Cn9312F+2WcaVC262LqCogW+PIjPez+6adEZCyruj1JHFvs8OaYQNOONknqumyO6pwTPF2tsdyRYo+8VCnefQp0lW7lVL5nSf4/U2L6ZW+lxaHES/yZM0iRv78AL9TxfkUEwSPFHkrXMQFCdP6hD93E3j+3ANb7wCaG5vC6GNyLrLTEKGZQ0hV0H2BMKChGoaqJOyN7r6dv1rq8+nM35o7zVkdm5xt/95xRFqQfWbne0G+ESZvpVD6LohD01ATefVUEtrSA0CwH3R2m/gSZPUFQR/2dqH4mhD1jAtfrq1D2riTbnncfzURAStZVZeJYR+1USE74WVQ7EL+mF69uSbqeGbIc+NZ9jJvAcc5BuSm2A/GKOLdToNfUoPQ9I9K/a0f/4dwhwe2WWWcMnfHfTArL4PifroHBj6H/7uMByyb6dLPEkUyCElTjc0W3a3B8YydIGnDFiZtOQUywbt1lRY3wQyl/FT3YM5d/2wdAvOi0AtSGm16y49YloiqYWphIYsQ9uNPfjNKxmYtbsWkxWtTL18mLEmPYI96LrTplBl5sxyYV4eZ7CJkNr4G+CzgqgGxUKWyegwUwQBoFw2ZHnOHbaLsQWKqjBSpUc3uZPXYLW2hJdq6gHI9KsmxeZ/tGfVNYjAZH6ynhT3S10gnh2uYawi85kUOe61XWT7YCNFQg0EdjZvEYjxngX0dbIuZRE3Ek3q9ckTsGa3rdv5dAjvL5cBHSuBviLZ+XMAkyFtyb702+0SDHWXsglSkzeFVS5Z43Lfjp35/fuvolTuB/9fbK+sqHL3g129hRvdLmr3l51yY+HGiQuXgFs3iL//qpw6TaPs3zHe8vYn9jAY++F8mY39zmc41pqBTBw71mrD2IDyJSuL5NaViodxksI+cltxc6I9WrtinJPj814qrXLCPnaIzDwy7ba92rmw6Ibs5blbvCzzP6kRM6nOohpy9m78mOYFpREqWdduSCb15muGR7xAcQuNPOk3tNeCKngsuz2T2zk2fDyYK1nWbsgmgQNKMJkrmcOzxuQW74XSSwnnnPu1/3v0Y0rpRaykgsxyNuzAhw6eh6Rcs2nr+m/n4/G+bKixcIHKcOSUhLW3mfQ+KWQbmKUbrpBPjEqls7jW9K/+EdTFGnAoz8h63oaD/girMixAw6CbImePNmjf7J37QCdMwe2yz3G8jabpFAqoyfCxJbP7xKuVjRQfauVk3WfFi0IOsExmuV4rVDyxLrNs9qs2SOE9wdMiz1KDE8ntgVGE9q0nkon8bF45g0Q9JwmmlsjXfRn1oZXrjee1WMO+eVIXvo2y7yrG10pYq+DXIle2YoOfDTew5Qr9nJSCMfeCHDYKwMfLMQEMJlTsiYTAmxFRjF2DKQdJ9Quww8ecy2JGQSpTJTDjzoiCSeGC/mTT0EmTEgXPg91e4AKbFFbiPYJNENl4sdg/TXJCcZnVsUoTbBvQnlckrcVinbvj55x4sBXwu/U+0HCBgfGddiF+4WiGKnNy0or1WncXeuJdU8FkqK52gV7Hj6mLbbqBcqlJalIImbxXEGgk5dwc8Kpg9IIs2QCFryLpCxZ9q0xYPxwkHYgTwNHsai8K3pBTS/YyxssnXDFQBSenCxAusRuBU2LBpr4xamojggJQwT+A5P5QVyBASE7dSbRIhVjL3Swnu/0WMc6PwH2Vnf6waH6w6fprRGnDWn5jrVOIa0lOXZrPr5oahqRcdUZXpDukhR369XYTCaiWCW1O0pEt6lavw3Re3G6bOyklOlNYYU/dLchpaghKMjp/2+DG6f47vlXQiazJKqqFXM+dCFCmrjW/VxnAS3f8FWwipQypWeq9hYvWZiUJW+2OFb/crVFgF9SRQEy2JSm03ucAcwcYXGC/bYtke8j9eIy7kTAMQ69BC2xwx+k+JFzKNDDASS4TAPsbxnwHyGbF3of64kkAYU8VZOfDIJv2/LgKeYVTdC2w7YSbD1268OhRpUFVFR6h7Ipd7RcP99t7c4hEPQs5clOSvLbHGLyT2g2IpYWckbG27X//VZLjEQ/4lUF1uH52uqywbiAec1WzW5+DddSp8K7lUuMPE4uaUh1WOZIv9yF6l4kuMCXXUBaj40sLG+iOqgyofgU5Umrgrrfxo9u+hIR7Q1uBWiipxQe46cIKDMYo7ZQIdVs5/4SMLiyIiy33YDuHFmbLf24AmWKE5NC3bOnqCiKn5M/A2rslWUIR8GaknsKHxLSla3+InzKRkiGdkaTZD/w9L7+uly6k2son7dp3qvWdYlIGKH2lRDsWjBXZgcM0emjeB8Du/v+LN/y4QOoFA1uX3bEuOMOv5favytydgiwlebweznN/D/XZMhg7ZNt01+5+m9d/hhszmPSwm9OV0wCA/IRdYldy5BgEYdi2nQW/ft5v/fw9dcdf0/y9WledwzADFIJ1TU6lj1fHgxu66X6xovnBiFIDRENyStAhU/feAJOWHCYYrwnmAQhRKNYzYLzaNsz4n6G/3P6EI0BQx2Klc8eraY99j6b3HxuNKXBo1Jr9aK8nYzHWnU7zfHnrjr+MikD0nagcytPsiXKNv99GQQXEKdwrxebXV1MBsT7qwcKqYPYtJ4mb4/U6HBdjl/1riJqjNYxGsZ7vBnKbAEw5PioZt+UZ29L3bfxjd/wcQgcpqcVATtKNtwHVeGqQ7858Gbdpvd+KcvSLjHxfRjcg0SJXDZDdK7IOnVI1UA3wdSvHZdBV7bkiJCHqH6/2jSQm6UdKSvI/oA6CHP2QhrOSm4fEh5yDLXdLHkpPLmi6H+s4WBBHwGhLlvGPP3GNtBy0NFMkK31P8JfhlBBZAzsLnZGJu7iEiUHHs5G6O87TcTyNkMRAqgH2gJrUo//5UukHJzV9yQ3ncSm3wLrj8X6+n7pwRL+EF69I6dUY/zh/DUtQlyvkrVdkGT6Gjj+JQpY8KnKARQA/1hJeIxH6FkCHafc///haKSVwKBC1ZMGFuEryN4JssP5fPL14/q6A47wle+LPwePmTgH6FxlZ+fvhCqnHBON4GVn1fn6dpw6e4PCiM5IU+/xCqUvAMG1Lxu7iEraIlXKRgqpFufvgcNAugoPdqZAhbEmWWmLscF6vkGppJRm8pmFDfjg86bLavfwFdGgEJKPEkjRriJHXJfLkMChkh7okC4hPLmGtLpErJsuz5Oj+U/jUcSMLtaR6X4y/nsm+nRMz3mTfriLJItRV4g+3kFk9O4Dz07Xi46eQFH92XO5xma1rvCRqMyXIYqrdR41FtsIKcdWjBJ10tXtfG6Z+9YOKT5kSJE7YGv0D2XoPJb4CVYJ8qiJ1gB7QZrZi++mJ/louh0JLUtnrgb+9x8W4OgX3DZEiOQfwwLWN26c3LY71kpygfoB7nnTqVdZw31zxR0DPp7gOUMLsHkuTF6BbAoDxv0nA8dyG+eGMHB344SqJ8LOAMeJsd3b24jqpaASqcRnZUXtczXsyPltKUm27JMspKfhl/BgDA9Jc7sjl7szDCilEHnQlcFf07qB2w018s0Cv0iTLW+C+MA+F8UO9O/BD6ETZo4RJf01KLIUXcFt8AA0cP1IfO4Q2872xyyIcpjojSRohtt/PgvuGZUKSU0Jso+oR0vBK8JrV5BCtQU56DsCyq9hIsg90duFJ0qHWdU5Xw2G5kt0XAza/memwJHVWxgisOduTkRYQ5tSkrIXHSv7CBSDyT29FTP2+YGfJ+sUZxC+jExI8O2hOsAUPh5V8G/D7klXSQMdGS65H7vwNtXIUAq3Is9Gwyj6W7hhU1HUGPhltQd5lmGVKd7rSTY1a142//2q1myPNHclGWYNxU6l3g5Valf7Xcg7qWmtXLte5/29+5KMmD+tTN33cwyEPKEJkjesmKN8ILsmXtrEeExtPDdySjGz4JCSHmxK2ngf12QsI1o7drv2AuW7cgKpuyZHkpPBKA4XsytlA6yZnH4+VKB46HCAr5bAWa6Pk0GItsFKyEWsytjh1f4JftwBzlIwcFF1xAt3CAjjwGflxnQYj03FBLJ3BdsLaPp6Gd+TPByL0fqHYte+/NqVL310jw3xzreN8D0KbHDS9G3K7MlhhjqNRe5p8LcNHd4RFV8kcpiW7MhvMwUqTGCsSM1RxOBubgiByqUBsvVDuaylItaXTMH2Eo36wi7RuKFh5iY2SlF88je+DSYzwhkG9WLMry5zwcJdSPcetnYqsOK5oh/k83m5DfzAlihQHVNwny6tZgRMZmaxdugn/MvcHF7kqPDgS/8SDcK+q8Mfe9kPuJuZLZf+LddX7+y/fFm7cIai0pyEUyr39xq0s1TiZB9X640A7EQedk4WROGSTOjbK2aeowp849phs3MxoQ9a7jDNTkG1CIEdyWAxMEGLi8A4p5XMap19uIs/UVm6zsQnFgqSc9qvIZMTgBo1zkINq2C3MDEEcP8dTvwyRh0Yl+1usJN+K2A/n2ddJgoNZyxHVPGe/YYNqCqPj2z384rQkm+Vu46qc+EjLHv6PgZC3cTLsz21GDIk2pewb1GQDS0Ab+pZJpgFTJkQsn01g+rkbfH+lzGFYXacYNq6hlXJh1CQpRAA/kzQrpUpaTc7sJnBT4Zsc7SLrNyuyreS+d+fxhAGmPDlZ0SgJee6m7mNYLEEo0KDJ5YOg95r77+tntwz9aXxbumUcrnbaPZhzk2FTTWoXm6HUw30yvMNwiASYUzl9eBplq+PneBuO6xBpcooUEmeyWWOQ7Xy8nfXEjENGqfTWEEImBjE10ATJcukT5OQwJszqkEUdg+8OoMTTyOWEZ0EvtAgzNSUPs6P0eZSGTk7Jw1QUKWhiLnAezm+BHr/OFPBy6T34ekutsRqLZdu/foRXWeFVsEgOkrlQ8uND6ToXPrmAqmCz6Lnrj/P0Pn7cl6F/6Np399vnHA7mlXI0lDXiNSrqp69uGc1mlGLdVzBWwQbJRpt96KNWZNATk+VGRc7NP4NO9dxkhKlIglxKVj6X5PBSu8S5cOppqnQxuCq9Plip/Z86fTFV+qn1zGuNqcYXwFxkpK3201oAy/xP/r+Rw6ruVwmOBRng/+XyCnLXmj8+okIRTBQ4NUXd5F5VxonV6dbV2/KMHOU6zR9meDtS52lB2Yg8LOaP0/A1QCsNzIGUZitm84fRQ97shsKgV8mSRZ6R80Knef51BzdcSStg61GWLr8Ml1OHe4M8pGpS39GPTT+LY2URgfUFC0ETUayUQ6vJOeBzd5yvyXl5qR6R2/XXkkTxczcGNQRJTnpUX8masYF7X7rzEMxz1ECuzmi0fwIebQNDLCxXJ6nWDxW8wlUytC+YF8rtVTnZNzl30707PZSDA8EIsVfnZLJ97i6Xobf5bMSOgEFcnZFqPRFm0A+GeZaMFMw6d8uvOKuqc5AF446/c3c7fmIJRDqBklzXc3cbFjsJNC7DavBmSPnhFLrcG1nk34/J62G6LX8Sfty5LJcaey8e+no7xDcKZAvVkuya1dN8Pl8W6zW9crsCXBiGJeXBDW4/XILlmMOR1ZI1UoNlnmJofw0UENWSkyoGzYZLIRzQsclQzMBtRK0g9s0gZiQ77wZtdfc4nMfTabwaHk84IJIBQ53MOzfg22diIQK3V7VkiGgAN7LL4dxd7I8hMIzLkN0UA+zr4Mnbhe+G7KsAaggIHw7JE1kB51t3enzpqXuFb4fMMx/Q6x2nYOEzIlvB5+53d73FG0cJymianIk+d7+jG8ulcVJR+MDaV84LUvjx3P2ONw8NG1zjzmOti8bD01tAaj+pZb6qC7Imee5+J7eTEoTmNakode5+j+c7kg+1nEtQlTOk0ookfljMeB1VYFauyXlfCxe/oCoDMhc53Gvh4nVZZcCxIum55+636Y/Ev2wL81U1HbD9Po/XRMCB0mZkp8CgJc6KEjqnmk4ifscPTcNpbYVB14+EXs3z/Xa539YHuEr8L0MH61Fn4CHIikGcu9/mAIpfTA1wJTmOcO5+20Ee3IEKuQPR79j0bqaPuAOtNEQsTeGZOKS2xvl4uSzzhwmvliGW5tYZEPPpGGY4fnbTeIX3Usjtq/LMo9ILxnpVe+0FNrT2f6pJlkaiQKkUdEzLzKVKLH3cYh4Mf3mtbAVfmlzTJXtAxRSFSgYk3vOicTWlxrNBrJOqOVLIGuh5uH3OcNsNKIIoz/rKSbnosxlLjVyFauDo2JEpQ4Rgt0dTOw1qkLoE6fXCl9jYeGXDfFRmr8c5ZFVqOGnI4c1zZCgC2sqOGlB6qklOcsy3Tfgw/HZ5T3AVubWX7HexYYZ+fFBuV0XrP8vM10iVM1/xxRRV5r5u6uMc1Tw+3wc1UPuf/CdNjufZG45qBqBepUpS/WhD627z+3soYFWCHJYiOfUbYMyrKgtAY4tYK1rKxh165lqRHccNbytYBq8cyG8VewateNF5XshftiL7uBvWZTECNbc/67/GX1jDL7zn/QYDp3JSyPNuHjRSRToMnMOXDO+4ftBfG39Yua6Dzj0rM2d/k/vN9Hke3guwawPjjFtb4ROWFWFXbM29zYrLVgrH+S1K14Nz+quFd1xxsX7hFKVsr9L42Li/3Li/7LhSviVTuu5e42hYbePbfO65qdybP+WF34ncXarG70kP1xdPa9baB5i57+pUpduxGlJQcJNeP3R9P0+Ht1QypSFHL0kFA4v73LYRHMuUJhPpDXa92+TNlmDBqnbdrCVcjNNXytkZSE9ak7W4DXn9yDoTjX4F8RXI9ZF5gsBMiI2iKhEZKm+QW/axNWGDSixoxeVkwLOhmiUQfqbgvqrYYGfqvqxOW383OYNlxMIeAhW6jCyoTUO3DNfbpVuG4MSD85gckZqGm9GRw9sCESHfj9e+96pbz530LcycVOiZht+3gAXeSr1dXZMFVQOUCCJyIPK05DDtNG9sufkyTCk1QPmiapKPENkWFDAzmPkJDu/1rZXfEpVXw1ZkoTGR48u90G3ApefCFsr318kCkblEsm0o5bBcD74lyxOTcYA5jf+JdjGw+VW69YkRSc4C4BQxC1KkwkXXmhVHc/jD8R3zpFxBAZLs2Hi4Vy7e8IIrmTmyDpX+Mpaqf40FX2FMriHHOEPccIoepr1Yw+1p/g4KYJAekm226XJ+LucPDA+y1x8Ahq3+GkhdGcmTmO6mtvEVDt41MkpUihza2UYgxy/cgDLoB+Qkg3TDcmlCkAJCBkwetdsU+HDsL9c4q25ArVeR7X0LOX9PQ28X4McyI0dEZ5DQtBmXcVnoxK2qGsqxLibOyLzaA99up0gBs5TshJp0obGIN1NgCcbgYYC6IWunFu97eEv99mBKT6bXEWKCcwkLviBTgzRwinGZ46lIviufBAZa49BaJkOgB9iIVWk5eKXY5fmwBsRPE8TA/VApyY6d39/H42g6i8+t7DMwVslJtqNDfhW/Ay45We1wUxG8yoChk5ORiYR8pmijM9m+yzNyNCcOXKWghy19rcEf+aVCBK8lbTl3yX3uisCVr+o/KqIV2YVzE2jHz/v0yxQxg5QWSMOKHDByoOmWAWhQk6UWh5igGwBPpSQVGX4avJM2CeyRZSG/h7fD5eEaGhSFgVlGMqgscsoXWBXwgjLSzsIibvJ7oeis2UQlJqnjZTFTcKA2Q7ZMLZxQmMFXJHeAkszhLeYqGRLcYwGpHBnOzpM0bjStuY+gHoIu4C4ZZI+CqR+7j2m+3kbUcW9AsLB6jL/nfvydnMQwl7ge52ka0CCjAcsctlacMEdpCgh32RN1SnnXtznOQ5ORxBSNX7ZA267ZD/wyBOJn4CngHj3Z5jBoQjgSq+Bymo/9Xi7DtNU8njqUYheNzAMN7rG/2IGSRHwPwqmKZJquqPP50t3G2PVUYXnGl1X41/Q9L6c+YcgOhURyGCop95/LjnLuusalYwhXD1N111oulW9bVr4X6I0vysZX4FtXz6n8hEKl/U+ux6Iq10ZQtZcwqEt3jbryP/nOY0Nmw/4XPqQs5FWVQ5bUuk2NTj9X45XudOwvx1iGHDzkFKsVlzJzaeUr0rUPwRpyNNRiHuK5TaUgpy1IU61NzQx+WfgiMz8BU7rJeF2y0fKKHfCoNCga+S6ybn3vxgnK65ycgdmu8zXOcemlAdYnK2E332/HUD6+Am6Mb07p3P8KBXuCrklJ6PUgVa0Uu6uI9CbIbuRmlZOaF6t46umUWFs5WFM15BjDD4USEEFhVQsc5iqI7qqLl+47ZZ1kwjpZiyFZj+YSy/VzDG5X7v+adUsyU4j2LpOqHy2IhdWel9P4YQ7Wa/D59LXsVlZksmTRMKeRug4lSU0wdmTzO25U4HrHPcdLZzQXb4OjN3vfG1ymMj4kazqXzoz/3MKMUEM/riE7PCtYUG2B2o3mtoi472acC+Bz4dbyBnR4XlmSqQC53VrMQBrJUIHlBklutdt8wdoNOyToNaBAquk1ZzBTzQxwrPKDobogqSEbcGJ/LEGTUJOZyQpn2tUHn5m7KQanlIYtExhAJPP07SJ9b7hlQx8ZLecVzBvQm40BtSKdznAGT6AaTiBy5nzDDb/xlD2OymDpFnuWxpaRJIzlFExIFOR5sWJuM+HwaUFgz/KoVzD3X4NDuIL5DVKQYQN8lH7W9ZUYOKjk+ca2Ey34NpuXIB+oogIVNzIQ2WCtnGqsDFfBGCE5mrhiJleShlnP5r/Bix2yFSRjiiUfbajrFLPZGD5XEbpgjYJaxJ5llWzvSiZDQ87AbWjW1q6fr9cxuMkcDMzZ2V6ATb6qvIDdikzuVlz04os7Qg0cX9WelYrQCSHtpgLrKTJ2FNh+K0zcN0j0VuRMUwo7ceMtuChW5ESTAF+G62WerkNc7YKNoSETHoHsO3DvOCHagkZn3ex41iEnIvaxqYFEVJA5SxI8OeNdy8KkLnbd/GZ7aPqTS/xQGggeyRb6ikvYpoKzgHGE5NEfoiGv/YOgtdbuCX1e6qGVkr1U7wnbjMxMQmazgiFgskq6App/FZ73MAJMMjdXsDXl7MO9XuU1jAGTtcYH4vWaOuMrEO4vSEskiTpMX+MyT+co59Ewj0QWsSXy9ThM3RIMkVeg8154s8KCVMNeL8BEVJKMRBIOU9jj2cxqhXNq8Dvs+SJWn7yhdzlBuERgoHtPMPR8r4eJwoYcdtwwIbQM2mMVSOqTxN4V9jp8JOLrGkid5KzEhvcIVcN7hBYeaRhzMSlQd0KDnqS3kWzdVmSfNZyxySUFsnQMo9K17UpX6iwdb7RyibMv9z9q/IXXYqp8B6DxiknZg92beaZl7nm+bnhAF34QsKEzx1AYpICvPKPP6tvn9W2V3ghlpCHQykiB3ssQy2y1cMrXJPvCIvlGSLLgCWIorMxziBy0LMBDmk4RflBGk2Wx2k+VtW7WJM/Y5Ntf59hdukTbroKQLWcLeQ/YYTyFL7CCF5iT3MsIE6c/oMSu2UKhx+yH4xix5yo5gazz3aAfSxdEOBX4LGq2DImIMfm90shyJA9iD2s+2wgV5OxqNix9YM6n8Ri2GaEeySZbD8hl/meVbMRqWQuFa9bTJoI1CQYOlQDLUZMEkgeu8WUPU5QKJh5zNiYDTOP1nhqAkE+hZkOPV4O+MPuUkxLEl8/uipPasmfZsHF4VB6XH05Ozltcwq2nge+vZFfgqZumoe+O0fZey5Jny1Y9Tt3tfV5QiEFW5XJ3frcunNCVtzmoSGGt+PurZDTVsNnxCmP4dLdhecGuk+5gbPlzGXqTsw7RZLyGWb6GPSGW4X38Da+ngukt5VrjDak/uCEOfbd83MP0SoF2smZpUJdlMCKo8ai2qqF6TgrDXhYzexJVqLecB9Mp+fLJOTaL/jx7LWXyWrNB3Yb68y3LwY+GHOi8LMPXOAcNpgbcCityOOyyjF9GV87qywenjs5AIqchWVIxaDoShaiRZAxclvlt+JzPw9sywFBOLmltrIfHimYqTPgogZxKJ00GC5dROuAsZQJtY3sz80xfZivcBGVv0C4j6d8e63jqrtfx3VbXkpLCkPSTKiMe3zGyksiQU5OsXfucA6aEjBBr7RNEP2DYPoimbC1gu86/fkqAQPCanHP22D99g1AHZ49GD77+7xPGCihdNKQQpYBeOTb90PVhRUdnGvzKyHmxEDrxmnUGNjgtS0kIHIGwcgIhMZDdNSlxFOMnfBhbIOBptuDnoA3xdBmv83Tox/MwXaN1WME6LHwsULCd4PhKqSZbC8e4ZqsTFnzleR3C2BcMmXOSGO8g3XKBk1UeL34LyDNSh9tBJ+ZSW+gGa09/zElC9qtCORQsc7YYGBw603E4BQoHZS2DGPocZw4zKX2yb0U7YL/aktPR0Drw9LeC7RjDpeICgDzqa6dawkfjEjx19yDuXJCCOAj71Z3GfrN5vl4DN0zIzXTBUuUs/udw/LV63KJfiiz21iRJ2EGehm66X+I+sc4U9BfZPrGDHdc3t7FZ8SuX8fOesOd6faw7N1gYrLwWnq37zNlZTde5coLzcbLa5nDSaF/bdi4EumBLHIJCG/kRQvjA8tgE4BO3bA2DGboh9UfDgCScWtcZ2AfSJLYNNn7IOpMplm6dh0OescQYiZysodbAgSi82lBBSk26K6w5Y3KUH+y4a1KRD5QVgmOmhtN21zGTbJjW4JJcPJYyOdAVYJu/PN6ickQNzYvCa/kXbOUWr5LYsGuYvijczKou+HzBFI4wnZT5zfbv3HiN015p6crKCt+PH2HRtcmB5OMnJCpv6VGTMhVO/xOSa6ms4nMo+p6f6olCUZ+1qXWA90sfeKhXMulo+KD3n2CMUOUKZGnJcR6L5Fivifo1pBYNOURsYTdSUz8bScBxul6GKHNRDUygVKQSpMUXZfKwSwBNjYavrSRgo4cCc1kNqVnhsDE8wMBALgWWcWKbLzFx409isLOSOqQNnwUlLrEVBuNfAmwi+FAs1UFSLYwH1G5KT9dsM8nivuJbgBZHxp8r58vtmboDqInlpI/hBulK2snwLgPVs5yUItmATeR4GsznFxqsKxjCUHRDKYDdVkUQxsg4jjVocMDJB1DCA6C/PKO/ExCZcmlykLuh0NINvpX80n2mASpLe/QYyjLf5uN8wtgH1HJytj1toQ7rpHhQDoAo/qH0SbeINuhoBl1VNRATSBVih5ccRYduf81/oF/D1EWseDQlpKHCSg1Me7nAyC4hl5ErpzWqdpQS1ysdluGf7ag8HGO3HAUaL3wJfoXu+u5iOoaJPjU4CbLM/gRsakIYLHoVzV926EL6AT5hccv8KbxCPiFnQgJNM10tZlAf1LIRqUq/LOrSU8j4HdxeICVMUoE7Oh+gSUh8rLLn7YbgnSM366DtL+DDPiyJyxpcXthPKOf7VrLWntbu0GBMq1u+MimxN09hxAWySEsKoofjvYn5Mg0TzpqeMAmQb/Ml2byEjZRmgsbgqVJZCQ2OnbuHw75fhuVrvM6BfwOoILSktMJT7PSjaeDR7Nuu/W59DGVLMwXiWXzGvOIG9yhjKZZt7JDiqoEGMRGa/+MA+/H9PRyPAt00nhhgEVfbXzMiFR9NoDTJitGkgdOHExx9NF0iwLfByzJ019DtAAwKmp3RgL+AX2fB3YPwEcudcuC3brndL0/6oSA0sPNksTI290vIH5FVn51fWkpBVyrk56UXZfO5YuWLP5U7gnVNSjxfrsO9n6PPGixwFP1g7svH0Hc3+A5rUOzLSLGNy/2KLCXgROqaFCVejIoW5kRik8md2H3pGOxlax9v5cTvKlc1rR7GN+QGvV78fV42Pb9g8hy8TBQZ4y7dd2LaD0ioLvAiOcNL9x1YqDYaqGvemVmRY0fL0B3MvNn7af5O9oDBCLsgy+bL0PVmshZXKXjOtKSnzwr1YgZe9tFJ2Q0D+Tbfp37o/wm3xgp1/Gk8Uz+bblJachMwCB3JQKeafkX98xHoXNYVC5J8bCB/HjkE1QKWaWigxbyhVRlIMEGlkQhJEFm2U+H++/g5nvoFNdkq+SU0JLvKI/ZPZxfF+qrJgMmgztPpT0KGDHJlsjNp4GzYuNynsDcJZZ2WHPG1kD/WrGUBeMdyDUqzX8dAYUOWq8k2toENhchrmZ60Xo6sIvXTl6E7RebEcpClJWtucYhVyl3TJ9i1S1qbh+tK7RXh3GGmqsd0lze88ueZqt2cl7JUkTUZ9j+5p6CazDvn1A96OLs8jvN0HE+uRN0bMeb1g8ZeCXT6+K/YgvfhNLJdkWFEWUAyl5EMDX+Zx25k6+4BOOhckA2+5+Apslcpn1NFFpueXyKWJyiAI5OR1K8frpBI0gqYcM/Iaqq/jntESTXbEqDJ/M9DP1ugBSzQHU/e8xqfREVKRkVOljkj24XBzOmpG9H+tYaZgYIkwyZQE/FnDQdGQU4aPsVOEQCAt1qQbZbEFe7Tr8louyE6UJQLUiUR0d1Hmp72lf5rJCsC4a2CfZ/QsKohkyj2bJkefmXJhw8FYNl8C2BNXfQVf72G9LsgGx94DftGjeJO+AvAmiHrrghuNDnc/T/bwWrg0BWVZ4mRoy7Pr5j81IDUVHlS03+1EcUXS74kIBFVnkS05+TfLhlH8fCZyFSmIufHN/teiLekMJIzsyP10Ta0g11TGGjLkEGxrOIN0DQJvoY+dZDrDPSLWCf6DTeptYTTmE4jI/P8IGeVlGekdi1e63u8faaeDzweFzxqsnBkTZi/Yn8bWYZirRQ3tORNItPH3WTtVsnjISn/kPiNz18zDqdqaNSUZIcpBk19nyCcVO6638QDB4OdXSvkycrIZUrFEsSXdegVmvCBC5Vk+dCFHwN6NTMaq51fkPu1wD1RpK2OT0wN6eRJupFDQ5udRALk5IwWTJeRTTqP+vReG7hXdgUkLSpKEHFQzsdUa7rsAVk/DsQFpxScwuSYNkn4kr0zK4Pz91/szFfyGokmTSXtHRoXRjQNe9AkruLkfaIoosCiIXvUwiVSzHkYpHoQgelCX1jjCQXRKtlmashG0FZCHRYXczwmDIx3Dx7GMPDU0lkvXsDABp1N4Ay1dJa74b4t8/d1WFKwUKkjB4g87Fr5ffk0YFqQrtRv8GtPb9lgw9uGkIecMfa406chPfUJ3Aa4BeRQhce1Ac4yJHyBdNZA+5+cfwixU/cMBEL6S9lwnXblq5cIhZyWro1uF/i4j/2q236+4AGslRyvyDNSg8/hQqsg9VRkyzMjSUQO/OHWG6BKQkCekRIoDlUafoW4BeCy58KGG809xa9QKmLlGcledfhWcHOrHETYSg5v5BnJ4Qyw40cCisx5RjajZbPrmbZgA0MPe253w/01BPYwUFpS5IwhtOWCkAfEOeiGzDOCTQObWkXnh/8kKGlKw1i/VzlQ7EDhMvwa/jwzFYQ+NN0ti70/clg7zgWHlcxxiGaKLZB1lLFD5cUj6Rbvaei8PmXykCjlrlXTx49RZQEYeaM1OeK0wbyWKlOgFa5z+qs8d+M0Th/nYNvLIViiW9vnoR/jAL6F+rTNyHMnQ5Q7E5u28H0pb4xdkbq4y3Ceb0P0hbVAjat9yaSmS1AGNk3sLgGZXRHnGb15QV6YjxEMzMYiQDCZ4PGnoEG7/hpPJwRrAYxdA1O/ajq9L6F6bttCDvHwkienvRy0s7ldr4AfgZR70Dkpr2FxsWUj12xJf00GSMZVAZ8SBmDoj+py6o5D15/HaTuX5mVV7MP9SZa/apIsbKE3nwTTuI3zvlLScFhevcV1Y3SJm5U0CVLhd5tmRA6HLBTRZeBVPy+wX9TyjlRNDtx5rDSHXtZw3M6jam/lVtMf+3oV0wud77fAM7MBNnflLYoauhi3Sv9Z4eFuWTpUd5MFvoacw3dygrj4MyAT07vJBjVeb+N0vG2szM/u+hkMEchaVEN34TbsuM3QgE2IosuuK94LDwbQKGUV3y3sFO518BFp1i/dor1wKYNpOrqztqKmCacgeNrQYX1gk1yjR7YnbNb0LV7H/t6dDqk2cduCvs7DqpAu527gqb5EDXyUkqRPB4jJ3kANuPxj+A8GIHKxt6Qks4mRTxjIVLKK0tLdhRXHUTYTw/zQAXfMCffynbSErgv3nxpyLs5d2db1QmZXITfvipQwsphbXLadqrelm66bxmckzohSNeyRvV6ij+5XfrcVKdRswbY59xfvQDXwFkq6fbLCby4Yr+DbGtTc9t39I2sLSuFlK1l1dCq4gtriR7KrC2Z5eUZqKLis8hAWKWrQRC/p0G0T9n+b+z82QBiRJNFAzp7RvYYH7t25VuPraqQ/osroEu8GfB5uXThGAMQrldENng0x5ZEDzOmGnLlZhnWeJBm+6BJGQGl2a3RrwDSwkWDj5YcyL7vOmjkuw23N4H90hAE+fePiRDq2uS1/Io6+Bvezmj477ld8ujqHIiv7BXyNpBUOeLTRYdfX/At5mXIJ1HQsbGD6w5oEHYJPVFWgIbPjN59/DY96UFAHghF2mv66QoYc70hrvpKU9IatX40fn1jolVuT9nNNzohCaU9a1n4KvWEba+ZiCRcgmJ2n+7sGLDxqtQJTePK2Zvx2Clk+qtRjPNlFNJpdDPNpOMROGyUEF5qt/c+mEHodbqfRCG0ETJdCpi8VKQxiIFfnjhitkmj8Ywxr8iBUwYZRgVZLIfNcP33X1PZtNGzEM8+3gwspD9fPTpcV0uDkE2QXoZFz9nX592C8FA8U/rcPmgctMEO8k7b29i/aDRzo3A8n5t6mqaRX6/0W1lFlAaNmOSkGx2LA7tcA3ZctgM7fwb4MjZmc7QjfcbazgPab48fUpa/RkHoly306LvP1audH4cjDYxQac2TAZybbVgqjl1oOun0NgJIfwn3qx0VIc2FKJ/t87Jd/nzYlLuwYykfMDvLcp1VgahXiDMJGEEJky9LhlJVq8YRwpku68d9L44vfrP72cp9O43m8xW1JrcFgiAxv7pPXJ0m+IpnjsBOs9wka0ggo3xTbiTWAN/Sor+WG17LVpMQoTwkEG8V/4wbpICQ6sZIkB7oVa5pjUcPUsAAyTcbujRvYubtcoi4hlDV0RsplesTb8XOcPp4OXsFYEVuP37CfYdYwb8VWdq2wux33GS3pIFSKUQW0izJSluKJbLxqSnCrzd15WfN75n0azbcT9OGAfk1TRO7T/fKxdFiLrUHLISP3nmv3PpxNeyAwKtcw/l+TFG6D9rIaAJVeRXZWr9003sb/DJZQFwy+KwVWXqy4qAM9dlM/htqXqoQRF0VO5TvM/tmdwow+q0d8PXZTZNKOGRDoOXH70oq6ecX9xxjWvMSXWTaZZBv8YzfNk/Hg/QFeLgoy+TbwImgyoMEgIahcabJfLGADMPDU5OIaU9nv76ehP3S3Q9DcqypQziO7kluv4JBQGwHXDKVbl2vm5MmyzfdELkO59OspSXHLDQsDp0ZDydLFSIplWm2YwSnaZtDMI9lQG9Rp/oiq9i1YeNS+41qTagobMpZqQRiSHci9DsdlMNUJQ4sM5uNkhK1LMg3aAANilSSu8zeWOMhhYJecZLwOQzjkA9IqZF/GWcvez+cu3FbgcG3JwHQTNYLiIJRG/rJVgx1gYXG1kuThlpTT3aDcGD5q1AcEL+josPZFFn9TTR1QFGQlfaAQvKwXscKs2yUCLw3JvSO/Mic7hc+0ls+U3PQcUiwRKzvw9IpG+doGxJhYndXrSjQ6PIwqgmoObHklKe6zgT7DLMHcWpGj61fTmgqnGCsQ1s0d60/njS8x+aOpyPwYLNmquA7L2J3G/wyvdIAUTG2onJx/8Nj9waS4oec6VN5Jdo+HfC7ao0DsVzVs8OaQqR6JjAzYtNpfQQz/BiIdeAho0HRij+JVOe1fx2XobsP2f3ArK2ErY2PDDfV8vKTk93VWwVQPGyBtoKG4dIAMgz3kcLdFZmaOYSaE3i4tPD9OBd6pLdmzfXKd1BwRzPuQcowB/IvhKpj4IQvxIfrPM1awMEnKcXCVV6NW8KbJBn8I/3ziCiK2lpTtDuF/GLyCj4ykaDy5RGrSCL60fdvNrjEsmKUjhxmC6/w4NQVzdaT1T3CN58NTMO9F9nIC8FczVNAIIRsTATwzSiXlHzM6ZA4vE43DZTJtzjOy8RkA/zSqBZwicoQ6fYnUxFYO6HQgtaL/2CCCp0MSDiz4S55VBoOCbK0SgM2zWEntYd0HJppytlhtwQ3qaf74CIzAtVKwAkl5WAEqR89SSs9KwbMmqY5wgUj8Wil4zCSzyWCOx+Gw/kPIPWDIoSQ7DPZ1YTcTI4A9OLHZJfRz6WhiAzMP7plZirShVzlZ6bfAQfELmNdKe21WkmFiQSWzO7hXGA7KSdUnC+vVwsMGfiUPv5ZO8mPQwIdH3GtL16/8N5/8eDJkmbEL/XYLGMkZuM+xtucb0PqfoCQrX4ogWdD1hNv90iUqHdIJgq5q3e6XxFCZ3HRaV9xiBRQ2UMOFXs7R4VFLcgGru78i2pG8cNYApPD4rO12v2wsZdt+i7fJWkqntE7Bo93zlkKLwUqOrLck6XlFsneZGEsEuT4+t7zdU54LYDHY0lWk2/1yOXX4nuUgdktqwW1Irx1PahkjtHRh5JZyTAUnwpYtcEUcr1wqBpSO+1G6dnBZOF3y0ta4qtKJsHobUtXknqCr/DAKG6SstxQqIKlSHlVasW2az/GctGACmkPr+GI5u+Q+x3PCfgmEOHL2zP+83/r5e3r7Y81wsV0DdYqGHLq8jsEgMcwwq5I9PMaPqQuyFPkStn/2YAq4Smhr10jjra4r5Sqitgtj/pYn4rWkAOp2P2tDAG9K7m6aFd+5jqdhur10m5QxXENyM8MBJQW2fzr3Sm4Nu9jMZPM0DP01xa6Qhzn9HBMl5ULS/fwgpspKLzTt3Ih0y3589jJv49QHuYaCEpbK2eqPRXQJ1/u8/Ps+BD0xkB5SOTng4aBXltBwTd8zGOCxJSUETg0QgZqRykkOXAC8DZcGuKDAzvIDLG58xOSyiVKwR4yDC1m7eQEOYvt+6eRvCwkCS2CYj7+GiCSvWthSan+eNezWaTYTzOJymamqho29VqD7NP77HtJ3WjgQybcRdQFzKIA4Cc6ysGd52dj9qvR/5LZ3rcjhVTs6dpoT6nhy/2LdSyzeubscQvpRA77SJcmBRcBwFEGuBL37FnHNy5JxydbJNqw4VlNlBV1NdqvbXGp/H0/3fggmx+WGocih3A3v3F1Sji1A2CNZqg9A44eyBtHBt1RAF4quJD1w15FDZLE0oLHJHs4OMmw3A7eO9Ef0YNFThAFDthOwopnhlWDoAh4ea/pslRXDfRKqEoq1ZNnA4gOmkaaSSrE18Lg3k8uad0laSVqc+DMrpLKXaR3ugTuN4SQjiBMpUiH2eum+p8EkCg+9DttUCNrJIH3Eku4MOoENHSk2X92k1kMPVyDzlW42Xisvf6XZlH0lH30Pb65Lh1wyUG8q2Z0ixAxkS8APsCRF/z1okuhn7N0BlEw3bgGtuQYdAxZjCeYNQVCm9Xqpymuse2lq/YgHGrbJYa5n/ko39SaVTnCvMhClpl+aiZW6oEEAtmqs58mKdZrny1t3/BXfXykzw5r9hA2ms8TsDLsCs01JH931KO+XZ+o6INCn/KQquyHe8FnWku1FN4ojplELQ27kBmVQgmEQEEfL+JdwG4+HU/cn8Phs5SavNKlmaOG2gb5jdzqtLaUgGIB5YcWSFS2yndhJG7MI4OKhns+GG+sVVtGkL6O2Htw1NLAUW+BdMYffppgSvi6YhWFj3xVvnKz8cqrTCmMwrB3Whmvky4OTHm6S39hv49GoHK7L9NkwEFAQM7aIsmKbKM6I2I+TXQ/X43wJwgrwp6KDxBU+CuvKHJas3vOy7B2mh05ghFizsh4IPC9OSfOp8QCwyEp2tOXJVVIy5ZB4lWyH6uUFkr9HA5fZs2SeLpSihUE3luZtQI3LNzobyr28IlW+4/HKAnoOf9kmglcVsXXl3IWGpRNYKJ1lXOtEOFXm4hKVKS++QN+Y6eZiHAI2AXQX6dbPKBegMxDfbdmRkNsQZJZZBlUuNkW/zUHJPAdyH5u33ebQQUqVcAyrhwIEWynbMKOtuARXXUXHbcs4fXRTb/7lMx8J2cVQdBl+Rf6KbUmA9+DnaRQpurnZD92X7nR4H6cPk3iN0+3QnT7mZbx9olVaCfuaYivQ6Usk60nwLtlC9BP82BCshG6WYgvSHt9Y9iVqiGUBsGwp2cJiaamWmUfLTujc3/4JJmrAfN51SEsn/aZYhblt6CdsKeXyeFYNuw4cliPlrr7AXTRUCEREliexWY0Hgy8yo63Y4p9DOmxcjkM/vI9m5jRs78v4lGYne/BNNe5gqP+Hc/dPIEvSQNG3Yj+EED0xxKgasJWs2G/AQW8PJXgScsmysyAOcHUE3ugjsAok5yynv4MV9GrC1dTvXkPZtmRr6d/j++2wOuwEiswltPFJ7bnrn7PRBzokWkgViJLmpAjt9c/1Npw3eY+QJaMlJyAnR/RDwBQdTCYqNBluxU2yecBost2F56f+I0zwNKOJxxvoNvwfQUJvNyONpW4dNHIrmTY35PcSr5YcpGUc1aF0U2Cl/y+tjV9ZF/jtUkHRXsPEIxm0b0jma3z741LngFtagI5IRqbPG3AsCQrRcqW80KmL03Xti1A1/fLMpbBVU8HUIVlCskDbFgXrQQptsq/o+iuYSa1ke7choz+nBY91QAlEZhwvROVhvKMgBXwdXkpcvpZiBqxHkgW0k3XHIXRsgIZZS1awQpZYIT/JklRxMCCHtz+34Xow/UbAk0atbDN5xTMcj+shNQ1cSD5qSSo0G8x+ON0Cmz2gbzdkDGSqAnF6CmwClgidLjtriaUeXKJaP+hgnjPmSWO1z/cbb+HekkOz9j6i5EyDbLtmRRhvY8CZbiroS3rGo9eSUzkZfNxmUyR+NsugYZCJVHm5zb8CmYEG7MUr721Ye+XphqxYvZwdAKl1sl+xAg6/1+7HwRhSL2M/hMAw28wemvN86qZpTiiMKbCDMcmTe2lkgLdib1rC42m8/VmG7hpG9SB1Qi6zeT65ZxvcLzht+KQxJymIBtg+4wAXnmzulzE5NWNwozoNVMhUTrLguXEh0O5jj/l5myFZ5eYCGyggBrI3eguOZ7mYmsLXGMl2mHnbw+F96G4B972toP/EPkcj0J4Q0tVyIj53QvMsv/m2jB8feOiXsmrckDOWtl6D/ekG1GJITTSH1AfbO/T2t39buBKkP29a59SlPDVZNb5rnXlucuaFbJWXEM29NH9OdoP8rR7W2nvA/5K+PKRcxu3PJTiNoORYeh0kz9D1nlS6dOV0XZJJ3X3qzm/jx32+X12daLwcL924hHJ8Gsz/yKm0J6rsNahcZ2ToJsC66y3dHJQlKDL/FrCrT20s/itJNhXZHbtv9TY/hhqZ+cp02Y/okBGQT8LXwHNNoTFkl4MmpP/b88RedjLZYW6PNob3Jh+mMdrZB5eYhJHqn4q1SbdWJYejcQo3NgdB6RrUEFgdLg9qj3kX+gTxCdwwWyVy2Ofh/BZwGZSCTbYki80O0R7Mf5KkAzB1Vxmp82+h3SdqCnBYwwSDAtaz1aK+b2T94IUBEY4tEljE832LI1NbSl2CSx1JZLDACbcmSOIUaSjr4bY3Fe0lSoMFe03WNZxfT9y6gWKeLkmxzPt0DrXswXi9JkPl+3Tpjr+CRFoOz5UkR+w+OQuafjwPU1ShzkFnsiEL//dLSHTQWQtz6exnsgIdUkZMQL5UOSm+vQG+NHiqIIgiq7QbbgoPtofGBU8uUS5I6hngR+evqmGmit7fItCkMRVwLkgO8rN6NViMsBw1C7blMVj+hqOSLDJauMRBWcNBSWpfBOR0jRMXNhhVmZsFV1ZNdQ1Bc/+Tq0mwFbD7dVhMVP0RKKuWMsDzDqmqrHzPtfY/NZn/yf89N/upKifVpjxRUlV+orXynh6+nKIql2ioxwxs5R0/qsr/PTfyaDTW3E+uO6Aqfwe1p67UvmNc+zvwM0iqdtV0VXvaS+2vW9f+X5C0F/NoE/rIpZwe83U6Vbpk0oRE/nkq/5P/ez7VqjL/dLxnUKX9T/73qnwyXRX+ifkFVVX+73lz6Kr2b6/xeO3jGfvnlPmfXLKnan8Hdf54xt7Ct/RP21+3rv2/IEut96vh/0/33/1wnpEDC22XhmR23W9r/elgScRBGKkzoNSTFCOLmYYswZZZkXUiK8LovM2soCfuslCYLZyZsi7Issx6iVhrECzOa7J3smLF/T0tNRZzckwmKkErDRYnpZeLfOTtqvakIT8crUlftgRxFyZ5NSuX9DVM/RxkEeAarjVZM/4alvH9z2GVr984NqGOM8z+alLmwsI+cpTrfLrH44TgE8ZaM2/Yz+9YgX6GLsgMbYP1oXryhiHv8XY1rmdSkPFxgmwhm3RuYy3cAVyU9oMr3O5WuG29cOdW4ba7wu2yhdvmCzcUWrjtvnBq16Xbzhu/0ypvjN74MZ+q8WPw5BiRU0IPGEbi8VVkUh5oqv8xguhTwH5RILuw7w4lbrKuLYmNpMKlE2y3488BIMgfkF/peB1NjbK73g6GIBCUKSUh19u+aJJIbbEjWFWCu5siG1zf3Rg0KyHkbNw61S2ZZRnA93np3uYlEq6WN/hfgfVDNMsEZPqWLBhY3OF3+MvnINdIphTfw9vhsgx2jCIoFoFMQEE2MgLEFN1TwUR+0XJ72ffwth3sKWcfVYNsaEm2HSPMVOIHiqEleQB/D29OsHx8f0dAaAqW5FaOgKn7BEIHG+Z9D29+Y3JDjYm8GmYDSlKMWGJbY4QEMqTVJM/oe3g7Hy/9eD2aXnE4Lwnvi6xwBYiJ59soSGhJAuz38CZNlWJBQIUeIAV57CVxE3eNBiYF2Vb7Ht4u3ccwTmZIN4pNFHTiC7L7HGGm7hbIAwVZnBXzuGiOFKwLmB0lw8ttLHcYpkhrvVFQayLPV8BzQtEBLnzHZEoJuNGW04B1W0lyGyPM1FcB0k8lSTkH5CQqfGtkudWgrrIt2BWVkb/ylRFFVoY9aOBtAgU8ssnpsYJaGYz+12TSv4KhcAVkU3LuTymyt/c9vBlOWXJh1pD2lWTmGyCmDq4W2/Xkhj0vv95P8/cLB/Zc9joKcs7A4I7Tx2Ezegz9msC/RBdkU9JixgalNYwAF6S0btLsQOc4z77925ysU3/Pywn5Owo67yXZLV1xQp1aBTYMJTmb9r2MURSucsiLW7LFbqACMQQp/knKIawor+w3ZAjKrrYVczl+jl9YsJKHAGtBt4KtZIKhj4QSwfmBTYgM4HMHj1zGFgWbcRjMn707ctkhoXMPg206gmHJWg6S1mxkvIKF3uFmLBGVgqU2TUPSPVfs8BXV0gWqZbKi//n7r8t4MV3z4a//83//5//9v/8PwhlNAg==";
\ No newline at end of file
+window.searchData = "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N730i0nXQulaj8orn0sWk66F0rUelVc+lywmXQula6V0edNLv5h0LZSuldLlTS/9YtK1ULpWSpc3W68vJl0LpWuldHnTgL6YdC2UrpXS5U3z+GLStVC6VkqXN9t7LyZdC6VrpXR50zy+mHQtlK6V0uVNz/Vi0rVQulZKF18EtphzLXSulc7lzV7WiznXQudax6yG8T0wF2Ouhcy1RsW1OXAYcy1krpXM5c1+2Isx10LmWslc3rR+L8ZcC5lrJXN5sx/2Ysy1kLlWMpc3bduLMddC5lq5gMub/sTFnGuhc610Lm/aAhdzroXOtdK5vGkLXMy5FjrXSufypi1wMeda6FwrncubtsDFnGuhc610Lm/aAhdzroXOtdK5vGk+W8y5FjrXSufypm9sMeda6FwrF3B50ze2GHQthK6VC7i8aflajLoWUtdK6vKm5Wsx6lpIXSupy5uWr8WoayF1raQub1q+FqOuhdS1krq8aflajLoWUtdK6vKmW2sx6lpIXSupy5turcWoayF1raQub1qTFqOuhdS1krq86SpajLoWUtfKVVzedBUtZl0LrWuldXnThrOYdS20rpXW5U0bzmLWtdC6VlqXN9vqLoZdC7FrJXZ5syPuYti1ELtWYpc3u9kuhl0LsWsldnmzm+1i2LUQu1Zilze72S6GXQuxayV2eYNdi2HXQuxaiV3eYNdi2LUQu1au5Zr8PSiLWddC61ppXd7siLuYdS20rnXcqltUthh1LaSuZbnykO+puZh0LZSuldLlzc68i0nXQulaKV3998viitK1Urr675fFFaVrHbVqv18GXQuhax20ar8a5lwLnWsds2q/GsZcC5lrJXN5szXvYsy1kLnWqrA2cxpjroXMtZK5vNmJdjHmWshc65DVyy01/2pYWlG51hGrlztqXoOFFZFrrQprM7cy5FqIXOuAVf/9sqyica0yrmYP2MWMa6FxrTKuZtPUxYxroXGtNC5vNk1dzLgWGtcq42oaxhYzroXGtcq4moaxxYxroXGtNC5vmqwWM66FxrXSuLzpBVrMuBYa1yrjavp4FjOuhca1yriaPp7FjGuhca0yrqYHZzHjWmhcq4yr6cFZzLgWGtcq42o6GhYzroXGtcq4mo6GxYxroXGtMq6mo2Ex41poXKuMq+loWMy4FhrXKuNqOhoWM66FxrXKuJqOhsWMa6FxrTKu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";
\ No newline at end of file
diff --git a/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html b/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html
index 4e06f1f10..97a9234de 100644
--- a/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html
+++ b/docs/api/classes/application_JavaScriptArtifactGraphAccumulator.JavaScriptArtifactGraphAccumulator.html
@@ -50,7 +50,7 @@
add Edge
-addEdge ( input : unknown , ) : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; }
+addEdge ( input : unknown , ) : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; }
@@ -58,14 +58,14 @@
Parameters
-Returns { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; }
+Returns { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; }
add Node
-addNode ( input : unknown , ) : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
+addNode ( input : unknown , ) : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
@@ -73,29 +73,29 @@
Parameters
-Returns { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
+Returns { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
edges
-edges () : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
+edges () : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
-
Returns readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
+Returns readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
nodes
-nodes () : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
+nodes () : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
-
Returns readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
+Returns readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
diff --git a/docs/api/classes/application_PermissionAuthority.PermissionPathError.html b/docs/api/classes/application_PermissionAuthority.PermissionPathError.html
index 0e9d17f91..f29bed7fc 100644
--- a/docs/api/classes/application_PermissionAuthority.PermissionPathError.html
+++ b/docs/api/classes/application_PermissionAuthority.PermissionPathError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/classes/application_ProcessCaptureError.ProcessCaptureError.html b/docs/api/classes/application_ProcessCaptureError.ProcessCaptureError.html
index baea2ddd6..834244986 100644
--- a/docs/api/classes/application_ProcessCaptureError.ProcessCaptureError.html
+++ b/docs/api/classes/application_ProcessCaptureError.ProcessCaptureError.html
@@ -14,7 +14,7 @@
-
+
AnalysisError
diff --git a/docs/api/classes/application_ProjectPermissionStore.ProjectPermissionStoreError.html b/docs/api/classes/application_ProjectPermissionStore.ProjectPermissionStoreError.html
index 1cd36b65f..c6cc3c57a 100644
--- a/docs/api/classes/application_ProjectPermissionStore.ProjectPermissionStoreError.html
+++ b/docs/api/classes/application_ProjectPermissionStore.ProjectPermissionStoreError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/classes/domain_permissionPolicy.PermissionGrantError.html b/docs/api/classes/domain_permissionPolicy.PermissionGrantError.html
index bd597a941..0f95d09d0 100644
--- a/docs/api/classes/domain_permissionPolicy.PermissionGrantError.html
+++ b/docs/api/classes/domain_permissionPolicy.PermissionGrantError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/classes/ghidra_GhidraLauncher.GhidraLaunchError.html b/docs/api/classes/ghidra_GhidraLauncher.GhidraLaunchError.html
index 5a7d86805..7654df9d9 100644
--- a/docs/api/classes/ghidra_GhidraLauncher.GhidraLaunchError.html
+++ b/docs/api/classes/ghidra_GhidraLauncher.GhidraLaunchError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/classes/ghidra_GhidraSessionError.GhidraSessionError.html b/docs/api/classes/ghidra_GhidraSessionError.GhidraSessionError.html
index 4f3cc346a..bf8c72c17 100644
--- a/docs/api/classes/ghidra_GhidraSessionError.GhidraSessionError.html
+++ b/docs/api/classes/ghidra_GhidraSessionError.GhidraSessionError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/classes/ghidra_protocol.GhidraRemoteError.html b/docs/api/classes/ghidra_protocol.GhidraRemoteError.html
index 681fef5c0..1f0d79c4d 100644
--- a/docs/api/classes/ghidra_protocol.GhidraRemoteError.html
+++ b/docs/api/classes/ghidra_protocol.GhidraRemoteError.html
@@ -14,7 +14,7 @@
-
+
Hierarchy
Error
diff --git a/docs/api/functions/application_CapabilityInventory.buildCapabilityInventory.html b/docs/api/functions/application_CapabilityInventory.buildCapabilityInventory.html
index 0cff0b1a5..abead1003 100644
--- a/docs/api/functions/application_CapabilityInventory.buildCapabilityInventory.html
+++ b/docs/api/functions/application_CapabilityInventory.buildCapabilityInventory.html
@@ -14,7 +14,7 @@
-buildCapabilityInventory ( sessionStatus : JSONType , policy : { browserObservationEnabled ?: boolean ; electronObservationEnabled ?: boolean ; evidenceFileRoots : number ; processCaptureEnabled : boolean ; } , ) : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; available : boolean ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" ; reason : ToolAvailabilityReason ; remediation : string | null ; surface : ToolKind ; } []
+buildCapabilityInventory ( sessionStatus : JSONType , policy : { browserObservationEnabled ?: boolean ; electronObservationEnabled ?: boolean ; evidenceFileRoots : number ; processCaptureEnabled : boolean ; } , ) : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; available : boolean ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" | "trace_application_feature" | "compare_application_versions" ; reason : ToolAvailabilityReason ; remediation : string | null ; surface : ToolKind ; } []
@@ -23,7 +23,7 @@
sessionStatus : JSONType
policy : { browserObservationEnabled ?: boolean ; electronObservationEnabled ?: boolean ; evidenceFileRoots : number ; processCaptureEnabled : boolean ; }
-Returns { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; available : boolean ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" ; reason : ToolAvailabilityReason ; remediation : string | null ; surface : ToolKind ; } []
+Returns { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; available : boolean ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" | "trace_application_feature" | "compare_application_versions" ; reason : ToolAvailabilityReason ; remediation : string | null ; surface : ToolKind ; } []
Returns | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
diff --git a/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseApplicationGraphEvidence.html b/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseApplicationGraphEvidence.html
new file mode 100644
index 000000000..0d9a6a9e9
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseApplicationGraphEvidence.html
@@ -0,0 +1,44 @@
+parseApplicationGraphEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function parseApplicationGraphEvidence
+
+
+
+
+
+
+
+
+
+Defined in src/application/JavaScriptApplicationEvidenceGraph.ts:23
+
+
diff --git a/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseNativeApplicationEvidence.html b/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseNativeApplicationEvidence.html
new file mode 100644
index 000000000..6698156c5
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationEvidenceGraph.parseNativeApplicationEvidence.html
@@ -0,0 +1,44 @@
+parseNativeApplicationEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function parseNativeApplicationEvidence
+
+
+
+parseNativeApplicationEvidence ( inputs : readonly unknown [] , ) : (
| { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } )
[]
+
+
+
+
Parameters
+
+inputs : readonly unknown []
+
Returns ( | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } )[]
+
+Defined in src/application/JavaScriptApplicationEvidenceGraph.ts:131
+
+
diff --git a/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationFeatureTraceEvidence.html b/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationFeatureTraceEvidence.html
new file mode 100644
index 000000000..a671b8051
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationFeatureTraceEvidence.html
@@ -0,0 +1,45 @@
+createApplicationFeatureTraceEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function createApplicationFeatureTraceEvidence
+
+
+
+createApplicationFeatureTraceEvidence ( parameters : Readonly < Record < string , JSONType > > , result : { coverage : { frontier_node_ids : string [] ; omitted_edges : number ; omitted_nodes : number ; omitted_paths : number ; omitted_seed_matches : number ; scanned_nodes : number ; source_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; status : "truncated" | "partial" | "complete-within-source" | "no-match" ; total_seed_matches : number ; } ; direction : "incoming" | "outgoing" | "both" ; evidence_links : string [] ; graph : | { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string ; } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...
; line : ...
} ; kind : "source-range" ; source : string ; start : { column : ...
; line : ...
} ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...)
| (...)
; kind : "runtime" ; script_key : (...)
| (...)
; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...)
| (...)
} | { export_path : string ; kind : "package-export" ; package_name : string ; } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string ; } | { available : false ; detail : string ; reason : (...)
| (...)
| (...)
| (...)
| (...)
| (...)
| (...)
; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : ...
; unit : ...
; value : ...
} [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : (...)
| (...)
| (...)
| (...)
| (...)
| (...)
| (...)
; } | { available : true ; value : (...)
| (...)
| (...)
| (...)
| (...)
| (...)
| (...)
; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; } | null ; limitations : string [] ; native_handoffs : { artifact_path : string | null ; artifact_sha256 : string ; evidence_ids : string [] ; export_node_ids : string [] ; native_node_id : string ; providers : { id : string ; name : string ; version : string | null } [] ; recommended_tools : (
| "open_binary" | "binary_overview" | "analyze_function" | "search_procedures" | "xrefs" )
[] ; requested_exports : string [] ; status : "evidence-linked" | "requires-provider-analysis" ; } [] ; paths : { authorities : string [] ; contains_inference : boolean ; edge_ids : string [] ; end_kind : string ; end_node_id : string ; node_ids : string [] ; path_id : string ; start_node_id : string ; } [] ; schema_version : 1 ; seed : { case_sensitive : boolean ; kind : | "string" | "native-export" | "node-id" | "route" | "api" | "channel" | "module" ; match : "exact" | "contains" | null ; value : string ; } ; seed_matches : { basis : "identity" | "label" | "node-id" | "property" ; field : string ; kind : string ; node_id : string ; } [] ; source_evidence_id : string ; source_graph_id : string ; summary : { inferred_facts : number ; matched_seeds : number ; native_handoffs : number ; observed_facts : number ; terminal_paths : number ; traced_edges : number ; traced_nodes : number ; unavailable_facts : number ; unknown_facts : number ; } ; trace_id : string ; } , ) : | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
+
+
+
+
Parameters
+
+parameters : Readonly < Record < string , JSONType > >
+result : { coverage : { frontier_node_ids : string [] ; omitted_edges : number ; omitted_nodes : number ; omitted_paths : number ; omitted_seed_matches : number ; scanned_nodes : number ; source_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; status : "truncated" | "partial" | "complete-within-source" | "no-match" ; total_seed_matches : number ; } ; direction : "incoming" | "outgoing" | "both" ; evidence_links : string [] ; graph : | { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...; line : ... } ; kind : "source-range" ; source : string ; start : { column : ...; line : ... } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...) | (...); kind : "runtime" ; script_key : (...) | (...); target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...) | (...) } | { export_path : string ; kind : "package-export" ; package_name : string ; } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string ; } | { available : false ; detail : string ; reason : (...) | (...) | (...) | (...) | (...) | (...) | (...); } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : ...; unit : ...; value : ... } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : (...) | (...) | (...) | (...) | (...) | (...) | (...); } | { available : true ; value : (...) | (...) | (...) | (...) | (...) | (...) | (...); } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; } | null ; limitations : string [] ; native_handoffs : { artifact_path : string | null ; artifact_sha256 : string ; evidence_ids : string [] ; export_node_ids : string [] ; native_node_id : string ; providers : { id : string ; name : string ; version : string | null } [] ; recommended_tools : ( | "open_binary" | "binary_overview" | "analyze_function" | "search_procedures" | "xrefs" )[] ; requested_exports : string [] ; status : "evidence-linked" | "requires-provider-analysis" ; } [] ; paths : { authorities : string [] ; contains_inference : boolean ; edge_ids : string [] ; end_kind : string ; end_node_id : string ; node_ids : string [] ; path_id : string ; start_node_id : string ; } [] ; schema_version : 1 ; seed : { case_sensitive : boolean ; kind : | "string" | "native-export" | "node-id" | "route" | "api" | "channel" | "module" ; match : "exact" | "contains" | null ; value : string ; } ; seed_matches : { basis : "identity" | "label" | "node-id" | "property" ; field : string ; kind : string ; node_id : string ; } [] ; source_evidence_id : string ; source_graph_id : string ; summary : { inferred_facts : number ; matched_seeds : number ; native_handoffs : number ; observed_facts : number ; terminal_paths : number ; traced_edges : number ; traced_nodes : number ; unavailable_facts : number ; unknown_facts : number ; } ; trace_id : string ; }
+
Returns | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
+
+Defined in src/application/JavaScriptApplicationWorkflowEvidence.ts:12
+
+
diff --git a/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationVersionComparisonEvidence.html b/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationVersionComparisonEvidence.html
new file mode 100644
index 000000000..190a8000f
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationWorkflowEvidence.createApplicationVersionComparisonEvidence.html
@@ -0,0 +1,45 @@
+createApplicationVersionComparisonEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function createApplicationVersionComparisonEvidence
+
+
+
+createApplicationVersionComparisonEvidence ( parameters : Readonly < Record < string , JSONType > > , result : { comparison_id : string ; coverage : { left_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; omitted_candidate_references : number ; omitted_comparison_items : number ; omitted_graph_edges : number ; omitted_graph_nodes : number ; omitted_graph_observations : number ; right_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; status : "truncated" | "partial" | "complete-within-inputs" ; } ; evidence_links : string [] ; graph : { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string ; } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string ; } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : (...)
| (...)
| (...)
| (...)
| (...)
| (...)
| (...)
; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : ...
; kind : ...
; source : ...
; start : ...
} | { end : ...
; kind : ...
; start : ...
} | { kind : ...
; path : ...
} | { kind : ...
; url : ...
} | { capture_sha256 : ...
; frame_key : ...
; kind : ...
; script_key : ...
; target_key : ...
; } | { address : ...
; kind : ...
; symbol : ...
} | { export_path : ...
; kind : ...
; package_name : ...
} ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; } ; items : { dimensions : (
| "relationships" | "content" | "availability" | "properties" | "location" | "coverage" )
[] ; evidence_links : string [] ; item_id : string ; left_node_id : string | null ; limitations : string [] ; match : { basis : | "none" | "structural-fingerprint" | "exact-node-identity" | "exact-content-digest" | "exact-module-source-digest" | "source-map-identity" | "semantic-key" ; candidate_left_node_ids : string [] ; candidate_right_node_ids : string [] ; confidence : "unknown" | "exact" | "medium" | "high" ; status : "matched" | "unmatched" | "ambiguous" ; } ; node_kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; right_node_id : string | null ; status : "unknown" | "unchanged" | "added" | "removed" | "changed" ; } [] ; left : { evidence_id : string ; graph_id : string ; root_artifact_sha256 : string ; } ; limitations : string [] ; matching : { ambiguous : number ; exact_content_digest : number ; exact_module_source_digest : number ; exact_node_identity : number ; semantic_key : number ; source_map_identity : number ; structural_fingerprint : number ; unmatched : number ; } ; right : { evidence_id : string ; graph_id : string ; root_artifact_sha256 : string ; } ; schema_version : 1 ; summary : { added : number ; changed : number ; removed : number ; unchanged : number ; unknown : number ; } ; } , ) : | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
+
+
+
+
Parameters
+
+parameters : Readonly < Record < string , JSONType > >
+result : { comparison_id : string ; coverage : { left_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; omitted_candidate_references : number ; omitted_comparison_items : number ; omitted_graph_edges : number ; omitted_graph_nodes : number ; omitted_graph_observations : number ; right_graph_status : "unknown" | "unavailable" | "complete" | "partial" ; status : "truncated" | "partial" | "complete-within-inputs" ; } ; evidence_links : string [] ; graph : { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : (...) | (...) | (...) | (...) | (...) | (...) | (...); value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : ...; kind : ...; source : ...; start : ... } | { end : ...; kind : ...; start : ... } | { kind : ...; path : ... } | { kind : ...; url : ... } | { capture_sha256 : ...; frame_key : ...; kind : ...; script_key : ...; target_key : ...; } | { address : ...; kind : ...; symbol : ... } | { export_path : ...; kind : ...; package_name : ... } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; } ; items : { dimensions : ( | "relationships" | "content" | "availability" | "properties" | "location" | "coverage" )[] ; evidence_links : string [] ; item_id : string ; left_node_id : string | null ; limitations : string [] ; match : { basis : | "none" | "structural-fingerprint" | "exact-node-identity" | "exact-content-digest" | "exact-module-source-digest" | "source-map-identity" | "semantic-key" ; candidate_left_node_ids : string [] ; candidate_right_node_ids : string [] ; confidence : "unknown" | "exact" | "medium" | "high" ; status : "matched" | "unmatched" | "ambiguous" ; } ; node_kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; right_node_id : string | null ; status : "unknown" | "unchanged" | "added" | "removed" | "changed" ; } [] ; left : { evidence_id : string ; graph_id : string ; root_artifact_sha256 : string ; } ; limitations : string [] ; matching : { ambiguous : number ; exact_content_digest : number ; exact_module_source_digest : number ; exact_node_identity : number ; semantic_key : number ; source_map_identity : number ; structural_fingerprint : number ; unmatched : number ; } ; right : { evidence_id : string ; graph_id : string ; root_artifact_sha256 : string ; } ; schema_version : 1 ; summary : { added : number ; changed : number ; removed : number ; unchanged : number ; unknown : number ; } ; }
+
Returns | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
+
+Defined in src/application/JavaScriptApplicationWorkflowEvidence.ts:30
+
+
diff --git a/docs/api/functions/application_JavaScriptApplicationWorkflowService.compareApplicationVersionsEvidence.html b/docs/api/functions/application_JavaScriptApplicationWorkflowService.compareApplicationVersionsEvidence.html
new file mode 100644
index 000000000..7411fe07e
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationWorkflowService.compareApplicationVersionsEvidence.html
@@ -0,0 +1,44 @@
+compareApplicationVersionsEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function compareApplicationVersionsEvidence
+
+
+
+compareApplicationVersionsEvidence ( rawInput : unknown , ) : Result < | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } , AnalysisError , >
+
+
+
+
Returns Result < | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } , AnalysisError , >
+
+Defined in src/application/JavaScriptApplicationWorkflowService.ts:61
+
+
diff --git a/docs/api/functions/application_JavaScriptApplicationWorkflowService.traceApplicationFeatureEvidence.html b/docs/api/functions/application_JavaScriptApplicationWorkflowService.traceApplicationFeatureEvidence.html
new file mode 100644
index 000000000..7f42ca20a
--- /dev/null
+++ b/docs/api/functions/application_JavaScriptApplicationWorkflowService.traceApplicationFeatureEvidence.html
@@ -0,0 +1,44 @@
+traceApplicationFeatureEvidence | rea-agents - v1.7.0
+
+
+
+
+
Function traceApplicationFeatureEvidence
+
+
+
+traceApplicationFeatureEvidence ( rawInput : unknown , ) : Result < | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : (
| { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )
[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } , AnalysisError , >
+
+
+
+
Returns Result < | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } , AnalysisError , >
+
+Defined in src/application/JavaScriptApplicationWorkflowService.ts:24
+
+
diff --git a/docs/api/functions/application_JavaScriptArtifactGraphBuilder.buildJavaScriptArtifactGraph.html b/docs/api/functions/application_JavaScriptArtifactGraphBuilder.buildJavaScriptArtifactGraph.html
index 907b781e6..8ef4c0087 100644
--- a/docs/api/functions/application_JavaScriptArtifactGraphBuilder.buildJavaScriptArtifactGraph.html
+++ b/docs/api/functions/application_JavaScriptArtifactGraphBuilder.buildJavaScriptArtifactGraph.html
@@ -14,7 +14,7 @@
-buildJavaScriptArtifactGraph ( snapshot : ArtifactInventorySnapshot , fileSet : JavaScriptArtifactFileSet , analysis : JavaScriptArtifactAnalysis , input : { format : "directory" | "asar" | "auto" ; input_path : string ; limits : { max_artifact_entry_bytes : number ; max_ast_nodes : number ; max_compression_ratio : number ; max_depth : number ; max_entries : number ; max_findings : number ; max_modules : number ; max_parse_milliseconds : number ; max_path_bytes : number ; max_source_map_sources : number ; max_text_file_bytes : number ; max_text_files : number ; max_total_artifact_bytes : number ; max_total_text_bytes : number ; } ; source_map_read_approved : boolean ; } , ) : { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...
; line : ...
} ; kind : "source-range" ; source : string ; start : { column : ...
; line : ...
} ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...)
| (...)
; kind : "runtime" ; script_key : (...)
| (...)
; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...)
| (...)
} | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; }
+buildJavaScriptArtifactGraph ( snapshot : ArtifactInventorySnapshot , fileSet : JavaScriptArtifactFileSet , analysis : JavaScriptArtifactAnalysis , input : { format : "directory" | "asar" | "auto" ; input_path : string ; limits : { max_artifact_entry_bytes : number ; max_ast_nodes : number ; max_compression_ratio : number ; max_depth : number ; max_entries : number ; max_findings : number ; max_modules : number ; max_parse_milliseconds : number ; max_path_bytes : number ; max_source_map_sources : number ; max_text_file_bytes : number ; max_text_files : number ; max_total_artifact_bytes : number ; max_total_text_bytes : number ; } ; source_map_read_approved : boolean ; } , ) : { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...
; line : ...
} ; kind : "source-range" ; source : string ; start : { column : ...
; line : ...
} ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...)
| (...)
; kind : "runtime" ; script_key : (...)
| (...)
; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...)
| (...)
} | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; }
@@ -25,7 +25,7 @@
fileSet : JavaScriptArtifactFileSet
analysis : JavaScriptArtifactAnalysis
input : { format : "directory" | "asar" | "auto" ; input_path : string ; limits : { max_artifact_entry_bytes : number ; max_ast_nodes : number ; max_compression_ratio : number ; max_depth : number ; max_entries : number ; max_findings : number ; max_modules : number ; max_parse_milliseconds : number ; max_path_bytes : number ; max_source_map_sources : number ; max_text_file_bytes : number ; max_text_files : number ; max_total_artifact_bytes : number ; max_total_text_bytes : number ; } ; source_map_read_approved : boolean ; }
-Returns { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...; line : ... } ; kind : "source-range" ; source : string ; start : { column : ...; line : ... } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...) | (...); kind : "runtime" ; script_key : (...) | (...); target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...) | (...) } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; }
+Returns { coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; edges : { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; graph_id : string ; limitations : string [] ; nodes : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : ...; line : ... } ; kind : "source-range" ; source : string ; start : { column : ...; line : ... } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : (...) | (...); kind : "runtime" ; script_key : (...) | (...); target_key : string ; } | { address : string ; kind : "native-address" ; symbol : (...) | (...) } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; root_node_ids : string [] ; schema : "JavaScriptApplicationGraph" ; schema_version : 1 ; }
Returns | { analysis_profile : { digest : string ; parameters : Record < string , JSONType > ; provider : { id : string ; name : string ; version : string } ; provider_profile_schema_version : number ; schema_version : 1 ; } ; authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; } | { authority : | "shipped-artifact" | "controlled-replay" | "historical-reference" | "external-service" | "analyst-inference" ; confidence : "observed" | "derived" | "inferred" ; environment : | { architecture : string ; id : string ; isolation : "process" | "none" | "container" | "virtual-machine" ; platform : string ; } | null ; evidence_id : string ; evidence_links : string [] ; limitations : string [] ; locations : ( | { address : string ; kind : "address" } | { end : string ; kind : "address-range" ; start : string } | { kind : "artifact-path" ; path : string } | { kind : "file-offset" ; offset : number } | { end : number ; kind : "file-offset-range" ; start : number } )[] ; normalized_result : JSONType ; operation : string ; parameters : Record < string , JSONType > ; predicate_type : string ; provider : { id : string ; name : string ; version : string | null } ; raw_result : JSONType ; schema_version : 2 ; subject : | { architecture : "x86" | "x86_64" | "arm" | "arm64" | null ; digest : { sha256 : string } ; format : | "unknown" | "file" | "directory" | "javascript" | "source-map" | "plist" | "entitlements" | "dmg" | "zip" | "pkg" | "asar" | "javascript-bundle" | "mach-o-universal" | "mach-o" | "elf" | "pe" | "hopper" | "analysis-database" | "ipa" | "apk" ; local_path : string ; name : string ; } | null ; }
diff --git a/docs/api/functions/cli.createCli.html b/docs/api/functions/cli.createCli.html
index c52ac1bb6..8ae676759 100644
--- a/docs/api/functions/cli.createCli.html
+++ b/docs/api/functions/cli.createCli.html
@@ -22,7 +22,7 @@ Analysis commands acquire and close their own sessions; bare mcp an
Returns Cli < {} >
+Defined in src/cli.ts:50
+Defined in src/server/createServer.ts:47
-interface SetupResult { appliedActions : readonly string [] ; clients : Readonly < Record < string , ClientConfigurationResult > > ; code ?: SetupFailureCode ; doctor : { checks : readonly DoctorCheck [] ; healthy : boolean ; hopperPath ?: string ; identity ?: { catalog : { counts : { cli_commands : number ; mcp_prompts : number ; mcp_resource_templates : 7 ; mcp_resources : 2 ; mcp_tools : number ; } ; digests : { combined_sha256 : string ; prompts_sha256 : string ; resources_sha256 : string ; tools_sha256 : string ; } ; tools : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" ; surface : ToolKind ; } [] ; } ; cli_package_version : string ; expected_skill_version : string ; installations : { paths : readonly string [] ; state : "unknown" | "single" | "multiple" ; } ; live_server : { remediation : string ; state : "unknown" } ; registrations : readonly ClientRegistrationStatus [] ; sdk : { client_test : "2.0.0-beta.4" ; core : "2.0.0-beta.4" ; server : "2.0.0-beta.4" ; } ; skill : { installed_version : string | null ; remediation : string | null ; state : "unknown" | "aligned" | "stale" ; } ; } ; providerInspections ?: readonly DoctorProviderInspection [] ; } ; plannedActions : readonly SetupAction [] ; remediation ?: string ; status : "ready" | "planned" | "needs_confirmation" | "needs_human" ; }
+interface SetupResult { appliedActions : readonly string [] ; clients : Readonly < Record < string , ClientConfigurationResult > > ; code ?: SetupFailureCode ; doctor : { checks : readonly DoctorCheck [] ; healthy : boolean ; hopperPath ?: string ; identity ?: { catalog : { counts : { cli_commands : number ; mcp_prompts : number ; mcp_resource_templates : 7 ; mcp_resources : 2 ; mcp_tools : number ; } ; digests : { combined_sha256 : string ; prompts_sha256 : string ; resources_sha256 : string ; tools_sha256 : string ; } ; tools : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" | "trace_application_feature" | "compare_application_versions" ; surface : ToolKind ; } [] ; } ; cli_package_version : string ; expected_skill_version : string ; installations : { paths : readonly string [] ; state : "unknown" | "single" | "multiple" ; } ; live_server : { remediation : string ; state : "unknown" } ; registrations : readonly ClientRegistrationStatus [] ; sdk : { client_test : "2.0.0-beta.4" ; core : "2.0.0-beta.4" ; server : "2.0.0-beta.4" ; } ; skill : { installed_version : string | null ; remediation : string | null ; state : "unknown" | "aligned" | "stale" ; } ; } ; providerInspections ?: readonly DoctorProviderInspection [] ; } ; plannedActions : readonly SetupAction [] ; remediation ?: string ; status : "ready" | "planned" | "needs_confirmation" | "needs_human" ; }
Readonlydoctor
-doctor : { checks : readonly DoctorCheck [] ; healthy : boolean ; hopperPath ?: string ; identity ?: { catalog : { counts : { cli_commands : number ; mcp_prompts : number ; mcp_resource_templates : 7 ; mcp_resources : 2 ; mcp_tools : number ; } ; digests : { combined_sha256 : string ; prompts_sha256 : string ; resources_sha256 : string ; tools_sha256 : string ; } ; tools : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" ; surface : ToolKind ; } [] ; } ; cli_package_version : string ; expected_skill_version : string ; installations : { paths : readonly string [] ; state : "unknown" | "single" | "multiple" ; } ; live_server : { remediation : string ; state : "unknown" } ; registrations : readonly ClientRegistrationStatus [] ; sdk : { client_test : "2.0.0-beta.4" ; core : "2.0.0-beta.4" ; server : "2.0.0-beta.4" ; } ; skill : { installed_version : string | null ; remediation : string | null ; state : "unknown" | "aligned" | "stale" ; } ; } ; providerInspections ?: readonly DoctorProviderInspection [] ; }
+doctor : { checks : readonly DoctorCheck [] ; healthy : boolean ; hopperPath ?: string ; identity ?: { catalog : { counts : { cli_commands : number ; mcp_prompts : number ; mcp_resource_templates : 7 ; mcp_resources : 2 ; mcp_tools : number ; } ; digests : { combined_sha256 : string ; prompts_sha256 : string ; resources_sha256 : string ; tools_sha256 : string ; } ; tools : { annotations : { destructive : boolean ; idempotent : boolean ; open_world : boolean ; read_only : boolean ; } ; name : | "open_binary" | "list_browser_targets" | "inspect_web_page" | "analyze_web_bundle" | "observe_web_session" | "discover_webmcp_tools" | "compare_web_captures" | "capture_web_screenshot" | "compare_web_screenshots" | "list_electron_targets" | "inspect_electron_page" | "inventory_artifact" | "extract_artifact" | "analyze_javascript_application" | "swift_classes" | "get_objc_classes" | "get_objc_protocols" | "batch_decompile" | "get_call_graph" | "analyze_swift_types" | "find_xrefs_to_name" | "binary_overview" | "analyze_function" | "trace_feature" | "comment" | "compare_artifacts" | "find_changed_behavior" | "compare_process_captures" | "compare_functions" | "capture_process_scenario" | "address_name" | "current_address" | "current_procedure" | "current_document" | "goto_address" | "inline_comment" | "list_bookmarks" | "list_documents" | "list_names" | "list_procedures" | "list_segments" | "list_strings" | "next_address" | "prev_address" | "procedure_address" | "procedure_assembly" | "procedure_callees" | "procedure_callers" | "procedure_info" | "procedure_references" | "procedure_pseudo_code" | "resolve_containing_procedure" | "search_procedures" | "search_strings" | "set_address_name" | "set_addresses_names" | "set_bookmark" | "set_comment" | "set_current_document" | "set_inline_comment" | "unset_bookmark" | "xrefs" | "inspect_macho" | "inspect_signature" | "inspect_plist" | "list_architectures" | "demangle_swift" | "close_binary" | "binary_session" | "export_evidence_bundle" | "import_evidence_bundle" | "compare_bundles" | "build_call_path" | "correlate_static_and_runtime" | "verify_reconstruction" | "list_unknowns" | "record_unknown" | "update_unknown" | "verify_unknown_resolution" | "reconcile_javascript_runtime" | "trace_application_feature" | "compare_application_versions" ; surface : ToolKind ; } [] ; } ; cli_package_version : string ; expected_skill_version : string ; installations : { paths : readonly string [] ; state : "unknown" | "single" | "multiple" ; } ; live_server : { remediation : string ; state : "unknown" } ; registrations : readonly ClientRegistrationStatus [] ; sdk : { client_test : "2.0.0-beta.4" ; core : "2.0.0-beta.4" ; server : "2.0.0-beta.4" ; } ; skill : { installed_version : string | null ; remediation : string | null ; state : "unknown" | "aligned" | "stale" ; } ; } ; providerInspections ?: readonly DoctorProviderInspection [] ; }
diff --git a/docs/api/interfaces/contracts_toolContractTypes.ToolContract.html b/docs/api/interfaces/contracts_toolContractTypes.ToolContract.html
index 0ce658174..8239b1c2d 100644
--- a/docs/api/interfaces/contracts_toolContractTypes.ToolContract.html
+++ b/docs/api/interfaces/contracts_toolContractTypes.ToolContract.html
@@ -20,7 +20,7 @@
Name extends string = string
+Defined in src/contracts/toolContractTypes.ts:31
Readonlydescription
description : string
+Defined in src/contracts/toolContractTypes.ts:33
+Defined in src/contracts/toolContractTypes.ts:38
+Defined in src/contracts/toolContractTypes.ts:35
+Defined in src/contracts/toolContractTypes.ts:34
+Defined in src/contracts/toolContractTypes.ts:32
Readonlyoutput Schema
outputSchema : ZodObject
+Defined in src/contracts/toolContractTypes.ts:36
-interface RuntimeProjection { edges : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; entities : readonly RuntimeReconciliationEntity [] ; nodes : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; omittedEntities : number ; targetNodeByEvidenceId : ReadonlyMap < string , { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string ; } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } , > ; }
+interface RuntimeProjection { edges : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } [] ; entities : readonly RuntimeReconciliationEntity [] ; nodes : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } [] ; omittedEntities : number ; targetNodeByEvidenceId : ReadonlyMap < string , { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string ; } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } , > ; }
@@ -32,7 +32,7 @@
Readonlyedges
-edges : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
+edges : readonly { edge_id : string ; evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "relationship-exact" ; strategy : "semantic-content-sha256" ; } ; properties : Record < string , JSONType > ; relation : | "contains" | "loads" | "calls" | "imports" | "maps_to" | "exposes" | "sends" | "invokes" | "handles" | "persists_to" | "observed_as" | "changed_from" ; source_node_id : string ; target_node_id : string ; } []
Readonlynodes
-nodes : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
+nodes : readonly { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } []
Readonlytarget Node By Evidence Id
-targetNodeByEvidenceId : ReadonlyMap < string , { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } , >
+targetNodeByEvidenceId : ReadonlyMap < string , { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } , >
-interface RuntimeReconciliationEntity { capture : ParsedRuntimeCapture ; frameKey : string | null ; kind : "target" | "frame" | "worker" | "script" ; location : { kind : "file" | "url" ; value : string } ; node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } ; runtimeKey : string ; section : "frames" | "target" | "scripts" | "workers" ; sourceSha256 : string | null ; staticKind : "javascript" | "worker" | "service-worker" | "renderer" ; }
+interface RuntimeReconciliationEntity { capture : ParsedRuntimeCapture ; frameKey : string | null ; kind : "target" | "frame" | "worker" | "script" ; location : { kind : "file" | "url" ; value : string } ; node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } ; runtimeKey : string ; section : "frames" | "target" | "scripts" | "workers" ; sourceSha256 : string | null ; staticKind : "javascript" | "worker" | "service-worker" | "renderer" ; }
Readonlynode
-node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
+node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
diff --git a/docs/api/interfaces/domain_javascriptRuntimeStaticCandidates.StaticRuntimeCandidate.html b/docs/api/interfaces/domain_javascriptRuntimeStaticCandidates.StaticRuntimeCandidate.html
index 5ef09189b..efc1ec1ac 100644
--- a/docs/api/interfaces/domain_javascriptRuntimeStaticCandidates.StaticRuntimeCandidate.html
+++ b/docs/api/interfaces/domain_javascriptRuntimeStaticCandidates.StaticRuntimeCandidate.html
@@ -11,7 +11,7 @@
domain/javascriptRuntimeStaticCandidates
StaticRuntimeCandidate
Interface StaticRuntimeCandidate
-interface StaticRuntimeCandidate { category : "javascript" | "worker" | "service-worker" | "renderer" ; digests : readonly { basis : "content-sha256" | "module-source-sha256" ; sha256 : string ; } [] ; layer : ParsedStaticLayer ; node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } ; paths : readonly string [] ; }
+interface StaticRuntimeCandidate { category : "javascript" | "worker" | "service-worker" | "renderer" ; digests : readonly { basis : "content-sha256" | "module-source-sha256" ; sha256 : string ; } [] ; layer : ParsedStaticLayer ; node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : (
| "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )
[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; } ; paths : readonly string [] ; }
Readonlynode
-node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
+node : { identity : | { sha256 : string ; stability : "global-exact" ; strategy : "content-digest" ; } | { original_source : string ; source_map_sha256 : string ; source_sha256 : string | null ; stability : "source-map-exact" ; strategy : "source-map-original" ; } | { artifact_sha256 : string ; path : string ; stability : "artifact-version" ; strategy : "canonical-path" ; } | { algorithm : string ; basis : ( | "imports" | "exports" | "syntax-tree" | "control-flow" | "literals" | "api-usage" )[] ; fingerprint_sha256 : string ; stability : "cross-version-inference" ; strategy : "structural-fingerprint" ; } | { artifact_sha256 : string ; key : string ; namespace : string ; stability : "artifact-version" ; strategy : "artifact-local-key" ; } | { capture_sha256 : string ; runtime_key : string ; stability : "capture-only" ; strategy : "runtime-instance" ; } | { observation_sha256 : string ; scope : string ; stability : "observation-only" ; strategy : "observation-fingerprint" ; } ; kind : | "unknown" | "target" | "native-addon" | "source-map" | "artifact" | "package" | "storage" | "installer" | "asar-entry" | "electron-main" | "electron-preload" | "electron-renderer" | "electron-utility" | "javascript-asset" | "javascript-chunk" | "javascript-module" | "source-module" | "browser-window" | "frame" | "context-bridge-api" | "ipc-channel" | "ipc-handler" | "worker" | "service-worker" | "endpoint" | "native-export" | "runtime-script-instance" ; node_id : string ; observations : { evidence : { artifact : | { artifact_id : string ; available : true ; sha256 : string } | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } ; authority : | "unknown" | "controlled-replay" | "historical-reference" | "artifact-bytes" | "ast-static-analysis" | "static-relationship-inference" | "passive-cdp-runtime" | "cross-layer-reconciliation" | "cross-version-comparison" | "native-analysis-provider" | "user-assertion" ; confidence : "unknown" | "exact" | "low" | "medium" | "high" ; coverage : { limits : { name : string ; unit : | "other" | "items" | "bytes" | "depth" | "milliseconds" | "characters" | "instructions" ; value : number ; } [] ; omitted_count : number | null ; status : "unknown" | "unavailable" | "complete" | "partial" ; truncated : boolean ; } ; evidence_ids : string [] ; extractor : { executable_sha256 : string | null ; name : string ; operation : string ; version : string ; } ; limitations : string [] ; location : | { available : false ; detail : string ; reason : | "unknown" | "truncated" | "unresolved" | "not-applicable" | "not-observed" | "not-approved" | "provider-unavailable" ; } | { available : true ; value : | { end : { column : number ; line : number } ; kind : "source-range" ; source : string ; start : { column : number ; line : number } ; } | { end : number ; kind : "file-offset-range" ; start : number } | { kind : "artifact-path" ; path : string } | { kind : "url" ; url : string } | { capture_sha256 : string ; frame_key : string | null ; kind : "runtime" ; script_key : string | null ; target_key : string ; } | { address : string ; kind : "native-address" ; symbol : string | null } | { export_path : string ; kind : "package-export" ; package_name : string } ; } ; state : "unknown" | "observed" | "inferred" | "unavailable" ; } ; identifier_strategy : { stability : "observation-exact" ; strategy : "semantic-content-sha256" ; } ; label : string | null ; observation_id : string ; properties : Record < string , JSONType > ; } [] ; }
diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html b/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html
index bfdaf82aa..5ca1d1020 100644
--- a/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html
+++ b/docs/api/interfaces/domain_permissionPolicy.PermissionGrant.html
@@ -15,7 +15,7 @@
-
+
PermissionScope
diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html b/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html
index db82c40b4..3181f55b4 100644
--- a/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html
+++ b/docs/api/interfaces/domain_permissionPolicy.PermissionRequest.html
@@ -15,7 +15,7 @@
-
+
PermissionScope
diff --git a/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html b/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html
index f22f665be..6aa86a674 100644
--- a/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html
+++ b/docs/api/interfaces/domain_permissionPolicy.PermissionScope.html
@@ -15,7 +15,7 @@
-
+
PermissionScope
diff --git a/docs/api/interfaces/domain_webInventory.StableWebResource.html b/docs/api/interfaces/domain_webInventory.StableWebResource.html
index 1dbde87f4..aef0a68fd 100644
--- a/docs/api/interfaces/domain_webInventory.StableWebResource.html
+++ b/docs/api/interfaces/domain_webInventory.StableWebResource.html
@@ -12,7 +12,7 @@
StableWebResource
Interface StableWebResource
-
+
WebInventoryResourceInput
diff --git a/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html b/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html
index 936a27743..f2b607520 100644
--- a/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html
+++ b/docs/api/interfaces/domain_webInventory.WebInventoryResourceInput.html
@@ -12,7 +12,7 @@
WebInventoryResourceInput
Interface WebInventoryResourceInput
-
+
WebInventoryResourceInput
diff --git a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html
index 2a26bb452..f8cddfa56 100644
--- a/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html
+++ b/docs/api/interfaces/ghidra_GhidraLauncher.GhidraLaunch.html
@@ -15,7 +15,7 @@
-
+
ProviderProcessLaunch
diff --git a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html
index 6984ad5bc..31d732015 100644
--- a/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html
+++ b/docs/api/interfaces/ghidra_GhidraSessionError.GhidraSessionErrorOptions.html
@@ -15,7 +15,7 @@
-
+
Hierarchy
ErrorOptions
diff --git a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html
index 1979fe5ca..c917d5c88 100644
--- a/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html
+++ b/docs/api/interfaces/hopper_BridgeLauncher.BridgeLaunch.html
@@ -15,7 +15,7 @@
-
+
ProviderProcessLaunch
diff --git a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html
index 3df9d777d..3cf60c195 100644
--- a/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html
+++ b/docs/api/interfaces/process_ProviderProcess.ProviderProcessLaunch.html
@@ -15,7 +15,7 @@
-
+
ProviderProcessLaunch
diff --git a/docs/api/interfaces/server_createServer.CreateServerOptions.html b/docs/api/interfaces/server_createServer.CreateServerOptions.html
index b0fe0c4ee..25afd4adb 100644
--- a/docs/api/interfaces/server_createServer.CreateServerOptions.html
+++ b/docs/api/interfaces/server_createServer.CreateServerOptions.html
@@ -13,7 +13,7 @@
Interface CreateServerOptions
+Defined in src/server/createServer.ts:24
Optional Readonlyartifact Integrity Continue Enabled
artifactIntegrityContinueEnabled ?: () => boolean
+Defined in src/server/createServer.ts:33
Optional Readonlyavailability Policy
availabilityPolicy ?: () => { browserObservationEnabled ?: boolean ; electronObservationEnabled ?: boolean ; evidenceFileRoots : number ; processCaptureEnabled : boolean ; }
+Defined in src/server/createServer.ts:34
Optional Readonlybrowser Observation
+Defined in src/server/createServer.ts:31
Optional Readonlyelectron Observation
+Defined in src/server/createServer.ts:32
Optional Readonlyevidence File Policy
+Defined in src/server/createServer.ts:27
investigationInputRoots ?: readonly string []
+Defined in src/server/createServer.ts:28
Optional Readonlylogger
logger ?: Logger
+Defined in src/server/createServer.ts:25
Optional Readonlypermission Authority
+Defined in src/server/createServer.ts:30
Optional Readonlyprocess Policy
+Defined in src/server/createServer.ts:26
+Variables JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE
-ToolKind : | "official-proxy" | "enhanced" | "native-provider" | "artifact-provider" | "browser-provider" | "electron-provider" | "session"
+ToolKind : | "official-proxy" | "enhanced" | "native-provider" | "artifact-provider" | "browser-provider" | "electron-provider" | "application" | "session"
diff --git a/docs/api/types/contracts_toolContracts.OfficialToolName.html b/docs/api/types/contracts_toolContracts.OfficialToolName.html
index 60d770f56..2aa728431 100644
--- a/docs/api/types/contracts_toolContracts.OfficialToolName.html
+++ b/docs/api/types/contracts_toolContracts.OfficialToolName.html
@@ -15,7 +15,7 @@
+Defined in src/contracts/toolContracts.ts:343
-javascriptRuntimeReconciliationResultSchema : ZodObject < { coverage : ZodObject < { omitted_graph_items : ZodNumber ; omitted_reconciliation_items : ZodNumber ; omitted_runtime_entities : ZodNumber ; omitted_static_load_states : ZodNumber ; status : ZodEnum < { "complete-within-inputs" : "complete-within-inputs" ; partial : "partial" ; truncated : "truncated" ; } , > ; truncated : ZodBoolean ; } , $strict , > ; evidence_links : ZodArray < ZodString > ; graph : ZodObject < { coverage : ZodObject < { limits : ZodArray < ZodObject < { name : ZodString ; unit : ZodEnum < { bytes : ...; characters : ...; depth : ...; instructions : ...; items : ...; milliseconds : ...; other : ...; } , > ; value : ZodNumber ; } , $strict , > , > ; omitted_count : ZodNullable < ZodNumber > ; status : ZodEnum < { complete : "complete" ; partial : "partial" ; unavailable : "unavailable" ; unknown : "unknown" ; } , > ; truncated : ZodBoolean ; } , $strict , > ; edges : ZodArray < ZodObject < { edge_id : ZodString ; evidence : ZodObject < { artifact : ZodDiscriminatedUnion < [ (...), (...)] , "available" > ; authority : ZodEnum < { "artifact-bytes" : ...; "ast-static-analysis" : ...; "controlled-replay" : ...; "cross-layer-reconciliation" : ...; "historical-reference" : ...; "native-analysis-provider" : ...; "passive-cdp-runtime" : ...; "static-relationship-inference" : ...; unknown : ...; "user-assertion" : ...; } , > ; confidence : ZodEnum < { exact : ...; high : ...; low : ...; medium : ...; unknown : ... } , > ; coverage : ZodObject < { limits : ...; omitted_count : ...; status : ...; truncated : ...; } , $strict , > ; evidence_ids : ZodArray < ZodString > ; extractor : ZodObject < { executable_sha256 : ...; name : ...; operation : ...; version : ...; } , $strict , > ; limitations : ZodArray < ZodString > ; location : ZodDiscriminatedUnion < [ (...), (...)] , "available" > ; state : ZodEnum < { inferred : ...; observed : ...; unavailable : ...; unknown : ...; } , > ; } , $strict , > ; identifier_strategy : ZodObject < { stability : ZodLiteral < "relationship-exact" > ; strategy : ZodLiteral < "semantic-content-sha256" > ; } , $strict , > ; properties : ZodRecord < ZodString , ZodJSONSchema > ; relation : ZodEnum < { calls : "calls" ; changed_from : "changed_from" ; contains : "contains" ; exposes : "exposes" ; handles : "handles" ; imports : "imports" ; invokes : "invokes" ; loads : "loads" ; maps_to : "maps_to" ; observed_as : "observed_as" ; persists_to : "persists_to" ; sends : "sends" ; } , > ; source_node_id : ZodString ; target_node_id : ZodString ; } , $strict , > , > ; graph_id : ZodString ; limitations : ZodArray < ZodString > ; nodes : ZodArray < ZodObject < { identity : ZodDiscriminatedUnion < [ ZodObject < { sha256 : ...; stability : ...; strategy : ... } , $strict , > , ZodObject < { original_source : ...; source_map_sha256 : ...; source_sha256 : ...; stability : ...; strategy : ...; } , $strict , > , ZodObject < { artifact_sha256 : ...; path : ...; stability : ...; strategy : ...; } , $strict , > , ] , "strategy" , > ; kind : ZodEnum < { artifact : "artifact" ; "asar-entry" : "asar-entry" ; "browser-window" : "browser-window" ; "context-bridge-api" : "context-bridge-api" ; "electron-main" : "electron-main" ; "electron-preload" : "electron-preload" ; "electron-renderer" : "electron-renderer" ; "electron-utility" : "electron-utility" ; endpoint : "endpoint" ; frame : "frame" ; installer : "installer" ; "ipc-channel" : "ipc-channel" ; "ipc-handler" : "ipc-handler" ; "javascript-asset" : "javascript-asset" ; "javascript-chunk" : "javascript-chunk" ; "javascript-module" : "javascript-module" ; "native-addon" : "native-addon" ; "native-export" : "native-export" ; package : "package" ; "runtime-script-instance" : "runtime-script-instance" ; "service-worker" : "service-worker" ; "source-map" : "source-map" ; "source-module" : "source-module" ; storage : "storage" ; target : "target" ; unknown : "unknown" ; worker : "worker" ; } , > ; node_id : ZodString ; observations : ZodArray < ZodObject < { evidence : ZodObject < (...), (...)> ; identifier_strategy : ZodObject < (...), (...)> ; label : ZodNullable < (...)> ; observation_id : ZodString ; properties : ZodRecord < (...), (...)> ; } , $strict , > , > ; } , $strict , > , > ; root_node_ids : ZodArray < ZodString > ; schema : ZodLiteral < "JavaScriptApplicationGraph" > ; schema_version : ZodLiteral < 1 > ; } , $strict , > ; limitations : ZodArray < ZodString > ; reconciliation_id : ZodString ; reconciliations : ZodArray < ZodObject < { basis : ZodEnum < { "artifact-path" : "artifact-path" ; "content-and-location" : "content-and-location" ; "content-sha256" : "content-sha256" ; "module-source-sha256" : "module-source-sha256" ; none : "none" ; "operator-file-mapping" : "operator-file-mapping" ; "operator-url-mapping" : "operator-url-mapping" ; } , > ; candidate_static_count : ZodNumber ; candidate_static_nodes : ZodArray < ZodObject < { static_layer_id : ZodString ; static_node_id : ZodString } , $strict , > , > ; confidence : ZodEnum < { exact : "exact" ; high : "high" ; low : "low" ; medium : "medium" ; unknown : "unknown" ; } , > ; entity_kind : ZodEnum < { frame : "frame" ; script : "script" ; target : "target" ; worker : "worker" ; } , > ; reason : ZodEnum < { "ambiguous-static-candidates" : "ambiguous-static-candidates" ; "captured-content-disagrees-with-static-location" : "captured-content-disagrees-with-static-location" ; "content-and-location-match" : "content-and-location-match" ; "no-authorized-location-mapping" : "no-authorized-location-mapping" ; "no-static-content-match" : "no-static-content-match" ; "reconciliation-limit-reached" : "reconciliation-limit-reached" ; "runtime-frame-unattributed" : "runtime-frame-unattributed" ; "static-or-runtime-coverage-incomplete" : "static-or-runtime-coverage-incomplete" ; "unique-content-match" : "unique-content-match" ; "unique-location-match" : "unique-location-match" ; } , > ; reconciliation_id : ZodString ; runtime_evidence_id : ZodString ; runtime_node_id : ZodString ; static_layer_id : ZodNullable < ZodString > ; static_node_id : ZodNullable < ZodString > ; status : ZodEnum < { ambiguous : "ambiguous" ; matched : "matched" ; unknown : "unknown" ; unmatched : "unmatched" ; } , > ; } , $strict , > , > ; runtime_captures : ZodArray < ZodObject < { capture_sha256 : ZodString ; evidence_id : ZodString ; frames : ZodNumber ; kind : ZodEnum < { browser : "browser" ; electron : "electron" } > ; scripts : ZodNumber ; scripts_complete_within_scope : ZodBoolean ; target_key : ZodString ; target_location : ZodString ; target_node_id : ZodString ; workers : ZodNumber ; } , $strict , > , > ; schema_version : ZodLiteral < 1 > ; source_map_authority : ZodObject < { limitation : ZodString ; runtime_script_declarations : ZodNumber ; static_layers_with_read_approval : ZodNumber ; used_for_primary_matching : ZodLiteral < false > ; } , $strict , > ; static_layers : ZodArray < ZodObject < { evidence_id : ZodString ; format : ZodEnum < { asar : "asar" ; directory : "directory" } > ; graph_id : ZodString ; input_path : ZodString ; layer_id : ZodString ; role : ZodEnum < { application : "application" ; assets : "assets" ; cache : "cache" } , > ; root_artifact_sha256 : ZodString ; runtime_mappings : ZodArray < ZodDiscriminatedUnion < [ ZodObject < { artifact_prefix : ZodDefault < (...)> ; kind : ZodLiteral < (...)> ; root : ZodString ; } , $strict , > , ZodObject < { artifact_prefix : ZodDefault < (...)> ; kind : ZodLiteral < (...)> ; prefix : ZodString ; } , $strict , > , ] , "kind" , > , > ; } , $strict , > , > ; static_load_states : ZodArray < ZodObject < { kind : ZodEnum < { "javascript-asset" : "javascript-asset" ; "javascript-chunk" : "javascript-chunk" ; "javascript-module" : "javascript-module" ; } , > ; reason : ZodEnum < { "containing-asset-was-loaded" : "containing-asset-was-loaded" ; "layer-outside-runtime-scope" : "layer-outside-runtime-scope" ; "not-observed-in-bounded-capture" : "not-observed-in-bounded-capture" ; "runtime-script-correspondence" : "runtime-script-correspondence" ; "static-or-runtime-coverage-incomplete" : "static-or-runtime-coverage-incomplete" ; } , > ; runtime_node_ids : ZodArray < ZodString > ; static_layer_id : ZodString ; static_node_id : ZodString ; status : ZodEnum < { loaded : "loaded" ; "not-observed-in-capture" : "not-observed-in-capture" ; "resident-in-loaded-asset" : "resident-in-loaded-asset" ; unknown : "unknown" ; } , > ; } , $strict , > , > ; summary : ZodObject < { ambiguous : ZodNumber ; matched : ZodNumber ; runtime_frames : ZodNumber ; runtime_scripts : ZodNumber ; runtime_targets : ZodNumber ; runtime_workers : ZodNumber ; static_loaded : ZodNumber ; static_not_observed : ZodNumber ; static_resident : ZodNumber ; static_unknown : ZodNumber ; unknown : ZodNumber ; unmatched : ZodNumber ; } , $strict , > ; } , $strict , > = ...
+javascriptRuntimeReconciliationResultSchema : ZodObject < { coverage : ZodObject < { omitted_graph_items : ZodNumber ; omitted_reconciliation_items : ZodNumber ; omitted_runtime_entities : ZodNumber ; omitted_static_load_states : ZodNumber ; status : ZodEnum < { "complete-within-inputs" : "complete-within-inputs" ; partial : "partial" ; truncated : "truncated" ; } , > ; truncated : ZodBoolean ; } , $strict , > ; evidence_links : ZodArray < ZodString > ; graph : ZodObject < { coverage : ZodObject < { limits : ZodArray < ZodObject < { name : ZodString ; unit : ZodEnum < { bytes : ...; characters : ...; depth : ...; instructions : ...; items : ...; milliseconds : ...; other : ...; } , > ; value : ZodNumber ; } , $strict , > , > ; omitted_count : ZodNullable < ZodNumber > ; status : ZodEnum < { complete : "complete" ; partial : "partial" ; unavailable : "unavailable" ; unknown : "unknown" ; } , > ; truncated : ZodBoolean ; } , $strict , > ; edges : ZodArray < ZodObject < { edge_id : ZodString ; evidence : ZodObject < { artifact : ZodDiscriminatedUnion < [ (...), (...)] , "available" > ; authority : ZodEnum < { "artifact-bytes" : ...; "ast-static-analysis" : ...; "controlled-replay" : ...; "cross-layer-reconciliation" : ...; "cross-version-comparison" : ...; "historical-reference" : ...; "native-analysis-provider" : ...; "passive-cdp-runtime" : ...; "static-relationship-inference" : ...; unknown : ...; "user-assertion" : ...; } , > ; confidence : ZodEnum < { exact : ...; high : ...; low : ...; medium : ...; unknown : ... } , > ; coverage : ZodObject < { limits : ...; omitted_count : ...; status : ...; truncated : ...; } , $strict , > ; evidence_ids : ZodArray < ZodString > ; extractor : ZodObject < { executable_sha256 : ...; name : ...; operation : ...; version : ...; } , $strict , > ; limitations : ZodArray < ZodString > ; location : ZodDiscriminatedUnion < [ (...), (...)] , "available" > ; state : ZodEnum < { inferred : ...; observed : ...; unavailable : ...; unknown : ...; } , > ; } , $strict , > ; identifier_strategy : ZodObject < { stability : ZodLiteral < "relationship-exact" > ; strategy : ZodLiteral < "semantic-content-sha256" > ; } , $strict , > ; properties : ZodRecord < ZodString , ZodJSONSchema > ; relation : ZodEnum < { calls : "calls" ; changed_from : "changed_from" ; contains : "contains" ; exposes : "exposes" ; handles : "handles" ; imports : "imports" ; invokes : "invokes" ; loads : "loads" ; maps_to : "maps_to" ; observed_as : "observed_as" ; persists_to : "persists_to" ; sends : "sends" ; } , > ; source_node_id : ZodString ; target_node_id : ZodString ; } , $strict , > , > ; graph_id : ZodString ; limitations : ZodArray < ZodString > ; nodes : ZodArray < ZodObject < { identity : ZodDiscriminatedUnion < [ ZodObject < { sha256 : ...; stability : ...; strategy : ... } , $strict , > , ZodObject < { original_source : ...; source_map_sha256 : ...; source_sha256 : ...; stability : ...; strategy : ...; } , $strict , > , ZodObject < { artifact_sha256 : ...; path : ...; stability : ...; strategy : ...; } , $strict , > , ] , "strategy" , > ; kind : ZodEnum < { artifact : "artifact" ; "asar-entry" : "asar-entry" ; "browser-window" : "browser-window" ; "context-bridge-api" : "context-bridge-api" ; "electron-main" : "electron-main" ; "electron-preload" : "electron-preload" ; "electron-renderer" : "electron-renderer" ; "electron-utility" : "electron-utility" ; endpoint : "endpoint" ; frame : "frame" ; installer : "installer" ; "ipc-channel" : "ipc-channel" ; "ipc-handler" : "ipc-handler" ; "javascript-asset" : "javascript-asset" ; "javascript-chunk" : "javascript-chunk" ; "javascript-module" : "javascript-module" ; "native-addon" : "native-addon" ; "native-export" : "native-export" ; package : "package" ; "runtime-script-instance" : "runtime-script-instance" ; "service-worker" : "service-worker" ; "source-map" : "source-map" ; "source-module" : "source-module" ; storage : "storage" ; target : "target" ; unknown : "unknown" ; worker : "worker" ; } , > ; node_id : ZodString ; observations : ZodArray < ZodObject < { evidence : ZodObject < (...), (...)> ; identifier_strategy : ZodObject < (...), (...)> ; label : ZodNullable < (...)> ; observation_id : ZodString ; properties : ZodRecord < (...), (...)> ; } , $strict , > , > ; } , $strict , > , > ; root_node_ids : ZodArray < ZodString > ; schema : ZodLiteral < "JavaScriptApplicationGraph" > ; schema_version : ZodLiteral < 1 > ; } , $strict , > ; limitations : ZodArray < ZodString > ; reconciliation_id : ZodString ; reconciliations : ZodArray < ZodObject < { basis : ZodEnum < { "artifact-path" : "artifact-path" ; "content-and-location" : "content-and-location" ; "content-sha256" : "content-sha256" ; "module-source-sha256" : "module-source-sha256" ; none : "none" ; "operator-file-mapping" : "operator-file-mapping" ; "operator-url-mapping" : "operator-url-mapping" ; } , > ; candidate_static_count : ZodNumber ; candidate_static_nodes : ZodArray < ZodObject < { static_layer_id : ZodString ; static_node_id : ZodString } , $strict , > , > ; confidence : ZodEnum < { exact : "exact" ; high : "high" ; low : "low" ; medium : "medium" ; unknown : "unknown" ; } , > ; entity_kind : ZodEnum < { frame : "frame" ; script : "script" ; target : "target" ; worker : "worker" ; } , > ; reason : ZodEnum < { "ambiguous-static-candidates" : "ambiguous-static-candidates" ; "captured-content-disagrees-with-static-location" : "captured-content-disagrees-with-static-location" ; "content-and-location-match" : "content-and-location-match" ; "no-authorized-location-mapping" : "no-authorized-location-mapping" ; "no-static-content-match" : "no-static-content-match" ; "reconciliation-limit-reached" : "reconciliation-limit-reached" ; "runtime-frame-unattributed" : "runtime-frame-unattributed" ; "static-or-runtime-coverage-incomplete" : "static-or-runtime-coverage-incomplete" ; "unique-content-match" : "unique-content-match" ; "unique-location-match" : "unique-location-match" ; } , > ; reconciliation_id : ZodString ; runtime_evidence_id : ZodString ; runtime_node_id : ZodString ; static_layer_id : ZodNullable < ZodString > ; static_node_id : ZodNullable < ZodString > ; status : ZodEnum < { ambiguous : "ambiguous" ; matched : "matched" ; unknown : "unknown" ; unmatched : "unmatched" ; } , > ; } , $strict , > , > ; runtime_captures : ZodArray < ZodObject < { capture_sha256 : ZodString ; evidence_id : ZodString ; frames : ZodNumber ; kind : ZodEnum < { browser : "browser" ; electron : "electron" } > ; scripts : ZodNumber ; scripts_complete_within_scope : ZodBoolean ; target_key : ZodString ; target_location : ZodString ; target_node_id : ZodString ; workers : ZodNumber ; } , $strict , > , > ; schema_version : ZodLiteral < 1 > ; source_map_authority : ZodObject < { limitation : ZodString ; runtime_script_declarations : ZodNumber ; static_layers_with_read_approval : ZodNumber ; used_for_primary_matching : ZodLiteral < false > ; } , $strict , > ; static_layers : ZodArray < ZodObject < { evidence_id : ZodString ; format : ZodEnum < { asar : "asar" ; directory : "directory" } > ; graph_id : ZodString ; input_path : ZodString ; layer_id : ZodString ; role : ZodEnum < { application : "application" ; assets : "assets" ; cache : "cache" } , > ; root_artifact_sha256 : ZodString ; runtime_mappings : ZodArray < ZodDiscriminatedUnion < [ ZodObject < { artifact_prefix : ZodDefault < (...)> ; kind : ZodLiteral < (...)> ; root : ZodString ; } , $strict , > , ZodObject < { artifact_prefix : ZodDefault < (...)> ; kind : ZodLiteral < (...)> ; prefix : ZodString ; } , $strict , > , ] , "kind" , > , > ; } , $strict , > , > ; static_load_states : ZodArray < ZodObject < { kind : ZodEnum < { "javascript-asset" : "javascript-asset" ; "javascript-chunk" : "javascript-chunk" ; "javascript-module" : "javascript-module" ; } , > ; reason : ZodEnum < { "containing-asset-was-loaded" : "containing-asset-was-loaded" ; "layer-outside-runtime-scope" : "layer-outside-runtime-scope" ; "not-observed-in-bounded-capture" : "not-observed-in-bounded-capture" ; "runtime-script-correspondence" : "runtime-script-correspondence" ; "static-or-runtime-coverage-incomplete" : "static-or-runtime-coverage-incomplete" ; } , > ; runtime_node_ids : ZodArray < ZodString > ; static_layer_id : ZodString ; static_node_id : ZodString ; status : ZodEnum < { loaded : "loaded" ; "not-observed-in-capture" : "not-observed-in-capture" ; "resident-in-loaded-asset" : "resident-in-loaded-asset" ; unknown : "unknown" ; } , > ; } , $strict , > , > ; summary : ZodObject < { ambiguous : ZodNumber ; matched : ZodNumber ; runtime_frames : ZodNumber ; runtime_scripts : ZodNumber ; runtime_targets : ZodNumber ; runtime_workers : ZodNumber ; static_loaded : ZodNumber ; static_not_observed : ZodNumber ; static_resident : ZodNumber ; static_unknown : ZodNumber ; unknown : ZodNumber ; unmatched : ZodNumber ; } , $strict , > ; } , $strict , > = ...
diff --git a/docs/architecture.mermaid b/docs/architecture.mermaid
index f8920dc08..97c2698e8 100644
--- a/docs/architecture.mermaid
+++ b/docs/architecture.mermaid
@@ -32,7 +32,7 @@ graph TD
end
subgraph "Contracts Layer"
- CONTRACTS["src/contracts/ Caller-visible tool schemas 80 analysis, browser, Electron, and session tools"]
+ CONTRACTS["src/contracts/ Caller-visible tool schemas 82 analysis, browser, Electron, application, and session tools"]
end
subgraph "Domain Layer"
diff --git a/docs/javascript-application-workflows.md b/docs/javascript-application-workflows.md
new file mode 100644
index 000000000..c413b6f03
--- /dev/null
+++ b/docs/javascript-application-workflows.md
@@ -0,0 +1,74 @@
+# Cross-layer JavaScript application workflows
+
+REA derives a bounded feature trace from one authenticated JavaScript
+Application Graph and compares two authenticated graph versions. The MCP tools
+are `trace_application_feature` and `compare_application_versions`; their CLI
+equivalents are `rea trace-application-feature` and
+`rea compare-application-versions`.
+
+Both workflows consume Evidence v2 produced by
+`analyze_javascript_application` or `reconcile_javascript_runtime`. They do not
+read an artifact, execute application code, attach to a process, or open a
+native-analysis provider. Static artifact observations, passive runtime
+observations, relationship inferences, and unknown or unavailable facts retain
+their original graph authority.
+
+## Feature tracing
+
+Select one literal seed kind: node ID, route, string, API, IPC channel, module,
+or native export. Matching is exact or literal substring matching; regular
+expressions and executable predicates are not accepted. Direction, depth,
+nodes, edges, paths, and seed matches all have caller-visible limits.
+
+The result contains the matching basis, a bounded subgraph, terminal paths,
+authority summaries, truncation frontier, and native handoffs. A handoff binds
+the exact native artifact digest and requested exports from the application
+graph. Existing Hopper or Ghidra Evidence is linked only when its subject digest
+matches exactly. Otherwise the result recommends provider-neutral follow-up
+tools and reports `requires-provider-analysis`; it never starts or switches a
+provider implicitly.
+
+## Version comparison
+
+REA pairs entities only when a tier produces one unique candidate on each side.
+The tiers are exact content digest, exact module-source digest, exact node
+identity, source-map identity, structural fingerprint, and a semantic key for
+non-module entities. Lower tiers never override a higher unique match.
+
+Module ordinals, stable minified names, and fuzzy text similarity are not
+persistent identities. Duplicate candidates remain ambiguous. Source-map and
+structural matches are high/medium-confidence inferences rather than exact
+facts. Each item is `unchanged`, `added`, `removed`, `changed`, or `unknown`,
+and the result includes its basis, candidates, changed dimensions, Evidence
+links, limitations, and a bounded `changed_from` graph.
+
+One-sided absence is `added` or `removed` only when the opposite input graph has
+complete coverage. With partial, unavailable, or truncated input, the same
+condition is `unknown`. Output truncation separately reports omitted comparison
+items, candidate references, graph nodes, edges, and observations. With
+`unknown_registry_approved: true`, unresolved comparison items can be retained
+as a residual unknown in a live session.
+
+## CLI and verification
+
+Both CLI commands accept inline JSON or a JSON file up to 64 MiB. The input is
+the same object used by the corresponding MCP tool.
+
+For two operator-provided directories or ASARs, run:
+
+```bash
+npm run verify:application-workflows -- \
+ --left /absolute/path/to/version-a \
+ --right /absolute/path/to/version-b \
+ --source-map-read-approved
+```
+
+The verifier reconstructs both versions independently, compares them, and runs
+one literal trace when a seed is available. It prints only graph, artifact, and
+Evidence identifiers plus matching, summary, handoff, and coverage statistics;
+it does not print source text. Use `--seed-kind` and `--seed-value` to select a
+specific route, string, API, channel, module, native export, or node ID.
+
+Because source Evidence and derived Evidence are retained by the normal session
+ledger, evidence bundles, analysis snapshots, and investigation workspaces can
+carry these records without another persistence format.
diff --git a/docs/mcp-prompts.md b/docs/mcp-prompts.md
index 03bd93b5c..574c38821 100644
--- a/docs/mcp-prompts.md
+++ b/docs/mcp-prompts.md
@@ -1,7 +1,7 @@
# Guided MCP prompts and completion
REA exposes six provider-neutral investigation workflows through the MCP
-`prompts` capability. They complement the 80 tools; they do not add, remove, or
+`prompts` capability. They complement the 82 tools; they do not add, remove, or
invoke tools by themselves.
## Prompt inventory
diff --git a/docs/product-catalog.json b/docs/product-catalog.json
index cb5715426..5d7329f1d 100644
--- a/docs/product-catalog.json
+++ b/docs/product-catalog.json
@@ -8,10 +8,10 @@
"client": "2.0.0-beta.4",
"core": "2.0.0-beta.4"
},
- "skill_version": "16"
+ "skill_version": "17"
},
"tools": {
- "total": 80,
+ "total": 82,
"families": [
{
"id": "direct",
@@ -114,6 +114,12 @@
"reconcile_javascript_runtime"
]
},
+ {
+ "id": "application",
+ "surface": "application-workflow",
+ "count": 2,
+ "tools": ["compare_application_versions", "trace_application_feature"]
+ },
{
"id": "session",
"surface": "session",
@@ -253,6 +259,15 @@
"version": "1",
"capabilities": ["analyze_javascript_application"]
},
+ {
+ "id": "rea-javascript-application-workflows",
+ "name": "REA JavaScript application workflows",
+ "version": "1",
+ "capabilities": [
+ "compare_application_versions",
+ "trace_application_feature"
+ ]
+ },
{
"id": "rea-javascript-runtime-reconciliation",
"name": "REA JavaScript runtime reconciliation",
@@ -357,6 +372,14 @@
"id": "javascript_application_graph",
"version": 1
},
+ {
+ "id": "javascript_application_version_comparison",
+ "version": 1
+ },
+ {
+ "id": "javascript_feature_trace",
+ "version": 1
+ },
{
"id": "process_capture",
"version": 4
@@ -399,7 +422,7 @@
}
],
"cli": {
- "primary_count": 40,
+ "primary_count": 42,
"commands": [
"analyze",
"analyze-javascript-application",
@@ -408,6 +431,7 @@
"capture-process",
"capture-web-screenshot",
"compare",
+ "compare-application-versions",
"compare-process-captures",
"compare-web-captures",
"compare-web-screenshots",
@@ -438,6 +462,7 @@
"search",
"setup",
"trace",
+ "trace-application-feature",
"uninstall",
"upgrade",
"xrefs"
@@ -451,17 +476,17 @@
},
"runtime_catalog": {
"counts": {
- "cli_commands": 40,
- "mcp_tools": 80,
+ "cli_commands": 42,
+ "mcp_tools": 82,
"mcp_prompts": 6,
"mcp_resources": 2,
"mcp_resource_templates": 7
},
"digests": {
- "tools_sha256": "ea588b0a55232dc3d51a5baff7ef07d522484b0ca218abe072762498bcbbd2ee",
- "prompts_sha256": "cb1a0316708d1bdb5f4325c2000e466211b16070af8c927bc201340301f194c4",
+ "tools_sha256": "abf857fcc4e427f5e882e5d812ce43f03523611e28cf00665b8959ea961360b0",
+ "prompts_sha256": "f6da3ad38a1000c11364d1710f122ac4990551f04efd8c53ffb2e819b5cf5707",
"resources_sha256": "e603aad57a79479004fbdc267644092e8365dd64d94ad772b9da4425a49abd73",
- "combined_sha256": "e8b9641545de9729803af17f34f2677498ca7c2e6108e50291bf4ca86c1695e6"
+ "combined_sha256": "d690c8c0fcf38fb801827bb5aef3113a19a8c363abafc2e7fa5c6f53448c1e17"
}
}
}
diff --git a/package.json b/package.json
index 37d684cea..a43357740 100644
--- a/package.json
+++ b/package.json
@@ -75,6 +75,7 @@
"verify:ghidra": "npm run build && node scripts/verify-real-ghidra.mjs",
"verify:browser": "npm run build && node scripts/verify-real-browser.mjs",
"verify:javascript-runtime": "npm run build && node scripts/verify-local-javascript-runtime.mjs",
+ "verify:application-workflows": "npm run build && node scripts/verify-local-application-workflows.mjs",
"verify:hopper:linux": "npm run build && node scripts/verify-real-hopper-linux.mjs",
"verify:setup:linux": "npm run build && node scripts/verify-linux-setup-e2e.mjs",
"build:fixtures": "node scripts/build-conformance-fixtures.mjs",
diff --git a/scripts/lib/product-catalog.mjs b/scripts/lib/product-catalog.mjs
index 10c492e32..6a354da81 100644
--- a/scripts/lib/product-catalog.mjs
+++ b/scripts/lib/product-catalog.mjs
@@ -99,6 +99,7 @@ const SOURCE_PATHS = {
artifactContracts: "dist/contracts/artifactToolContracts.js",
browserContracts: "dist/contracts/browserToolContracts.js",
electronContracts: "dist/contracts/electronToolContracts.js",
+ applicationContracts: "dist/contracts/applicationToolContracts.js",
supportedClients: "dist/application/SupportedClients.js",
hopperProvider: "dist/hopper/HopperProvider.js",
ghidraProvider: "dist/ghidra/GhidraProvider.js",
@@ -121,6 +122,9 @@ const SOURCE_PATHS = {
webScreenshot: "dist/domain/webScreenshot.js",
javascriptApplicationGraph: "dist/domain/javascriptApplicationGraph.js",
javascriptApplicationAnalysis: "dist/domain/javascriptApplicationAnalysis.js",
+ javascriptFeatureTrace: "dist/domain/javascriptFeatureTraceSchemas.js",
+ javascriptVersionComparison:
+ "dist/domain/javascriptApplicationVersionComparisonSchemas.js",
reconstructionVerification:
"dist/domain/reconstructionVerificationSchemas.js",
residualUnknown: "dist/domain/residualUnknown.js",
@@ -168,6 +172,11 @@ const toolFamilyCatalog = (sources) => {
surface: "electron-provider",
contracts: sources.electronContracts.ELECTRON_TOOL_CONTRACTS,
},
+ {
+ id: "application",
+ surface: "application-workflow",
+ contracts: sources.applicationContracts.APPLICATION_TOOL_CONTRACTS,
+ },
{
id: "session",
surface: "session",
@@ -246,6 +255,11 @@ const providerCatalog = (sources) => {
sources.artifactProviders.JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER,
contracts: reconciliationContracts,
},
+ {
+ identity:
+ sources.artifactProviders.JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER,
+ contracts: sources.applicationContracts.APPLICATION_TOOL_CONTRACTS,
+ },
]
.map(({ identity, contracts }) => ({
id: identity.id,
@@ -298,6 +312,17 @@ const durableSchemaDefinitions = (sources) => [
sources.javascriptApplicationGraph.javascriptApplicationGraphSchema,
["schema_version"],
],
+ [
+ "javascript_application_version_comparison",
+ sources.javascriptVersionComparison
+ .applicationVersionComparisonResultSchema,
+ ["schema_version"],
+ ],
+ [
+ "javascript_feature_trace",
+ sources.javascriptFeatureTrace.applicationFeatureTraceResultSchema,
+ ["schema_version"],
+ ],
[
"process_capture",
sources.processCapture.processCaptureSchema,
diff --git a/scripts/verify-local-application-workflows.mjs b/scripts/verify-local-application-workflows.mjs
new file mode 100644
index 000000000..0a87c1a11
--- /dev/null
+++ b/scripts/verify-local-application-workflows.mjs
@@ -0,0 +1,134 @@
+#!/usr/bin/env node
+
+import { realpath } from "node:fs/promises";
+import { parseArgs } from "node:util";
+
+import { analyzeJavaScriptApplication } from "../dist/application/JavaScriptApplicationService.js";
+import {
+ compareApplicationVersionsEvidence,
+ traceApplicationFeatureEvidence,
+} from "../dist/application/JavaScriptApplicationWorkflowService.js";
+import { PermissionAuthority } from "../dist/application/PermissionAuthority.js";
+import { applicationVersionComparisonResultSchema } from "../dist/domain/javascriptApplicationVersionComparisonSchemas.js";
+import { applicationFeatureTraceResultSchema } from "../dist/domain/javascriptFeatureTraceSchemas.js";
+import { createPermissionPolicy } from "../dist/domain/permissionPolicy.js";
+
+const options = parseArgs({
+ options: {
+ left: { type: "string" },
+ right: { type: "string" },
+ "seed-kind": { type: "string", default: "module" },
+ "seed-value": { type: "string" },
+ "source-map-read-approved": { type: "boolean", default: false },
+ },
+ strict: true,
+ allowPositionals: false,
+}).values;
+
+if (options.left === undefined || options.right === undefined)
+ throw new Error(
+ "--left and --right must name operator-provided app/ASAR paths",
+ );
+const [leftPath, rightPath] = await Promise.all([
+ realpath(options.left),
+ realpath(options.right),
+]);
+if (leftPath === rightPath)
+ throw new Error("--left and --right must resolve to distinct paths");
+const authority = permissionAuthority([leftPath, rightPath]);
+const [left, right] = await Promise.all([
+ analyze(leftPath, authority),
+ analyze(rightPath, authority),
+]);
+const comparison = compareApplicationVersionsEvidence({ left, right });
+if (!comparison.ok) throw comparison.error;
+const comparisonResult = applicationVersionComparisonResultSchema.parse(
+ comparison.value.normalized_result,
+);
+const seedValue =
+ options["seed-value"] ??
+ left.normalized_result.graph.nodes.find(
+ ({ kind }) => kind === "javascript-module",
+ )?.observations[0]?.label;
+const trace =
+ seedValue === undefined
+ ? null
+ : traceApplicationFeatureEvidence({
+ application: left,
+ seed: {
+ kind: options["seed-kind"],
+ value: seedValue,
+ match: "exact",
+ case_sensitive: false,
+ },
+ direction: "both",
+ });
+if (trace !== null && !trace.ok) throw trace.error;
+const traceResult =
+ trace === null
+ ? null
+ : applicationFeatureTraceResultSchema.parse(trace.value.normalized_result);
+
+process.stdout.write(
+ `${JSON.stringify({
+ comparison_id: comparisonResult.comparison_id,
+ evidence_id: comparison.value.evidence_id,
+ left: comparisonResult.left,
+ right: comparisonResult.right,
+ summary: comparisonResult.summary,
+ matching: comparisonResult.matching,
+ coverage: comparisonResult.coverage,
+ trace:
+ traceResult === null
+ ? null
+ : {
+ trace_id: traceResult.trace_id,
+ evidence_id: trace.value.evidence_id,
+ seed: traceResult.seed,
+ summary: traceResult.summary,
+ coverage: traceResult.coverage,
+ native_handoffs: traceResult.native_handoffs.map((handoff) => ({
+ artifact_sha256: handoff.artifact_sha256,
+ status: handoff.status,
+ requested_exports: handoff.requested_exports,
+ evidence_ids: handoff.evidence_ids,
+ })),
+ },
+ verified: true,
+ })}\n`,
+);
+
+async function analyze(path, authority) {
+ const result = await analyzeJavaScriptApplication(authority, {
+ input_path: path,
+ approved: true,
+ source_map_read_approved: options["source-map-read-approved"],
+ });
+ if (!result.ok) throw result.error;
+ return result.value;
+}
+
+function permissionAuthority(roots) {
+ const scope = {
+ capability: "investigation_input",
+ roots,
+ executables: [],
+ environment_names: [],
+ network: "none",
+ mount: false,
+ };
+ return new PermissionAuthority(
+ createPermissionPolicy(
+ [scope],
+ [
+ {
+ ...scope,
+ grant_id: "local-application-workflow-verifier",
+ lifetime: "session",
+ operation_identity: null,
+ expires_at: null,
+ },
+ ],
+ ),
+ );
+}
diff --git a/skills/rea-analysis/SKILL.md b/skills/rea-analysis/SKILL.md
index cb9ab8940..f9475d5b1 100644
--- a/skills/rea-analysis/SKILL.md
+++ b/skills/rea-analysis/SKILL.md
@@ -2,8 +2,8 @@
name: rea-analysis
description: Reverse engineer native, Electron/JavaScript, and web applications with REA. Connect static artifacts to passive runtime evidence, explain how features work, and build a version tailored to the user's project.
metadata:
- version: "16"
- tool_count: 80
+ version: "17"
+ tool_count: 82
---
# REA
@@ -60,6 +60,24 @@ its containing bundle was observed. Keep source-map authority separate. This
tool maps JavaScript graph entities; `correlate_static_and_runtime` remains the
separate workflow for explicit cross-version comparison hypotheses.
+Use `trace_application_feature` on authenticated static or reconciled
+application Evidence to follow one literal node ID, route, string, API, IPC
+channel, module, or native export. Choose an explicit direction and bounds.
+Preserve every graph authority in the returned subgraph. A native handoff means
+only that the exact artifact digest and requested export frontier are known;
+link Ghidra or Hopper Evidence only on exact subject digest, and never claim the
+workflow opened a provider or verified a requested export by itself.
+
+Use `compare_application_versions` after analyzing both versions independently.
+Accept only its unique digest, source-map, structural-fingerprint, or non-module
+semantic matches. Never use module ordinals or minified names as persistent
+identity, and never promote an ambiguous candidate to a match. Report added or
+removed only when opposite-side coverage is complete; otherwise report unknown.
+Use `unknown_registry_approved: true` only after approval to retain unresolved
+version matches. For local operator-provided artifacts, the packaged
+`verify:application-workflows` command reports digests and coverage without
+printing source text.
+
## Understand the request
Identify the app and what the user wants to understand or build. Do not ask for information they already provided.
diff --git a/src/application/InvestigationProviders.ts b/src/application/InvestigationProviders.ts
index c518824a7..9e7786b94 100644
--- a/src/application/InvestigationProviders.ts
+++ b/src/application/InvestigationProviders.ts
@@ -39,6 +39,13 @@ export const JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER = {
version: "1",
} as const;
+/** Provider identity for graph-native feature tracing and version comparison. */
+export const JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER = {
+ id: "rea-javascript-application-workflows",
+ name: "REA JavaScript application workflows",
+ version: "1",
+} as const;
+
/** Provider identity for deterministic cross-artifact comparisons. */
export const ARTIFACT_COMPARISON_PROVIDER = {
id: "rea-artifact-comparison",
diff --git a/src/application/JavaScriptApplicationEvidenceGraph.ts b/src/application/JavaScriptApplicationEvidenceGraph.ts
new file mode 100644
index 000000000..611c5dafc
--- /dev/null
+++ b/src/application/JavaScriptApplicationEvidenceGraph.ts
@@ -0,0 +1,141 @@
+import {
+ JAVASCRIPT_APPLICATION_PROVIDER,
+ JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER,
+} from "./InvestigationProviders.js";
+import { parseEvidence, type Evidence } from "../domain/evidence.js";
+import {
+ analyzeJavaScriptApplicationInputSchema,
+ javascriptApplicationAnalysisResultSchema,
+ type JavaScriptApplicationAnalysisResult,
+} from "../domain/javascriptApplicationAnalysis.js";
+import type { JavaScriptApplicationGraph } from "../domain/javascriptApplicationGraph.js";
+import { javascriptRuntimeReconciliationResultSchema } from "../domain/javascriptRuntimeReconciliationSchemas.js";
+
+/** Supported immutable source for an application-level graph workflow. */
+export interface ApplicationGraphEvidenceSource {
+ readonly evidence: Evidence;
+ readonly graph: JavaScriptApplicationGraph;
+ readonly kind: "static-application" | "static-runtime-reconciliation";
+ readonly rootArtifactSha256: string;
+}
+
+/** Parse and authenticate one REA-produced JavaScript Application Graph Evidence. */
+export const parseApplicationGraphEvidence = (
+ input: unknown,
+): ApplicationGraphEvidenceSource => {
+ const evidence = parseEvidence(input);
+ if (
+ evidence.operation === "analyze_javascript_application" &&
+ evidence.predicate_type === "rea.javascript-application-analysis/v1" &&
+ providerMatches(evidence, JAVASCRIPT_APPLICATION_PROVIDER)
+ )
+ return staticApplicationSource(evidence);
+ if (
+ evidence.operation === "reconcile_javascript_runtime" &&
+ evidence.predicate_type === "rea.javascript-runtime-reconciliation/v1" &&
+ providerMatches(evidence, JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER)
+ )
+ return staticRuntimeSource(evidence);
+ throw new TypeError(
+ "Application workflow requires authenticated analyze_javascript_application or reconcile_javascript_runtime Evidence",
+ );
+};
+
+const staticApplicationSource = (
+ evidence: Evidence,
+): ApplicationGraphEvidenceSource => {
+ if (
+ evidence.authority !== "shipped-artifact" ||
+ evidence.confidence !== "derived"
+ )
+ throw new TypeError(
+ "JavaScript application Evidence authority or confidence is invalid",
+ );
+ const result = javascriptApplicationAnalysisResultSchema.parse(
+ evidence.normalized_result,
+ );
+ analyzeJavaScriptApplicationInputSchema.parse({
+ input_path: result.input_path,
+ ...evidence.parameters,
+ });
+ assertApplicationSubject(evidence, result);
+ return {
+ evidence,
+ graph: result.graph,
+ kind: "static-application",
+ rootArtifactSha256: result.root_artifact_sha256,
+ };
+};
+
+const staticRuntimeSource = (
+ evidence: Evidence,
+): ApplicationGraphEvidenceSource => {
+ if (
+ evidence.authority !== "analyst-inference" ||
+ evidence.confidence !== "inferred"
+ )
+ throw new TypeError(
+ "JavaScript runtime reconciliation Evidence authority or confidence is invalid",
+ );
+ const result = javascriptRuntimeReconciliationResultSchema.parse(
+ evidence.normalized_result,
+ );
+ if (
+ result.evidence_links.some(
+ (evidenceId) => !evidence.evidence_links.includes(evidenceId),
+ )
+ )
+ throw new TypeError(
+ "Runtime reconciliation result references Evidence outside its envelope",
+ );
+ const applicationLayer = result.static_layers.find(
+ ({ role }) => role === "application",
+ );
+ if (applicationLayer === undefined)
+ throw new TypeError("Runtime reconciliation application layer is missing");
+ return {
+ evidence,
+ graph: result.graph,
+ kind: "static-runtime-reconciliation",
+ rootArtifactSha256: applicationLayer.root_artifact_sha256,
+ };
+};
+
+const assertApplicationSubject = (
+ evidence: Evidence,
+ result: JavaScriptApplicationAnalysisResult,
+): void => {
+ if (
+ evidence.subject === null ||
+ evidence.subject.digest.sha256 !== result.root_artifact_sha256 ||
+ evidence.subject.format !== result.format
+ )
+ throw new TypeError(
+ "JavaScript application Evidence subject does not match its result",
+ );
+};
+
+const providerMatches = (
+ evidence: Evidence,
+ provider: {
+ readonly id: string;
+ readonly name: string;
+ readonly version: string;
+ },
+): boolean =>
+ evidence.provider.id === provider.id &&
+ evidence.provider.name === provider.name &&
+ evidence.provider.version === provider.version;
+
+/** Parse unique, artifact-bound Evidence that may extend a native handoff. */
+export const parseNativeApplicationEvidence = (
+ inputs: readonly unknown[],
+): Evidence[] => {
+ const parsed = inputs.map((input) => parseEvidence(input));
+ if (parsed.some(({ subject }) => subject === null))
+ throw new TypeError("Native handoff Evidence requires an artifact subject");
+ const ids = parsed.map(({ evidence_id: id }) => id);
+ if (new Set(ids).size !== ids.length)
+ throw new TypeError("Native handoff Evidence must be unique");
+ return parsed;
+};
diff --git a/src/application/JavaScriptApplicationWorkflowEvidence.ts b/src/application/JavaScriptApplicationWorkflowEvidence.ts
new file mode 100644
index 000000000..87a5734b2
--- /dev/null
+++ b/src/application/JavaScriptApplicationWorkflowEvidence.ts
@@ -0,0 +1,45 @@
+import {
+ createEvidence,
+ type Evidence,
+ type EvidenceObservation,
+} from "../domain/evidence.js";
+import type { ApplicationVersionComparisonResult } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
+import type { ApplicationFeatureTraceResult } from "../domain/javascriptFeatureTraceSchemas.js";
+import { jsonValueSchema } from "../domain/jsonValue.js";
+import { JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER } from "./InvestigationProviders.js";
+
+/** Create derived Evidence for one bounded application-graph feature trace. */
+export const createApplicationFeatureTraceEvidence = (
+ parameters: EvidenceObservation["parameters"],
+ result: ApplicationFeatureTraceResult,
+): Evidence =>
+ createEvidence(undefined, JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER, {
+ predicateType: "rea.application-feature-trace/v1",
+ operation: "trace_application_feature",
+ parameters,
+ result: jsonValueSchema.parse(result),
+ rawResult: null,
+ confidence: "inferred",
+ authority: "analyst-inference",
+ environment: null,
+ limitations: result.limitations,
+ evidenceLinks: result.evidence_links,
+ });
+
+/** Create derived Evidence for one tiered application version comparison. */
+export const createApplicationVersionComparisonEvidence = (
+ parameters: EvidenceObservation["parameters"],
+ result: ApplicationVersionComparisonResult,
+): Evidence =>
+ createEvidence(undefined, JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER, {
+ predicateType: "rea.application-version-comparison/v1",
+ operation: "compare_application_versions",
+ parameters,
+ result: jsonValueSchema.parse(result),
+ rawResult: null,
+ confidence: "inferred",
+ authority: "analyst-inference",
+ environment: null,
+ limitations: result.limitations,
+ evidenceLinks: result.evidence_links,
+ });
diff --git a/src/application/JavaScriptApplicationWorkflowService.ts b/src/application/JavaScriptApplicationWorkflowService.ts
new file mode 100644
index 000000000..1c94a3447
--- /dev/null
+++ b/src/application/JavaScriptApplicationWorkflowService.ts
@@ -0,0 +1,121 @@
+import { z } from "zod";
+
+import {
+ AnalysisInputError,
+ AnalysisProtocolError,
+ type AnalysisError,
+} from "../domain/errors.js";
+import type { Evidence } from "../domain/evidence.js";
+import { compareJavaScriptApplicationVersions } from "../domain/javascriptApplicationVersionComparison.js";
+import { compareApplicationVersionsInputSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
+import { traceApplicationFeature } from "../domain/javascriptFeatureTrace.js";
+import { traceApplicationFeatureInputSchema } from "../domain/javascriptFeatureTraceSchemas.js";
+import { err, ok, type Result } from "../domain/result.js";
+import {
+ parseApplicationGraphEvidence,
+ parseNativeApplicationEvidence,
+} from "./JavaScriptApplicationEvidenceGraph.js";
+import {
+ createApplicationFeatureTraceEvidence,
+ createApplicationVersionComparisonEvidence,
+} from "./JavaScriptApplicationWorkflowEvidence.js";
+
+/** Authenticate Evidence and derive one bounded cross-layer feature trace. */
+export const traceApplicationFeatureEvidence = (
+ rawInput: unknown,
+): Result => {
+ const operation = "trace_application_feature";
+ const parsed = traceApplicationFeatureInputSchema.safeParse(rawInput);
+ if (!parsed.success) return err(new AnalysisInputError(operation));
+ try {
+ const source = parseApplicationGraphEvidence(parsed.data.application);
+ const nativeEvidence = parseNativeApplicationEvidence(
+ parsed.data.native_observations,
+ );
+ const result = traceApplicationFeature({
+ sourceEvidenceId: source.evidence.evidence_id,
+ graph: source.graph,
+ nativeEvidence,
+ seed: parsed.data.seed,
+ direction: parsed.data.direction,
+ limits: parsed.data.limits,
+ });
+ return ok(
+ createApplicationFeatureTraceEvidence(
+ {
+ application_evidence_id: source.evidence.evidence_id,
+ native_evidence_ids: nativeEvidence.map(({ evidence_id: id }) => id),
+ seed: parsed.data.seed,
+ direction: parsed.data.direction,
+ limits: parsed.data.limits,
+ },
+ result,
+ ),
+ );
+ } catch (cause: unknown) {
+ return workflowFailure(operation, cause);
+ }
+};
+
+/** Authenticate both graphs and derive a tiered cross-version change graph. */
+export const compareApplicationVersionsEvidence = (
+ rawInput: unknown,
+): Result => {
+ const operation = "compare_application_versions";
+ const parsed = compareApplicationVersionsInputSchema.safeParse(rawInput);
+ if (!parsed.success) return err(new AnalysisInputError(operation));
+ try {
+ const left = parseApplicationGraphEvidence(parsed.data.left);
+ const right = parseApplicationGraphEvidence(parsed.data.right);
+ const leftNative = parseNativeApplicationEvidence(
+ parsed.data.left_native_observations,
+ );
+ const rightNative = parseNativeApplicationEvidence(
+ parsed.data.right_native_observations,
+ );
+ const result = compareJavaScriptApplicationVersions({
+ left: {
+ evidenceId: left.evidence.evidence_id,
+ rootArtifactSha256: left.rootArtifactSha256,
+ graph: left.graph,
+ },
+ right: {
+ evidenceId: right.evidence.evidence_id,
+ rootArtifactSha256: right.rootArtifactSha256,
+ graph: right.graph,
+ },
+ leftNativeEvidence: leftNative,
+ rightNativeEvidence: rightNative,
+ limits: parsed.data.limits,
+ });
+ return ok(
+ createApplicationVersionComparisonEvidence(
+ {
+ left_evidence_id: left.evidence.evidence_id,
+ right_evidence_id: right.evidence.evidence_id,
+ left_native_evidence_ids: leftNative.map(({ evidence_id: id }) => id),
+ right_native_evidence_ids: rightNative.map(
+ ({ evidence_id: id }) => id,
+ ),
+ limits: parsed.data.limits,
+ },
+ result,
+ ),
+ );
+ } catch (cause: unknown) {
+ return workflowFailure(operation, cause);
+ }
+};
+
+const workflowFailure = (
+ operation: string,
+ cause: unknown,
+): Result =>
+ err(
+ cause instanceof z.ZodError || cause instanceof TypeError
+ ? new AnalysisInputError(operation)
+ : new AnalysisProtocolError(
+ "JavaScript application workflow produced an invalid result",
+ { cause },
+ ),
+ );
diff --git a/src/cli.ts b/src/cli.ts
index 307ef3ae9..89c2dfc91 100644
--- a/src/cli.ts
+++ b/src/cli.ts
@@ -34,6 +34,7 @@ import { registerPolicyCommands } from "./cliPolicyCommands.js";
import { registerBrowserCommands } from "./cliBrowserCommands.js";
import { registerAdvancedBrowserCommands } from "./cliBrowserAdvancedCommands.js";
import { registerElectronCommands } from "./cliElectronCommands.js";
+import { registerApplicationCommands } from "./cliApplicationCommands.js";
import { CLI_COMMANDS } from "./cliCommandNames.js";
import {
analysisProviderSelectorSchema,
@@ -89,6 +90,7 @@ export const createCli = (): ReturnType => {
registerBrowserCommands(cli, logger);
registerAdvancedBrowserCommands(cli, logger);
registerElectronCommands(cli, logger);
+ registerApplicationCommands(cli, logger);
return cli;
};
diff --git a/src/cliApplicationCommands.ts b/src/cliApplicationCommands.ts
new file mode 100644
index 000000000..013b21d2e
--- /dev/null
+++ b/src/cliApplicationCommands.ts
@@ -0,0 +1,68 @@
+import { Cli, z } from "incur";
+
+import {
+ compareApplicationVersionsEvidence,
+ traceApplicationFeatureEvidence,
+} from "./application/JavaScriptApplicationWorkflowService.js";
+import { CLI_COMMANDS } from "./cliCommandNames.js";
+import { parseCliJsonInput } from "./cliJsonInput.js";
+import { logCliCommand } from "./cliLogging.js";
+import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
+import type { JsonValue } from "./domain/jsonValue.js";
+import type { Logger } from "./logger.js";
+
+/** Register CLI equivalents of provider-neutral application graph workflows. */
+export const registerApplicationCommands = (
+ cli: ReturnType,
+ logger: Logger,
+): void => {
+ registerJsonCommand(
+ cli,
+ logger,
+ CLI_COMMANDS.traceApplicationFeature,
+ "Trace a typed seed through authenticated application Evidence JSON",
+ traceApplicationFeatureEvidence,
+ );
+ registerJsonCommand(
+ cli,
+ logger,
+ CLI_COMMANDS.compareApplicationVersions,
+ "Compare two authenticated JavaScript Application Graph versions",
+ compareApplicationVersionsEvidence,
+ );
+};
+
+const registerJsonCommand = (
+ cli: ReturnType,
+ logger: Logger,
+ name: string,
+ description: string,
+ workflow: (
+ input: unknown,
+ ) =>
+ | { readonly ok: true; readonly value: JsonValue }
+ | { readonly ok: false; readonly error: Error },
+): void => {
+ cli.command(name, {
+ description,
+ args: z.object({
+ inputJson: z.string().describe("Inline workflow JSON or JSON file path"),
+ }),
+ run: ({ args }) =>
+ logCliCommand(logger, name, async () => {
+ const input = await parseCliJsonInput(args.inputJson, name);
+ if (!input.ok) return input.error;
+ const result = workflow(input.value);
+ return result.ok
+ ? result.value
+ : {
+ error: "Application workflow failed",
+ ...projectAnalysisError(
+ result.error instanceof AnalysisInputError
+ ? result.error
+ : new AnalysisInputError(name),
+ ),
+ };
+ }),
+ });
+};
diff --git a/src/cliCommandNames.ts b/src/cliCommandNames.ts
index a99d59af2..a24d57973 100644
--- a/src/cliCommandNames.ts
+++ b/src/cliCommandNames.ts
@@ -40,6 +40,8 @@ export const CLI_COMMANDS = Object.freeze({
inspectElectronPage: "inspect-electron-page",
analyzeJavaScriptApplication: "analyze-javascript-application",
reconcileJavaScriptRuntime: "reconcile-javascript-runtime",
+ traceApplicationFeature: "trace-application-feature",
+ compareApplicationVersions: "compare-application-versions",
});
/** Ordered primary CLI inventory; aliases are intentionally excluded. */
diff --git a/src/cliElectronCommands.ts b/src/cliElectronCommands.ts
index 296327c01..03f7aac6e 100644
--- a/src/cliElectronCommands.ts
+++ b/src/cliElectronCommands.ts
@@ -1,5 +1,3 @@
-import { readFile, stat } from "node:fs/promises";
-
import { Cli, z } from "incur";
import {
@@ -21,8 +19,7 @@ import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
import type { JsonValue } from "./domain/jsonValue.js";
import type { Logger } from "./logger.js";
import { CLI_COMMANDS } from "./cliCommandNames.js";
-
-const MAX_RECONCILIATION_INPUT_BYTES = 64 * 1_024 * 1_024;
+import { parseCliJsonInput } from "./cliJsonInput.js";
const scopeOptions = {
allowedFileRoots: z
@@ -61,7 +58,10 @@ const registerJavaScriptRuntimeReconciliationCommand = (
logger,
CLI_COMMANDS.reconcileJavaScriptRuntime,
async () => {
- const input = await parseJsonInput(args.inputJson);
+ const input = await parseCliJsonInput(
+ args.inputJson,
+ "reconcile_javascript_runtime",
+ );
if (!input.ok) return input.error;
const result = reconcileJavaScriptRuntimeEvidence(input.value);
return result.ok ? result.value : cliError(result.error);
@@ -266,60 +266,6 @@ const electronContext = async () => {
const inputError = (operation: string): JsonValue =>
cliError(new AnalysisInputError(operation));
-const parseJson = (value: string): unknown => {
- try {
- return JSON.parse(value);
- } catch {
- return undefined;
- }
-};
-
-const parseJsonInput = async (
- value: string,
-): Promise<
- | { readonly ok: true; readonly value: unknown }
- | { readonly ok: false; readonly error: JsonValue }
-> => {
- const inline = parseJson(value);
- if (inline !== undefined) return { ok: true, value: inline };
- if (["{", "["].includes(value.trimStart()[0] ?? ""))
- return {
- ok: false,
- error: inputError("reconcile_javascript_runtime"),
- };
- try {
- const metadata = await stat(value);
- if (!metadata.isFile()) return jsonFileError(value, "not-file");
- if (metadata.size > MAX_RECONCILIATION_INPUT_BYTES)
- return jsonFileError(value, "too-large");
- const bytes = await readFile(value);
- if (bytes.byteLength > MAX_RECONCILIATION_INPUT_BYTES)
- return jsonFileError(value, "too-large");
- const parsed = parseJson(bytes.toString("utf8"));
- return parsed === undefined
- ? jsonFileError(value, "invalid-json")
- : { ok: true, value: parsed };
- } catch {
- return jsonFileError(value, "read-failed");
- }
-};
-
-const jsonFileError = (
- path: string,
- reason: "not-file" | "too-large" | "invalid-json" | "read-failed",
-) => ({
- ok: false as const,
- error: {
- error: "Electron analysis failed",
- ...projectAnalysisError(
- new AnalysisInputError("reconcile_javascript_runtime"),
- ),
- input_path: path,
- input_reason: reason,
- maximum_input_bytes: MAX_RECONCILIATION_INPUT_BYTES,
- },
-});
-
const cliError = (
error: Parameters[0],
): JsonValue => ({
diff --git a/src/cliJsonInput.ts b/src/cliJsonInput.ts
new file mode 100644
index 000000000..deca5b7bc
--- /dev/null
+++ b/src/cliJsonInput.ts
@@ -0,0 +1,63 @@
+import { readFile, stat } from "node:fs/promises";
+
+import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
+import type { JsonValue } from "./domain/jsonValue.js";
+
+const MAX_JSON_INPUT_BYTES = 64 * 1_024 * 1_024;
+
+/** Parse bounded inline JSON or one bounded local JSON file for a CLI workflow. */
+export const parseCliJsonInput = async (
+ value: string,
+ operation: string,
+): Promise<
+ | { readonly ok: true; readonly value: unknown }
+ | { readonly ok: false; readonly error: JsonValue }
+> => {
+ const inline = parseJson(value);
+ if (inline !== undefined) return { ok: true, value: inline };
+ if (["{", "["].includes(value.trimStart()[0] ?? ""))
+ return { ok: false, error: inputError(operation) };
+ try {
+ const metadata = await stat(value);
+ if (!metadata.isFile()) return jsonFileError(value, operation, "not-file");
+ if (metadata.size > MAX_JSON_INPUT_BYTES)
+ return jsonFileError(value, operation, "too-large");
+ const bytes = await readFile(value);
+ if (bytes.byteLength > MAX_JSON_INPUT_BYTES)
+ return jsonFileError(value, operation, "too-large");
+ const parsed = parseJson(bytes.toString("utf8"));
+ return parsed === undefined
+ ? jsonFileError(value, operation, "invalid-json")
+ : { ok: true, value: parsed };
+ } catch {
+ return jsonFileError(value, operation, "read-failed");
+ }
+};
+
+const parseJson = (value: string): unknown => {
+ try {
+ return JSON.parse(value);
+ } catch {
+ return undefined;
+ }
+};
+
+const inputError = (operation: string): JsonValue => ({
+ error: "Application workflow failed",
+ ...projectAnalysisError(new AnalysisInputError(operation)),
+});
+
+const jsonFileError = (
+ path: string,
+ operation: string,
+ reason: "not-file" | "too-large" | "invalid-json" | "read-failed",
+) => ({
+ ok: false as const,
+ error: {
+ error: "Application workflow failed",
+ ...projectAnalysisError(new AnalysisInputError(operation)),
+ input_path: path,
+ input_reason: reason,
+ maximum_input_bytes: MAX_JSON_INPUT_BYTES,
+ },
+});
diff --git a/src/contracts/applicationToolContracts.ts b/src/contracts/applicationToolContracts.ts
new file mode 100644
index 000000000..68fdadc5f
--- /dev/null
+++ b/src/contracts/applicationToolContracts.ts
@@ -0,0 +1,65 @@
+import {
+ applicationVersionComparisonResultSchema,
+ compareApplicationVersionsInputSchema,
+} from "../domain/javascriptApplicationVersionComparisonSchemas.js";
+import {
+ applicationFeatureTraceResultSchema,
+ traceApplicationFeatureInputSchema,
+} from "../domain/javascriptFeatureTraceSchemas.js";
+import { evidenceEnvelopeSchema } from "../domain/evidence.js";
+import type { ToolContract } from "./toolContracts.js";
+import {
+ JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE,
+ JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+} from "./javascriptApplicationWorkflowExamples.js";
+
+const traceOutputSchema = evidenceEnvelopeSchema
+ .omit({ normalized_result: true })
+ .extend({ normalized_result: applicationFeatureTraceResultSchema });
+const comparisonOutputSchema = evidenceEnvelopeSchema
+ .omit({ normalized_result: true })
+ .extend({ normalized_result: applicationVersionComparisonResultSchema });
+
+/** Provider-neutral graph workflow contracts shared by MCP and CLI adapters. */
+export const APPLICATION_TOOL_CONTRACTS = [
+ {
+ name: "trace_application_feature",
+ description:
+ "Trace a typed literal seed through an authenticated JavaScript Application Graph with explicit direction, depth, node, edge, and path bounds. Original static, native, passive-runtime, inferred, and unknown authorities remain distinct; native addon handoffs never open a provider or execute the application.",
+ kind: "application",
+ inputSchema: traceApplicationFeatureInputSchema,
+ outputSchema: traceOutputSchema,
+ annotations: {
+ readOnlyHint: true,
+ destructiveHint: false,
+ idempotentHint: true,
+ openWorldHint: false,
+ },
+ examples: [
+ {
+ title: "Trace one module seed through a retained application graph",
+ input: JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+ },
+ ],
+ },
+ {
+ name: "compare_application_versions",
+ description:
+ "Compare two authenticated JavaScript Application Graph versions using unique-only exact digest, module source digest, source-map identity, structural fingerprint, and non-module semantic-key tiers. Reports added, removed, changed, ambiguous, and unknown entities plus a bounded changed_from graph without fuzzy or module-ordinal pairing.",
+ kind: "application",
+ inputSchema: compareApplicationVersionsInputSchema,
+ outputSchema: comparisonOutputSchema,
+ annotations: {
+ readOnlyHint: true,
+ destructiveHint: false,
+ idempotentHint: true,
+ openWorldHint: false,
+ },
+ examples: [
+ {
+ title: "Compare authenticated static and reconciled application graphs",
+ input: JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE,
+ },
+ ],
+ },
+] as const satisfies readonly ToolContract[];
diff --git a/src/contracts/javascriptApplicationWorkflowExamples.ts b/src/contracts/javascriptApplicationWorkflowExamples.ts
new file mode 100644
index 000000000..f15083b92
--- /dev/null
+++ b/src/contracts/javascriptApplicationWorkflowExamples.ts
@@ -0,0 +1,64 @@
+import { createEvidence } from "../domain/evidence.js";
+import { reconcileJavaScriptRuntime } from "../domain/javascriptRuntimeReconciliation.js";
+import {
+ JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE,
+ JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE,
+} from "./javascriptRuntimeReconciliationExample.js";
+
+const reconciliation = reconcileJavaScriptRuntime(
+ JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE,
+);
+const reconciliationEvidence = createEvidence(
+ undefined,
+ {
+ id: "rea-javascript-runtime-reconciliation",
+ name: "REA JavaScript runtime reconciliation",
+ version: "1",
+ },
+ {
+ predicateType: "rea.javascript-runtime-reconciliation/v1",
+ operation: "reconcile_javascript_runtime",
+ parameters: {
+ static_layers:
+ JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE.static_layers.map(
+ ({ role, analysis }) => ({
+ role,
+ evidence_id: analysis.evidence_id,
+ runtime_mappings: [],
+ }),
+ ),
+ runtime_evidence_ids:
+ JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE.runtime_observations.map(
+ ({ evidence_id: id }) => id,
+ ),
+ limits: {
+ max_runtime_entities: 10_000,
+ max_reconciliation_items: 20_000,
+ max_static_load_states: 20_000,
+ },
+ },
+ result: reconciliation,
+ confidence: "inferred",
+ authority: "analyst-inference",
+ limitations: reconciliation.limitations,
+ evidenceLinks: reconciliation.evidence_links,
+ },
+);
+
+/** Valid public trace request without proprietary artifacts. */
+export const JAVASCRIPT_FEATURE_TRACE_EXAMPLE = {
+ application: JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE,
+ seed: {
+ kind: "module" as const,
+ value: "renderer.js",
+ match: "exact" as const,
+ case_sensitive: false,
+ },
+ direction: "both" as const,
+};
+
+/** Valid static/runtime graph pair demonstrating comparison authority. */
+export const JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE = {
+ left: JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE,
+ right: reconciliationEvidence,
+};
diff --git a/src/contracts/javascriptRuntimeReconciliationExample.ts b/src/contracts/javascriptRuntimeReconciliationExample.ts
index f3529b7e1..6f9320256 100644
--- a/src/contracts/javascriptRuntimeReconciliationExample.ts
+++ b/src/contracts/javascriptRuntimeReconciliationExample.ts
@@ -132,6 +132,9 @@ const staticEvidence = createEvidence(
},
);
+/** Minimal valid static application Evidence for graph workflow examples. */
+export const JAVASCRIPT_APPLICATION_EVIDENCE_EXAMPLE = staticEvidence;
+
const runtimeEvidence = createEvidence(
undefined,
{
diff --git a/src/contracts/promptContracts.ts b/src/contracts/promptContracts.ts
index 1a7bb237b..b74fd2c6e 100644
--- a/src/contracts/promptContracts.ts
+++ b/src/contracts/promptContracts.ts
@@ -114,9 +114,13 @@ export const PROMPT_CONTRACTS = [
},
steps: [
{
- tools: ["binary_session", "open_binary"],
+ tools: [
+ "binary_session",
+ "open_binary",
+ "analyze_javascript_application",
+ ],
instruction:
- "Inspect provider availability and effects first. Open target_path only when no matching target is active.",
+ "Inspect provider availability and effects first. For an approved JavaScript/Electron artifact, reconstruct its application graph without execution; otherwise open target_path only when no matching target is active.",
},
{
tools: ["list_documents", "set_current_document", "binary_overview"],
@@ -128,6 +132,11 @@ export const PROMPT_CONTRACTS = [
instruction:
"Search in literal mode first, follow every continuation needed for the stated scope, and resolve selected procedures to canonical addresses.",
},
+ {
+ tools: ["trace_application_feature"],
+ instruction:
+ "When authenticated application-graph Evidence exists, trace a typed literal route, API, channel, module, string, or native export through a bounded cross-layer subgraph before native localization.",
+ },
{
tools: [
"analyze_function",
@@ -179,6 +188,15 @@ export const PROMPT_CONTRACTS = [
instruction:
"Inventory each target independently before extraction. Follow nodes, occurrences, and edges to completion and retain every Evidence page for each manifest.",
},
+ {
+ tools: [
+ "analyze_javascript_application",
+ "reconcile_javascript_runtime",
+ "compare_application_versions",
+ ],
+ instruction:
+ "For JavaScript/Electron versions, reconstruct each approved artifact independently, optionally reconcile separately retained passive runtime Evidence, then compare authenticated graphs with unique-only identity tiers. Keep ambiguous and incomplete matches unknown.",
+ },
{
tools: ["export_evidence_bundle", "compare_artifacts"],
instruction:
diff --git a/src/contracts/toolContractTypes.ts b/src/contracts/toolContractTypes.ts
index e71312e80..3481eaf6d 100644
--- a/src/contracts/toolContractTypes.ts
+++ b/src/contracts/toolContractTypes.ts
@@ -24,6 +24,7 @@ export type ToolKind =
| "artifact-provider"
| "browser-provider"
| "electron-provider"
+ | "application"
| "session";
/** Single source of truth for a public MCP tool. */
diff --git a/src/contracts/toolContracts.ts b/src/contracts/toolContracts.ts
index cedf50b7a..30832c5d5 100644
--- a/src/contracts/toolContracts.ts
+++ b/src/contracts/toolContracts.ts
@@ -28,6 +28,7 @@ import { NATIVE_TOOL_CONTRACTS } from "./nativeToolContracts.js";
import { ARTIFACT_TOOL_CONTRACTS } from "./artifactToolContracts.js";
import { BROWSER_TOOL_CONTRACTS } from "./browserToolContracts.js";
import { ELECTRON_TOOL_CONTRACTS } from "./electronToolContracts.js";
+import { APPLICATION_TOOL_CONTRACTS } from "./applicationToolContracts.js";
import {
closeBinaryInputSchema,
openBinaryInputSchema,
@@ -526,5 +527,6 @@ export const TOOL_CONTRACTS = [
...ARTIFACT_TOOL_CONTRACTS,
...BROWSER_TOOL_CONTRACTS,
...ELECTRON_TOOL_CONTRACTS,
+ ...APPLICATION_TOOL_CONTRACTS,
...SESSION_TOOL_CONTRACTS,
] as const;
diff --git a/src/domain/javascriptApplicationChangeGraph.ts b/src/domain/javascriptApplicationChangeGraph.ts
new file mode 100644
index 000000000..72c550fe0
--- /dev/null
+++ b/src/domain/javascriptApplicationChangeGraph.ts
@@ -0,0 +1,324 @@
+import {
+ compareCodePoints,
+ createJavaScriptApplicationEdge,
+ createJavaScriptApplicationGraph,
+ createJavaScriptApplicationNode,
+ type ApplicationEdge,
+ type ApplicationGraphEvidence,
+ type ApplicationNode,
+ type JavaScriptApplicationGraph,
+} from "./javascriptApplicationGraph.js";
+import type {
+ ApplicationVersionComparisonItem,
+ CompareApplicationVersionsInput,
+} from "./javascriptApplicationVersionComparisonSchemas.js";
+
+interface ChangeGraphInput {
+ readonly left: JavaScriptApplicationGraph;
+ readonly right: JavaScriptApplicationGraph;
+ readonly leftEvidenceId: string;
+ readonly rightEvidenceId: string;
+ readonly items: readonly ApplicationVersionComparisonItem[];
+ readonly omittedComparisonItems: number;
+ readonly limits: CompareApplicationVersionsInput["limits"];
+}
+
+/** Bounded cross-version graph and exact projection omission counts. */
+export interface ApplicationChangeGraphProjection {
+ readonly graph: JavaScriptApplicationGraph;
+ readonly omittedNodes: number;
+ readonly omittedEdges: number;
+ readonly omittedObservations: number;
+}
+
+/** Merge compared nodes and add inferred right-to-left changed_from edges. */
+export const buildJavaScriptApplicationChangeGraph = (
+ input: ChangeGraphInput,
+): ApplicationChangeGraphProjection => {
+ const allNodes = nodeCandidates(input);
+ const preferredRoots = uniqueSorted([
+ ...input.right.root_node_ids,
+ ...input.left.root_node_ids,
+ ]).filter((nodeId) => allNodes.has(nodeId));
+ const orderedNodeIds = uniqueSorted([
+ ...preferredRoots,
+ ...input.items.flatMap(({ left_node_id: left, right_node_id: right }) => [
+ ...(right === null ? [] : [right]),
+ ...(left === null ? [] : [left]),
+ ]),
+ ]);
+ const retainedIds = orderedNodeIds.slice(0, input.limits.max_graph_nodes);
+ const retained = new Set(retainedIds);
+ const merged = mergeNodes(
+ retainedIds.flatMap((nodeId) => allNodes.get(nodeId) ?? []),
+ );
+ const sourceEdges = uniqueEdges([
+ ...input.left.edges,
+ ...input.right.edges,
+ ]).filter(
+ ({ source_node_id: source, target_node_id: target }) =>
+ retained.has(source) && retained.has(target),
+ );
+ const comparisonEdges = input.items.flatMap((item) =>
+ changedFromEdge(item, input, retained),
+ );
+ const candidateEdges = uniqueEdges([...sourceEdges, ...comparisonEdges]);
+ const edges = candidateEdges.slice(0, input.limits.max_graph_edges);
+ const omittedNodes = Math.max(0, orderedNodeIds.length - retainedIds.length);
+ const omittedEdges = Math.max(0, candidateEdges.length - edges.length);
+ const graphOmissions =
+ omittedNodes + omittedEdges + merged.omittedObservations;
+ const rootNodeIds = preferredRoots
+ .filter((nodeId) => retained.has(nodeId))
+ .slice(0, 1_000);
+ const fallbackRoot = merged.nodes[0]?.node_id;
+ const graph = createJavaScriptApplicationGraph({
+ schema: "JavaScriptApplicationGraph",
+ schema_version: 1,
+ root_node_ids:
+ rootNodeIds.length > 0
+ ? rootNodeIds
+ : fallbackRoot === undefined
+ ? []
+ : [fallbackRoot],
+ nodes: merged.nodes,
+ edges,
+ coverage: changeGraphCoverage(input, graphOmissions),
+ limitations: uniqueSorted([
+ ...input.left.limitations.map((value) => `Left: ${value}`),
+ ...input.right.limitations.map((value) => `Right: ${value}`),
+ "changed_from edges are cross-version inferences and never promote structural or semantic matches to exact identity.",
+ "The change graph contains compared entities and their retained relationships; it is not an executable application.",
+ ...(graphOmissions === 0
+ ? []
+ : ["The change graph omitted content at explicit caller bounds."]),
+ ]),
+ });
+ return {
+ graph,
+ omittedNodes,
+ omittedEdges,
+ omittedObservations: merged.omittedObservations,
+ };
+};
+
+const nodeCandidates = (
+ input: ChangeGraphInput,
+): Map => {
+ const required = new Set([
+ ...input.left.root_node_ids,
+ ...input.right.root_node_ids,
+ ...input.items.flatMap(({ left_node_id: left, right_node_id: right }) => [
+ ...(left === null ? [] : [left]),
+ ...(right === null ? [] : [right]),
+ ]),
+ ]);
+ const output = new Map();
+ for (const node of [...input.left.nodes, ...input.right.nodes])
+ if (required.has(node.node_id))
+ output.set(node.node_id, [...(output.get(node.node_id) ?? []), node]);
+ return output;
+};
+
+const changedFromEdge = (
+ item: ApplicationVersionComparisonItem,
+ input: ChangeGraphInput,
+ retained: ReadonlySet,
+): ApplicationEdge[] => {
+ const left = item.left_node_id;
+ const right = item.right_node_id;
+ if (
+ item.match.status !== "matched" ||
+ item.status === "unchanged" ||
+ left === null ||
+ right === null ||
+ left === right ||
+ !retained.has(left) ||
+ !retained.has(right)
+ )
+ return [];
+ const evidence = comparisonEvidence(item, input);
+ return [
+ createJavaScriptApplicationEdge({
+ source_node_id: right,
+ target_node_id: left,
+ relation: "changed_from",
+ properties: {
+ comparison_item_id: item.item_id,
+ status: item.status,
+ match_basis: item.match.basis,
+ match_confidence: item.match.confidence,
+ dimensions: item.dimensions,
+ },
+ evidence,
+ }),
+ ];
+};
+
+const comparisonEvidence = (
+ item: ApplicationVersionComparisonItem,
+ input: ChangeGraphInput,
+): ApplicationGraphEvidence => {
+ const right = input.right.nodes.find(
+ ({ node_id: id }) => id === item.right_node_id,
+ );
+ const left = input.left.nodes.find(
+ ({ node_id: id }) => id === item.left_node_id,
+ );
+ const source =
+ right?.observations[0]?.evidence ?? left?.observations[0]?.evidence;
+ const complete =
+ input.left.coverage.status === "complete" &&
+ input.right.coverage.status === "complete" &&
+ input.omittedComparisonItems === 0;
+ return {
+ authority: "cross-version-comparison",
+ state: "inferred",
+ confidence: item.match.confidence === "medium" ? "medium" : "high",
+ artifact: source?.artifact ?? {
+ available: false,
+ reason: "unresolved",
+ detail: "Compared node has no artifact-backed observation.",
+ },
+ location: source?.location ?? {
+ available: false,
+ reason: "unresolved",
+ detail: "Compared node has no actionable source location.",
+ },
+ extractor: {
+ name: "rea-application-version-comparison",
+ version: "1",
+ operation: "compare_application_versions",
+ executable_sha256: null,
+ },
+ coverage: complete
+ ? { status: "complete", truncated: false, omitted_count: 0, limits: [] }
+ : {
+ status: "partial",
+ truncated: input.omittedComparisonItems > 0,
+ omitted_count:
+ input.omittedComparisonItems > 0
+ ? input.omittedComparisonItems
+ : (source?.coverage.omitted_count ?? null),
+ limits:
+ input.omittedComparisonItems > 0
+ ? [
+ {
+ name: "max-comparison-items",
+ value: input.limits.max_comparison_items,
+ unit: "items",
+ },
+ ]
+ : [],
+ },
+ limitations: [
+ "Cross-version pairing is inferred from the stated match basis; changed_from does not prove runtime reachability.",
+ ...item.limitations,
+ ],
+ evidence_ids: [input.leftEvidenceId, input.rightEvidenceId],
+ };
+};
+
+const changeGraphCoverage = (
+ input: ChangeGraphInput,
+ graphOmissions: number,
+): JavaScriptApplicationGraph["coverage"] => {
+ const outputOmissions = graphOmissions + input.omittedComparisonItems;
+ if (outputOmissions > 0)
+ return {
+ status: "partial",
+ truncated: true,
+ omitted_count: outputOmissions,
+ limits: [
+ {
+ name: "max-comparison-items",
+ value: input.limits.max_comparison_items,
+ unit: "items",
+ },
+ {
+ name: "max-graph-nodes",
+ value: input.limits.max_graph_nodes,
+ unit: "items",
+ },
+ {
+ name: "max-graph-edges",
+ value: input.limits.max_graph_edges,
+ unit: "items",
+ },
+ ],
+ };
+ if (
+ input.left.coverage.status === "complete" &&
+ input.right.coverage.status === "complete"
+ )
+ return {
+ status: "complete",
+ truncated: false,
+ omitted_count: 0,
+ limits: [],
+ };
+ const counts = [
+ input.left.coverage.omitted_count,
+ input.right.coverage.omitted_count,
+ ];
+ return {
+ status: "partial",
+ truncated: false,
+ omitted_count: counts.every((value) => value !== null)
+ ? counts.reduce((total, value) => total + (value ?? 0), 0)
+ : null,
+ limits: [],
+ };
+};
+
+const mergeNodes = (
+ nodes: readonly ApplicationNode[],
+): {
+ readonly nodes: ApplicationNode[];
+ readonly omittedObservations: number;
+} => {
+ const groups = new Map();
+ for (const node of nodes)
+ groups.set(node.node_id, [...(groups.get(node.node_id) ?? []), node]);
+ let omittedObservations = 0;
+ const merged = [...groups.values()].map((group) => {
+ const first = group[0];
+ if (first === undefined)
+ throw new TypeError("Empty change-graph node group");
+ const observations = [
+ ...new Map(
+ group
+ .flatMap(({ observations: values }) => values)
+ .map((observation) => [observation.observation_id, observation]),
+ ).values(),
+ ].sort((left, right) =>
+ compareCodePoints(left.observation_id, right.observation_id),
+ );
+ omittedObservations += Math.max(0, observations.length - 64);
+ return createJavaScriptApplicationNode({
+ kind: first.kind,
+ identity: first.identity,
+ observations: observations
+ .slice(0, 64)
+ .map(
+ ({ observation_id: _id, identifier_strategy: _strategy, ...value }) =>
+ value,
+ ),
+ });
+ });
+ return {
+ nodes: merged.sort((left, right) =>
+ compareCodePoints(left.node_id, right.node_id),
+ ),
+ omittedObservations,
+ };
+};
+
+const uniqueEdges = (edges: readonly ApplicationEdge[]): ApplicationEdge[] =>
+ [...new Map(edges.map((edge) => [edge.edge_id, edge])).values()].sort(
+ (left, right) => compareCodePoints(left.edge_id, right.edge_id),
+ );
+
+const uniqueSorted = (
+ values: readonly Value[],
+): Value[] => [...new Set(values)].sort(compareCodePoints);
diff --git a/src/domain/javascriptApplicationEvidenceSchemas.ts b/src/domain/javascriptApplicationEvidenceSchemas.ts
index 1cfd0db5a..cda8d6fea 100644
--- a/src/domain/javascriptApplicationEvidenceSchemas.ts
+++ b/src/domain/javascriptApplicationEvidenceSchemas.ts
@@ -24,6 +24,7 @@ const applicationEvidenceAuthoritySchema = z.enum([
"static-relationship-inference",
"passive-cdp-runtime",
"cross-layer-reconciliation",
+ "cross-version-comparison",
"controlled-replay",
"native-analysis-provider",
"historical-reference",
@@ -269,6 +270,15 @@ const checkAuthorityState = (
path: ["state"],
message: "Cross-layer reconciliation authority must remain inferred",
});
+ if (
+ evidence.authority === "cross-version-comparison" &&
+ evidence.state !== "inferred"
+ )
+ context.addIssue({
+ code: "custom",
+ path: ["state"],
+ message: "Cross-version comparison authority must remain inferred",
+ });
if (
evidence.authority === "unknown" &&
!["unknown", "unavailable"].includes(evidence.state)
diff --git a/src/domain/javascriptApplicationVersionComparison.ts b/src/domain/javascriptApplicationVersionComparison.ts
new file mode 100644
index 000000000..1576d4234
--- /dev/null
+++ b/src/domain/javascriptApplicationVersionComparison.ts
@@ -0,0 +1,187 @@
+import { createHash } from "node:crypto";
+
+import canonicalize from "canonicalize";
+
+import type { Evidence } from "./evidence.js";
+import { buildJavaScriptApplicationChangeGraph } from "./javascriptApplicationChangeGraph.js";
+import {
+ applicationVersionComparisonResultSchema,
+ type ApplicationVersionComparisonResult,
+ type CompareApplicationVersionsInput,
+} from "./javascriptApplicationVersionComparisonSchemas.js";
+import type { JavaScriptApplicationGraph } from "./javascriptApplicationGraph.js";
+import { compareCodePoints } from "./javascriptApplicationGraph.js";
+import { classifyJavaScriptApplicationVersions } from "./javascriptApplicationVersionItems.js";
+import { matchJavaScriptApplicationVersions } from "./javascriptApplicationVersionKeys.js";
+
+/** Pure inputs after application-layer Evidence authentication. */
+export interface ApplicationVersionComparisonProjectionInput {
+ readonly left: {
+ readonly evidenceId: string;
+ readonly rootArtifactSha256: string;
+ readonly graph: JavaScriptApplicationGraph;
+ };
+ readonly right: {
+ readonly evidenceId: string;
+ readonly rootArtifactSha256: string;
+ readonly graph: JavaScriptApplicationGraph;
+ };
+ readonly leftNativeEvidence: readonly Evidence[];
+ readonly rightNativeEvidence: readonly Evidence[];
+ readonly limits: CompareApplicationVersionsInput["limits"];
+}
+
+/** Compare application entities with ordered unique-only identity tiers. */
+export const compareJavaScriptApplicationVersions = (
+ input: ApplicationVersionComparisonProjectionInput,
+): ApplicationVersionComparisonResult => {
+ const matching = matchJavaScriptApplicationVersions(
+ input.left.graph.nodes,
+ input.right.graph.nodes,
+ );
+ const projection = classifyJavaScriptApplicationVersions(matching, {
+ leftGraph: input.left.graph,
+ rightGraph: input.right.graph,
+ leftEvidenceId: input.left.evidenceId,
+ rightEvidenceId: input.right.evidenceId,
+ leftNativeEvidence: input.leftNativeEvidence,
+ rightNativeEvidence: input.rightNativeEvidence,
+ maxCandidates: input.limits.max_candidate_nodes,
+ });
+ const items = projection.items.slice(0, input.limits.max_comparison_items);
+ const omittedComparisonItems = projection.items.length - items.length;
+ const changeGraph = buildJavaScriptApplicationChangeGraph({
+ left: input.left.graph,
+ right: input.right.graph,
+ leftEvidenceId: input.left.evidenceId,
+ rightEvidenceId: input.right.evidenceId,
+ items,
+ omittedComparisonItems,
+ limits: input.limits,
+ });
+ const evidenceLinks = uniqueSorted(
+ projection.items.flatMap(({ evidence_links: links }) => links),
+ );
+ const omissions = {
+ omitted_comparison_items: omittedComparisonItems,
+ omitted_candidate_references: projection.omittedCandidateReferences,
+ omitted_graph_nodes: changeGraph.omittedNodes,
+ omitted_graph_edges: changeGraph.omittedEdges,
+ omitted_graph_observations: changeGraph.omittedObservations,
+ };
+ const semantic = {
+ schema_version: 1 as const,
+ left: {
+ evidence_id: input.left.evidenceId,
+ graph_id: input.left.graph.graph_id,
+ root_artifact_sha256: input.left.rootArtifactSha256,
+ },
+ right: {
+ evidence_id: input.right.evidenceId,
+ graph_id: input.right.graph.graph_id,
+ root_artifact_sha256: input.right.rootArtifactSha256,
+ },
+ summary: summary(projection.items),
+ matching: matchingSummary(projection.items),
+ items,
+ graph: changeGraph.graph,
+ coverage: {
+ status: comparisonCoverageStatus(input, omissions),
+ left_graph_status: input.left.graph.coverage.status,
+ right_graph_status: input.right.graph.coverage.status,
+ ...omissions,
+ },
+ evidence_links: evidenceLinks,
+ limitations: comparisonLimitations(input, omissions),
+ };
+ return applicationVersionComparisonResultSchema.parse({
+ ...semantic,
+ comparison_id: `javc_${digestCanonical(semantic)}`,
+ });
+};
+
+const summary = (
+ items: readonly ApplicationVersionComparisonResult["items"][number][],
+): ApplicationVersionComparisonResult["summary"] => ({
+ unchanged: countStatus(items, "unchanged"),
+ added: countStatus(items, "added"),
+ removed: countStatus(items, "removed"),
+ changed: countStatus(items, "changed"),
+ unknown: countStatus(items, "unknown"),
+});
+
+const countStatus = (
+ items: readonly ApplicationVersionComparisonResult["items"][number][],
+ status: ApplicationVersionComparisonResult["items"][number]["status"],
+): number => items.filter((item) => item.status === status).length;
+
+const matchingSummary = (
+ items: readonly ApplicationVersionComparisonResult["items"][number][],
+): ApplicationVersionComparisonResult["matching"] => ({
+ exact_node_identity: countBasis(items, "exact-node-identity"),
+ exact_content_digest: countBasis(items, "exact-content-digest"),
+ exact_module_source_digest: countBasis(items, "exact-module-source-digest"),
+ source_map_identity: countBasis(items, "source-map-identity"),
+ structural_fingerprint: countBasis(items, "structural-fingerprint"),
+ semantic_key: countBasis(items, "semantic-key"),
+ ambiguous: items.filter(({ match }) => match.status === "ambiguous").length,
+ unmatched: items.filter(({ match }) => match.status === "unmatched").length,
+});
+
+const countBasis = (
+ items: readonly ApplicationVersionComparisonResult["items"][number][],
+ basis: ApplicationVersionComparisonResult["items"][number]["match"]["basis"],
+): number => items.filter(({ match }) => match.basis === basis).length;
+
+type ComparisonOmissions = ApplicationVersionComparisonResult["coverage"];
+
+const comparisonCoverageStatus = (
+ input: ApplicationVersionComparisonProjectionInput,
+ omissions: Omit<
+ ComparisonOmissions,
+ "status" | "left_graph_status" | "right_graph_status"
+ >,
+): ApplicationVersionComparisonResult["coverage"]["status"] =>
+ Object.values(omissions).some((value) => value > 0)
+ ? "truncated"
+ : input.left.graph.coverage.status === "complete" &&
+ input.right.graph.coverage.status === "complete"
+ ? "complete-within-inputs"
+ : "partial";
+
+const comparisonLimitations = (
+ input: ApplicationVersionComparisonProjectionInput,
+ omissions: Omit<
+ ComparisonOmissions,
+ "status" | "left_graph_status" | "right_graph_status"
+ >,
+): string[] =>
+ uniqueSorted([
+ "Application comparison never uses bundler module ordinals as persistent identity and performs no fuzzy pairing.",
+ "Exact digest equality proves byte identity only; source-map, structural-fingerprint, and semantic-key matches retain inferred confidence.",
+ "Minified names and chunk locations are not assumed stable across versions.",
+ "The comparison reads retained graphs and Evidence only; it does not execute either application.",
+ "Native Evidence is linked only by exact subject digest; provider snapshot reuse remains target/provider/profile exact.",
+ ...(input.left.graph.coverage.status === "complete" &&
+ input.right.graph.coverage.status === "complete"
+ ? []
+ : [
+ "At least one source graph is incomplete; unmatched entities on the opposite side remain unknown rather than added or removed.",
+ ]),
+ ...(Object.values(omissions).some((value) => value > 0)
+ ? ["Comparison output was truncated at explicit caller limits."]
+ : []),
+ ]);
+
+const digestCanonical = (value: unknown): string => {
+ const encoded = canonicalize(value);
+ if (encoded === undefined)
+ throw new TypeError(
+ "Application version comparison could not canonicalize data",
+ );
+ return createHash("sha256").update(encoded).digest("hex");
+};
+
+const uniqueSorted = (
+ values: readonly Value[],
+): Value[] => [...new Set(values)].sort(compareCodePoints);
diff --git a/src/domain/javascriptApplicationVersionComparisonSchemas.ts b/src/domain/javascriptApplicationVersionComparisonSchemas.ts
new file mode 100644
index 000000000..96ab87ea0
--- /dev/null
+++ b/src/domain/javascriptApplicationVersionComparisonSchemas.ts
@@ -0,0 +1,161 @@
+import { z } from "zod";
+
+import { evidenceSchema } from "./evidence.js";
+import { javascriptApplicationGraphSchema } from "./javascriptApplicationGraph.js";
+import { JAVASCRIPT_APPLICATION_NODE_KINDS } from "./javascriptApplicationGraphSchemas.js";
+
+const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
+const nodeIdSchema = z.string().regex(/^jag_node_[a-f0-9]{64}$/u);
+const boundedTextSchema = z.string().min(1).max(4_096);
+
+const comparisonLimitsSchema = z.strictObject({
+ max_comparison_items: z.number().int().min(1).max(50_000).default(20_000),
+ max_candidate_nodes: z.number().int().min(1).max(1_000).default(100),
+ max_graph_nodes: z.number().int().min(1).max(100_000).default(20_000),
+ max_graph_edges: z.number().int().min(1).max(200_000).default(40_000),
+});
+
+/** Two authenticated application versions and deterministic output bounds. */
+export const compareApplicationVersionsInputSchema = z
+ .strictObject({
+ left: evidenceSchema,
+ right: evidenceSchema,
+ left_native_observations: z.array(evidenceSchema).max(64).default([]),
+ right_native_observations: z.array(evidenceSchema).max(64).default([]),
+ limits: comparisonLimitsSchema.default({
+ max_comparison_items: 20_000,
+ max_candidate_nodes: 100,
+ max_graph_nodes: 20_000,
+ max_graph_edges: 40_000,
+ }),
+ unknown_registry_approved: z.literal(true).optional(),
+ })
+ .superRefine((input, context) => {
+ if (input.left.evidence_id === input.right.evidence_id)
+ context.addIssue({
+ code: "custom",
+ path: ["right"],
+ message: "Application version Evidence must be distinct",
+ });
+ for (const side of [
+ "left_native_observations",
+ "right_native_observations",
+ ] as const) {
+ const ids = input[side].map(({ evidence_id: id }) => id);
+ if (new Set(ids).size !== ids.length)
+ context.addIssue({
+ code: "custom",
+ path: [side],
+ message: "Native observations must be unique on each side",
+ });
+ }
+ });
+
+const applicationVersionMatchBasisSchema = z.enum([
+ "exact-node-identity",
+ "exact-content-digest",
+ "exact-module-source-digest",
+ "source-map-identity",
+ "structural-fingerprint",
+ "semantic-key",
+ "none",
+]);
+
+const comparisonItemSchema = z.strictObject({
+ item_id: z.string().regex(/^javc_item_[a-f0-9]{64}$/u),
+ status: z.enum(["unchanged", "added", "removed", "changed", "unknown"]),
+ node_kind: z.enum(JAVASCRIPT_APPLICATION_NODE_KINDS),
+ left_node_id: nodeIdSchema.nullable(),
+ right_node_id: nodeIdSchema.nullable(),
+ match: z.strictObject({
+ status: z.enum(["matched", "unmatched", "ambiguous"]),
+ basis: applicationVersionMatchBasisSchema,
+ confidence: z.enum(["exact", "high", "medium", "unknown"]),
+ candidate_left_node_ids: z.array(nodeIdSchema).max(1_000),
+ candidate_right_node_ids: z.array(nodeIdSchema).max(1_000),
+ }),
+ dimensions: z
+ .array(
+ z.enum([
+ "content",
+ "location",
+ "properties",
+ "relationships",
+ "availability",
+ "coverage",
+ ]),
+ )
+ .max(6),
+ evidence_links: z.array(evidenceIdSchema).min(2).max(130),
+ limitations: z.array(boundedTextSchema).max(100),
+});
+
+/** Tiered module/entity matching plus a bounded cross-version change graph. */
+export const applicationVersionComparisonResultSchema = z.strictObject({
+ schema_version: z.literal(1),
+ comparison_id: z.string().regex(/^javc_[a-f0-9]{64}$/u),
+ left: z.strictObject({
+ evidence_id: evidenceIdSchema,
+ graph_id: z.string().regex(/^jag_[a-f0-9]{64}$/u),
+ root_artifact_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
+ }),
+ right: z.strictObject({
+ evidence_id: evidenceIdSchema,
+ graph_id: z.string().regex(/^jag_[a-f0-9]{64}$/u),
+ root_artifact_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
+ }),
+ summary: z.strictObject({
+ unchanged: z.number().int().min(0),
+ added: z.number().int().min(0),
+ removed: z.number().int().min(0),
+ changed: z.number().int().min(0),
+ unknown: z.number().int().min(0),
+ }),
+ matching: z.strictObject({
+ exact_node_identity: z.number().int().min(0),
+ exact_content_digest: z.number().int().min(0),
+ exact_module_source_digest: z.number().int().min(0),
+ source_map_identity: z.number().int().min(0),
+ structural_fingerprint: z.number().int().min(0),
+ semantic_key: z.number().int().min(0),
+ ambiguous: z.number().int().min(0),
+ unmatched: z.number().int().min(0),
+ }),
+ items: z.array(comparisonItemSchema).max(50_000),
+ graph: javascriptApplicationGraphSchema,
+ coverage: z.strictObject({
+ status: z.enum(["complete-within-inputs", "partial", "truncated"]),
+ left_graph_status: z.enum([
+ "complete",
+ "partial",
+ "unknown",
+ "unavailable",
+ ]),
+ right_graph_status: z.enum([
+ "complete",
+ "partial",
+ "unknown",
+ "unavailable",
+ ]),
+ omitted_comparison_items: z.number().int().min(0),
+ omitted_candidate_references: z.number().int().min(0),
+ omitted_graph_nodes: z.number().int().min(0),
+ omitted_graph_edges: z.number().int().min(0),
+ omitted_graph_observations: z.number().int().min(0),
+ }),
+ evidence_links: z.array(evidenceIdSchema).min(2).max(130),
+ limitations: z.array(boundedTextSchema).max(1_000),
+});
+
+export type CompareApplicationVersionsInput = z.infer<
+ typeof compareApplicationVersionsInputSchema
+>;
+export type ApplicationVersionComparisonItem = z.infer<
+ typeof comparisonItemSchema
+>;
+export type ApplicationVersionComparisonResult = z.infer<
+ typeof applicationVersionComparisonResultSchema
+>;
+export type ApplicationVersionMatchBasis = z.infer<
+ typeof applicationVersionMatchBasisSchema
+>;
diff --git a/src/domain/javascriptApplicationVersionItems.ts b/src/domain/javascriptApplicationVersionItems.ts
new file mode 100644
index 000000000..07db36faa
--- /dev/null
+++ b/src/domain/javascriptApplicationVersionItems.ts
@@ -0,0 +1,371 @@
+import { createHash } from "node:crypto";
+
+import canonicalize from "canonicalize";
+
+import type { Evidence } from "./evidence.js";
+import {
+ compareCodePoints,
+ type ApplicationEdge,
+ type ApplicationNode,
+ type JavaScriptApplicationGraph,
+} from "./javascriptApplicationGraph.js";
+import type {
+ ApplicationVersionComparisonItem,
+ CompareApplicationVersionsInput,
+} from "./javascriptApplicationVersionComparisonSchemas.js";
+import type {
+ ApplicationVersionMatchingProjection,
+ ApplicationVersionNodePair,
+} from "./javascriptApplicationVersionKeys.js";
+
+/** All classified entities before the caller's item bound is applied. */
+export interface ApplicationVersionItemProjection {
+ readonly items: ApplicationVersionComparisonItem[];
+ readonly omittedCandidateReferences: number;
+}
+
+interface ItemContext {
+ readonly leftGraph: JavaScriptApplicationGraph;
+ readonly rightGraph: JavaScriptApplicationGraph;
+ readonly leftEvidenceId: string;
+ readonly rightEvidenceId: string;
+ readonly leftNativeEvidence: readonly Evidence[];
+ readonly rightNativeEvidence: readonly Evidence[];
+ readonly pairByLeft: ReadonlyMap;
+ readonly pairByRight: ReadonlyMap;
+ readonly maxCandidates: number;
+}
+
+/** Classify matched, unmatched, and ambiguous nodes without inventing absence. */
+export const classifyJavaScriptApplicationVersions = (
+ matching: ApplicationVersionMatchingProjection,
+ context: Omit & {
+ readonly maxCandidates: CompareApplicationVersionsInput["limits"]["max_candidate_nodes"];
+ },
+): ApplicationVersionItemProjection => {
+ const pairByLeft = new Map(
+ matching.pairs.map(({ left, right }) => [
+ left.node_id,
+ `pair:${left.node_id}:${right.node_id}`,
+ ]),
+ );
+ const pairByRight = new Map(
+ matching.pairs.map(({ left, right }) => [
+ right.node_id,
+ `pair:${left.node_id}:${right.node_id}`,
+ ]),
+ );
+ const fullContext: ItemContext = { ...context, pairByLeft, pairByRight };
+ let omittedCandidateReferences = 0;
+ const leftItems = matching.unmatchedLeft.map((node) => {
+ const candidates = matching.candidatesForLeft.get(node.node_id) ?? [];
+ omittedCandidateReferences += Math.max(
+ 0,
+ candidates.length - context.maxCandidates,
+ );
+ return unmatchedItem(
+ node,
+ "left",
+ candidates.slice(0, context.maxCandidates),
+ fullContext,
+ );
+ });
+ const rightItems = matching.unmatchedRight.map((node) => {
+ const candidates = matching.candidatesForRight.get(node.node_id) ?? [];
+ omittedCandidateReferences += Math.max(
+ 0,
+ candidates.length - context.maxCandidates,
+ );
+ return unmatchedItem(
+ node,
+ "right",
+ candidates.slice(0, context.maxCandidates),
+ fullContext,
+ );
+ });
+ return {
+ items: [
+ ...matching.pairs.map((pair) => matchedItem(pair, fullContext)),
+ ...leftItems,
+ ...rightItems,
+ ].sort((left, right) => compareCodePoints(left.item_id, right.item_id)),
+ omittedCandidateReferences,
+ };
+};
+
+const matchedItem = (
+ pair: ApplicationVersionNodePair,
+ context: ItemContext,
+): ApplicationVersionComparisonItem => {
+ const dimensions = changedDimensions(pair, context);
+ const complete = graphsComplete(context);
+ const observedChange = dimensions.some((dimension) =>
+ ["content", "location", "properties"].includes(dimension),
+ );
+ const status: ApplicationVersionComparisonItem["status"] =
+ observedChange || (complete && dimensions.length > 0)
+ ? "changed"
+ : complete
+ ? "unchanged"
+ : "unknown";
+ const finalDimensions =
+ status === "unknown" && !dimensions.includes("coverage")
+ ? [...dimensions, "coverage" as const]
+ : dimensions;
+ const semantic = {
+ status,
+ node_kind: pair.left.kind,
+ left_node_id: pair.left.node_id,
+ right_node_id: pair.right.node_id,
+ match: {
+ status: "matched" as const,
+ basis: pair.basis,
+ confidence: pair.confidence,
+ candidate_left_node_ids: [],
+ candidate_right_node_ids: [],
+ },
+ dimensions: finalDimensions,
+ evidence_links: itemEvidenceLinks(pair.left, pair.right, context),
+ limitations: pairLimitations(pair, status),
+ };
+ return itemWithId(semantic);
+};
+
+const unmatchedItem = (
+ node: ApplicationNode,
+ side: "left" | "right",
+ candidates: readonly string[],
+ context: ItemContext,
+): ApplicationVersionComparisonItem => {
+ const ambiguous = candidates.length > 0;
+ const oppositeComplete =
+ (side === "left" ? context.rightGraph : context.leftGraph).coverage
+ .status === "complete";
+ const status: ApplicationVersionComparisonItem["status"] = ambiguous
+ ? "unknown"
+ : oppositeComplete
+ ? side === "left"
+ ? "removed"
+ : "added"
+ : "unknown";
+ const semantic = {
+ status,
+ node_kind: node.kind,
+ left_node_id: side === "left" ? node.node_id : null,
+ right_node_id: side === "right" ? node.node_id : null,
+ match: {
+ status: ambiguous ? ("ambiguous" as const) : ("unmatched" as const),
+ basis: "none" as const,
+ confidence: "unknown" as const,
+ candidate_left_node_ids: side === "right" ? [...candidates] : [],
+ candidate_right_node_ids: side === "left" ? [...candidates] : [],
+ },
+ dimensions: [
+ "availability" as const,
+ ...(status === "unknown" && !ambiguous ? (["coverage"] as const) : []),
+ ],
+ evidence_links: itemEvidenceLinks(
+ side === "left" ? node : undefined,
+ side === "right" ? node : undefined,
+ context,
+ ),
+ limitations: [
+ ...(ambiguous
+ ? [
+ "Multiple nodes share the same permitted match key; no cross-version pair was selected.",
+ ]
+ : []),
+ ...(status === "unknown" && !ambiguous
+ ? [
+ "The opposite graph is incomplete, so an unmatched node cannot be classified as added or removed.",
+ ]
+ : []),
+ ],
+ };
+ return itemWithId(semantic);
+};
+
+const changedDimensions = (
+ pair: ApplicationVersionNodePair,
+ context: ItemContext,
+): ApplicationVersionComparisonItem["dimensions"] => {
+ const dimensions: ApplicationVersionComparisonItem["dimensions"] = [];
+ const leftContent = contentIdentity(pair.left);
+ const rightContent = contentIdentity(pair.right);
+ if (
+ leftContent !== null &&
+ rightContent !== null &&
+ leftContent !== rightContent
+ )
+ dimensions.push("content");
+ if (canonical(locations(pair.left)) !== canonical(locations(pair.right)))
+ dimensions.push("location");
+ if (canonical(properties(pair.left)) !== canonical(properties(pair.right)))
+ dimensions.push("properties");
+ if (
+ relationshipSignature(pair.left, "left", context) !==
+ relationshipSignature(pair.right, "right", context)
+ )
+ dimensions.push("relationships");
+ return dimensions;
+};
+
+const contentIdentity = (node: ApplicationNode): string | null => {
+ if (node.identity.strategy === "content-digest")
+ return `content:${node.identity.sha256}`;
+ if (node.kind === "javascript-module")
+ return stringProperty(node, "source_sha256");
+ if (
+ node.kind === "source-module" &&
+ node.identity.strategy === "source-map-original"
+ )
+ return node.identity.source_sha256;
+ return null;
+};
+
+const locations = (node: ApplicationNode) =>
+ node.observations
+ .map(({ evidence }) =>
+ evidence.location.available ? evidence.location.value : evidence.location,
+ )
+ .sort((left, right) =>
+ compareCodePoints(canonical(left), canonical(right)),
+ );
+
+const properties = (node: ApplicationNode) =>
+ node.observations
+ .map(({ label, properties: values }) => ({ label, properties: values }))
+ .sort((left, right) =>
+ compareCodePoints(canonical(left), canonical(right)),
+ );
+
+const relationshipSignature = (
+ node: ApplicationNode,
+ side: "left" | "right",
+ context: ItemContext,
+): string => {
+ const graph = side === "left" ? context.leftGraph : context.rightGraph;
+ const paired = side === "left" ? context.pairByLeft : context.pairByRight;
+ const nodeById = new Map(graph.nodes.map((value) => [value.node_id, value]));
+ const signatures = graph.edges.flatMap((edge) => {
+ if (edge.source_node_id === node.node_id)
+ return [
+ edgeSignature(
+ "out",
+ edge.relation,
+ edge.target_node_id,
+ paired,
+ nodeById,
+ ),
+ ];
+ if (edge.target_node_id === node.node_id)
+ return [
+ edgeSignature(
+ "in",
+ edge.relation,
+ edge.source_node_id,
+ paired,
+ nodeById,
+ ),
+ ];
+ return [];
+ });
+ return canonical(signatures.sort(compareCodePoints));
+};
+
+const edgeSignature = (
+ direction: "in" | "out",
+ relation: ApplicationEdge["relation"],
+ neighborId: string,
+ paired: ReadonlyMap,
+ nodeById: ReadonlyMap,
+): string => {
+ const mapped = paired.get(neighborId);
+ const neighbor = nodeById.get(neighborId);
+ return `${direction}\0${relation}\0${mapped ?? `unmatched:${neighbor?.kind ?? "unknown"}`}`;
+};
+
+const itemEvidenceLinks = (
+ left: ApplicationNode | undefined,
+ right: ApplicationNode | undefined,
+ context: ItemContext,
+): string[] =>
+ [
+ ...new Set([
+ context.leftEvidenceId,
+ context.rightEvidenceId,
+ ...nativeLinks(left, context.leftNativeEvidence),
+ ...nativeLinks(right, context.rightNativeEvidence),
+ ]),
+ ].sort(compareCodePoints);
+
+const nativeLinks = (
+ node: ApplicationNode | undefined,
+ evidence: readonly Evidence[],
+): string[] => {
+ const digest =
+ node === undefined
+ ? null
+ : contentIdentity(node)?.replace(/^content:/u, "");
+ return digest === null
+ ? []
+ : evidence
+ .filter(({ subject }) => subject?.digest.sha256 === digest)
+ .map(({ evidence_id: id }) => id);
+};
+
+const pairLimitations = (
+ pair: ApplicationVersionNodePair,
+ status: ApplicationVersionComparisonItem["status"],
+): string[] => [
+ ...(pair.basis === "structural-fingerprint"
+ ? [
+ "Structural fingerprint equality is rename-resistant inference; it is not byte identity or proof of semantic equivalence.",
+ ]
+ : []),
+ ...(pair.basis === "source-map-identity"
+ ? [
+ "Source-map original names identify a candidate source lineage; changed or unavailable source content remains explicit.",
+ ]
+ : []),
+ ...(pair.basis === "semantic-key"
+ ? [
+ "Semantic-key pairing is a deterministic inference and is never promoted to exact identity.",
+ ]
+ : []),
+ ...(status === "unknown"
+ ? ["Incomplete graph coverage prevents a complete node-level conclusion."]
+ : []),
+];
+
+const itemWithId = (
+ semantic: Omit,
+): ApplicationVersionComparisonItem => ({
+ ...semantic,
+ item_id: `javc_item_${digestCanonical(semantic)}`,
+});
+
+const stringProperty = (node: ApplicationNode, key: string): string | null => {
+ const values = [
+ ...new Set(
+ node.observations
+ .map(({ properties: values }) => values[key])
+ .filter((value): value is string => typeof value === "string"),
+ ),
+ ];
+ return values.length === 1 ? (values[0] ?? null) : null;
+};
+
+const graphsComplete = (context: ItemContext): boolean =>
+ context.leftGraph.coverage.status === "complete" &&
+ context.rightGraph.coverage.status === "complete";
+
+const canonical = (value: unknown): string => {
+ const encoded = canonicalize(value);
+ if (encoded === undefined)
+ throw new TypeError("Application version item could not canonicalize data");
+ return encoded;
+};
+
+const digestCanonical = (value: unknown): string =>
+ createHash("sha256").update(canonical(value)).digest("hex");
diff --git a/src/domain/javascriptApplicationVersionKeys.ts b/src/domain/javascriptApplicationVersionKeys.ts
new file mode 100644
index 000000000..6ad5475ac
--- /dev/null
+++ b/src/domain/javascriptApplicationVersionKeys.ts
@@ -0,0 +1,273 @@
+import type { ApplicationNode } from "./javascriptApplicationGraph.js";
+import { compareCodePoints } from "./javascriptApplicationGraph.js";
+import type { ApplicationVersionMatchBasis } from "./javascriptApplicationVersionComparisonSchemas.js";
+import type { JsonValue } from "./jsonValue.js";
+
+/** One deterministic one-to-one match between two graph versions. */
+export interface ApplicationVersionNodePair {
+ readonly left: ApplicationNode;
+ readonly right: ApplicationNode;
+ readonly basis: Exclude;
+ readonly confidence: "exact" | "high" | "medium";
+}
+
+/** Matched nodes plus ambiguity candidates that were never forced into pairs. */
+export interface ApplicationVersionMatchingProjection {
+ readonly pairs: ApplicationVersionNodePair[];
+ readonly unmatchedLeft: ApplicationNode[];
+ readonly unmatchedRight: ApplicationNode[];
+ readonly candidatesForLeft: ReadonlyMap;
+ readonly candidatesForRight: ReadonlyMap;
+}
+
+interface MatchTier {
+ readonly basis: ApplicationVersionNodePair["basis"];
+ readonly confidence: ApplicationVersionNodePair["confidence"];
+ readonly key: (node: ApplicationNode) => string | null;
+}
+
+const matchTiers = (): readonly MatchTier[] => [
+ { basis: "exact-content-digest", confidence: "exact", key: contentDigestKey },
+ {
+ basis: "exact-module-source-digest",
+ confidence: "exact",
+ key: moduleSourceDigestKey,
+ },
+ { basis: "exact-node-identity", confidence: "exact", key: nodeIdentityKey },
+ { basis: "source-map-identity", confidence: "high", key: sourceMapKey },
+ {
+ basis: "structural-fingerprint",
+ confidence: "medium",
+ key: structuralFingerprintKey,
+ },
+ { basis: "semantic-key", confidence: "medium", key: semanticKey },
+];
+
+/** Apply ordered, unique-only matching tiers without fuzzy pairing. */
+export const matchJavaScriptApplicationVersions = (
+ leftNodes: readonly ApplicationNode[],
+ rightNodes: readonly ApplicationNode[],
+): ApplicationVersionMatchingProjection => {
+ const left = new Map(leftNodes.map((node) => [node.node_id, node]));
+ const right = new Map(rightNodes.map((node) => [node.node_id, node]));
+ const leftCandidates = new Map>();
+ const rightCandidates = new Map>();
+ const pairs: ApplicationVersionNodePair[] = [];
+ for (const tier of matchTiers())
+ applyTier(left, right, pairs, leftCandidates, rightCandidates, tier);
+ const remainingLeft = sortedNodes(left.values());
+ const remainingRight = sortedNodes(right.values());
+ const leftIds = new Set(remainingLeft.map(({ node_id: id }) => id));
+ const rightIds = new Set(remainingRight.map(({ node_id: id }) => id));
+ return {
+ pairs: pairs.sort((a, b) =>
+ compareCodePoints(
+ `${a.left.node_id}\0${a.right.node_id}`,
+ `${b.left.node_id}\0${b.right.node_id}`,
+ ),
+ ),
+ unmatchedLeft: remainingLeft,
+ unmatchedRight: remainingRight,
+ candidatesForLeft: filteredCandidates(leftCandidates, rightIds),
+ candidatesForRight: filteredCandidates(rightCandidates, leftIds),
+ };
+};
+
+const applyTier = (
+ left: Map,
+ right: Map,
+ pairs: ApplicationVersionNodePair[],
+ leftCandidates: Map>,
+ rightCandidates: Map>,
+ tier: MatchTier,
+): void => {
+ const leftByKey = nodesByKey(left.values(), tier.key);
+ const rightByKey = nodesByKey(right.values(), tier.key);
+ for (const key of [...leftByKey.keys()].sort(compareCodePoints)) {
+ const leftGroup = leftByKey.get(key) ?? [];
+ const rightGroup = rightByKey.get(key) ?? [];
+ if (rightGroup.length === 0) continue;
+ recordCandidates(leftGroup, rightGroup, leftCandidates, rightCandidates);
+ if (leftGroup.length !== 1 || rightGroup.length !== 1) continue;
+ const leftNode = leftGroup[0];
+ const rightNode = rightGroup[0];
+ if (leftNode === undefined || rightNode === undefined) continue;
+ pairs.push({ left: leftNode, right: rightNode, ...tier });
+ left.delete(leftNode.node_id);
+ right.delete(rightNode.node_id);
+ }
+};
+
+const nodesByKey = (
+ nodes: Iterable,
+ keyFor: (node: ApplicationNode) => string | null,
+): Map => {
+ const output = new Map();
+ for (const node of nodes) {
+ const key = keyFor(node);
+ if (key === null) continue;
+ output.set(key, [...(output.get(key) ?? []), node]);
+ }
+ return output;
+};
+
+const recordCandidates = (
+ left: readonly ApplicationNode[],
+ right: readonly ApplicationNode[],
+ leftCandidates: Map>,
+ rightCandidates: Map>,
+): void => {
+ for (const leftNode of left) {
+ const candidates =
+ leftCandidates.get(leftNode.node_id) ?? new Set();
+ for (const rightNode of right) candidates.add(rightNode.node_id);
+ leftCandidates.set(leftNode.node_id, candidates);
+ }
+ for (const rightNode of right) {
+ const candidates =
+ rightCandidates.get(rightNode.node_id) ?? new Set();
+ for (const leftNode of left) candidates.add(leftNode.node_id);
+ rightCandidates.set(rightNode.node_id, candidates);
+ }
+};
+
+const filteredCandidates = (
+ candidates: ReadonlyMap>,
+ retained: ReadonlySet,
+): ReadonlyMap =>
+ new Map(
+ [...candidates.entries()].flatMap(([nodeId, values]) => {
+ const filtered = [...values]
+ .filter((value) => retained.has(value))
+ .sort(compareCodePoints);
+ return filtered.length === 0 ? [] : [[nodeId, filtered] as const];
+ }),
+ );
+
+const nodeIdentityKey = (node: ApplicationNode): string =>
+ `node\0${node.kind}\0${node.node_id}`;
+
+const contentDigestKey = (node: ApplicationNode): string | null =>
+ node.identity.strategy === "content-digest"
+ ? `content\0${node.kind}\0${node.identity.sha256}`
+ : null;
+
+const moduleSourceDigestKey = (node: ApplicationNode): string | null => {
+ if (node.kind !== "javascript-module") return null;
+ const value = uniqueStringProperty(node, "source_sha256");
+ return value === null ? null : `module-source\0${node.kind}\0${value}`;
+};
+
+const sourceMapKey = (node: ApplicationNode): string | null =>
+ node.kind === "source-module" &&
+ node.identity.strategy === "source-map-original"
+ ? `source-map\0${node.identity.original_source}`
+ : null;
+
+const structuralFingerprintKey = (node: ApplicationNode): string | null => {
+ if (node.kind !== "javascript-module") return null;
+ const digest = uniqueStringProperty(node, "structural_fingerprint_sha256");
+ const algorithm = uniqueStringProperty(
+ node,
+ "structural_fingerprint_algorithm",
+ );
+ const status = uniqueStringProperty(node, "structural_fingerprint_status");
+ return digest === null || algorithm === null || status !== "complete"
+ ? null
+ : `structural\0${node.kind}\0${algorithm}\0${digest}`;
+};
+
+const semanticKey = (node: ApplicationNode): string | null => {
+ if (
+ [
+ "javascript-module",
+ "javascript-chunk",
+ "runtime-script-instance",
+ "unknown",
+ ].includes(node.kind)
+ )
+ return null;
+ const properties = firstProperties(node);
+ const value = semanticValue(node, properties);
+ return value === null ? null : `semantic\0${node.kind}\0${value}`;
+};
+
+const semanticValue = (
+ node: ApplicationNode,
+ properties: Readonly>,
+): string | null => {
+ if (node.kind === "endpoint")
+ return joined(properties.endpoint_kind, properties.value);
+ if (node.kind === "storage")
+ return joined(
+ properties.storage_kind,
+ properties.name ?? properties.mechanism,
+ );
+ if (node.kind === "ipc-channel")
+ return properties.resolution === "dynamic"
+ ? null
+ : (stringValue(properties.channel) ?? firstLabel(node));
+ if (node.kind === "context-bridge-api")
+ return firstLabel(node) ?? stringValue(properties.api_name);
+ if (node.kind === "native-export")
+ return (
+ joined(
+ properties.specifier,
+ stringList(properties.requested_members).join(","),
+ ) ?? firstLabel(node)
+ );
+ if (
+ [
+ "electron-main",
+ "electron-preload",
+ "electron-renderer",
+ "electron-utility",
+ ].includes(node.kind)
+ )
+ return joined(properties.declared_path, properties.resolved_path);
+ if (node.kind === "package") return stringValue(properties.name);
+ return canonicalPath(node) ?? stringValue(properties.path);
+};
+
+const canonicalPath = (node: ApplicationNode): string | null =>
+ node.identity.strategy === "canonical-path" ? node.identity.path : null;
+
+const firstProperties = (node: ApplicationNode) =>
+ node.observations[0]?.properties ?? {};
+
+const firstLabel = (node: ApplicationNode): string | null =>
+ node.observations.find(({ label }) => label !== null)?.label ?? null;
+
+const uniqueStringProperty = (
+ node: ApplicationNode,
+ name: string,
+): string | null => {
+ const values = [
+ ...new Set(
+ node.observations
+ .map(({ properties }) => properties[name])
+ .filter((value): value is string => typeof value === "string"),
+ ),
+ ];
+ return values.length === 1 ? (values[0] ?? null) : null;
+};
+
+const joined = (...values: readonly unknown[]): string | null => {
+ const strings = values.map(stringValue);
+ return strings.some((value) => value === null) ? null : strings.join("\0");
+};
+
+const stringValue = (value: unknown): string | null =>
+ typeof value === "string" && value !== "" ? value : null;
+
+const stringList = (value: unknown): string[] =>
+ Array.isArray(value)
+ ? value
+ .filter((item): item is string => typeof item === "string")
+ .sort(compareCodePoints)
+ : [];
+
+const sortedNodes = (nodes: Iterable): ApplicationNode[] =>
+ [...nodes].sort((left, right) =>
+ compareCodePoints(left.node_id, right.node_id),
+ );
diff --git a/src/domain/javascriptFeatureSeed.ts b/src/domain/javascriptFeatureSeed.ts
new file mode 100644
index 000000000..2899fb515
--- /dev/null
+++ b/src/domain/javascriptFeatureSeed.ts
@@ -0,0 +1,191 @@
+import type { ApplicationNode } from "./javascriptApplicationGraph.js";
+import { compareCodePoints } from "./javascriptApplicationGraph.js";
+import type { ApplicationFeatureSeed } from "./javascriptFeatureTraceSchemas.js";
+import type { JsonValue } from "./jsonValue.js";
+
+/** One explicit field that matched a feature seed. */
+export interface ApplicationFeatureSeedMatch {
+ readonly node_id: string;
+ readonly kind: ApplicationNode["kind"];
+ readonly basis: "node-id" | "label" | "identity" | "property";
+ readonly field: string;
+}
+
+interface CandidateField {
+ readonly basis: ApplicationFeatureSeedMatch["basis"];
+ readonly field: string;
+ readonly value: string;
+}
+
+/** Locate every graph node matching a typed literal seed without regex execution. */
+export const findApplicationFeatureSeeds = (
+ nodes: readonly ApplicationNode[],
+ seed: ApplicationFeatureSeed,
+): ApplicationFeatureSeedMatch[] =>
+ nodes
+ .flatMap((node) => seedMatch(node, seed))
+ .sort((left, right) =>
+ compareCodePoints(
+ `${left.node_id}\0${left.basis}\0${left.field}`,
+ `${right.node_id}\0${right.basis}\0${right.field}`,
+ ),
+ );
+
+const seedMatch = (
+ node: ApplicationNode,
+ seed: ApplicationFeatureSeed,
+): ApplicationFeatureSeedMatch[] => {
+ if (seed.kind === "node-id")
+ return node.node_id === seed.value
+ ? [
+ {
+ node_id: node.node_id,
+ kind: node.kind,
+ basis: "node-id",
+ field: "node_id",
+ },
+ ]
+ : [];
+ if (!kindMatches(node, seed.kind)) return [];
+ const mode = seed.match ?? (seed.kind === "string" ? "contains" : "exact");
+ const query = normalized(seed.value, seed.case_sensitive);
+ const match = candidateFields(node, seed.kind).find((candidate) => {
+ const value = normalized(candidate.value, seed.case_sensitive);
+ return mode === "exact" ? value === query : value.includes(query);
+ });
+ return match === undefined
+ ? []
+ : [
+ {
+ node_id: node.node_id,
+ kind: node.kind,
+ basis: match.basis,
+ field: match.field,
+ },
+ ];
+};
+
+const kindMatches = (
+ node: ApplicationNode,
+ kind: Exclude,
+): boolean => {
+ if (kind === "string") return true;
+ if (kind === "route")
+ return (
+ node.kind === "endpoint" &&
+ node.observations.some(
+ ({ properties }) => properties.endpoint_kind === "route",
+ )
+ );
+ if (kind === "api") return node.kind === "context-bridge-api";
+ if (kind === "channel") return node.kind === "ipc-channel";
+ if (kind === "module")
+ return ["javascript-asset", "javascript-module", "source-module"].includes(
+ node.kind,
+ );
+ return node.kind === "native-export";
+};
+
+const candidateFields = (
+ node: ApplicationNode,
+ seedKind: Exclude,
+): CandidateField[] => {
+ const fields: CandidateField[] = [
+ ...identityFields(node),
+ ...node.observations.flatMap((observation, index) => [
+ ...(observation.label === null
+ ? []
+ : [
+ {
+ basis: "label" as const,
+ field: `observations[${String(index)}].label`,
+ value: observation.label,
+ },
+ ]),
+ ...propertyFields(
+ observation.properties,
+ `observations[${String(index)}].properties`,
+ ),
+ ]),
+ ];
+ if (seedKind === "string") return fields;
+ const names = relevantFields[seedKind];
+ return fields.filter(({ field }) =>
+ names.some((name) => field === "identity" || field.endsWith(name)),
+ );
+};
+
+const relevantFields = {
+ route: [".label", ".value", ".path"],
+ api: [".label", ".api_name", ".key", ".methods", ".members"],
+ channel: [".label", ".channel", ".key"],
+ module: [
+ ".label",
+ ".module_key",
+ ".path",
+ ".source",
+ ".original_source",
+ ".exports",
+ ],
+ "native-export": [".label", ".key", ".requested_members", ".members"],
+} as const;
+
+const identityFields = (node: ApplicationNode): CandidateField[] => {
+ const identity = node.identity;
+ if (identity.strategy === "content-digest")
+ return [{ basis: "identity", field: "identity", value: identity.sha256 }];
+ if (identity.strategy === "source-map-original")
+ return [
+ {
+ basis: "identity",
+ field: "identity.original_source",
+ value: identity.original_source,
+ },
+ ];
+ if (identity.strategy === "canonical-path")
+ return [
+ { basis: "identity", field: "identity.path", value: identity.path },
+ ];
+ if (identity.strategy === "artifact-local-key")
+ return [{ basis: "identity", field: "identity.key", value: identity.key }];
+ if (identity.strategy === "runtime-instance")
+ return [
+ {
+ basis: "identity",
+ field: "identity.runtime_key",
+ value: identity.runtime_key,
+ },
+ ];
+ return [];
+};
+
+const propertyFields = (
+ value: Readonly>,
+ prefix: string,
+): CandidateField[] => {
+ const output: CandidateField[] = [];
+ const visit = (current: JsonValue, path: string, depth: number): void => {
+ if (output.length >= 512 || depth > 6) return;
+ if (typeof current === "string") {
+ output.push({ basis: "property", field: path, value: current });
+ return;
+ }
+ if (Array.isArray(current)) {
+ for (const [index, item] of current.entries())
+ visit(item, `${path}[${String(index)}]`, depth + 1);
+ return;
+ }
+ if (current !== null && typeof current === "object")
+ for (const key of Object.keys(current).sort(compareCodePoints))
+ visit(current[key] ?? null, `${path}.${key}`, depth + 1);
+ };
+ visit(value, prefix, 0);
+ return output;
+};
+
+const normalized = (value: string, caseSensitive: boolean): string => {
+ const normalizedValue = value.normalize("NFKC");
+ return caseSensitive
+ ? normalizedValue
+ : normalizedValue.toLocaleLowerCase("en-US");
+};
diff --git a/src/domain/javascriptFeatureTrace.ts b/src/domain/javascriptFeatureTrace.ts
new file mode 100644
index 000000000..33907ba4c
--- /dev/null
+++ b/src/domain/javascriptFeatureTrace.ts
@@ -0,0 +1,349 @@
+import { createHash } from "node:crypto";
+
+import canonicalize from "canonicalize";
+
+import type { Evidence } from "./evidence.js";
+import {
+ compareCodePoints,
+ createJavaScriptApplicationGraph,
+ type ApplicationEdge,
+ type ApplicationNode,
+ type JavaScriptApplicationGraph,
+} from "./javascriptApplicationGraph.js";
+import {
+ applicationFeatureTraceResultSchema,
+ type ApplicationFeatureTraceResult,
+ type TraceApplicationFeatureInput,
+} from "./javascriptFeatureTraceSchemas.js";
+import {
+ findApplicationFeatureSeeds,
+ type ApplicationFeatureSeedMatch,
+} from "./javascriptFeatureSeed.js";
+import {
+ traverseApplicationFeature,
+ type ApplicationFeatureTraversal,
+} from "./javascriptFeatureTraversal.js";
+import { buildJavaScriptNativeHandoffs } from "./javascriptNativeHandoff.js";
+
+/** Pure, authenticated inputs projected by the application service. */
+export interface ApplicationFeatureTraceProjectionInput {
+ readonly sourceEvidenceId: string;
+ readonly graph: JavaScriptApplicationGraph;
+ readonly nativeEvidence: readonly Evidence[];
+ readonly seed: TraceApplicationFeatureInput["seed"];
+ readonly direction: TraceApplicationFeatureInput["direction"];
+ readonly limits: TraceApplicationFeatureInput["limits"];
+}
+
+/** Trace a literal feature through a bounded, authority-preserving JAG. */
+export const traceApplicationFeature = (
+ input: ApplicationFeatureTraceProjectionInput,
+): ApplicationFeatureTraceResult => {
+ const allSeedMatches = findApplicationFeatureSeeds(
+ input.graph.nodes,
+ input.seed,
+ );
+ const seedMatches = allSeedMatches.slice(0, input.limits.max_seed_matches);
+ if (seedMatches.length === 0) return noMatchResult(input);
+ const traversal = traverseApplicationFeature(
+ input.graph,
+ seedMatches.map(({ node_id: id }) => id),
+ input.direction,
+ input.limits,
+ );
+ const graph = traceGraph(
+ input,
+ seedMatches,
+ traversal,
+ allSeedMatches.length,
+ );
+ const allPaths = terminalPaths(traversal, seedMatches);
+ const paths = allPaths.slice(0, input.limits.max_paths);
+ const nativeHandoffs = buildJavaScriptNativeHandoffs(
+ traversal.nodes,
+ traversal.edges,
+ input.nativeEvidence,
+ );
+ const evidenceLinks = uniqueSorted([
+ input.sourceEvidenceId,
+ ...nativeHandoffs.flatMap(({ evidence_ids: ids }) => ids),
+ ]);
+ const omissions = traceOmissions(
+ input,
+ traversal,
+ allSeedMatches.length,
+ allPaths.length,
+ );
+ const semantic = {
+ schema_version: 1 as const,
+ source_evidence_id: input.sourceEvidenceId,
+ source_graph_id: input.graph.graph_id,
+ seed: input.seed,
+ direction: input.direction,
+ seed_matches: seedMatches,
+ graph,
+ paths,
+ native_handoffs: nativeHandoffs,
+ summary: {
+ matched_seeds: seedMatches.length,
+ traced_nodes: traversal.nodes.length,
+ traced_edges: traversal.edges.length,
+ terminal_paths: paths.length,
+ native_handoffs: nativeHandoffs.length,
+ ...factSummary(traversal.nodes, traversal.edges),
+ },
+ coverage: {
+ status: traceCoverageStatus(input.graph, omissions),
+ source_graph_status: input.graph.coverage.status,
+ scanned_nodes: input.graph.nodes.length,
+ total_seed_matches: allSeedMatches.length,
+ ...omissions,
+ frontier_node_ids: traversal.frontierNodeIds,
+ },
+ evidence_links: evidenceLinks,
+ limitations: traceLimitations(input.graph, omissions),
+ };
+ return applicationFeatureTraceResultSchema.parse({
+ ...semantic,
+ trace_id: `jatr_${digestCanonical(semantic)}`,
+ });
+};
+
+const noMatchResult = (
+ input: ApplicationFeatureTraceProjectionInput,
+): ApplicationFeatureTraceResult => {
+ const semantic = {
+ schema_version: 1 as const,
+ source_evidence_id: input.sourceEvidenceId,
+ source_graph_id: input.graph.graph_id,
+ seed: input.seed,
+ direction: input.direction,
+ seed_matches: [],
+ graph: null,
+ paths: [],
+ native_handoffs: [],
+ summary: {
+ matched_seeds: 0,
+ traced_nodes: 0,
+ traced_edges: 0,
+ terminal_paths: 0,
+ native_handoffs: 0,
+ observed_facts: 0,
+ inferred_facts: 0,
+ unknown_facts: 0,
+ unavailable_facts: 0,
+ },
+ coverage: {
+ status: "no-match" as const,
+ source_graph_status: input.graph.coverage.status,
+ scanned_nodes: input.graph.nodes.length,
+ total_seed_matches: 0,
+ omitted_seed_matches: 0,
+ omitted_nodes: 0,
+ omitted_edges: 0,
+ omitted_paths: 0,
+ frontier_node_ids: [],
+ },
+ evidence_links: [input.sourceEvidenceId],
+ limitations: uniqueSorted([
+ "No graph entity matched the literal seed; this is not evidence that the feature is absent.",
+ ...sourceCoverageLimitations(input.graph),
+ ]),
+ };
+ return applicationFeatureTraceResultSchema.parse({
+ ...semantic,
+ trace_id: `jatr_${digestCanonical(semantic)}`,
+ });
+};
+
+const traceGraph = (
+ input: ApplicationFeatureTraceProjectionInput,
+ seedMatches: readonly ApplicationFeatureSeedMatch[],
+ traversal: ApplicationFeatureTraversal,
+ totalSeedMatches: number,
+): JavaScriptApplicationGraph => {
+ const omitted =
+ traversal.omittedNodeCount +
+ traversal.omittedEdgeCount +
+ (totalSeedMatches - seedMatches.length);
+ return createJavaScriptApplicationGraph({
+ schema: "JavaScriptApplicationGraph",
+ schema_version: 1,
+ root_node_ids: uniqueSorted(seedMatches.map(({ node_id: id }) => id)),
+ nodes: traversal.nodes,
+ edges: traversal.edges,
+ coverage: traceGraphCoverage(input.graph, input.limits, omitted),
+ limitations: uniqueSorted([
+ ...input.graph.limitations,
+ "Trace edges retain their source authority; graph connectivity does not prove runtime execution or reachability.",
+ ...(omitted === 0
+ ? []
+ : ["Trace output stopped at explicit caller bounds."]),
+ ]),
+ });
+};
+
+const traceGraphCoverage = (
+ source: JavaScriptApplicationGraph,
+ limits: TraceApplicationFeatureInput["limits"],
+ omitted: number,
+): JavaScriptApplicationGraph["coverage"] => {
+ if (omitted > 0)
+ return {
+ status: "partial",
+ truncated: true,
+ omitted_count: omitted,
+ limits: [
+ {
+ name: "max-seed-matches",
+ value: limits.max_seed_matches,
+ unit: "items",
+ },
+ { name: "max-depth", value: limits.max_depth, unit: "depth" },
+ { name: "max-nodes", value: limits.max_nodes, unit: "items" },
+ { name: "max-edges", value: limits.max_edges, unit: "items" },
+ ],
+ };
+ return source.coverage.status === "complete"
+ ? { status: "complete", truncated: false, omitted_count: 0, limits: [] }
+ : {
+ status: source.coverage.status,
+ truncated: source.coverage.truncated,
+ omitted_count: source.coverage.omitted_count,
+ limits: source.coverage.limits,
+ };
+};
+
+const terminalPaths = (
+ traversal: ApplicationFeatureTraversal,
+ seeds: readonly ApplicationFeatureSeedMatch[],
+): ApplicationFeatureTraceResult["paths"] => {
+ const seedIds = new Set(seeds.map(({ node_id: id }) => id));
+ const edgeById = new Map(traversal.edges.map((edge) => [edge.edge_id, edge]));
+ return traversal.nodes
+ .filter(
+ (node) =>
+ isTerminal(node) &&
+ (!seedIds.has(node.node_id) || traversal.nodes.length === 1),
+ )
+ .map((node) => pathTo(node, traversal.predecessors, edgeById))
+ .filter((path): path is NonNullable => path !== null)
+ .sort((left, right) => compareCodePoints(left.path_id, right.path_id));
+};
+
+const pathTo = (
+ node: ApplicationNode,
+ predecessors: ApplicationFeatureTraversal["predecessors"],
+ edgeById: ReadonlyMap,
+): ApplicationFeatureTraceResult["paths"][number] | null => {
+ const nodeIds = [node.node_id];
+ const edgeIds: string[] = [];
+ let current = node.node_id;
+ while (predecessors.has(current)) {
+ const predecessor = predecessors.get(current);
+ if (predecessor === undefined) break;
+ nodeIds.push(predecessor.previousNodeId);
+ edgeIds.push(predecessor.edgeId);
+ current = predecessor.previousNodeId;
+ }
+ nodeIds.reverse();
+ edgeIds.reverse();
+ const edges = edgeIds
+ .map((edgeId) => edgeById.get(edgeId))
+ .filter((edge): edge is ApplicationEdge => edge !== undefined);
+ if (edges.length !== edgeIds.length) return null;
+ const semantic = {
+ start_node_id: nodeIds[0] ?? node.node_id,
+ end_node_id: node.node_id,
+ end_kind: node.kind,
+ node_ids: nodeIds,
+ edge_ids: edgeIds,
+ authorities: uniqueSorted(edges.map(({ evidence }) => evidence.authority)),
+ contains_inference: edges.some(
+ ({ evidence }) => evidence.state === "inferred",
+ ),
+ };
+ return { ...semantic, path_id: `jatp_${digestCanonical(semantic)}` };
+};
+
+const isTerminal = (node: ApplicationNode): boolean =>
+ ["endpoint", "storage", "native-addon", "native-export", "unknown"].includes(
+ node.kind,
+ );
+
+const factSummary = (
+ nodes: readonly ApplicationNode[],
+ edges: readonly ApplicationEdge[],
+) => {
+ const states = [
+ ...nodes.flatMap(({ observations }) =>
+ observations.map(({ evidence }) => evidence.state),
+ ),
+ ...edges.map(({ evidence }) => evidence.state),
+ ];
+ return {
+ observed_facts: states.filter((state) => state === "observed").length,
+ inferred_facts: states.filter((state) => state === "inferred").length,
+ unknown_facts: states.filter((state) => state === "unknown").length,
+ unavailable_facts: states.filter((state) => state === "unavailable").length,
+ };
+};
+
+const traceOmissions = (
+ input: ApplicationFeatureTraceProjectionInput,
+ traversal: ApplicationFeatureTraversal,
+ seedMatches: number,
+ paths: number,
+) => ({
+ omitted_seed_matches: Math.max(
+ 0,
+ seedMatches - input.limits.max_seed_matches,
+ ),
+ omitted_nodes: traversal.omittedNodeCount,
+ omitted_edges: traversal.omittedEdgeCount,
+ omitted_paths: Math.max(0, paths - input.limits.max_paths),
+});
+
+const traceCoverageStatus = (
+ graph: JavaScriptApplicationGraph,
+ omissions: ReturnType,
+): ApplicationFeatureTraceResult["coverage"]["status"] =>
+ Object.values(omissions).some((value) => value > 0)
+ ? "truncated"
+ : graph.coverage.status === "complete"
+ ? "complete-within-source"
+ : "partial";
+
+const traceLimitations = (
+ graph: JavaScriptApplicationGraph,
+ omissions: ReturnType,
+): string[] =>
+ uniqueSorted([
+ "A trace reports graph relationships, not proof that code executed or that a feature is reachable in every state.",
+ "Static, native, passive-runtime, inferred, and unknown facts retain their original authority in the returned graph.",
+ "Native handoffs never open a binary or invoke a provider automatically; snapshot reuse remains provider/profile/target exact.",
+ ...sourceCoverageLimitations(graph),
+ ...(Object.values(omissions).some((value) => value > 0)
+ ? ["Trace results were truncated at explicit caller limits."]
+ : []),
+ ]);
+
+const sourceCoverageLimitations = (
+ graph: JavaScriptApplicationGraph,
+): string[] =>
+ graph.coverage.status === "complete"
+ ? []
+ : [
+ "The source application graph is incomplete; unmatched seeds and frontiers remain unknown.",
+ ];
+
+const digestCanonical = (value: unknown): string => {
+ const encoded = canonicalize(value);
+ if (encoded === undefined)
+ throw new TypeError("Feature trace could not canonicalize data");
+ return createHash("sha256").update(encoded).digest("hex");
+};
+
+const uniqueSorted = (
+ values: readonly Value[],
+): Value[] => [...new Set(values)].sort(compareCodePoints);
diff --git a/src/domain/javascriptFeatureTraceSchemas.ts b/src/domain/javascriptFeatureTraceSchemas.ts
new file mode 100644
index 000000000..00119218e
--- /dev/null
+++ b/src/domain/javascriptFeatureTraceSchemas.ts
@@ -0,0 +1,157 @@
+import { z } from "zod";
+
+import { evidenceSchema, providerSchema } from "./evidence.js";
+import { javascriptApplicationGraphSchema } from "./javascriptApplicationGraph.js";
+
+const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
+const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
+const nodeIdSchema = z.string().regex(/^jag_node_[a-f0-9]{64}$/u);
+const edgeIdSchema = z.string().regex(/^jag_edge_[a-f0-9]{64}$/u);
+const boundedTextSchema = z.string().min(1).max(4_096);
+
+/** Literal starting point for one bounded application trace. */
+const applicationFeatureSeedSchema = z.strictObject({
+ kind: z.enum([
+ "node-id",
+ "route",
+ "string",
+ "api",
+ "channel",
+ "module",
+ "native-export",
+ ]),
+ value: boundedTextSchema,
+ match: z.enum(["exact", "contains"]).nullable().default(null),
+ case_sensitive: z.boolean().default(false),
+});
+
+const featureTraceLimitsSchema = z.strictObject({
+ max_seed_matches: z.number().int().min(1).max(1_000).default(25),
+ max_depth: z.number().int().min(0).max(64).default(12),
+ max_nodes: z.number().int().min(1).max(50_000).default(2_000),
+ max_edges: z.number().int().min(1).max(100_000).default(4_000),
+ max_paths: z.number().int().min(1).max(1_000).default(100),
+});
+
+/** Evidence-backed application graph and explicit trace bounds. */
+export const traceApplicationFeatureInputSchema = z
+ .strictObject({
+ application: evidenceSchema,
+ native_observations: z.array(evidenceSchema).max(64).default([]),
+ seed: applicationFeatureSeedSchema,
+ direction: z.enum(["outgoing", "incoming", "both"]).default("both"),
+ limits: featureTraceLimitsSchema.default({
+ max_seed_matches: 25,
+ max_depth: 12,
+ max_nodes: 2_000,
+ max_edges: 4_000,
+ max_paths: 100,
+ }),
+ })
+ .superRefine((input, context) => {
+ const ids = input.native_observations.map(({ evidence_id: id }) => id);
+ if (new Set(ids).size !== ids.length)
+ context.addIssue({
+ code: "custom",
+ path: ["native_observations"],
+ message: "Native observations must be unique",
+ });
+ });
+
+const seedMatchSchema = z.strictObject({
+ node_id: nodeIdSchema,
+ kind: z.string().min(1).max(128),
+ basis: z.enum(["node-id", "label", "identity", "property"]),
+ field: z.string().min(1).max(256),
+});
+
+const tracePathSchema = z.strictObject({
+ path_id: z.string().regex(/^jatp_[a-f0-9]{64}$/u),
+ start_node_id: nodeIdSchema,
+ end_node_id: nodeIdSchema,
+ end_kind: z.string().min(1).max(128),
+ node_ids: z.array(nodeIdSchema).min(1).max(65),
+ edge_ids: z.array(edgeIdSchema).max(64),
+ authorities: z.array(z.string().min(1).max(128)).max(16),
+ contains_inference: z.boolean(),
+});
+
+const nativeHandoffSchema = z.strictObject({
+ native_node_id: nodeIdSchema,
+ artifact_sha256: digestSchema,
+ artifact_path: z.string().min(1).max(4_096).nullable(),
+ export_node_ids: z.array(nodeIdSchema).max(1_000),
+ requested_exports: z.array(boundedTextSchema).max(1_000),
+ status: z.enum(["evidence-linked", "requires-provider-analysis"]),
+ providers: z.array(providerSchema).max(64),
+ evidence_ids: z.array(evidenceIdSchema).max(64),
+ recommended_tools: z
+ .array(
+ z.enum([
+ "open_binary",
+ "binary_overview",
+ "search_procedures",
+ "analyze_function",
+ "xrefs",
+ ]),
+ )
+ .max(5),
+});
+
+/** Evidence-preserving bounded subgraph and native-analysis frontiers. */
+export const applicationFeatureTraceResultSchema = z.strictObject({
+ schema_version: z.literal(1),
+ trace_id: z.string().regex(/^jatr_[a-f0-9]{64}$/u),
+ source_evidence_id: evidenceIdSchema,
+ source_graph_id: z.string().regex(/^jag_[a-f0-9]{64}$/u),
+ seed: applicationFeatureSeedSchema,
+ direction: z.enum(["outgoing", "incoming", "both"]),
+ seed_matches: z.array(seedMatchSchema).max(1_000),
+ graph: javascriptApplicationGraphSchema.nullable(),
+ paths: z.array(tracePathSchema).max(1_000),
+ native_handoffs: z.array(nativeHandoffSchema).max(10_000),
+ summary: z.strictObject({
+ matched_seeds: z.number().int().min(0),
+ traced_nodes: z.number().int().min(0),
+ traced_edges: z.number().int().min(0),
+ terminal_paths: z.number().int().min(0),
+ native_handoffs: z.number().int().min(0),
+ observed_facts: z.number().int().min(0),
+ inferred_facts: z.number().int().min(0),
+ unknown_facts: z.number().int().min(0),
+ unavailable_facts: z.number().int().min(0),
+ }),
+ coverage: z.strictObject({
+ status: z.enum([
+ "complete-within-source",
+ "partial",
+ "truncated",
+ "no-match",
+ ]),
+ source_graph_status: z.enum([
+ "complete",
+ "partial",
+ "unknown",
+ "unavailable",
+ ]),
+ scanned_nodes: z.number().int().min(0),
+ total_seed_matches: z.number().int().min(0),
+ omitted_seed_matches: z.number().int().min(0),
+ omitted_nodes: z.number().int().min(0),
+ omitted_edges: z.number().int().min(0),
+ omitted_paths: z.number().int().min(0),
+ frontier_node_ids: z.array(nodeIdSchema).max(50_000),
+ }),
+ evidence_links: z.array(evidenceIdSchema).min(1).max(65),
+ limitations: z.array(boundedTextSchema).max(1_000),
+});
+
+export type TraceApplicationFeatureInput = z.infer<
+ typeof traceApplicationFeatureInputSchema
+>;
+export type ApplicationFeatureSeed = z.infer<
+ typeof applicationFeatureSeedSchema
+>;
+export type ApplicationFeatureTraceResult = z.infer<
+ typeof applicationFeatureTraceResultSchema
+>;
diff --git a/src/domain/javascriptFeatureTraversal.ts b/src/domain/javascriptFeatureTraversal.ts
new file mode 100644
index 000000000..52304e5fb
--- /dev/null
+++ b/src/domain/javascriptFeatureTraversal.ts
@@ -0,0 +1,143 @@
+import {
+ compareCodePoints,
+ type ApplicationEdge,
+ type ApplicationNode,
+ type JavaScriptApplicationGraph,
+} from "./javascriptApplicationGraph.js";
+import type { TraceApplicationFeatureInput } from "./javascriptFeatureTraceSchemas.js";
+
+interface AdjacencyEntry {
+ readonly edge: ApplicationEdge;
+ readonly nextNodeId: string;
+}
+
+interface Predecessor {
+ readonly previousNodeId: string;
+ readonly edgeId: string;
+}
+
+/** Bounded graph projection plus the first deterministic path to each node. */
+export interface ApplicationFeatureTraversal {
+ readonly nodes: ApplicationNode[];
+ readonly edges: ApplicationEdge[];
+ readonly depths: ReadonlyMap;
+ readonly predecessors: ReadonlyMap;
+ readonly frontierNodeIds: string[];
+ readonly omittedNodeCount: number;
+ readonly omittedEdgeCount: number;
+}
+
+/** Traverse a JAG without treating edge inference as observed reachability. */
+export const traverseApplicationFeature = (
+ graph: JavaScriptApplicationGraph,
+ seedNodeIds: readonly string[],
+ direction: TraceApplicationFeatureInput["direction"],
+ limits: TraceApplicationFeatureInput["limits"],
+): ApplicationFeatureTraversal => {
+ const nodeById = new Map(graph.nodes.map((node) => [node.node_id, node]));
+ const adjacency = buildAdjacency(graph.edges, direction);
+ const visited = new Set(seedNodeIds);
+ const retainedEdges = new Map();
+ const omittedNodes = new Set();
+ const omittedEdges = new Set();
+ const frontier = new Set();
+ const depths = new Map(seedNodeIds.map((nodeId) => [nodeId, 0]));
+ const predecessors = new Map();
+ const queue = [...seedNodeIds];
+ for (let offset = 0; offset < queue.length; offset += 1) {
+ const current = queue[offset];
+ if (current === undefined) continue;
+ const depth = depths.get(current) ?? 0;
+ for (const entry of adjacency.get(current) ?? []) {
+ if (depth >= limits.max_depth) {
+ recordOmission(entry, current, omittedNodes, omittedEdges, frontier);
+ continue;
+ }
+ if (!visited.has(entry.nextNodeId) && visited.size >= limits.max_nodes) {
+ recordOmission(entry, current, omittedNodes, omittedEdges, frontier);
+ continue;
+ }
+ if (
+ !retainedEdges.has(entry.edge.edge_id) &&
+ retainedEdges.size >= limits.max_edges
+ ) {
+ omittedEdges.add(entry.edge.edge_id);
+ frontier.add(current);
+ frontier.add(entry.nextNodeId);
+ continue;
+ }
+ retainedEdges.set(entry.edge.edge_id, entry.edge);
+ if (visited.has(entry.nextNodeId)) continue;
+ if (!nodeById.has(entry.nextNodeId)) continue;
+ visited.add(entry.nextNodeId);
+ depths.set(entry.nextNodeId, depth + 1);
+ predecessors.set(entry.nextNodeId, {
+ previousNodeId: current,
+ edgeId: entry.edge.edge_id,
+ });
+ queue.push(entry.nextNodeId);
+ }
+ }
+ return {
+ nodes: [...visited]
+ .map((nodeId) => nodeById.get(nodeId))
+ .filter((node): node is ApplicationNode => node !== undefined)
+ .sort((left, right) => compareCodePoints(left.node_id, right.node_id)),
+ edges: [...retainedEdges.values()].sort((left, right) =>
+ compareCodePoints(left.edge_id, right.edge_id),
+ ),
+ depths,
+ predecessors,
+ frontierNodeIds: [...frontier].sort(compareCodePoints),
+ omittedNodeCount: omittedNodes.size,
+ omittedEdgeCount: omittedEdges.size,
+ };
+};
+
+const buildAdjacency = (
+ edges: readonly ApplicationEdge[],
+ direction: TraceApplicationFeatureInput["direction"],
+): ReadonlyMap => {
+ const adjacency = new Map();
+ for (const edge of edges) {
+ if (direction !== "incoming")
+ addAdjacency(adjacency, edge.source_node_id, {
+ edge,
+ nextNodeId: edge.target_node_id,
+ });
+ if (direction !== "outgoing")
+ addAdjacency(adjacency, edge.target_node_id, {
+ edge,
+ nextNodeId: edge.source_node_id,
+ });
+ }
+ for (const entries of adjacency.values())
+ entries.sort((left, right) =>
+ compareCodePoints(
+ `${left.edge.edge_id}\0${left.nextNodeId}`,
+ `${right.edge.edge_id}\0${right.nextNodeId}`,
+ ),
+ );
+ return adjacency;
+};
+
+const addAdjacency = (
+ adjacency: Map,
+ nodeId: string,
+ entry: AdjacencyEntry,
+): void => {
+ adjacency.set(nodeId, [...(adjacency.get(nodeId) ?? []), entry]);
+};
+
+const recordOmission = (
+ entry: AdjacencyEntry,
+ current: string,
+ omittedNodes: Set,
+ omittedEdges: Set,
+ frontier: Set,
+): void => {
+ omittedNodes.add(entry.nextNodeId);
+ omittedEdges.add(entry.edge.edge_id);
+ frontier.add(current);
+ frontier.add(entry.nextNodeId);
+};
diff --git a/src/domain/javascriptNativeHandoff.ts b/src/domain/javascriptNativeHandoff.ts
new file mode 100644
index 000000000..d72bb9dd8
--- /dev/null
+++ b/src/domain/javascriptNativeHandoff.ts
@@ -0,0 +1,132 @@
+import type { Evidence } from "./evidence.js";
+import {
+ compareCodePoints,
+ type ApplicationEdge,
+ type ApplicationNode,
+} from "./javascriptApplicationGraph.js";
+import type { ApplicationFeatureTraceResult } from "./javascriptFeatureTraceSchemas.js";
+
+type NativeHandoff = ApplicationFeatureTraceResult["native_handoffs"][number];
+
+/** Build provider-neutral addon targets and link exact-subject native Evidence. */
+export const buildJavaScriptNativeHandoffs = (
+ nodes: readonly ApplicationNode[],
+ edges: readonly ApplicationEdge[],
+ nativeEvidence: readonly Evidence[],
+): NativeHandoff[] => {
+ const nodeById = new Map(nodes.map((node) => [node.node_id, node]));
+ return nodes
+ .filter(({ kind }) => kind === "native-addon")
+ .flatMap((node) => {
+ const digest = artifactDigest(node);
+ if (digest === null) return [];
+ const linked = nativeEvidence.filter(
+ ({ subject }) => subject?.digest.sha256 === digest,
+ );
+ const exportNodes = nativeExportNodes(node, edges, nodeById);
+ return [
+ {
+ native_node_id: node.node_id,
+ artifact_sha256: digest,
+ artifact_path: artifactPath(node),
+ export_node_ids: exportNodes.map(({ node_id: id }) => id),
+ requested_exports: requestedExports(exportNodes),
+ status:
+ linked.length === 0
+ ? ("requires-provider-analysis" as const)
+ : ("evidence-linked" as const),
+ providers: uniqueProviders(linked),
+ evidence_ids: linked
+ .map(({ evidence_id: id }) => id)
+ .sort(compareCodePoints),
+ recommended_tools: [
+ "open_binary" as const,
+ "binary_overview" as const,
+ "search_procedures" as const,
+ "analyze_function" as const,
+ "xrefs" as const,
+ ],
+ },
+ ];
+ })
+ .sort((left, right) =>
+ compareCodePoints(left.native_node_id, right.native_node_id),
+ );
+};
+
+const artifactDigest = (node: ApplicationNode): string | null => {
+ if (node.identity.strategy === "content-digest") return node.identity.sha256;
+ const observation = node.observations.find(
+ ({ evidence }) => evidence.artifact.available,
+ );
+ return observation?.evidence.artifact.available === true
+ ? observation.evidence.artifact.sha256
+ : null;
+};
+
+const artifactPath = (node: ApplicationNode): string | null => {
+ for (const { evidence } of node.observations)
+ if (
+ evidence.location.available &&
+ evidence.location.value.kind === "artifact-path"
+ )
+ return evidence.location.value.path;
+ return null;
+};
+
+const nativeExportNodes = (
+ addon: ApplicationNode,
+ edges: readonly ApplicationEdge[],
+ nodeById: ReadonlyMap,
+): ApplicationNode[] => {
+ const ids = edges.flatMap((edge) => {
+ if (
+ edge.source_node_id === addon.node_id &&
+ ["contains", "exposes"].includes(edge.relation)
+ )
+ return [edge.target_node_id];
+ if (
+ edge.target_node_id === addon.node_id &&
+ ["imports", "loads"].includes(edge.relation)
+ )
+ return [edge.source_node_id];
+ return [];
+ });
+ return [...new Set(ids)]
+ .map((id) => nodeById.get(id))
+ .filter((node): node is ApplicationNode => node?.kind === "native-export")
+ .sort((left, right) => compareCodePoints(left.node_id, right.node_id));
+};
+
+const requestedExports = (nodes: readonly ApplicationNode[]): string[] => {
+ const values = nodes.flatMap((node) =>
+ node.observations.flatMap((observation) => [
+ ...(observation.label === null ? [] : [observation.label]),
+ ...stringArray(observation.properties.requested_members),
+ ...stringArray(observation.properties.members),
+ ]),
+ );
+ return [...new Set(values)].sort(compareCodePoints).slice(0, 1_000);
+};
+
+const stringArray = (value: unknown): string[] =>
+ Array.isArray(value)
+ ? value.filter((item): item is string => typeof item === "string")
+ : [];
+
+const uniqueProviders = (
+ evidence: readonly Evidence[],
+): NativeHandoff["providers"] =>
+ [
+ ...new Map(
+ evidence.map(({ provider }) => [
+ `${provider.id}\0${provider.name}\0${provider.version ?? ""}`,
+ provider,
+ ]),
+ ).values(),
+ ].sort((left, right) =>
+ compareCodePoints(
+ `${left.id}\0${left.name}\0${left.version ?? ""}`,
+ `${right.id}\0${right.name}\0${right.version ?? ""}`,
+ ),
+ );
diff --git a/src/generatedPackageMetadata.ts b/src/generatedPackageMetadata.ts
index a663d819a..90a7815f9 100644
--- a/src/generatedPackageMetadata.ts
+++ b/src/generatedPackageMetadata.ts
@@ -5,5 +5,5 @@ export const PACKAGE_METADATA = {
serverSdkVersion: "2.0.0-beta.4",
clientSdkVersion: "2.0.0-beta.4",
coreSdkVersion: "2.0.0-beta.4",
- skillVersion: "16",
+ skillVersion: "17",
} as const;
diff --git a/src/server/createServer.ts b/src/server/createServer.ts
index 438953125..2bf9b2289 100644
--- a/src/server/createServer.ts
+++ b/src/server/createServer.ts
@@ -19,6 +19,7 @@ import type { BrowserObservationPort } from "../application/BrowserObservationPo
import { registerBrowserTools } from "./registerBrowserTools.js";
import type { ElectronObservationPort } from "../application/ElectronObservationPort.js";
import { registerElectronTools } from "./registerElectronTools.js";
+import { registerApplicationTools } from "./registerApplicationTools.js";
export interface CreateServerOptions {
readonly logger?: Logger;
@@ -113,6 +114,17 @@ export const createServer = (
server.sendResourceListChanged();
return recorded;
};
+ const recordEvidenceWithUnknown =
+ session === undefined
+ ? undefined
+ : (
+ evidence: Parameters[0],
+ input: Parameters[1],
+ ) => {
+ const recorded = session.recordEvidenceWithUnknown(evidence, input);
+ if (recorded.ok) server.sendResourceListChanged();
+ return recorded;
+ };
registerOfficialTools(server, analysis, {
logger: toolLogger,
activeTarget,
@@ -158,6 +170,11 @@ export const createServer = (
permissionAuthority: options.permissionAuthority,
recordEvidence,
});
+ registerApplicationTools(server, {
+ logger: toolLogger,
+ recordEvidence,
+ recordEvidenceWithUnknown,
+ });
registerGuidedPrompts(server, analysis, session);
if (session !== undefined) {
registerEvidenceResources(server, session);
diff --git a/src/server/registerApplicationTools.ts b/src/server/registerApplicationTools.ts
new file mode 100644
index 000000000..e089e3e45
--- /dev/null
+++ b/src/server/registerApplicationTools.ts
@@ -0,0 +1,131 @@
+import type { McpServer } from "@modelcontextprotocol/server";
+
+import type { BinarySessionPort } from "../application/BinarySession.js";
+import {
+ compareApplicationVersionsEvidence,
+ traceApplicationFeatureEvidence,
+} from "../application/JavaScriptApplicationWorkflowService.js";
+import { APPLICATION_TOOL_CONTRACTS } from "../contracts/applicationToolContracts.js";
+import { compareApplicationVersionsInputSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
+import { applicationVersionComparisonResultSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
+import { traceApplicationFeatureInputSchema } from "../domain/javascriptFeatureTraceSchemas.js";
+import type { Evidence } from "../domain/evidence.js";
+import type { Logger } from "../logger.js";
+import { logToolExecution } from "./toolLogging.js";
+import { toCallToolResult } from "./toolResult.js";
+import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
+
+interface ApplicationToolRegistration {
+ readonly logger: Logger;
+ readonly recordEvidence: BinarySessionPort["recordEvidence"] | undefined;
+ readonly recordEvidenceWithUnknown:
+ | BinarySessionPort["recordEvidenceWithUnknown"]
+ | undefined;
+}
+
+/** Register provider-neutral JavaScript application graph workflows. */
+export const registerApplicationTools = (
+ server: McpServer,
+ options: ApplicationToolRegistration,
+): void => {
+ const [traceContract, compareContract] = APPLICATION_TOOL_CONTRACTS;
+ server.registerTool(
+ traceContract.name,
+ toolRegistrationOptions(traceContract),
+ async (input) => {
+ const parsed = traceApplicationFeatureInputSchema.parse(input);
+ const result = await logToolExecution(
+ options.logger,
+ traceContract.name,
+ () => Promise.resolve(traceApplicationFeatureEvidence(parsed)),
+ );
+ if (!result.ok) return toCallToolResult(result, traceContract);
+ const sources = [parsed.application, ...parsed.native_observations];
+ const recorded = recordSources(options.recordEvidence, sources);
+ if (!recorded.ok) return toCallToolResult(recorded, traceContract);
+ return recordResult(options, traceContract, result.value);
+ },
+ );
+ server.registerTool(
+ compareContract.name,
+ toolRegistrationOptions(compareContract),
+ async (input) => {
+ const parsed = compareApplicationVersionsInputSchema.parse(input);
+ const result = await logToolExecution(
+ options.logger,
+ compareContract.name,
+ () => Promise.resolve(compareApplicationVersionsEvidence(parsed)),
+ );
+ if (!result.ok) return toCallToolResult(result, compareContract);
+ const sources = [
+ parsed.left,
+ parsed.right,
+ ...parsed.left_native_observations,
+ ...parsed.right_native_observations,
+ ];
+ const recorded = recordSources(options.recordEvidence, sources);
+ if (!recorded.ok) return toCallToolResult(recorded, compareContract);
+ const comparison = applicationVersionComparisonResultSchema.parse(
+ result.value.normalized_result,
+ );
+ const unknown = comparison.summary.unknown > 0;
+ return recordResult(
+ options,
+ compareContract,
+ result.value,
+ parsed.unknown_registry_approved === true && unknown,
+ );
+ },
+ );
+};
+
+const recordSources = (
+ recordEvidence: ApplicationToolRegistration["recordEvidence"],
+ sources: readonly Evidence[],
+) => {
+ for (const source of sources) {
+ const recorded = recordEvidence?.(source);
+ if (recorded !== undefined && !recorded.ok) return recorded;
+ }
+ return { ok: true as const, value: null };
+};
+
+const recordResult = (
+ options: ApplicationToolRegistration,
+ contract: (typeof APPLICATION_TOOL_CONTRACTS)[number],
+ evidence: Evidence,
+ recordUnknown = false,
+) => {
+ const recorded = recordUnknown
+ ? options.recordEvidenceWithUnknown?.(evidence, {
+ approved: true,
+ question:
+ "Which application entities remain unmatched or ambiguous across these versions?",
+ severity: "medium",
+ domain: "application-version-comparison",
+ supporting_evidence_ids: [evidence.evidence_id],
+ contradicting_evidence_ids: [],
+ required_authority: "shipped-artifact",
+ required_confidence: "observed",
+ required_environment: null,
+ recommended_probes: [
+ {
+ operation: "analyze_javascript_application",
+ rationale:
+ "Repeat static reconstruction with complete artifacts and source maps when available.",
+ },
+ {
+ operation: "reconcile_javascript_runtime",
+ rationale:
+ "Add approved passive runtime Evidence without promoting it to static fact.",
+ },
+ ],
+ relationships: [],
+ })
+ : options.recordEvidence?.(evidence);
+ if (recorded !== undefined && !recorded.ok)
+ return toCallToolResult(recorded, contract);
+ return toCallToolResult({ ok: true, value: evidence }, contract, {
+ evidenceResourcesAvailable: recorded !== undefined,
+ });
+};
diff --git a/tests/applicationWorkflowCli.test.ts b/tests/applicationWorkflowCli.test.ts
new file mode 100644
index 000000000..2c51385f8
--- /dev/null
+++ b/tests/applicationWorkflowCli.test.ts
@@ -0,0 +1,67 @@
+import { execFile } from "node:child_process";
+import { mkdtemp, rm, writeFile } from "node:fs/promises";
+import { tmpdir } from "node:os";
+import { join } from "node:path";
+import { promisify } from "node:util";
+
+import { afterEach, describe, expect, it } from "vitest";
+
+import {
+ JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE,
+ JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+} from "../src/contracts/javascriptApplicationWorkflowExamples.js";
+
+const execute = promisify(execFile);
+
+describe("application workflow CLI parity", () => {
+ const temporary: string[] = [];
+
+ afterEach(async () => {
+ await Promise.all(
+ temporary
+ .splice(0)
+ .map(async (path) => rm(path, { recursive: true, force: true })),
+ );
+ });
+
+ it("accepts inline trace JSON and file-backed comparison JSON", async () => {
+ const traced = await runCli([
+ "trace-application-feature",
+ JSON.stringify(JAVASCRIPT_FEATURE_TRACE_EXAMPLE),
+ "--json",
+ ]);
+ expect(traced).toMatchObject({
+ operation: "trace_application_feature",
+ normalized_result: { schema_version: 1 },
+ });
+
+ const root = await mkdtemp(join(tmpdir(), "rea-application-cli-"));
+ temporary.push(root);
+ const comparisonPath = join(root, "comparison.json");
+ await writeFile(
+ comparisonPath,
+ JSON.stringify(JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE),
+ );
+ const compared = await runCli([
+ "compare-application-versions",
+ comparisonPath,
+ "--json",
+ ]);
+ expect(compared).toMatchObject({
+ operation: "compare_application_versions",
+ normalized_result: {
+ schema_version: 1,
+ summary: { unknown: expect.any(Number) },
+ },
+ });
+ }, 20_000);
+});
+
+const runCli = async (arguments_: readonly string[]): Promise => {
+ const { stdout } = await execute(
+ process.execPath,
+ ["scripts/rea.mjs", ...arguments_],
+ { cwd: process.cwd(), env: process.env, maxBuffer: 16 * 1_024 * 1_024 },
+ );
+ return JSON.parse(stdout);
+};
diff --git a/tests/applicationWorkflowMcp.test.ts b/tests/applicationWorkflowMcp.test.ts
new file mode 100644
index 000000000..6c05d0d9f
--- /dev/null
+++ b/tests/applicationWorkflowMcp.test.ts
@@ -0,0 +1,78 @@
+import { Client, InMemoryTransport } from "@modelcontextprotocol/client";
+import { describe, expect, it } from "vitest";
+
+import { BinarySession } from "../src/application/BinarySession.js";
+import {
+ JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE,
+ JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+} from "../src/contracts/javascriptApplicationWorkflowExamples.js";
+import { createServer } from "../src/server/createServer.js";
+import { observed } from "./fixtures/analysisExecution.js";
+
+describe("application workflow MCP parity", () => {
+ it("traces and compares authenticated graph Evidence in the session", async () => {
+ const session = new BinarySession(() => ({
+ execute: () => Promise.resolve(observed(null)),
+ close: () => Promise.resolve(),
+ }));
+ const server = createServer(session, session);
+ const client = new Client({
+ name: "application-workflow-test",
+ version: "1",
+ });
+ const [clientTransport, serverTransport] =
+ InMemoryTransport.createLinkedPair();
+ try {
+ await server.connect(serverTransport);
+ await client.connect(clientTransport);
+
+ const traced = await client.callTool({
+ name: "trace_application_feature",
+ arguments: JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+ });
+ expect(traced.isError).not.toBe(true);
+ expect(traced.structuredContent).toMatchObject({
+ operation: "trace_application_feature",
+ provider: { id: "rea-javascript-application-workflows" },
+ normalized_result: {
+ schema_version: 1,
+ coverage: { status: expect.any(String) },
+ },
+ });
+
+ const compared = await client.callTool({
+ name: "compare_application_versions",
+ arguments: {
+ ...JAVASCRIPT_APPLICATION_VERSION_COMPARISON_EXAMPLE,
+ unknown_registry_approved: true,
+ },
+ });
+ expect(compared.isError).not.toBe(true);
+ expect(compared.structuredContent).toMatchObject({
+ operation: "compare_application_versions",
+ normalized_result: {
+ schema_version: 1,
+ summary: { unknown: expect.any(Number) },
+ coverage: { status: expect.any(String) },
+ },
+ });
+ expect(session.exportEvidenceBundle().records.length).toBeGreaterThan(2);
+
+ const spoofed = await client.callTool({
+ name: "trace_application_feature",
+ arguments: {
+ ...JAVASCRIPT_FEATURE_TRACE_EXAMPLE,
+ application: {
+ ...JAVASCRIPT_FEATURE_TRACE_EXAMPLE.application,
+ provider: { id: "spoofed", name: "spoofed", version: "1" },
+ },
+ },
+ });
+ expect(spoofed.isError).toBe(true);
+ } finally {
+ await client.close();
+ await server.close();
+ await session.close();
+ }
+ });
+});
diff --git a/tests/applicationWorkflowVerifier.test.ts b/tests/applicationWorkflowVerifier.test.ts
new file mode 100644
index 000000000..ea568a596
--- /dev/null
+++ b/tests/applicationWorkflowVerifier.test.ts
@@ -0,0 +1,61 @@
+import { execFile } from "node:child_process";
+import { mkdtemp, rm } from "node:fs/promises";
+import { tmpdir } from "node:os";
+import { join } from "node:path";
+import { promisify } from "node:util";
+
+import { afterEach, describe, expect, it } from "vitest";
+
+import { writeVersionedJavaScriptApplicationFixtures } from "./fixtures/javascriptArtifactApplication.js";
+
+const execute = promisify(execFile);
+
+describe("local application workflow verifier", () => {
+ const temporary: string[] = [];
+
+ afterEach(async () => {
+ await Promise.all(
+ temporary
+ .splice(0)
+ .map(async (path) => rm(path, { recursive: true, force: true })),
+ );
+ });
+
+ it("reports bounded two-version and trace claims without source text", async () => {
+ const root = await mkdtemp(join(tmpdir(), "rea-application-verifier-"));
+ temporary.push(root);
+ const fixtures = await writeVersionedJavaScriptApplicationFixtures(root);
+ const { stdout } = await execute(
+ process.execPath,
+ [
+ "scripts/verify-local-application-workflows.mjs",
+ "--left",
+ fixtures.left,
+ "--right",
+ fixtures.right,
+ "--seed-kind",
+ "module",
+ "--seed-value",
+ "stable",
+ ],
+ { cwd: process.cwd(), maxBuffer: 16 * 1_024 * 1_024 },
+ );
+ const result = JSON.parse(stdout);
+ expect(result).toMatchObject({
+ verified: true,
+ summary: {
+ added: expect.any(Number),
+ removed: expect.any(Number),
+ changed: expect.any(Number),
+ unknown: expect.any(Number),
+ },
+ matching: {
+ exact_module_source_digest: expect.any(Number),
+ structural_fingerprint: expect.any(Number),
+ },
+ coverage: { status: expect.any(String) },
+ trace: { summary: { matched_seeds: expect.any(Number) } },
+ });
+ expect(stdout).not.toContain("stableValue");
+ }, 20_000);
+});
diff --git a/tests/browserMcp.test.ts b/tests/browserMcp.test.ts
index b7574254c..d5904a3f6 100644
--- a/tests/browserMcp.test.ts
+++ b/tests/browserMcp.test.ts
@@ -37,7 +37,7 @@ describe("browser MCP tools", () => {
const connected = await connectBrowser(browser);
const tools = await connected.client.listTools();
- expect(tools.tools).toHaveLength(80);
+ expect(tools.tools).toHaveLength(82);
expect(tools.tools.map(({ name }) => name)).toEqual(
expect.arrayContaining([
"list_browser_targets",
diff --git a/tests/contractSnapshot.test.ts b/tests/contractSnapshot.test.ts
index dd0111646..4877ad5e4 100644
--- a/tests/contractSnapshot.test.ts
+++ b/tests/contractSnapshot.test.ts
@@ -10,6 +10,7 @@ import { NATIVE_TOOL_CONTRACTS } from "../src/contracts/nativeToolContracts.js";
import { ARTIFACT_TOOL_CONTRACTS } from "../src/contracts/artifactToolContracts.js";
import { BROWSER_TOOL_CONTRACTS } from "../src/contracts/browserToolContracts.js";
import { ELECTRON_TOOL_CONTRACTS } from "../src/contracts/electronToolContracts.js";
+import { APPLICATION_TOOL_CONTRACTS } from "../src/contracts/applicationToolContracts.js";
import {
enhancedOutputSchemas,
officialOutputSchemas,
@@ -57,8 +58,9 @@ describe("tool contract surface", () => {
...ARTIFACT_TOOL_CONTRACTS,
...BROWSER_TOOL_CONTRACTS,
...ELECTRON_TOOL_CONTRACTS,
+ ...APPLICATION_TOOL_CONTRACTS,
];
- expect(contracts).toHaveLength(62);
+ expect(contracts).toHaveLength(64);
for (const contract of contracts) {
const inputSchema = contractJsonSchema(contract.inputSchema);
const outputSchema = contractJsonSchema(contract.outputSchema);
@@ -148,7 +150,7 @@ describe("tool contract surface", () => {
}
});
- it("publishes no unconstrained output-schema holes across all 80 tools", () => {
+ it("publishes no unconstrained output-schema holes across all 82 tools", () => {
const contracts = [
...OFFICIAL_TOOL_CONTRACTS,
...ENHANCED_TOOL_CONTRACTS,
@@ -156,9 +158,10 @@ describe("tool contract surface", () => {
...ARTIFACT_TOOL_CONTRACTS,
...BROWSER_TOOL_CONTRACTS,
...ELECTRON_TOOL_CONTRACTS,
+ ...APPLICATION_TOOL_CONTRACTS,
...SESSION_TOOL_CONTRACTS,
];
- expect(contracts).toHaveLength(80);
+ expect(contracts).toHaveLength(82);
for (const contract of contracts) {
const schema = contractJsonSchema(contract.outputSchema);
expect(emptySchemaPaths(schema), contract.name).toEqual([]);
diff --git a/tests/fixtures/javascriptArtifactApplication.ts b/tests/fixtures/javascriptArtifactApplication.ts
index 00a6ed5ae..0936b3577 100644
--- a/tests/fixtures/javascriptArtifactApplication.ts
+++ b/tests/fixtures/javascriptArtifactApplication.ts
@@ -123,3 +123,98 @@ export const writeJavaScriptArtifactFixture = async (
),
]);
};
+
+/** Materialize two source-owned rechunked/minified comparison fixtures. */
+export const writeVersionedJavaScriptApplicationFixtures = async (
+ root: string,
+): Promise<{ readonly left: string; readonly right: string }> => {
+ const left = join(root, "version-1");
+ const right = join(root, "version-2");
+ await Promise.all([
+ writeVersionFixture(left, "1.0.0", "left-bundle.js", versionOneBundle()),
+ writeVersionFixture(right, "2.0.0", "right-bundle.js", versionTwoBundle()),
+ ]);
+ return { left, right };
+};
+
+const writeVersionFixture = async (
+ root: string,
+ version: string,
+ bundleName: string,
+ bundle: string,
+): Promise => {
+ await mkdir(join(root, "renderer", "chunks"), { recursive: true });
+ await Promise.all([
+ writeFile(
+ join(root, "package.json"),
+ JSON.stringify({
+ name: "rea-version-comparison-fixture",
+ version,
+ main: "./main.js",
+ renderer: "./renderer/index.html",
+ }),
+ ),
+ writeFile(
+ join(root, "main.js"),
+ 'const { ipcMain } = require("electron"); ipcMain.handle("feature:open", () => require("./native.node"));\n',
+ ),
+ writeFile(
+ join(root, "renderer", "index.html"),
+ ``,
+ ),
+ writeFile(join(root, "renderer", "chunks", bundleName), bundle),
+ writeFile(
+ join(root, "renderer", `${bundleName}.map`),
+ JSON.stringify({
+ version: 3,
+ file: bundleName,
+ sources: ["src/feature.ts"],
+ sourcesContent: [
+ version === "1.0.0"
+ ? 'export const feature = "before";'
+ : 'export const feature = "after";',
+ ],
+ names: [],
+ mappings: "AAAA",
+ }),
+ ),
+ writeFile(
+ join(root, "native.node"),
+ Buffer.from([0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00]),
+ ),
+ ]);
+};
+
+const versionOneBundle = (): string => `
+ (globalThis.webpackChunkfixture = globalThis.webpackChunkfixture || []).push([
+ [101],
+ {
+ "stable-old": (module, exports) => { exports.stable = () => 42; },
+ "descriptive-name": (module, exports) => {
+ const descriptiveValue = 1;
+ exports.changedName = () => descriptiveValue + 2;
+ },
+ "duplicate-a": (module, exports) => { exports.duplicate = () => 7; },
+ "duplicate-b": (module, exports) => { exports.duplicate = () => 7; },
+ "removed": (module, exports) => { exports.removed = true; }
+ }
+ ]);
+ ${String.fromCharCode(47, 47)}# sourceMap${"ping"}URL=left-bundle.js.map
+`;
+
+const versionTwoBundle = (): string => `
+ (globalThis.webpackChunkfixture = globalThis.webpackChunkfixture || []).push([
+ [909],
+ {
+ "stable-new": (module, exports) => { exports.stable = () => 42; },
+ "a": (module, exports) => {
+ const b = 1;
+ exports.changedName = () => b + 2;
+ },
+ "collision-x": (module, exports) => { exports.duplicate = () => 7; },
+ "collision-y": (module, exports) => { exports.duplicate = () => 7; },
+ "added": (module, exports) => { exports.added = true; }
+ }
+ ]);
+ ${String.fromCharCode(47, 47)}# sourceMap${"ping"}URL=right-bundle.js.map
+`;
diff --git a/tests/integration/serverIntegration.test.ts b/tests/integration/serverIntegration.test.ts
index 453dd7245..74b86d304 100644
--- a/tests/integration/serverIntegration.test.ts
+++ b/tests/integration/serverIntegration.test.ts
@@ -131,7 +131,7 @@ describe("full MCP integration with multi-tool sequences", () => {
});
});
- it("preserves the complete 80-tool inventory with a session", async () => {
+ it("preserves the complete 82-tool inventory with a session", async () => {
const session = new BinarySession(
(_path) =>
({
@@ -154,7 +154,7 @@ describe("full MCP integration with multi-tool sequences", () => {
await client.connect(clientTransport);
const listed = await client.listTools();
- expect(listed.tools).toHaveLength(80);
+ expect(listed.tools).toHaveLength(82);
const names = listed.tools.map((t) => t.name);
expect(names).toContain("open_binary");
expect(names).toContain("close_binary");
diff --git a/tests/javascriptApplicationWorkflows.test.ts b/tests/javascriptApplicationWorkflows.test.ts
new file mode 100644
index 000000000..ed8a3f700
--- /dev/null
+++ b/tests/javascriptApplicationWorkflows.test.ts
@@ -0,0 +1,291 @@
+import { mkdtemp, rm } from "node:fs/promises";
+import { tmpdir } from "node:os";
+import { join } from "node:path";
+
+import { afterEach, describe, expect, it } from "vitest";
+
+import { analyzeJavaScriptApplication } from "../src/application/JavaScriptApplicationService.js";
+import { compareApplicationVersionsEvidence } from "../src/application/JavaScriptApplicationWorkflowService.js";
+import { createEvidence } from "../src/domain/evidence.js";
+import { applicationVersionComparisonResultSchema } from "../src/domain/javascriptApplicationVersionComparisonSchemas.js";
+import { compareJavaScriptApplicationVersions } from "../src/domain/javascriptApplicationVersionComparison.js";
+import { createJavaScriptApplicationGraph } from "../src/domain/javascriptApplicationGraph.js";
+import { traceApplicationFeature } from "../src/domain/javascriptFeatureTrace.js";
+import { applicationFeatureTraceResultSchema } from "../src/domain/javascriptFeatureTraceSchemas.js";
+import {
+ APPLICATION_GRAPH_DIGESTS,
+ buildSyntheticJavaScriptApplicationGraph,
+} from "./fixtures/javascriptApplicationGraph.js";
+import { writeVersionedJavaScriptApplicationFixtures } from "./fixtures/javascriptArtifactApplication.js";
+import { permissionAuthorityForRoot } from "./fixtures/permissionAuthority.js";
+
+describe("JavaScript application workflows", () => {
+ const temporary: string[] = [];
+
+ afterEach(async () => {
+ await Promise.all(
+ temporary
+ .splice(0)
+ .map(async (path) => rm(path, { recursive: true, force: true })),
+ );
+ });
+
+ it("traces a contextBridge API through IPC into linked native evidence", () => {
+ const graph = buildSyntheticJavaScriptApplicationGraph();
+ const nativeEvidence = createEvidence(
+ {
+ path: "/tmp/synthetic.node",
+ sha256: APPLICATION_GRAPH_DIGESTS.nativeAddon,
+ format: "elf",
+ architecture: "x86_64",
+ },
+ { id: "ghidra", name: "Ghidra", version: "fixture" },
+ {
+ operation: "analyze_function",
+ parameters: { address: "openProject" },
+ result: { name: "openProject", address: "0x1000" },
+ limitations: ["Synthetic native provider observation."],
+ },
+ );
+
+ const result = traceApplicationFeature({
+ sourceEvidenceId: `ev_${"a".repeat(64)}`,
+ graph,
+ nativeEvidence: [nativeEvidence],
+ seed: {
+ kind: "api",
+ value: "desktopApi",
+ match: "exact",
+ case_sensitive: false,
+ },
+ direction: "outgoing",
+ limits: traceLimits(),
+ });
+
+ expect(() =>
+ applicationFeatureTraceResultSchema.parse(result),
+ ).not.toThrow();
+ expect(result.summary).toMatchObject({
+ matched_seeds: 1,
+ native_handoffs: 1,
+ });
+ expect(result.native_handoffs).toContainEqual(
+ expect.objectContaining({
+ artifact_sha256: APPLICATION_GRAPH_DIGESTS.nativeAddon,
+ status: "evidence-linked",
+ evidence_ids: [nativeEvidence.evidence_id],
+ requested_exports: expect.arrayContaining(["openProject"]),
+ }),
+ );
+ expect(result.paths).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({ end_kind: "native-export" }),
+ ]),
+ );
+ expect(
+ result.graph?.edges.some(
+ ({ evidence }) =>
+ evidence.authority === "static-relationship-inference" &&
+ evidence.state === "inferred",
+ ),
+ ).toBe(true);
+ });
+
+ it("keeps no-match and bounded frontiers explicit", () => {
+ const graph = buildSyntheticJavaScriptApplicationGraph();
+ const noMatch = traceApplicationFeature({
+ sourceEvidenceId: `ev_${"a".repeat(64)}`,
+ graph,
+ nativeEvidence: [],
+ seed: {
+ kind: "route",
+ value: "/missing",
+ match: "exact",
+ case_sensitive: false,
+ },
+ direction: "both",
+ limits: traceLimits(),
+ });
+ expect(noMatch).toMatchObject({
+ graph: null,
+ coverage: { status: "no-match" },
+ summary: { matched_seeds: 0 },
+ });
+
+ const bounded = traceApplicationFeature({
+ sourceEvidenceId: `ev_${"a".repeat(64)}`,
+ graph,
+ nativeEvidence: [],
+ seed: {
+ kind: "api",
+ value: "desktopApi",
+ match: "exact",
+ case_sensitive: false,
+ },
+ direction: "outgoing",
+ limits: { ...traceLimits(), max_depth: 1 },
+ });
+ expect(bounded.coverage).toMatchObject({ status: "truncated" });
+ expect(bounded.coverage.omitted_nodes).toBeGreaterThan(0);
+ expect(bounded.summary.native_handoffs).toBe(0);
+ });
+
+ it("matches rechunked modules by exact source and minified modules by structural fingerprint", async () => {
+ const root = await mkdtemp(join(tmpdir(), "rea-application-versions-"));
+ temporary.push(root);
+ const fixtures = await writeVersionedJavaScriptApplicationFixtures(root);
+ const [left, right] = await Promise.all([
+ analyzeFixture(fixtures.left, true),
+ analyzeFixture(fixtures.right, true),
+ ]);
+ const compared = compareApplicationVersionsEvidence({ left, right });
+ if (!compared.ok) throw compared.error;
+ const result = applicationVersionComparisonResultSchema.parse(
+ compared.value.normalized_result,
+ );
+ const modules = result.items.filter(
+ ({ node_kind: kind }) => kind === "javascript-module",
+ );
+
+ expect(modules).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({
+ match: expect.objectContaining({
+ status: "matched",
+ basis: "exact-module-source-digest",
+ confidence: "exact",
+ }),
+ }),
+ expect.objectContaining({
+ status: "changed",
+ match: expect.objectContaining({
+ status: "matched",
+ basis: "structural-fingerprint",
+ confidence: "medium",
+ }),
+ }),
+ ]),
+ );
+ expect(result.matching.ambiguous).toBeGreaterThanOrEqual(4);
+ expect(modules.filter(({ match }) => match.status === "ambiguous")).toEqual(
+ expect.arrayContaining([expect.objectContaining({ status: "unknown" })]),
+ );
+ expect(result.summary.added).toBeGreaterThan(0);
+ expect(result.summary.removed).toBeGreaterThan(0);
+ expect(result.graph.edges).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({
+ relation: "changed_from",
+ evidence: expect.objectContaining({
+ authority: "cross-version-comparison",
+ state: "inferred",
+ }),
+ }),
+ ]),
+ );
+ expect(result.limitations.join(" ")).toMatch(
+ /module ordinals|fuzzy pairing/u,
+ );
+ });
+
+ it("pairs source-map originals without promoting the match to exact", async () => {
+ const root = await mkdtemp(join(tmpdir(), "rea-source-map-versions-"));
+ temporary.push(root);
+ const fixtures = await writeVersionedJavaScriptApplicationFixtures(root);
+ const [left, right] = await Promise.all([
+ analyzeFixture(fixtures.left, true),
+ analyzeFixture(fixtures.right, true),
+ ]);
+ const compared = compareApplicationVersionsEvidence({ left, right });
+ if (!compared.ok) throw compared.error;
+ const result = applicationVersionComparisonResultSchema.parse(
+ compared.value.normalized_result,
+ );
+ expect(result.items).toContainEqual(
+ expect.objectContaining({
+ node_kind: "source-module",
+ status: "changed",
+ match: expect.objectContaining({
+ basis: "source-map-identity",
+ confidence: "high",
+ }),
+ }),
+ );
+ });
+
+ it("keeps incomplete one-sided absence unknown and reports output truncation", () => {
+ const complete = buildSyntheticJavaScriptApplicationGraph();
+ const rootNode = complete.nodes.find(({ node_id: id }) =>
+ complete.root_node_ids.includes(id),
+ );
+ if (rootNode === undefined) throw new Error("Synthetic graph root missing");
+ const partial = createJavaScriptApplicationGraph({
+ schema: "JavaScriptApplicationGraph",
+ schema_version: 1,
+ root_node_ids: [rootNode.node_id],
+ nodes: [rootNode],
+ edges: [],
+ coverage: {
+ status: "partial",
+ truncated: true,
+ omitted_count: complete.nodes.length - 1,
+ limits: [{ name: "fixture_nodes", value: 1, unit: "items" }],
+ },
+ limitations: ["Synthetic partial graph."],
+ });
+ const input = {
+ left: {
+ evidenceId: `ev_${"a".repeat(64)}`,
+ rootArtifactSha256: APPLICATION_GRAPH_DIGESTS.package,
+ graph: complete,
+ },
+ right: {
+ evidenceId: `ev_${"b".repeat(64)}`,
+ rootArtifactSha256: APPLICATION_GRAPH_DIGESTS.package,
+ graph: partial,
+ },
+ leftNativeEvidence: [],
+ rightNativeEvidence: [],
+ limits: {
+ max_comparison_items: 1,
+ max_candidate_nodes: 1,
+ max_graph_nodes: 20,
+ max_graph_edges: 20,
+ },
+ };
+
+ const first = compareJavaScriptApplicationVersions(input);
+ const second = compareJavaScriptApplicationVersions(input);
+ expect(first.comparison_id).toBe(second.comparison_id);
+ expect(first.coverage).toMatchObject({
+ status: "truncated",
+ right_graph_status: "partial",
+ });
+ expect(first.coverage.omitted_comparison_items).toBeGreaterThan(0);
+ expect(first.summary.removed).toBe(0);
+ expect(first.summary.unknown).toBeGreaterThan(0);
+ });
+});
+
+const traceLimits = () => ({
+ max_seed_matches: 25,
+ max_depth: 12,
+ max_nodes: 2_000,
+ max_edges: 4_000,
+ max_paths: 100,
+});
+
+const analyzeFixture = async (root: string, sourceMaps = false) => {
+ const authority = await permissionAuthorityForRoot(
+ root,
+ ["investigation_input"],
+ ["investigation_input"],
+ );
+ const result = await analyzeJavaScriptApplication(authority, {
+ input_path: root,
+ approved: true,
+ source_map_read_approved: sourceMaps,
+ });
+ if (!result.ok) throw result.error;
+ return result.value;
+};
diff --git a/tests/productCatalog.test.ts b/tests/productCatalog.test.ts
index 5eccb4030..70ba2c230 100644
--- a/tests/productCatalog.test.ts
+++ b/tests/productCatalog.test.ts
@@ -10,6 +10,7 @@ import { SUPPORTED_CLIENT_DEFINITIONS } from "../src/application/SupportedClient
import {
ARTIFACT_GRAPH_PROVIDER,
JAVASCRIPT_APPLICATION_PROVIDER,
+ JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER,
JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER,
} from "../src/application/InvestigationProviders.js";
import { CDP_BROWSER_PROVIDER_IDENTITY } from "../src/browser/CdpBrowserProvider.js";
@@ -72,6 +73,7 @@ describe("canonical product catalog", () => {
CDP_ELECTRON_PROVIDER_IDENTITY,
JAVASCRIPT_APPLICATION_PROVIDER,
JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER,
+ JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER,
]
.map(({ id }) => id)
.sort(),
@@ -99,6 +101,11 @@ describe("canonical product catalog", () => {
({ id }) => id === JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER.id,
)?.capabilities,
).toEqual(["reconcile_javascript_runtime"]);
+ expect(
+ catalog.providers.find(
+ ({ id }) => id === JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER.id,
+ )?.capabilities,
+ ).toEqual(["compare_application_versions", "trace_application_feature"]);
expect(
z.toJSONSchema(analysisSnapshotSchema).properties?.snapshot_version,
).toMatchObject({
diff --git a/tests/promptMcp.test.ts b/tests/promptMcp.test.ts
index e086387da..beedf718b 100644
--- a/tests/promptMcp.test.ts
+++ b/tests/promptMcp.test.ts
@@ -54,7 +54,7 @@ describe("guided prompts over MCP", () => {
),
);
}
- expect((await client.listTools()).tools).toHaveLength(80);
+ expect((await client.listTools()).tools).toHaveLength(82);
const result = await client.getPrompt({
name: "investigate_feature",
arguments: {
diff --git a/tests/readmeConsistency.test.ts b/tests/readmeConsistency.test.ts
index 83ee4eb56..e3d6b4d35 100644
--- a/tests/readmeConsistency.test.ts
+++ b/tests/readmeConsistency.test.ts
@@ -12,6 +12,7 @@ import { NATIVE_TOOL_CONTRACTS } from "../src/contracts/nativeToolContracts.js";
import { ARTIFACT_TOOL_CONTRACTS } from "../src/contracts/artifactToolContracts.js";
import { BROWSER_TOOL_CONTRACTS } from "../src/contracts/browserToolContracts.js";
import { ELECTRON_TOOL_CONTRACTS } from "../src/contracts/electronToolContracts.js";
+import { APPLICATION_TOOL_CONTRACTS } from "../src/contracts/applicationToolContracts.js";
import { SUPPORTED_CLIENT_DEFINITIONS } from "../src/application/SupportedClients.js";
const readmes = [
@@ -29,6 +30,7 @@ const expectedToolCounts = [
ARTIFACT_TOOL_CONTRACTS.length,
BROWSER_TOOL_CONTRACTS.length,
ELECTRON_TOOL_CONTRACTS.length,
+ APPLICATION_TOOL_CONTRACTS.length,
SESSION_TOOL_CONTRACTS.length,
] as const;
diff --git a/tests/runtime.test.ts b/tests/runtime.test.ts
index 1b51d1d53..6b0701c4e 100644
--- a/tests/runtime.test.ts
+++ b/tests/runtime.test.ts
@@ -10,7 +10,7 @@ const fixturePath = fileURLToPath(
);
describe("production stdio runtime", () => {
- it("starts the built entrypoint, lists 80 tools, calls one, and shuts down", async () => {
+ it("starts the built entrypoint, lists 82 tools, calls one, and shuts down", async () => {
const transport = new StdioClientTransport({
command: process.execPath,
args: [mainPath],
@@ -32,7 +32,7 @@ describe("production stdio runtime", () => {
try {
await client.connect(transport);
const tools = await client.listTools();
- expect(tools.tools).toHaveLength(80);
+ expect(tools.tools).toHaveLength(82);
const result = await client.callTool({
name: "current_document",
arguments: {},
@@ -78,7 +78,7 @@ describe("production stdio runtime", () => {
try {
await client.connect(transport);
- expect((await client.listTools()).tools).toHaveLength(80);
+ expect((await client.listTools()).tools).toHaveLength(82);
} finally {
await client.close();
await transport.close();
diff --git a/tests/serverIdentity.test.ts b/tests/serverIdentity.test.ts
index caa1c11c9..3908df070 100644
--- a/tests/serverIdentity.test.ts
+++ b/tests/serverIdentity.test.ts
@@ -24,11 +24,11 @@ describe("server and catalog identity", () => {
});
expect(PRODUCT_IDENTITY.packageVersion).toBe(packageJson.version);
expect(SDK_IDENTITY.server).toBe("2.0.0-beta.4");
- expect(CLI_COMMAND_NAMES).toHaveLength(40);
- expect(new Set(CLI_COMMAND_NAMES).size).toBe(40);
+ expect(CLI_COMMAND_NAMES).toHaveLength(42);
+ expect(new Set(CLI_COMMAND_NAMES).size).toBe(42);
expect(CATALOG_IDENTITY.counts).toEqual({
- cli_commands: 40,
- mcp_tools: 80,
+ cli_commands: 42,
+ mcp_tools: 82,
mcp_prompts: 6,
mcp_resources: 2,
mcp_resource_templates: 7,
@@ -162,7 +162,7 @@ describe("server and catalog identity", () => {
expect(status.structuredContent).toMatchObject({
result: {
server_identity: {
- catalog: { counts: { mcp_tools: 80, cli_commands: 40 } },
+ catalog: { counts: { mcp_tools: 82, cli_commands: 42 } },
alignment: { state: "mcp_server_restart_required" },
},
tool_availability: expect.arrayContaining([
diff --git a/tests/sessionMcp.test.ts b/tests/sessionMcp.test.ts
index 2e2decbf8..3505bdaa0 100644
--- a/tests/sessionMcp.test.ts
+++ b/tests/sessionMcp.test.ts
@@ -142,7 +142,7 @@ describe("target-free MCP lifecycle", () => {
expect(text(before)).toBe(
"No app is open. Ask the user which app to investigate, then call open_binary with its local path.",
);
- expect((await mcp.listTools()).tools).toHaveLength(80);
+ expect((await mcp.listTools()).tools).toHaveLength(82);
const deniedCapture = await mcp.callTool({
name: "capture_process_scenario",
arguments: {
diff --git a/tests/setupSkill.test.ts b/tests/setupSkill.test.ts
index 2477b7231..b3f873c4e 100644
--- a/tests/setupSkill.test.ts
+++ b/tests/setupSkill.test.ts
@@ -31,7 +31,7 @@ describe("canonical skill transaction", () => {
expect(await readFile(`${destination}.rea.backup`, "utf8")).toBe(
"stale managed skill\n",
);
- expect(await readFile(destination, "utf8")).toContain('version: "16"');
+ expect(await readFile(destination, "utf8")).toContain('version: "17"');
expect(await readFile(destination, "utf8")).toContain(
`tool_count: ${String(TOOL_CONTRACTS.length)}`,
);
diff --git a/tests/toolContracts.test.ts b/tests/toolContracts.test.ts
index af1dbd537..df741b227 100644
--- a/tests/toolContracts.test.ts
+++ b/tests/toolContracts.test.ts
@@ -10,9 +10,10 @@ import { ARTIFACT_TOOL_CONTRACTS } from "../src/contracts/artifactToolContracts.
import { NATIVE_TOOL_CONTRACTS } from "../src/contracts/nativeToolContracts.js";
import { BROWSER_TOOL_CONTRACTS } from "../src/contracts/browserToolContracts.js";
import { ELECTRON_TOOL_CONTRACTS } from "../src/contracts/electronToolContracts.js";
+import { APPLICATION_TOOL_CONTRACTS } from "../src/contracts/applicationToolContracts.js";
describe("tool contract inventory", () => {
- it("publishes 62 analysis contracts and eighteen session tools", () => {
+ it("publishes 64 analysis contracts and eighteen session tools", () => {
expect(OFFICIAL_TOOL_CONTRACTS).toHaveLength(33);
expect(ENHANCED_TOOL_CONTRACTS).toHaveLength(10);
expect(NATIVE_TOOL_CONTRACTS).toHaveLength(5);
@@ -33,6 +34,10 @@ describe("tool contract inventory", () => {
"analyze_javascript_application",
"reconcile_javascript_runtime",
]);
+ expect(APPLICATION_TOOL_CONTRACTS.map(({ name }) => name)).toEqual([
+ "trace_application_feature",
+ "compare_application_versions",
+ ]);
expect(SESSION_TOOL_CONTRACTS.map(({ name }) => name)).toEqual([
"open_binary",
"close_binary",
@@ -53,8 +58,8 @@ describe("tool contract inventory", () => {
"update_unknown",
"verify_unknown_resolution",
]);
- expect(TOOL_CONTRACTS).toHaveLength(80);
- expect(new Set(TOOL_CONTRACTS.map(({ name }) => name)).size).toBe(80);
+ expect(TOOL_CONTRACTS).toHaveLength(82);
+ expect(new Set(TOOL_CONTRACTS.map(({ name }) => name)).size).toBe(82);
});
it("retains documented enhanced-tool limits at the input boundary", () => {
Create or replace one canonical edge by semantic identifier.