From 63fe0eb5dbd4f4f8b12a7d6c7d8c51effe4673f3 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Thu, 22 Oct 2026 10:57:27 +0800 Subject: [PATCH] refactor(electron): reuse retention and capture contracts --- .../PlaywrightElectronActiveActions.ts | 35 ++++++++----------- .../javascriptRuntimeReconciliationActive.ts | 22 +++--------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/browser/PlaywrightElectronActiveActions.ts b/src/browser/PlaywrightElectronActiveActions.ts index b7af1de4cd..52dd52fd60 100644 --- a/src/browser/PlaywrightElectronActiveActions.ts +++ b/src/browser/PlaywrightElectronActiveActions.ts @@ -7,6 +7,7 @@ import { electronActiveTimelineEventSchema, electronActiveProcessMetricSchema, electronActiveWindowSchema, + electronActiveObservationResultSchema, type ElectronActiveObservationInput, type ElectronActiveObservationResult, } from "../domain/javascript/electronActiveObservation.js"; @@ -19,30 +20,22 @@ const OPERATION = "capture_electron_scenario" as const; const CANCELLED_STATE_READ_TIMEOUT_MS = 5_000; const GRACE_EXPIRED = Symbol("cancellation grace expired"); +const retention = electronActiveObservationResultSchema.shape.retention.shape; const hookSnapshotSchema = z.strictObject({ events: z.array(electronActiveTimelineEventSchema), - retention_budget_bytes: z.number().int().min(0), - estimated_retained_bytes: z.number().int().min(0), - event_serialized_byte_upper_bound: z.number().int().min(0), - retained: z.number().int().min(0), - dropped: z.number().int().min(0), - dropped_ipc: z.number().int().min(0), - dropped_runtime: z.number().int().min(0), - dropped_event_families: z.array( - z.strictObject({ - family: z.string().min(1), - count: z.number().int().min(1), - }), - ), - dropped_event_roles: z.array( - z.strictObject({ - role: z.string().min(1), - count: z.number().int().min(1), - }), - ), + retention_budget_bytes: retention.budget_bytes, + estimated_retained_bytes: retention.estimated_retained_bytes, + event_serialized_byte_upper_bound: + retention.event_serialized_byte_upper_bound, + retained: retention.retained, + dropped: retention.dropped, + dropped_ipc: retention.dropped_ipc, + dropped_runtime: retention.dropped_runtime, + dropped_event_families: retention.dropped_event_families, + dropped_event_roles: retention.dropped_event_roles, observed: z.number().int().min(0), - observed_ipc: z.number().int().min(0), - observed_runtime: z.number().int().min(0), + observed_ipc: retention.observed_ipc, + observed_runtime: retention.observed_runtime, hook_error: z.boolean(), }); diff --git a/src/domain/javascript/javascriptRuntimeReconciliationActive.ts b/src/domain/javascript/javascriptRuntimeReconciliationActive.ts index 4981888ed6..738cbc0644 100644 --- a/src/domain/javascript/javascriptRuntimeReconciliationActive.ts +++ b/src/domain/javascript/javascriptRuntimeReconciliationActive.ts @@ -8,10 +8,7 @@ import { parseAtPath, } from "./javascriptRuntimeReconciliationInputValidation.js"; -import { - classifyBrowserCompleteness, - type BrowserCompleteness, -} from "../browserCompleteness.js"; +import { classifyBrowserCompleteness } from "../browserCompleteness.js"; import { electronActiveObservationResultSchema, type ElectronActiveObservationResult, @@ -81,19 +78,10 @@ const assertIdentity = (evidence: Evidence): void => { }; const normalizeInspection = ( result: ElectronActiveObservationResult, -): { - readonly target: { - readonly target_id: string; - readonly type: string; - readonly title: string; - readonly attached: boolean; - readonly file_path: string; - }; - readonly frames: readonly []; - readonly scripts: { readonly items: readonly [] }; - readonly workers: readonly []; - readonly completeness: BrowserCompleteness; -} => ({ +): Extract< + ParsedRuntimeCapture, + { kind: "electron-active" } +>["inspection"] => ({ target: { target_id: `electron-active:${digestCanonicalValue(result.application.application_path, "Runtime reconciliation").slice(0, 32)}`, type: "electron-application",