mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-03 01:27:09 +01:00
Integrate routine status with scoped execution and source notifications
Keep all owner subscriptions, restore issue identity, and remove only the replaced routine and retention sweeps. Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
commit
bc3559eb5e
23 files changed
+696
-67
No files matched your search
@@ -1,5 +1,6 @@
|
||||
import { statusCardEvaluationService, registerStatusCardEvaluationWork } from "../services/status-card-evaluation.js";
|
||||
import { attentionRetentionService } from "../services/attention-retention.js";
|
||||
import { routineExecutionStatusService } from "../services/routine-run-status.js";
|
||||
import { nativeHarnessBackupExpirationService } from "../services/native-runtime/native-harness-backup-expiration.js";
|
||||
import { skillVersionRetentionService } from "../services/skill-version-retention.js";
|
||||
import { approvalQueueSeedingService } from "../services/approval-queue-seeding-work.js";
|
||||
@@ -400,6 +401,11 @@ vi.mock("../services/approval-retention.js", async importOriginal => ({
|
||||
approvalRetentionService: vi.fn(() => ({ sweep: vi.fn(async () => ({ archived: 0 })), next: vi.fn(async () => null) })),
|
||||
}));
|
||||
|
||||
vi.mock("../services/routine-run-status.js", async importOriginal => ({
|
||||
...await importOriginal<typeof import("../services/routine-run-status.js")>(),
|
||||
routineExecutionStatusService: vi.fn(() => ({ load: vi.fn(async () => []), settle: vi.fn(async () => false) })),
|
||||
}));
|
||||
|
||||
vi.mock("../services/index.js", () => ({
|
||||
backfillLegacyToolOAuthTokens: vi.fn(async () => ({
|
||||
scannedConnections: 0,
|
||||
@@ -1422,6 +1428,27 @@ describe("startServer feedback export wiring", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it.each([{ cloud: false, enabled: true }, { cloud: true, enabled: false }, { cloud: true, enabled: true }])(
|
||||
"registers routine status only for enabled Cloud scheduling ($cloud/$enabled)", async ({ cloud, enabled }) => {
|
||||
if (cloud) vi.stubEnv("PAPERCLIP_CLOUD_TENANT_SERVER_TOKEN", "startup-test-token");
|
||||
else vi.stubEnv("PAPERCLIP_CLOUD_TENANT_SERVER_TOKEN", undefined);
|
||||
loadConfigMock.mockReturnValue(buildTestConfig({ heartbeatSchedulerEnabled: enabled }));
|
||||
const intervalCallbacks: Array<() => void> = [];
|
||||
const intervals = vi.spyOn(globalThis, "setInterval").mockImplementation(((callback: () => void) => {
|
||||
intervalCallbacks.push(callback); return 1 as unknown as ReturnType<typeof setInterval>;
|
||||
}) as typeof setInterval);
|
||||
try {
|
||||
await startServer(); await settleStartupHousekeeping();
|
||||
expect(deliveryWorkRegisterMock.mock.calls.filter(([queue]) => queue === DELIVERY_QUEUES.routineExecutionStatus)).toHaveLength(cloud && enabled ? 1 : 0);
|
||||
const service = vi.mocked(routineExecutionStatusService).mock.results.at(-1)?.value;
|
||||
if (cloud && enabled) expect(service?.load).toHaveBeenCalledExactlyOnceWith(undefined, undefined);
|
||||
for (let index = 0; index < 4; index++) for (const callback of intervalCallbacks) callback();
|
||||
await settleStartupHousekeeping();
|
||||
if (cloud && enabled) expect(service?.load).toHaveBeenCalledOnce();
|
||||
} finally { intervals.mockRestore(); vi.unstubAllEnvs(); }
|
||||
},
|
||||
);
|
||||
|
||||
it("keeps routine ticks and setup cleanup active when heartbeat scheduling is suppressed", async () => {
|
||||
loadConfigMock.mockReturnValue(buildTestConfig({
|
||||
heartbeatSchedulerEnabled: true,
|
||||
|
||||
Reference in new issue
Block a user