feat: expose executor job observability
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import {
|
||||
buildExecutorJobEvent,
|
||||
createExecutorAdapterRegistry,
|
||||
createExecutorGateway,
|
||||
createInMemoryExecutorJobStore,
|
||||
@@ -49,6 +50,22 @@ test('executor job contract uses resource references and bounded controls', () =
|
||||
assert.equal(normalized.controls.timeoutMs, 500);
|
||||
assert.equal(normalized.controls.fallbackExecutor, 'openhands');
|
||||
assert.equal('cwd' in normalized.task, false);
|
||||
assert.throws(
|
||||
() => normalizeExecutorJobRequest(request({ jobId: '../unsafe' })),
|
||||
(error) => error.code === 'EXECUTOR_JOB_ID_INVALID',
|
||||
);
|
||||
|
||||
const event = buildExecutorJobEvent({
|
||||
eventId: 'event-1',
|
||||
jobId: 'job-1',
|
||||
sequence: 1,
|
||||
type: 'executor_job_blocked',
|
||||
timestamp: 1234,
|
||||
data: { status: 'blocked' },
|
||||
});
|
||||
assert.equal(event.version, 'executor-job-event-v1');
|
||||
assert.equal(event.sequence, 1);
|
||||
assert.deepEqual(event.data, { status: 'blocked' });
|
||||
});
|
||||
|
||||
test('Phase 3 executor catalog exposes disabled Goosed, Aider and OpenHands adapters', () => {
|
||||
@@ -104,6 +121,9 @@ test('Executor Gateway records a blocked idempotent job without calling an adapt
|
||||
assert.equal(repeated.created, false);
|
||||
assert.equal(repeated.job.jobId, first.job.jobId);
|
||||
assert.equal(repeated.job.createdAt, 1000);
|
||||
const eventPage = await gateway.listEvents('job-1');
|
||||
assert.deepEqual(eventPage.events.map((event) => event.type), ['executor_job_blocked']);
|
||||
assert.equal(eventPage.nextCursor, 1);
|
||||
});
|
||||
|
||||
test('Executor Gateway rejects idempotency key reuse with a different payload', async () => {
|
||||
@@ -133,6 +153,11 @@ test('Executor Gateway cancellation is idempotent and never invokes a disabled a
|
||||
assert.equal(cancelled.completedAt, 1500);
|
||||
assert.deepEqual(await gateway.cancel('job-1'), cancelled);
|
||||
assert.equal(await gateway.cancel('missing-job'), null);
|
||||
const eventPage = await gateway.listEvents('job-1', { after: 1 });
|
||||
assert.deepEqual(eventPage.events.map((event) => event.type), ['executor_job_cancelled']);
|
||||
assert.equal(eventPage.events[0].sequence, 2);
|
||||
assert.equal(eventPage.nextCursor, 2);
|
||||
assert.equal(await gateway.listEvents('missing-job'), null);
|
||||
});
|
||||
|
||||
test('Executor Gateway status remains hard-disabled with a non-durable reference store', () => {
|
||||
|
||||
Reference in New Issue
Block a user