From d31caa81ef8c82483fadb1acf337f87aa748ec34 Mon Sep 17 00:00:00 2001 From: Sebastian <19554889+sebslight@users.noreply.github.com> Date: Thu, 12 Feb 2026 09:28:47 -0500 Subject: [PATCH] fix(runtime): guard cleanup and preserve skipped cron jobs --- extensions/voice-call/src/providers/twilio.test.ts | 8 +++++--- src/agents/bash-process-registry.ts | 2 +- src/cron/service/timer.ts | 4 +--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extensions/voice-call/src/providers/twilio.test.ts b/extensions/voice-call/src/providers/twilio.test.ts index 36b25005f0..3a5652a356 100644 --- a/extensions/voice-call/src/providers/twilio.test.ts +++ b/extensions/voice-call/src/providers/twilio.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import type { WebhookContext } from "../types.js"; import { TwilioProvider } from "./twilio.js"; -const STREAM_URL_PREFIX = "wss://example.ngrok.app/voice/stream?token="; +const STREAM_URL = "wss://example.ngrok.app/voice/stream"; function createProvider(): TwilioProvider { return new TwilioProvider( @@ -30,7 +30,8 @@ describe("TwilioProvider", () => { const result = provider.parseWebhookEvent(ctx); - expect(result.providerResponseBody).toContain(STREAM_URL_PREFIX); + expect(result.providerResponseBody).toContain(STREAM_URL); + expect(result.providerResponseBody).toContain('"); }); @@ -54,7 +55,8 @@ describe("TwilioProvider", () => { const result = provider.parseWebhookEvent(ctx); - expect(result.providerResponseBody).toContain(STREAM_URL_PREFIX); + expect(result.providerResponseBody).toContain(STREAM_URL); + expect(result.providerResponseBody).toContain('"); }); }); diff --git a/src/agents/bash-process-registry.ts b/src/agents/bash-process-registry.ts index 171b5f4527..7801d41f35 100644 --- a/src/agents/bash-process-registry.ts +++ b/src/agents/bash-process-registry.ts @@ -168,7 +168,7 @@ function moveToFinished(session: ProcessSession, status: ProcessStatus) { session.child.stderr?.destroy?.(); // Remove all event listeners to prevent memory leaks - session.child.removeAllListeners(); + session.child.removeAllListeners?.(); // Clear the reference delete session.child; diff --git a/src/cron/service/timer.ts b/src/cron/service/timer.ts index aa94adda2a..0259dfc61d 100644 --- a/src/cron/service/timer.ts +++ b/src/cron/service/timer.ts @@ -70,9 +70,7 @@ function applyJobResult( } const shouldDelete = - job.schedule.kind === "at" && - job.deleteAfterRun === true && - (result.status === "ok" || result.status === "skipped"); + job.schedule.kind === "at" && job.deleteAfterRun === true && result.status === "ok"; if (!shouldDelete) { if (job.schedule.kind === "at") {