rea-agents 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -20
- package/bridge/hopper_bridge.py +2 -0
- package/dist/android/JadxProvider.js +8 -2
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +63 -17
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/ClientConfigurationDocument.js +28 -0
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +12 -6
- package/dist/application/DirectAnalysisCleanup.js +0 -1
- package/dist/application/DirectAnalysisStatus.js +2 -5
- package/dist/application/Doctor.js +25 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/InvestigationProviders.js +4 -4
- package/dist/application/JsonFiles.js +15 -15
- package/dist/application/LinuxHopper.js +2 -1
- package/dist/application/ReconstructionObligationCandidates.js +9 -2
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +18 -7
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +6 -4
- package/dist/application/SetupPlan.js +19 -15
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +18 -2
- package/dist/application/UpdateMaintenance.js +6 -2
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +13 -6
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +16 -0
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +0 -6
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +8 -18
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +34 -26
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +44 -12
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +6 -3
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +5 -17
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +10 -7
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/artifacts/ArtifactProvider.js +14 -16
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +152 -67
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +54 -46
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +29 -11
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +7 -8
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/scanCanonical.js +28 -22
- package/dist/artifacts/inventory/scanReader.js +7 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/CdpBrowserProvider.js +4 -3
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +6 -6
- package/dist/browser/PlaywrightScenarioBrowser.js +145 -42
- package/dist/browser/PlaywrightScenarioSession.js +3 -11
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +13 -9
- package/dist/cli/electronCommands.js +9 -10
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +2 -4
- package/dist/cli.js +5 -2
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +4 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +2 -3
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/inputSchemaPresentation.js +94 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +3 -2
- package/dist/contracts/sessionToolSchemas.js +3 -2
- package/dist/contracts/toolOutputSchemaGroups.js +2 -2
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorPresentation.js +4 -2
- package/dist/domain/analysisSnapshot.js +3 -1
- package/dist/domain/analysisView/analysisView.js +1 -3
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/dylibResolution.js +1 -1
- package/dist/domain/artifactComparison.js +4 -4
- package/dist/domain/artifactGraph.js +1 -1
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +5 -5
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +10 -5
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +2 -2
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +9 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +5 -3
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +15 -13
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +45 -34
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +7 -7
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -6
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +200 -8
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +142 -35
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +497 -113
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +41 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +2 -6
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +20 -14
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturns.js +23 -27
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +135 -24
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/process/processCapture.js +11 -10
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +43 -0
- package/dist/domain/process/processCaptureValidation.js +4 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +3 -3
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +7 -7
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -29
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedStaticProvider.js +10 -7
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraClient.js +14 -4
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraLauncher.js +43 -19
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/ida/IdaOperationRunner.js +2 -0
- package/dist/ida/IdaSessionClient.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +10 -5
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/process/ProcessOwnershipObservation.js +9 -13
- package/dist/process/capture/FilesystemSnapshot.js +88 -18
- package/dist/process/capture/ProcessCaptureLifecycle.js +13 -27
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +8 -21
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +22 -23
- package/dist/server/registerApplicationTools/compareExportShapes.js +2 -1
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerCloseLifecycleTool.js +6 -4
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerSessionTools.js +9 -3
- package/native/windows/build/manifest.json +1 -1
- package/package.json +6 -3
- package/skills/reverse-engineer-anything/SKILL.md +5 -5
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -1,27 +1,65 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { canonicalJson } from "../comparisonSemantics.js";
|
|
3
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
4
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
5
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
4
6
|
import { canonicalJsonDigestSteps } from "../canonicalJsonDigestSteps.js";
|
|
5
7
|
import { freezeOwnedJsonSnapshotSteps } from "../immutableJson.js";
|
|
8
|
+
import { applicationGraphEvidenceSchema } from "./javascriptApplicationEvidenceSchemas.js";
|
|
6
9
|
import { JAVASCRIPT_SEMANTIC_RELATION_FAMILIES, JAVASCRIPT_SEMANTIC_RELATION_FAMILY, javaScriptSemanticFingerprintInputSchema, javaScriptSemanticFingerprintSchema, javaScriptSemanticGraphInputSchema, javaScriptSemanticGraphRecordSchema, javaScriptSemanticNodeInputSchema, javaScriptSemanticNodeSchema, javaScriptSemanticRelationInputSchema, javaScriptSemanticRelationSchema, javaScriptSemanticUnknownInputSchema, javaScriptSemanticUnknownSchema, } from "./javascriptSemanticGraphSchemas.js";
|
|
7
10
|
const normalizeEvidence = (evidence) => ({
|
|
8
11
|
...evidence,
|
|
9
12
|
coverage: {
|
|
10
13
|
...evidence.coverage,
|
|
11
|
-
limits: [...evidence.coverage.limits].sort((left, right) =>
|
|
14
|
+
limits: [...evidence.coverage.limits].sort((left, right) => compareUnicodeCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
|
|
12
15
|
},
|
|
13
16
|
limitations: uniqueSorted(evidence.limitations),
|
|
14
17
|
evidence_ids: uniqueSorted(evidence.evidence_ids),
|
|
15
18
|
});
|
|
19
|
+
const evidenceContextId = (context) => `jsrg_evidence_${digestCanonicalValue(context, "JavaScript semantic evidence context")}`;
|
|
20
|
+
/** Graph-scoped owner for canonical provenance shared by semantic facts. */
|
|
21
|
+
export class JavaScriptSemanticEvidenceContextRegistry {
|
|
22
|
+
#contexts = new Map();
|
|
23
|
+
/** Intern normalized non-location provenance at fact construction. */
|
|
24
|
+
intern(evidence) {
|
|
25
|
+
const normalized = normalizeEvidence(evidence);
|
|
26
|
+
const { location, ...context } = normalized;
|
|
27
|
+
const contextId = evidenceContextId(context);
|
|
28
|
+
const row = { ...context, context_id: contextId };
|
|
29
|
+
const existing = this.#contexts.get(contextId);
|
|
30
|
+
if (existing !== undefined &&
|
|
31
|
+
canonicalJson(existing, "JavaScript semantic graph") !==
|
|
32
|
+
canonicalJson(row, "JavaScript semantic graph"))
|
|
33
|
+
throw new TypeError("JavaScript semantic evidence context digest collision");
|
|
34
|
+
this.#contexts.set(contextId, row);
|
|
35
|
+
return { context_id: contextId, location };
|
|
36
|
+
}
|
|
37
|
+
/** Resolve one already interned fact reference for derived evidence. */
|
|
38
|
+
resolve(reference) {
|
|
39
|
+
const context = this.#contexts.get(reference.context_id);
|
|
40
|
+
if (context === undefined)
|
|
41
|
+
throw new TypeError("Semantic evidence reference names an absent context");
|
|
42
|
+
const { context_id: _contextId, ...evidenceContext } = context;
|
|
43
|
+
return { ...evidenceContext, location: reference.location };
|
|
44
|
+
}
|
|
45
|
+
/** Return the deterministic context table owned by this graph projection. */
|
|
46
|
+
get contexts() {
|
|
47
|
+
return [...this.#contexts.values()].sort((left, right) => compareUnicodeCodePoints(left.context_id, right.context_id));
|
|
48
|
+
}
|
|
49
|
+
/** Release interned contexts after the owning graph is finalized. */
|
|
50
|
+
clear() {
|
|
51
|
+
this.#contexts.clear();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
16
54
|
/** Derive a semantic node ID from its kind and exact artifact identity. */
|
|
17
|
-
export const javaScriptSemanticNodeId = (node) => `jsrg_node_${
|
|
55
|
+
export const javaScriptSemanticNodeId = (node) => `jsrg_node_${digestCanonicalValue({ kind: node.kind, identity: node.identity }, "JavaScript semantic graph")}`;
|
|
18
56
|
/** Normalize one semantic entity and derive its artifact-version identifier. */
|
|
19
|
-
export const createJavaScriptSemanticGraphNode = (input) => {
|
|
57
|
+
export const createJavaScriptSemanticGraphNode = (input, evidenceContexts) => {
|
|
20
58
|
const parsed = javaScriptSemanticNodeInputSchema.parse(input);
|
|
21
59
|
const semantic = {
|
|
22
60
|
...parsed,
|
|
23
61
|
application_node_ids: uniqueSorted(parsed.application_node_ids),
|
|
24
|
-
evidence:
|
|
62
|
+
evidence: evidenceContexts.intern(parsed.evidence),
|
|
25
63
|
identifier_strategy: {
|
|
26
64
|
strategy: "semantic-content-sha256",
|
|
27
65
|
stability: "artifact-version",
|
|
@@ -33,11 +71,11 @@ export const createJavaScriptSemanticGraphNode = (input) => {
|
|
|
33
71
|
});
|
|
34
72
|
};
|
|
35
73
|
/** Normalize one semantic relationship and derive its exact identifier. */
|
|
36
|
-
export const createJavaScriptSemanticGraphRelation = (input) => {
|
|
74
|
+
export const createJavaScriptSemanticGraphRelation = (input, evidenceContexts) => {
|
|
37
75
|
const parsed = javaScriptSemanticRelationInputSchema.parse(input);
|
|
38
76
|
const semantic = {
|
|
39
77
|
...parsed,
|
|
40
|
-
evidence:
|
|
78
|
+
evidence: evidenceContexts.intern(parsed.evidence),
|
|
41
79
|
identifier_strategy: {
|
|
42
80
|
strategy: "semantic-content-sha256",
|
|
43
81
|
stability: "relationship-exact",
|
|
@@ -45,25 +83,25 @@ export const createJavaScriptSemanticGraphRelation = (input) => {
|
|
|
45
83
|
};
|
|
46
84
|
return javaScriptSemanticRelationSchema.parse({
|
|
47
85
|
...semantic,
|
|
48
|
-
relation_id: `jsrg_relation_${
|
|
86
|
+
relation_id: `jsrg_relation_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
|
|
49
87
|
});
|
|
50
88
|
};
|
|
51
89
|
/** Normalize one unresolved semantic frontier and derive its identifier. */
|
|
52
|
-
export const createJavaScriptSemanticGraphUnknown = (input) => {
|
|
90
|
+
export const createJavaScriptSemanticGraphUnknown = (input, evidenceContexts) => {
|
|
53
91
|
const parsed = javaScriptSemanticUnknownInputSchema.parse(input);
|
|
54
92
|
const semantic = {
|
|
55
93
|
...parsed,
|
|
56
94
|
relation_kinds: uniqueSorted(parsed.relation_kinds),
|
|
57
95
|
candidate_node_ids: uniqueSorted(parsed.candidate_node_ids),
|
|
58
|
-
evidence:
|
|
96
|
+
evidence: evidenceContexts.intern(parsed.evidence),
|
|
59
97
|
};
|
|
60
98
|
return javaScriptSemanticUnknownSchema.parse({
|
|
61
99
|
...semantic,
|
|
62
|
-
unknown_id: `jsrg_unknown_${
|
|
100
|
+
unknown_id: `jsrg_unknown_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
|
|
63
101
|
});
|
|
64
102
|
};
|
|
65
103
|
/** Normalize one function fingerprint and derive its component commitment. */
|
|
66
|
-
export const createJavaScriptSemanticFingerprint = (input) => {
|
|
104
|
+
export const createJavaScriptSemanticFingerprint = (input, evidenceContexts) => {
|
|
67
105
|
const parsed = javaScriptSemanticFingerprintInputSchema.parse(input);
|
|
68
106
|
const semantic = {
|
|
69
107
|
...parsed,
|
|
@@ -72,13 +110,13 @@ export const createJavaScriptSemanticFingerprint = (input) => {
|
|
|
72
110
|
effects: uniqueSorted(parsed.components.effects),
|
|
73
111
|
},
|
|
74
112
|
limitations: uniqueSorted(parsed.limitations),
|
|
75
|
-
evidence:
|
|
113
|
+
evidence: evidenceContexts.intern(parsed.evidence),
|
|
76
114
|
};
|
|
77
|
-
const fingerprintSha256 =
|
|
115
|
+
const fingerprintSha256 = digestCanonicalValue(semantic.components, "JavaScript semantic graph");
|
|
78
116
|
return javaScriptSemanticFingerprintSchema.parse({
|
|
79
117
|
...semantic,
|
|
80
118
|
fingerprint_sha256: fingerprintSha256,
|
|
81
|
-
fingerprint_id: `jsrg_fingerprint_${
|
|
119
|
+
fingerprint_id: `jsrg_fingerprint_${digestCanonicalValue({
|
|
82
120
|
function_node_id: semantic.function_node_id,
|
|
83
121
|
algorithm: semantic.algorithm,
|
|
84
122
|
fingerprint_sha256: fingerprintSha256,
|
|
@@ -87,7 +125,7 @@ export const createJavaScriptSemanticFingerprint = (input) => {
|
|
|
87
125
|
};
|
|
88
126
|
const sortedUniqueIssue = (values, path, label, context) => {
|
|
89
127
|
for (let index = 1; index < values.length; index += 1) {
|
|
90
|
-
if (
|
|
128
|
+
if (compareUnicodeCodePoints(values[index - 1] ?? "", values[index] ?? "") < 0)
|
|
91
129
|
continue;
|
|
92
130
|
context.addIssue({
|
|
93
131
|
code: "custom",
|
|
@@ -159,12 +197,64 @@ function* checkCoverageSteps(graph, context) {
|
|
|
159
197
|
}
|
|
160
198
|
const checkCanonicalOrder = (graph, context) => {
|
|
161
199
|
sortedUniqueIssue(graph.root_node_ids, ["root_node_ids"], "Root nodes", context);
|
|
200
|
+
sortedUniqueIssue(graph.evidence_contexts.map(({ context_id }) => context_id), ["evidence_contexts"], "Evidence contexts", context);
|
|
162
201
|
sortedUniqueIssue(graph.nodes.map(({ node_id }) => node_id), ["nodes"], "Nodes", context);
|
|
163
202
|
sortedUniqueIssue(graph.relations.map(({ relation_id }) => relation_id), ["relations"], "Relations", context);
|
|
164
203
|
sortedUniqueIssue(graph.fingerprints.map(({ fingerprint_id }) => fingerprint_id), ["fingerprints"], "Fingerprints", context);
|
|
165
204
|
sortedUniqueIssue(graph.unknowns.map(({ unknown_id }) => unknown_id), ["unknowns"], "Unknown frontiers", context);
|
|
166
205
|
sortedUniqueIssue(graph.limitations, ["limitations"], "Limitations", context);
|
|
167
206
|
};
|
|
207
|
+
function* checkEvidenceContextReferencesSteps(graph, context) {
|
|
208
|
+
const contexts = new Map(graph.evidence_contexts.map((value) => [value.context_id, value]));
|
|
209
|
+
const referenced = new Set();
|
|
210
|
+
const validateReferences = function* (entities, entityKind) {
|
|
211
|
+
for (const [index, { evidence }] of entities.entries()) {
|
|
212
|
+
if (index % 256 === 0)
|
|
213
|
+
yield;
|
|
214
|
+
referenced.add(evidence.context_id);
|
|
215
|
+
const evidenceContext = contexts.get(evidence.context_id);
|
|
216
|
+
if (evidenceContext === undefined) {
|
|
217
|
+
context.addIssue({
|
|
218
|
+
code: "custom",
|
|
219
|
+
path: [entityKind, index, "evidence", "context_id"],
|
|
220
|
+
message: "Evidence reference names an absent context",
|
|
221
|
+
});
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const { context_id: _contextId, ...evidenceValue } = evidenceContext;
|
|
225
|
+
if (!applicationGraphEvidenceSchema.safeParse({
|
|
226
|
+
...evidenceValue,
|
|
227
|
+
location: evidence.location,
|
|
228
|
+
}).success)
|
|
229
|
+
context.addIssue({
|
|
230
|
+
code: "custom",
|
|
231
|
+
path: [entityKind, index, "evidence"],
|
|
232
|
+
message: "Evidence context is incompatible with its fact location",
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
yield* validateReferences(graph.nodes, "nodes");
|
|
237
|
+
yield* validateReferences(graph.relations, "relations");
|
|
238
|
+
yield* validateReferences(graph.unknowns, "unknowns");
|
|
239
|
+
yield* validateReferences(graph.fingerprints, "fingerprints");
|
|
240
|
+
for (const [index, evidenceContext] of graph.evidence_contexts.entries()) {
|
|
241
|
+
if (index % 256 === 0)
|
|
242
|
+
yield;
|
|
243
|
+
const { context_id: identifier, ...value } = evidenceContext;
|
|
244
|
+
if (identifier !== evidenceContextId(value))
|
|
245
|
+
context.addIssue({
|
|
246
|
+
code: "custom",
|
|
247
|
+
path: ["evidence_contexts", index, "context_id"],
|
|
248
|
+
message: "Evidence context identifier is stale",
|
|
249
|
+
});
|
|
250
|
+
if (!referenced.has(identifier))
|
|
251
|
+
context.addIssue({
|
|
252
|
+
code: "custom",
|
|
253
|
+
path: ["evidence_contexts", index],
|
|
254
|
+
message: "Evidence context is not referenced by a graph fact",
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
168
258
|
function* checkNodesSteps(graph, nodes, context) {
|
|
169
259
|
for (const [index, node] of graph.nodes.entries()) {
|
|
170
260
|
if (index % 256 === 0)
|
|
@@ -196,13 +286,14 @@ function* checkRootsSteps(graph, nodes, context) {
|
|
|
196
286
|
});
|
|
197
287
|
}
|
|
198
288
|
}
|
|
199
|
-
function* checkRelationsSteps(graph, nodes, context) {
|
|
289
|
+
function* checkRelationsSteps(graph, nodes, evidenceContexts, context) {
|
|
200
290
|
for (const [index, relation] of graph.relations.entries()) {
|
|
201
291
|
if (index % 256 === 0)
|
|
202
292
|
yield;
|
|
203
293
|
const { relation_id: identifier, ...semantic } = relation;
|
|
204
294
|
if (identifier !==
|
|
205
|
-
"jsrg_relation_" +
|
|
295
|
+
"jsrg_relation_" +
|
|
296
|
+
digestCanonicalValue(semantic, "JavaScript semantic graph"))
|
|
206
297
|
context.addIssue({
|
|
207
298
|
code: "custom",
|
|
208
299
|
path: ["relations", index, "relation_id"],
|
|
@@ -222,7 +313,7 @@ function* checkRelationsSteps(graph, nodes, context) {
|
|
|
222
313
|
message: "Semantic relations cannot be self-referential",
|
|
223
314
|
});
|
|
224
315
|
if (relation.resolution === "candidate" &&
|
|
225
|
-
relation.evidence.state === "observed")
|
|
316
|
+
evidenceContexts.get(relation.evidence.context_id)?.state === "observed")
|
|
226
317
|
context.addIssue({
|
|
227
318
|
code: "custom",
|
|
228
319
|
path: ["relations", index, "evidence", "state"],
|
|
@@ -230,13 +321,14 @@ function* checkRelationsSteps(graph, nodes, context) {
|
|
|
230
321
|
});
|
|
231
322
|
}
|
|
232
323
|
}
|
|
233
|
-
function* checkUnknownsSteps(graph, nodes, context) {
|
|
324
|
+
function* checkUnknownsSteps(graph, nodes, evidenceContexts, context) {
|
|
234
325
|
for (const [index, unknown] of graph.unknowns.entries()) {
|
|
235
326
|
if (index % 256 === 0)
|
|
236
327
|
yield;
|
|
237
328
|
const { unknown_id: identifier, ...semantic } = unknown;
|
|
238
329
|
if (identifier !==
|
|
239
|
-
"jsrg_unknown_" +
|
|
330
|
+
"jsrg_unknown_" +
|
|
331
|
+
digestCanonicalValue(semantic, "JavaScript semantic graph"))
|
|
240
332
|
context.addIssue({
|
|
241
333
|
code: "custom",
|
|
242
334
|
path: ["unknowns", index, "unknown_id"],
|
|
@@ -260,7 +352,8 @@ function* checkUnknownsSteps(graph, nodes, context) {
|
|
|
260
352
|
path: ["unknowns", index, "relation_kinds"],
|
|
261
353
|
message: "Unknown relation kinds must belong to their declared family",
|
|
262
354
|
});
|
|
263
|
-
|
|
355
|
+
const evidenceState = evidenceContexts.get(unknown.evidence.context_id)?.state;
|
|
356
|
+
if (evidenceState !== "unknown" && evidenceState !== "unavailable")
|
|
264
357
|
context.addIssue({
|
|
265
358
|
code: "custom",
|
|
266
359
|
path: ["unknowns", index, "evidence", "state"],
|
|
@@ -289,14 +382,14 @@ function* checkFingerprintsSteps(graph, nodes, context) {
|
|
|
289
382
|
message: "Fingerprint must name a function node",
|
|
290
383
|
});
|
|
291
384
|
if (fingerprint.fingerprint_sha256 !==
|
|
292
|
-
|
|
385
|
+
digestCanonicalValue(fingerprint.components, "JavaScript semantic graph"))
|
|
293
386
|
context.addIssue({
|
|
294
387
|
code: "custom",
|
|
295
388
|
path: ["fingerprints", index, "fingerprint_sha256"],
|
|
296
389
|
message: "Fingerprint component commitment is stale",
|
|
297
390
|
});
|
|
298
391
|
const expectedIdentifier = "jsrg_fingerprint_" +
|
|
299
|
-
|
|
392
|
+
digestCanonicalValue({
|
|
300
393
|
function_node_id: fingerprint.function_node_id,
|
|
301
394
|
algorithm: fingerprint.algorithm,
|
|
302
395
|
fingerprint_sha256: fingerprint.fingerprint_sha256,
|
|
@@ -318,6 +411,11 @@ function* checkFingerprintsSteps(graph, nodes, context) {
|
|
|
318
411
|
}
|
|
319
412
|
function* checkGraphContentSteps(graph, context) {
|
|
320
413
|
checkCanonicalOrder(graph, context);
|
|
414
|
+
yield* checkEvidenceContextReferencesSteps(graph, context);
|
|
415
|
+
const evidenceContexts = new Map(graph.evidence_contexts.map((evidenceContext) => [
|
|
416
|
+
evidenceContext.context_id,
|
|
417
|
+
evidenceContext,
|
|
418
|
+
]));
|
|
321
419
|
const nodes = new Map();
|
|
322
420
|
for (const [index, node] of graph.nodes.entries()) {
|
|
323
421
|
if (index % 256 === 0)
|
|
@@ -326,8 +424,8 @@ function* checkGraphContentSteps(graph, context) {
|
|
|
326
424
|
}
|
|
327
425
|
yield* checkNodesSteps(graph, nodes, context);
|
|
328
426
|
yield* checkRootsSteps(graph, nodes, context);
|
|
329
|
-
yield* checkRelationsSteps(graph, nodes, context);
|
|
330
|
-
yield* checkUnknownsSteps(graph, nodes, context);
|
|
427
|
+
yield* checkRelationsSteps(graph, nodes, evidenceContexts, context);
|
|
428
|
+
yield* checkUnknownsSteps(graph, nodes, evidenceContexts, context);
|
|
331
429
|
checkUnknownReferences(graph, context);
|
|
332
430
|
yield* checkFingerprintsSteps(graph, nodes, context);
|
|
333
431
|
yield* checkCoverageSteps(graph, context);
|
|
@@ -348,7 +446,7 @@ const checkGraph = (graph, context) => {
|
|
|
348
446
|
checkGraphContent(graph, context);
|
|
349
447
|
const { graph_id: identifier, ...semantic } = graph;
|
|
350
448
|
if (identifier !==
|
|
351
|
-
"jsrg_" +
|
|
449
|
+
"jsrg_" + digestCanonicalValue(semantic, "JavaScript semantic graph"))
|
|
352
450
|
context.addIssue({
|
|
353
451
|
code: "custom",
|
|
354
452
|
path: ["graph_id"],
|
|
@@ -357,22 +455,31 @@ const checkGraph = (graph, context) => {
|
|
|
357
455
|
};
|
|
358
456
|
/** Strict semantic graph schema with verified canonical commitments. */
|
|
359
457
|
export const javaScriptSemanticGraphSchema = javaScriptSemanticGraphRecordSchema.superRefine(checkGraph);
|
|
458
|
+
/** Resolve one fact's compact provenance without changing its stored shape. */
|
|
459
|
+
export const resolveJavaScriptSemanticEvidence = (graph, reference) => {
|
|
460
|
+
const context = graph.evidence_contexts.find(({ context_id }) => context_id === reference.context_id);
|
|
461
|
+
if (context === undefined)
|
|
462
|
+
throw new TypeError("Semantic evidence reference names an absent context");
|
|
463
|
+
const { context_id: _contextId, ...evidenceContext } = context;
|
|
464
|
+
return { ...evidenceContext, location: reference.location };
|
|
465
|
+
};
|
|
360
466
|
const normalizeGraphInput = (parsed) => ({
|
|
361
467
|
...parsed,
|
|
362
468
|
root_node_ids: uniqueSorted(parsed.root_node_ids),
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
469
|
+
evidence_contexts: [...parsed.evidence_contexts].sort((left, right) => compareUnicodeCodePoints(left.context_id, right.context_id)),
|
|
470
|
+
nodes: [...parsed.nodes].sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id)),
|
|
471
|
+
relations: [...parsed.relations].sort((left, right) => compareUnicodeCodePoints(left.relation_id, right.relation_id)),
|
|
472
|
+
fingerprints: [...parsed.fingerprints].sort((left, right) => compareUnicodeCodePoints(left.fingerprint_id, right.fingerprint_id)),
|
|
473
|
+
unknowns: [...parsed.unknowns].sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id)),
|
|
367
474
|
coverage: {
|
|
368
475
|
...parsed.coverage,
|
|
369
|
-
limits: [...parsed.coverage.limits].sort((left, right) =>
|
|
476
|
+
limits: [...parsed.coverage.limits].sort((left, right) => compareUnicodeCodePoints(canonicalJson(left, "JavaScript semantic graph"), canonicalJson(right, "JavaScript semantic graph"))),
|
|
370
477
|
families: [...parsed.coverage.families]
|
|
371
478
|
.map((family) => ({
|
|
372
479
|
...family,
|
|
373
480
|
unknown_ids: uniqueSorted(family.unknown_ids),
|
|
374
481
|
}))
|
|
375
|
-
.sort((left, right) =>
|
|
482
|
+
.sort((left, right) => compareUnicodeCodePoints(left.family, right.family)),
|
|
376
483
|
},
|
|
377
484
|
limitations: uniqueSorted(parsed.limitations),
|
|
378
485
|
});
|
|
@@ -384,7 +491,7 @@ export const createJavaScriptSemanticGraph = (input) => {
|
|
|
384
491
|
// public schema still verifies arbitrary records and their commitments.
|
|
385
492
|
const record = {
|
|
386
493
|
...semantic,
|
|
387
|
-
graph_id: `jsrg_${
|
|
494
|
+
graph_id: `jsrg_${digestCanonicalValue(semantic, "JavaScript semantic graph")}`,
|
|
388
495
|
};
|
|
389
496
|
const issues = [];
|
|
390
497
|
checkGraphContent(record, {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { applicationGraphEvidenceSchema } from "./javascriptApplicationEvidenceSchemas.js";
|
|
2
|
+
import { applicationGraphEvidenceContextSchema, applicationGraphEvidenceLocationSchema, applicationGraphEvidenceSchema, } from "./javascriptApplicationEvidenceSchemas.js";
|
|
3
3
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
4
4
|
import { digestSchema } from "../digests.js";
|
|
5
5
|
import { prefixedDigestSchema } from "../digests.js";
|
|
@@ -11,6 +11,18 @@ const semanticRelationIdSchema = z
|
|
|
11
11
|
const semanticUnknownIdSchema = z
|
|
12
12
|
.string()
|
|
13
13
|
.regex(/^jsrg_unknown_[a-f0-9]{64}$/u);
|
|
14
|
+
const semanticEvidenceContextIdSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^jsrg_evidence_[a-f0-9]{64}$/u);
|
|
17
|
+
/** One canonical owner for provenance shared by semantic graph facts. */
|
|
18
|
+
export const javaScriptSemanticEvidenceContextSchema = applicationGraphEvidenceContextSchema.extend({
|
|
19
|
+
context_id: semanticEvidenceContextIdSchema,
|
|
20
|
+
});
|
|
21
|
+
/** Location-specific reference to one exact graph-level evidence context. */
|
|
22
|
+
export const javaScriptSemanticEvidenceReferenceSchema = z.strictObject({
|
|
23
|
+
context_id: semanticEvidenceContextIdSchema,
|
|
24
|
+
location: applicationGraphEvidenceLocationSchema,
|
|
25
|
+
});
|
|
14
26
|
/** Semantic entity kinds admitted by JavaScript Semantic Relation Graph. */
|
|
15
27
|
export const JAVASCRIPT_SEMANTIC_NODE_KINDS = [
|
|
16
28
|
"module",
|
|
@@ -188,6 +200,7 @@ export const javaScriptSemanticNodeInputSchema = z.strictObject({
|
|
|
188
200
|
});
|
|
189
201
|
/** One exact, artifact-version semantic entity. */
|
|
190
202
|
export const javaScriptSemanticNodeSchema = javaScriptSemanticNodeInputSchema.extend({
|
|
203
|
+
evidence: javaScriptSemanticEvidenceReferenceSchema,
|
|
191
204
|
node_id: semanticNodeIdSchema,
|
|
192
205
|
identifier_strategy: z.strictObject({
|
|
193
206
|
strategy: z.literal("semantic-content-sha256"),
|
|
@@ -205,6 +218,7 @@ export const javaScriptSemanticRelationInputSchema = z.strictObject({
|
|
|
205
218
|
});
|
|
206
219
|
/** One canonical directed semantic relationship. */
|
|
207
220
|
export const javaScriptSemanticRelationSchema = javaScriptSemanticRelationInputSchema.extend({
|
|
221
|
+
evidence: javaScriptSemanticEvidenceReferenceSchema,
|
|
208
222
|
relation_id: semanticRelationIdSchema,
|
|
209
223
|
identifier_strategy: z.strictObject({
|
|
210
224
|
strategy: z.literal("semantic-content-sha256"),
|
|
@@ -222,6 +236,7 @@ export const JAVASCRIPT_SEMANTIC_UNKNOWN_REASONS = [
|
|
|
222
236
|
"incomplete-module",
|
|
223
237
|
"missing-source",
|
|
224
238
|
"resource-limit",
|
|
239
|
+
"unknown-value",
|
|
225
240
|
"unsupported-syntax",
|
|
226
241
|
];
|
|
227
242
|
/** One unresolved semantic frontier before its ID is derived. */
|
|
@@ -236,6 +251,7 @@ export const javaScriptSemanticUnknownInputSchema = z.strictObject({
|
|
|
236
251
|
});
|
|
237
252
|
/** One canonical unresolved semantic frontier. */
|
|
238
253
|
export const javaScriptSemanticUnknownSchema = javaScriptSemanticUnknownInputSchema.extend({
|
|
254
|
+
evidence: javaScriptSemanticEvidenceReferenceSchema,
|
|
239
255
|
unknown_id: semanticUnknownIdSchema,
|
|
240
256
|
});
|
|
241
257
|
const fingerprintComponentsSchema = z.strictObject({
|
|
@@ -265,6 +281,7 @@ export const javaScriptSemanticFingerprintInputSchema = z.strictObject({
|
|
|
265
281
|
});
|
|
266
282
|
/** One canonical function fingerprint record. */
|
|
267
283
|
export const javaScriptSemanticFingerprintSchema = javaScriptSemanticFingerprintInputSchema.extend({
|
|
284
|
+
evidence: javaScriptSemanticEvidenceReferenceSchema,
|
|
268
285
|
fingerprint_id: prefixedDigestSchema("jsrg_fingerprint"),
|
|
269
286
|
fingerprint_sha256: digestSchema,
|
|
270
287
|
});
|
|
@@ -293,6 +310,7 @@ export const javaScriptSemanticGraphInputSchema = z.strictObject({
|
|
|
293
310
|
root_artifact_sha256: digestSchema,
|
|
294
311
|
application_graph_id: prefixedDigestSchema("jag"),
|
|
295
312
|
root_node_ids: z.array(semanticNodeIdSchema).min(1),
|
|
313
|
+
evidence_contexts: z.array(javaScriptSemanticEvidenceContextSchema),
|
|
296
314
|
nodes: z.array(javaScriptSemanticNodeSchema).min(1),
|
|
297
315
|
relations: z.array(javaScriptSemanticRelationSchema),
|
|
298
316
|
fingerprints: z.array(javaScriptSemanticFingerprintSchema),
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/** Find the innermost resolved reference at one source coordinate. */
|
|
2
|
-
export const semanticReferenceAt = (ir, line, column) => ir.references.find(({ location }) => location.start.line === line && location.start.column === column);
|
|
3
|
-
/** Read one binding by its deterministic semantic identifier. */
|
|
4
|
-
export const semanticBinding = (ir, bindingId) => ir.bindings.find(({ bindingId: candidate }) => candidate === bindingId);
|
|
5
1
|
/** Fail-closed result when Babel cannot produce an inert syntax tree. */
|
|
6
2
|
export const failedJavaScriptSemanticIr = () => ({
|
|
7
3
|
schema: "JavaScriptSemanticIR",
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as t from "@babel/types";
|
|
2
|
+
import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
|
|
3
|
+
import { semanticArrayIndex } from "./javascriptSemanticPropertyPaths.js";
|
|
4
|
+
const add = (sources, source, mutation, guards) => {
|
|
5
|
+
sources.push({
|
|
6
|
+
node: source.node,
|
|
7
|
+
projection: source.projection,
|
|
8
|
+
mutation,
|
|
9
|
+
...guards,
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
const project = (source, key) => {
|
|
13
|
+
if (source === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
const index = key === null ? null : semanticArrayIndex(key);
|
|
16
|
+
return {
|
|
17
|
+
node: source.node,
|
|
18
|
+
projection: [
|
|
19
|
+
...source.projection,
|
|
20
|
+
source.restStartIndex !== undefined && index !== null
|
|
21
|
+
? source.restStartIndex + index
|
|
22
|
+
: key,
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const visit = (context, pattern, source, guards = {}) => {
|
|
27
|
+
const { sources, mutation } = context;
|
|
28
|
+
if (t.isTSParameterProperty(pattern)) {
|
|
29
|
+
visit(context, pattern.parameter, source, guards);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (t.isAssignmentPattern(pattern)) {
|
|
33
|
+
visit(context, pattern.left, source, {
|
|
34
|
+
...guards,
|
|
35
|
+
requiredSources: [
|
|
36
|
+
...(guards.requiredSources ?? []),
|
|
37
|
+
...(source === undefined ? [] : [source]),
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
visit(context, pattern.left, { node: pattern.right, projection: [] }, {
|
|
41
|
+
...guards,
|
|
42
|
+
fallbackSources: [
|
|
43
|
+
...(guards.fallbackSources ?? []),
|
|
44
|
+
...(source === undefined ? [] : [source]),
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (t.isObjectPattern(pattern)) {
|
|
50
|
+
for (const property of pattern.properties) {
|
|
51
|
+
// Object rest creates a fresh object and has no iterable binding pattern.
|
|
52
|
+
if (t.isRestElement(property))
|
|
53
|
+
continue;
|
|
54
|
+
visit(context, property.value, project(source, semanticStaticPropertyKey(property.key, property.computed)), guards);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (t.isArrayPattern(pattern)) {
|
|
59
|
+
if (source !== undefined && source.restStartIndex === undefined)
|
|
60
|
+
add(sources, source, mutation, guards);
|
|
61
|
+
pattern.elements.forEach((element, index) => {
|
|
62
|
+
if (element === null)
|
|
63
|
+
return;
|
|
64
|
+
if (t.isRestElement(element))
|
|
65
|
+
visit(context, element.argument, source === undefined
|
|
66
|
+
? undefined
|
|
67
|
+
: {
|
|
68
|
+
node: source.node,
|
|
69
|
+
projection: source.projection,
|
|
70
|
+
restStartIndex: (source.restStartIndex ?? 0) + index,
|
|
71
|
+
}, guards);
|
|
72
|
+
else
|
|
73
|
+
visit(context, element, project(source, index), guards);
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (t.isRestElement(pattern))
|
|
78
|
+
visit(context, pattern.argument, undefined, guards);
|
|
79
|
+
};
|
|
80
|
+
/** Describe implicit iteration sources without deciding their runtime values. */
|
|
81
|
+
export const semanticIterationSources = (node, parent) => {
|
|
82
|
+
const sources = [];
|
|
83
|
+
const context = { sources, mutation: node };
|
|
84
|
+
if (t.isVariableDeclarator(node) && node.init != null)
|
|
85
|
+
visit(context, node.id, { node: node.init, projection: [] });
|
|
86
|
+
else if (t.isAssignmentExpression(node) && node.operator === "=")
|
|
87
|
+
visit(context, node.left, { node: node.right, projection: [] });
|
|
88
|
+
else if (t.isForOfStatement(node)) {
|
|
89
|
+
add(sources, { node: node.right, projection: [] }, node, {});
|
|
90
|
+
const source = { node: node.right, projection: [null] };
|
|
91
|
+
if (t.isVariableDeclaration(node.left)) {
|
|
92
|
+
for (const declaration of node.left.declarations)
|
|
93
|
+
visit(context, declaration.id, source);
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
visit(context, node.left, source);
|
|
97
|
+
}
|
|
98
|
+
else if (t.isSpreadElement(node) && t.isArrayExpression(parent))
|
|
99
|
+
add(sources, { node: node.argument, projection: [] }, node, {});
|
|
100
|
+
else if (t.isYieldExpression(node) && node.delegate && node.argument != null)
|
|
101
|
+
add(sources, { node: node.argument, projection: [] }, node, {});
|
|
102
|
+
else if (t.isFunction(node))
|
|
103
|
+
for (const parameter of node.params)
|
|
104
|
+
visit(context, parameter, undefined);
|
|
105
|
+
return sources;
|
|
106
|
+
};
|