fix(javascript): preserve analysis applicability after interruption (#4207)

Preserve applicable artifact processing phases and entered/unvisited status after interruption. Centralize JavaScript semantic applicability for full and incremental builders; retain native byte identity, actual JavaScript unknowns and structured-file provenance.

Fixes #3948. Part of #4027.

Validation:78 distinct focused cases across10files, full static/docs, and real Joplin timeout/default public CLI/MCP controls passed. Source pins, every attempt/outlier and compact resource/token projections are retained. No target/native provider execution or speedup claim.

Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
This commit is contained in:
Ysopwnable
2026-10-16 03:46:00 +08:00
committed by GitHub
parent 663d07f02c
commit 85eac7b92b
18 changed files with 3717 additions and 93 deletions
@@ -6,6 +6,7 @@ import {
partialApplicationCoverage,
} from "../../domain/javascript/javascriptApplicationEvidenceSchemas.js";
import type { JavaScriptModuleArtifactAnalysis } from "./JavaScriptArtifactAnalysisTypes.js";
import { javascriptArtifactAnalysisScopes } from "./JavaScriptArtifactAnalysisTypes.js";
import { jsonValueSchema } from "../../domain/jsonValue.js";
import { freezeJsonSnapshot } from "../../domain/immutableJson.js";
import type { JavaScriptSourceRange } from "../../domain/javascript/javascriptStaticAnalysisTypes.js";
@@ -211,11 +212,17 @@ export const addJavaScriptArtifactFiles = (
}),
});
}
if (!file.text.included && file.text.reason === "outside-analysis-scope")
const analysisScope = javascriptArtifactAnalysisScopes[file.kind];
if (
!file.text.included &&
file.text.reason === "outside-analysis-scope" &&
analysisScope !== null
)
addUnavailableStaticParseScope(context, {
file,
asset: target,
operation: "select-javascript-sources",
authority: analysisScope.authority,
limitation:
"Source is outside the caller-selected source_paths; it was inventoried but not analyzed.",
});
@@ -223,12 +230,13 @@ export const addJavaScriptArtifactFiles = (
addUnavailableStaticParseScope(context, {
file,
asset: target,
operation: "analyze-javascript-source",
...analyzed.analysis_failure.scope,
limitation: analyzed.analysis_failure.reason,
failure: analyzed.analysis_failure.error,
limits: javaScriptAnalysisCoverageLimits(
analyzed.analysis_failure.limits,
),
details: { analysis_status: analyzed.analysis_failure.status },
});
else if (
file.kind === "javascript" &&
@@ -239,6 +247,7 @@ export const addJavaScriptArtifactFiles = (
file,
asset: target,
operation: "parse-javascript",
authority: javascriptArtifactAnalysisScopes.javascript.authority,
limitation: file.text.included
? "JavaScript syntax could not be parsed."
: `JavaScript text was unavailable: ${file.text.reason}.`,
@@ -248,6 +257,7 @@ export const addJavaScriptArtifactFiles = (
file,
asset: target,
operation: "project-javascript-application",
authority: javascriptArtifactAnalysisScopes.javascript.authority,
limitation: analyzed.application_projection_failure.reason,
failure: analyzed.application_projection_failure.error,
limits: javaScriptAnalysisCoverageLimits(
@@ -259,14 +269,14 @@ export const addJavaScriptArtifactFiles = (
addUnavailableStaticParseScope(context, {
file,
asset: target,
operation: "parse-package-json",
...javascriptArtifactAnalysisScopes["package-json"],
limitation: packageValue.limitation,
});
if (jsonValue !== undefined && jsonValue.status !== "included")
addUnavailableStaticParseScope(context, {
file,
asset: target,
operation: "parse-json-module",
...javascriptArtifactAnalysisScopes.json,
limitation: jsonValue.limitation,
});
const sourceMap = sourceMapsByPath.get(file.path);
@@ -274,7 +284,7 @@ export const addJavaScriptArtifactFiles = (
addUnavailableStaticParseScope(context, {
file,
asset: target,
operation: "parse-local-source-map",
...javascriptArtifactAnalysisScopes["source-map"],
limitation: sourceMap.limitation,
});
const inlineScripts = inlineScriptsByPath.get(file.path);
@@ -283,6 +293,7 @@ export const addJavaScriptArtifactFiles = (
file,
asset: target,
operation: "parse-html-inline-scripts",
authority: javascriptArtifactAnalysisScopes.javascript.authority,
limitation: htmlInlineScriptLimitation(inlineScripts),
limits:
inlineScripts.script_count > inlineScripts.scripts.length