fix(opencode): broadcast activity idle after cooldown (#1249)
Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
This commit is contained in:
committed by
GitHub
co-authored by
Isaac Sanchez
parent
05c5683ecb
commit
f01391dd72
@@ -96,7 +96,8 @@ export const createSessionRuntime = ({ writeSseEvent, getNotificationClients, br
|
|||||||
const timer = setTimeout(() => {
|
const timer = setTimeout(() => {
|
||||||
const now = sessionActivityPhases.get(sessionId);
|
const now = sessionActivityPhases.get(sessionId);
|
||||||
if (now?.phase === 'cooldown') {
|
if (now?.phase === 'cooldown') {
|
||||||
sessionActivityPhases.set(sessionId, { phase: 'idle', updatedAt: Date.now() });
|
setSessionActivityPhase(sessionId, 'idle');
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
sessionActivityCooldowns.delete(sessionId);
|
sessionActivityCooldowns.delete(sessionId);
|
||||||
}, SESSION_COOLDOWN_DURATION_MS);
|
}, SESSION_COOLDOWN_DURATION_MS);
|
||||||
@@ -178,7 +179,9 @@ export const createSessionRuntime = ({ writeSseEvent, getNotificationClients, br
|
|||||||
}
|
}
|
||||||
|
|
||||||
const phase = status === 'busy' || status === 'retry' ? 'busy' : 'idle';
|
const phase = status === 'busy' || status === 'retry' ? 'busy' : 'idle';
|
||||||
setSessionActivityPhase(sessionId, phase);
|
if (phase !== 'idle' || sessionActivityPhases.get(sessionId)?.phase !== 'cooldown') {
|
||||||
|
setSessionActivityPhase(sessionId, phase);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getSessionStateSnapshot = () => {
|
const getSessionStateSnapshot = () => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { afterEach, describe, expect, it } from 'vitest';
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
|
||||||
import { createSessionRuntime } from './session-runtime.js';
|
import { createSessionRuntime } from './session-runtime.js';
|
||||||
|
|
||||||
@@ -97,4 +97,55 @@ describe('session runtime', () => {
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('broadcasts idle activity when cooldown expires', () => {
|
||||||
|
vi.useFakeTimers();
|
||||||
|
const events = [];
|
||||||
|
const runtime = createSessionRuntime({
|
||||||
|
writeSseEvent() {
|
||||||
|
throw new Error('SSE fallback should not be used when broadcastEvent is provided');
|
||||||
|
},
|
||||||
|
getNotificationClients: () => new Set(),
|
||||||
|
broadcastEvent: (payload) => {
|
||||||
|
events.push(payload);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
runtime.processOpenCodeSsePayload({
|
||||||
|
type: 'session.status',
|
||||||
|
properties: {
|
||||||
|
sessionID: 'session-activity-1',
|
||||||
|
status: {
|
||||||
|
type: 'busy',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
runtime.processOpenCodeSsePayload({
|
||||||
|
type: 'session.status',
|
||||||
|
properties: {
|
||||||
|
sessionID: 'session-activity-1',
|
||||||
|
status: {
|
||||||
|
type: 'idle',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const activityPhases = () => events
|
||||||
|
.filter((event) => event.type === 'openchamber:session-activity')
|
||||||
|
.map((event) => event.properties.phase);
|
||||||
|
|
||||||
|
expect(activityPhases()).toEqual(['busy', 'cooldown']);
|
||||||
|
|
||||||
|
vi.advanceTimersByTime(1999);
|
||||||
|
expect(activityPhases()).toEqual(['busy', 'cooldown']);
|
||||||
|
|
||||||
|
vi.advanceTimersByTime(1);
|
||||||
|
|
||||||
|
expect(activityPhases()).toEqual(['busy', 'cooldown', 'idle']);
|
||||||
|
} finally {
|
||||||
|
runtime.dispose();
|
||||||
|
vi.useRealTimers();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user