feat(javascript): retain queryable static route inventories (#6019)

This commit is contained in:
gensokyo-dev
2026-10-22 16:54:14 +08:00
committed by GitHub
parent 933af60eba
commit 7d0efef62d
67 changed files with 74345 additions and 231 deletions
@@ -4,6 +4,7 @@ import { jsonValueSchema } from "../../domain/jsonValue.js";
import { digestSchema } from "../../domain/digests.js";
import {
JAVASCRIPT_ANALYSIS_RESOURCE_DEFAULTS,
JAVASCRIPT_STATIC_FACT_BYTES,
JAVASCRIPT_SEMANTIC_ITEM_MAXIMUM,
} from "../../domain/javascript/javascriptAnalysisResourceControls.js";
import { javaScriptAnalysisTransferDescriptorSchema } from "./JavaScriptAnalysisTransfer.js";
@@ -11,7 +12,7 @@ import { javaScriptAnalysisTransferDescriptorSchema } from "./JavaScriptAnalysis
/** Independent worker execution budget; source length is not an admission rule. */
export const JAVASCRIPT_ANALYSIS_WORKER_DEFAULTS = {
...JAVASCRIPT_ANALYSIS_RESOURCE_DEFAULTS,
checkpointBytes: 8 * 1024 * 1024,
checkpointBytes: JAVASCRIPT_STATIC_FACT_BYTES,
protocolBytes: 64 * 1024,
} as const;
@@ -2,6 +2,7 @@ import { javaScriptSemanticUnknownOmissionsSchema } from "../../domain/javascrip
import { z } from "zod";
import { digestSchema } from "../../domain/digests.js";
import type { JavaScriptStaticAnalysis } from "../../domain/javascript/javascriptStaticAnalysisTypes.js";
import { javaScriptRouteSourceFactsSchema } from "../../domain/javascript/javascriptRouteFacts.js";
import { JAVASCRIPT_AST_FINGERPRINT_ALGORITHM } from "../../domain/javascript/javascriptStaticAnalysisTypes.js";
import type {
JavaScriptSemanticProperty,
@@ -308,6 +309,7 @@ const referenceShape = {
export const javaScriptWorkerStaticAnalysisSchema = z
.strictObject({
parse_status: z.enum(["complete", "partial", "failed"]),
routes: javaScriptRouteSourceFactsSchema.exactOptional(),
parse_error_count: count,
visited_ast_nodes: count,
references: z.array(
@@ -1,3 +1,6 @@
import { fitJavaScriptRouteSourceFacts } from "../../domain/javascript/javascriptRouteResultBudget.js";
import { jsonValueByteLength } from "../../domain/jsonValueByteLength.js";
import type { JsonValue } from "../../domain/jsonValue.js";
import type { JavaScriptSemanticProjectionCapacity } from "../../domain/javascript/javascriptSemanticFileProjection.js";
import { createHash } from "node:crypto";
import { readFile, writeFile } from "node:fs/promises";
@@ -117,7 +120,24 @@ const analyzeJob = async (
{
phase: async (phase) => send({ kind: "phase", id: request.id, phase }),
checkpoint: async (facts) => {
const value = javaScriptWorkerStaticAnalysisSchema.parse(facts);
let value = javaScriptWorkerStaticAnalysisSchema.parse(facts);
if (value.routes !== undefined) {
const { routes, ...existing } = value;
// This is schema-checked, producer-owned JSON. Interface optional
// members can only make the size estimate conservative.
const available =
DEFAULTS.checkpointBytes -
jsonValueByteLength(
existing as JsonValue,
DEFAULTS.checkpointBytes,
) -
Buffer.byteLength(',"routes":');
const admitted = fitJavaScriptRouteSourceFacts(routes, available);
value =
admitted === undefined
? existing
: { ...existing, routes: admitted };
}
const text = JSON.stringify(value);
const bytes = Buffer.byteLength(text);
if (bytes > DEFAULTS.checkpointBytes)