fix(inspector): retain observations after capture failures

This commit is contained in:
morluto committed 2026-10-09 23:35:19 +08:00
1 parent c267e99227
commit dea3498b2b
9 files changed
+532 -45

No files matched your search

@@ -27,7 +27,6 @@ const observedJavaScriptRuntimeKindSchema = javascriptRuntimeKindSchema.or(
z.literal("unknown"),
);
/** Input for one bounded, attach-only V8 Inspector observation. */
/** Input for one passive attach-only V8 Inspector observation. */
export const observeJavaScriptRuntimeInputSchema = z.strictObject({
...runtimeEndpoint,
@@ -49,7 +48,6 @@ export const javascriptRuntimeLocationSchema = z.discriminatedUnion("kind", [
z.strictObject({
kind: z.literal("file"),
file_path: z.string().min(1),
authority: z.literal("scope-fallback").optional(),
}),
z.strictObject({
kind: z.literal("url"),
@@ -68,8 +66,15 @@ export type JavaScriptRuntimeLocation = z.infer<
/** Discovery metadata can identify an endpoint target without verifying its file location. */
export const javascriptRuntimeUnresolvedLocationSchema = z.strictObject({
kind: z.literal("unresolved"),
reported_url: z.string().min(1),
reason: z.literal("unverifiable-file-location"),
reported_url: z
.string()
.describe(
"Raw Inspector URL, which may be empty for anonymous or evaluated code.",
),
reason: z.enum([
"unverifiable-file-location",
"location-authorization-not-attempted",
]),
});
/** Verified locations and explicitly unresolved discovery metadata. */
@@ -104,7 +109,7 @@ export type JavaScriptRuntimeTargetList = z.infer<
const javascriptRuntimeScriptSchema = z.strictObject({
script_key: prefixedDigestSchema("v8_script"),
location: javascriptRuntimeLocationSchema,
location: javascriptRuntimeTargetLocationSchema,
execution_context_key: z.string().nullable(),
cdp_hash: z.string().nullable(),
length: z
@@ -20,7 +20,7 @@ import {
javascriptRuntimeObservationSchema,
javascriptRuntimeKindSchema,
type JavaScriptRuntimeObservation,
type JavaScriptRuntimeLocation,
type JavaScriptRuntimeTargetLocation,
} from "./javascriptRuntimeObservation.js";
import { canonicalDigest } from "../comparisonSemantics.js";
import { compareCodePoints } from "../canonicalOrdering.js";
@@ -89,7 +89,16 @@ interface NormalizedV8Inspection {
language: null;
source: { readonly included: false; readonly reason: string };
}> &
({ readonly file_path: string } | { readonly url: string }))[];
(
| { readonly file_path: string }
| { readonly url: string }
| {
readonly unresolved_location: Extract<
JavaScriptRuntimeObservation["scripts"]["items"][number]["location"],
{ kind: "unresolved" }
>;
}
))[];
};
readonly workers: readonly [];
readonly completeness: BrowserCompleteness;
@@ -367,8 +376,17 @@ const normalizeV8Inspection = (
});
const runtimeLocation = (
location: JavaScriptRuntimeLocation,
): { readonly file_path: string } | { readonly url: string } => {
location: JavaScriptRuntimeTargetLocation,
):
| { readonly file_path: string }
| { readonly url: string }
| {
readonly unresolved_location: Extract<
JavaScriptRuntimeTargetLocation,
{ kind: "unresolved" }
>;
} => {
if (location.kind === "unresolved") return { unresolved_location: location };
if (location.kind === "file") return { file_path: location.file_path };
if (location.kind === "url") return { url: location.sanitized_url };
return { url: location.specifier };
@@ -144,9 +144,14 @@ const scriptEntities = (
): RuntimeReconciliationEntity[] =>
capture.inspection.scripts.items.map((script) => {
const location =
"url" in script
? ({ kind: "url", value: script.url } as const)
: ({ kind: "file", value: script.file_path } as const);
"unresolved_location" in script
? ({
kind: "unresolved",
value: script.unresolved_location.reported_url,
} as const)
: "url" in script
? ({ kind: "url", value: script.url } as const)
: ({ kind: "file", value: script.file_path } as const);
return runtimeEntity(capture, {
kind: "script",
nodeKind: "runtime-script-instance",
@@ -161,7 +166,13 @@ const scriptEntities = (
: null,
label: location.value,
properties: {
location: location.value,
...("unresolved_location" in script
? {
location_kind: "unresolved",
reported_url: script.unresolved_location.reported_url,
location_reason: script.unresolved_location.reason,
}
: { location: location.value }),
cdp_hash: script.cdp_hash,
length: script.length,
is_module: script.is_module,