Skip to content

Commit 75d7325

Browse files
committed
test(tasks): add control runtime override seam
1 parent 8b29736 commit 75d7325

3 files changed

Lines changed: 39 additions & 7 deletions

File tree

src/plugins/runtime/runtime-task-test-harness.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { vi } from "vitest";
22
import {
3+
resetTaskRegistryControlRuntimeForTests,
34
resetTaskRegistryDeliveryRuntimeForTests,
45
resetTaskRegistryForTests,
6+
setTaskRegistryControlRuntimeForTests,
57
setTaskRegistryDeliveryRuntimeForTests,
68
} from "../../tasks/runtime-internal.js";
79
import { resetTaskFlowRegistryForTests } from "../../tasks/task-flow-runtime-internal.js";
@@ -12,13 +14,6 @@ const runtimeTaskMocks = vi.hoisted(() => ({
1214
killSubagentRunAdminMock: vi.fn(),
1315
}));
1416

15-
vi.mock("../../tasks/task-registry-control.runtime.js", () => ({
16-
getAcpSessionManager: () => ({
17-
cancelSession: runtimeTaskMocks.cancelSessionMock,
18-
}),
19-
killSubagentRunAdmin: (params: unknown) => runtimeTaskMocks.killSubagentRunAdminMock(params),
20-
}));
21-
2217
export function getRuntimeTaskMocks() {
2318
return runtimeTaskMocks;
2419
}
@@ -27,11 +22,18 @@ export function installRuntimeTaskDeliveryMock(): void {
2722
setTaskRegistryDeliveryRuntimeForTests({
2823
sendMessage: runtimeTaskMocks.sendMessageMock,
2924
});
25+
setTaskRegistryControlRuntimeForTests({
26+
getAcpSessionManager: () => ({
27+
cancelSession: runtimeTaskMocks.cancelSessionMock,
28+
}),
29+
killSubagentRunAdmin: (params: unknown) => runtimeTaskMocks.killSubagentRunAdminMock(params),
30+
});
3031
}
3132

3233
export function resetRuntimeTaskTestState(
3334
taskRegistryOptions?: Parameters<typeof resetTaskRegistryForTests>[0],
3435
): void {
36+
resetTaskRegistryControlRuntimeForTests();
3537
resetTaskRegistryDeliveryRuntimeForTests();
3638
resetTaskRegistryForTests(taskRegistryOptions);
3739
resetTaskFlowRegistryForTests({ persist: false });

src/tasks/runtime-internal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export {
33
createTaskRecord,
44
deleteTaskRecordById,
55
ensureTaskRegistryReady,
6+
resetTaskRegistryControlRuntimeForTests,
67
findLatestTaskForOwnerKey,
78
findLatestTaskForFlowId,
89
findLatestTaskForRelatedSessionKey,
@@ -25,6 +26,7 @@ export {
2526
resolveTaskForLookupToken,
2627
resetTaskRegistryForTests,
2728
isParentFlowLinkError,
29+
setTaskRegistryControlRuntimeForTests,
2830
setTaskRegistryDeliveryRuntimeForTests,
2931
setTaskCleanupAfterById,
3032
setTaskProgressById,

src/tasks/task-registry.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,19 @@ type TaskRegistryDeliveryRuntime = Pick<
6363
typeof import("./task-registry-delivery-runtime.js"),
6464
"sendMessage"
6565
>;
66+
type TaskRegistryControlRuntime = Pick<
67+
typeof import("./task-registry-control.runtime.js"),
68+
"getAcpSessionManager" | "killSubagentRunAdmin"
69+
>;
6670
const TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY = Symbol.for(
6771
"openclaw.taskRegistry.deliveryRuntimeOverride",
6872
);
73+
const TASK_REGISTRY_CONTROL_RUNTIME_OVERRIDE_KEY = Symbol.for(
74+
"openclaw.taskRegistry.controlRuntimeOverride",
75+
);
6976
type TaskRegistryGlobalWithDeliveryOverride = typeof globalThis & {
7077
[TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY]?: TaskRegistryDeliveryRuntime | null;
78+
[TASK_REGISTRY_CONTROL_RUNTIME_OVERRIDE_KEY]?: TaskRegistryControlRuntime | null;
7179
};
7280
let deliveryRuntimePromise: Promise<typeof import("./task-registry-delivery-runtime.js")> | null =
7381
null;
@@ -379,6 +387,12 @@ function loadTaskRegistryDeliveryRuntime() {
379387
}
380388

381389
function loadTaskRegistryControlRuntime() {
390+
const controlRuntimeOverride = (globalThis as TaskRegistryGlobalWithDeliveryOverride)[
391+
TASK_REGISTRY_CONTROL_RUNTIME_OVERRIDE_KEY
392+
];
393+
if (controlRuntimeOverride) {
394+
return Promise.resolve(controlRuntimeOverride);
395+
}
382396
// Registry reads happen far more often than task cancellation, so keep the ACP/subagent
383397
// control graph off the default import path until a cancellation flow actually needs it.
384398
controlRuntimePromise ??= import("./task-registry-control.runtime.js");
@@ -1976,3 +1990,17 @@ export function setTaskRegistryDeliveryRuntimeForTests(runtime: TaskRegistryDeli
19761990
] = runtime;
19771991
deliveryRuntimePromise = null;
19781992
}
1993+
1994+
export function resetTaskRegistryControlRuntimeForTests() {
1995+
(globalThis as TaskRegistryGlobalWithDeliveryOverride)[
1996+
TASK_REGISTRY_CONTROL_RUNTIME_OVERRIDE_KEY
1997+
] = null;
1998+
controlRuntimePromise = null;
1999+
}
2000+
2001+
export function setTaskRegistryControlRuntimeForTests(runtime: TaskRegistryControlRuntime): void {
2002+
(globalThis as TaskRegistryGlobalWithDeliveryOverride)[
2003+
TASK_REGISTRY_CONTROL_RUNTIME_OVERRIDE_KEY
2004+
] = runtime;
2005+
controlRuntimePromise = null;
2006+
}

0 commit comments

Comments
 (0)