diff --git a/loopx/control_plane/collaboration/steward_managed_mode.ts b/loopx/control_plane/collaboration/steward_managed_mode.ts index dc2e205a5e..6d8c3933fc 100644 --- a/loopx/control_plane/collaboration/steward_managed_mode.ts +++ b/loopx/control_plane/collaboration/steward_managed_mode.ts @@ -8,6 +8,7 @@ import { createHash } from "node:crypto"; import type { JsonObject } from "../runtime_decode.ts"; import { requireJsonObject, requireNonEmptyString } from "../runtime_decode.ts"; import { EffectRuntimeRequestError } from "../effect_runtime_errors.ts"; +import { ENVELOPED_SHA256_PATTERN } from "../content_digest.ts"; export const STEWARD_MANAGED_ACTOR_SCHEMA = "loopx_steward_managed_actor_v0"; const AGENT_ID = "steward"; @@ -152,7 +153,7 @@ export function admitStewardManagedTurn(params: JsonObject): JsonObject { throw new EffectRuntimeRequestError("report execution requires the original live subscription, window and task"); } if (request.resume_turn_key !== undefined) { - if (typeof request.resume_turn_key !== "string" || !/^sha256:[a-f0-9]{64}$/.test(request.resume_turn_key)) { + if (typeof request.resume_turn_key !== "string" || !ENVELOPED_SHA256_PATTERN.test(request.resume_turn_key)) { throw new EffectRuntimeRequestError("report recovery requires the original native Turn key"); } // An already accepted worker retains its ordinary active-Turn fence. diff --git a/tests/control_plane_ts/content_digest_single_owner.test.ts b/tests/control_plane_ts/content_digest_single_owner.test.ts index f8cf6a6bee..bb5887b2f6 100644 --- a/tests/control_plane_ts/content_digest_single_owner.test.ts +++ b/tests/control_plane_ts/content_digest_single_owner.test.ts @@ -115,6 +115,7 @@ const CANONICAL_CONSUMERS = [ "control_plane/collaboration/result_publication.ts", "control_plane/collaboration/return_delivery.ts", "control_plane/collaboration/semantic_request.ts", + "control_plane/collaboration/steward_managed_mode.ts", "control_plane/collaboration/turn_context.ts", "control_plane/coordination/authority_archive_read.ts", "control_plane/coordination/authority_source.ts",