LibreChat/api/server/services/Agents/triggers.spec.js
Danny Avila c7f0a8f247
📬 feat: Move Agent Queued Turns Server-Side (#15370)
* feat: move agent queued turns server-side

* test: update queued turn composition coverage

* fix: harden queued-turn lifecycle ownership

* fix: centralize queued-turn lifecycle ownership

* fix: close queued-turn lifecycle gaps

* fix: unify queued turn lifecycle transitions

* fix: fence queued-turn deletion admission

* fix: preserve queued-turn lifecycle ownership

* fix: close queued-turn reconciliation races

* fix: reconcile quarantined queued-turn admissions

* fix: annotate admission evidence default

* fix: deepen queued turn lifecycle admission

* fix: fence queued turn provider admission
2026-08-30 21:53:58 -04:00

65 lines
2.3 KiB
JavaScript

const mockCreateAgentTriggerService = jest.fn();
const mockGenerationJobManager = {
supportsDetachedAgentEventActions: true,
getJob: jest.fn(),
getGenerationAdmissionEvidence: jest.fn(),
};
const mockQueuedTurnLifecycle = {
prepareContinue: jest.fn(),
settleBeforeDeadLetter: jest.fn(),
recordExecutionAdmission: jest.fn(),
verifyExecutionAdmission: jest.fn(),
initialize: jest.fn(),
stop: jest.fn(),
schedule: jest.fn(),
cancel: jest.fn(),
};
jest.mock('@librechat/api', () => ({
createAgentTriggerService: (...args) => mockCreateAgentTriggerService(...args),
createAgentContinuationResolver: jest.fn(() => jest.fn()),
createAgentEventContinueResolver: jest.fn(() => jest.fn()),
createBackgroundToolCompletionWakeupResolver: jest.fn(() => jest.fn()),
createSubagentCompletionWakeupResolver: jest.fn(() => jest.fn()),
createAgentQueuedTurnLifecycle: jest.fn(() => mockQueuedTurnLifecycle),
BACKGROUND_TOOL_COMPLETION_SOURCE: 'background-tool-completion',
SUBAGENT_COMPLETION_SOURCE: 'subagent-completion',
AGENT_QUEUED_TURN_SOURCE: 'agent-queued-turn',
GenerationJobManager: mockGenerationJobManager,
}));
jest.mock('~/models', () => ({
isAgentTriggerPrincipalActive: jest.fn(),
}));
describe('agent trigger service composition', () => {
beforeEach(() => {
jest.resetModules();
jest.clearAllMocks();
mockGenerationJobManager.supportsDetachedAgentEventActions = true;
mockCreateAgentTriggerService.mockReturnValue({
initialize: jest.fn(),
stop: jest.fn(),
dispatch: jest.fn(),
enqueue: jest.fn(),
getDelivery: jest.fn(),
getDeliveryStatus: jest.fn(),
getDeadLetters: jest.fn(),
requeue: jest.fn(),
drainUser: jest.fn(),
prepareUserPurge: jest.fn(),
cancelUserPurge: jest.fn(),
purgeUser: jest.fn(),
});
});
it('advertises detached completion capability for every compatible generation store', () => {
require('./triggers');
const supportsDetachedActionCompletion =
mockCreateAgentTriggerService.mock.calls[0][0].supportsDetachedActionCompletion;
expect(supportsDetachedActionCompletion()).toBe(true);
mockGenerationJobManager.supportsDetachedAgentEventActions = false;
expect(supportsDetachedActionCompletion()).toBe(false);
});
});