117 lines
3.6 KiB
TypeScript
117 lines
3.6 KiB
TypeScript
import { z } from "zod";
|
|
|
|
import {
|
|
JAVASCRIPT_SEMANTIC_NODE_KINDS,
|
|
JAVASCRIPT_SEMANTIC_RELATIONS,
|
|
javaScriptSemanticNodeSchema,
|
|
javaScriptSemanticRelationSchema,
|
|
javaScriptSemanticUnknownSchema,
|
|
} from "./javascriptSemanticGraphSchemas.js";
|
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
import { digestSchema } from "../digests.js";
|
|
import { prefixedDigestSchema } from "../digests.js";
|
|
|
|
const semanticNodeIdSchema = prefixedDigestSchema("jsrg_node");
|
|
const literalSeedSchema = z.strictObject({
|
|
kind: z.literal("literal"),
|
|
value: jsonValueSchema.refine(
|
|
(value) =>
|
|
value === null ||
|
|
typeof value === "string" ||
|
|
typeof value === "number" ||
|
|
typeof value === "boolean",
|
|
"Literal seeds accept only JSON primitive values",
|
|
),
|
|
});
|
|
|
|
/** Authenticated starting points accepted by semantic tracing. */
|
|
export const javaScriptSemanticQuerySeedSchema = z.discriminatedUnion("kind", [
|
|
z.strictObject({
|
|
kind: z.literal("semantic-node"),
|
|
node_id: semanticNodeIdSchema,
|
|
}),
|
|
z.strictObject({
|
|
kind: z.literal("application-node"),
|
|
node_id: prefixedDigestSchema("jag_node"),
|
|
}),
|
|
literalSeedSchema,
|
|
z.strictObject({
|
|
kind: z.literal("function"),
|
|
fingerprint_sha256: digestSchema,
|
|
}),
|
|
z.strictObject({
|
|
kind: z.literal("property"),
|
|
name: z.string().min(1),
|
|
}),
|
|
z.strictObject({
|
|
kind: z.literal("endpoint"),
|
|
value: z.string().min(1),
|
|
}),
|
|
z.strictObject({
|
|
kind: z.literal("event"),
|
|
name: z.string().min(1),
|
|
}),
|
|
z.strictObject({
|
|
kind: z.literal("boundary-field"),
|
|
field: z.string().min(1),
|
|
}),
|
|
]);
|
|
|
|
/** Parsed pure-domain query over one authenticated companion graph. */
|
|
export const javaScriptSemanticQueryInputSchema = z.strictObject({
|
|
seed: javaScriptSemanticQuerySeedSchema,
|
|
direction: z.enum([
|
|
"backward-provenance",
|
|
"forward-influence",
|
|
"callers",
|
|
"ownership",
|
|
]),
|
|
allowed_relations: z
|
|
.array(z.enum(JAVASCRIPT_SEMANTIC_RELATIONS))
|
|
.min(1)
|
|
.optional(),
|
|
include_ambiguous_dynamic_edges: z.boolean().default(false),
|
|
expected: z
|
|
.strictObject({
|
|
role: z.enum(["source", "sink"]),
|
|
classes: z.array(z.enum(JAVASCRIPT_SEMANTIC_NODE_KINDS)).min(1),
|
|
})
|
|
.nullable()
|
|
.default(null),
|
|
});
|
|
|
|
/** Deterministic semantic trace result. */
|
|
export const javaScriptSemanticQueryResultSchema = z.strictObject({
|
|
query_id: prefixedDigestSchema("jsrq"),
|
|
source_graph_id: prefixedDigestSchema("jsrg"),
|
|
seed: javaScriptSemanticQuerySeedSchema,
|
|
direction: javaScriptSemanticQueryInputSchema.shape.direction,
|
|
status: z.enum(["found", "no-match", "ambiguous", "partial", "unsupported"]),
|
|
seed_node_ids: z.array(semanticNodeIdSchema),
|
|
nodes: z.array(javaScriptSemanticNodeSchema),
|
|
relations: z.array(javaScriptSemanticRelationSchema),
|
|
unknowns: z.array(javaScriptSemanticUnknownSchema),
|
|
expected_match_node_ids: z.array(semanticNodeIdSchema),
|
|
summary: z.strictObject({
|
|
total_seed_matches: z.number().int().min(0),
|
|
traversed_nodes: z.number().int().min(0),
|
|
traversed_relations: z.number().int().min(0),
|
|
traversed_functions: z.number().int().min(0),
|
|
traversed_modules: z.number().int().min(0),
|
|
relevant_unknowns: z.number().int().min(0),
|
|
}),
|
|
coverage: z.strictObject({
|
|
status: z.enum(["complete", "partial", "unavailable"]),
|
|
}),
|
|
limitations: z.array(z.string().min(1)),
|
|
});
|
|
|
|
/** Validated semantic query input. */
|
|
export type JavaScriptSemanticQueryInput = z.infer<
|
|
typeof javaScriptSemanticQueryInputSchema
|
|
>;
|
|
/** Validated semantic query result. */
|
|
export type JavaScriptSemanticQueryResult = z.infer<
|
|
typeof javaScriptSemanticQueryResultSchema
|
|
>;
|