From 19cd8f90ce2124a40edb857bba20b776d4e34ef0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 30 Sep 2026 21:40:06 +0000 Subject: [PATCH] feat(runner): /status meldet bekannte Dev-Spezifikationen (known) Co-Authored-By: Claude Sonnet 5.5 --- runner/src/dev.js | 4 +++- runner/src/server.js | 2 +- runner/test/dev.test.js | 8 ++++++++ runner/test/server.test.js | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/runner/src/dev.js b/runner/src/dev.js index 79e2fca..26e0c48 100644 --- a/runner/src/dev.js +++ b/runner/src/dev.js @@ -184,6 +184,8 @@ export function createDev({ await e.promise.catch(() => {}); if (!entries.has(sub)) await rmDir(join(config.workRoot, 'dev', sub)).catch(() => {}); // Arbeitsordner aufräumen } + // R18: Subdomains mit gemerkter Spezifikation (auch schlafende); das Portal registriert fehlende nach. + const known = () => [...specs.keys()]; const list = () => [...entries.values()].map((e) => ({ sub: e.sub, state: e.state, lastUsed: e.lastUsed, sha: e.sha })); function status(sub) { const e = entries.get(sub); @@ -200,5 +202,5 @@ export function createDev({ } const idle = () => Promise.all([...entries.values()].map((e) => e.promise)).then(() => {}); - return { ensure, register, wake, touch, markDead, stop, list, status, sweep, cleanupOrphans, idle }; + return { ensure, register, wake, touch, markDead, known, stop, list, status, sweep, cleanupOrphans, idle }; } diff --git a/runner/src/server.js b/runner/src/server.js index 55f61d3..ea2b17e 100644 --- a/runner/src/server.js +++ b/runner/src/server.js @@ -55,7 +55,7 @@ export function createApiServer({ config, jobs, dev, mem = readMemAvailable }) { const method = req.method; if (method === 'GET' && url.pathname === '/status') { - return send(res, 200, { dev: dev.list(), queue: jobs.queueLength(), memAvailable: mem() }); + return send(res, 200, { dev: dev.list(), known: dev.known ? dev.known() : [], queue: jobs.queueLength(), memAvailable: mem() }); } if (method === 'POST' && url.pathname === '/jobs/build') { const v = validateJob(await readJson(req)); diff --git a/runner/test/dev.test.js b/runner/test/dev.test.js index e85e547..2aec86f 100644 --- a/runner/test/dev.test.js +++ b/runner/test/dev.test.js @@ -344,3 +344,11 @@ test('I7: markDead entfernt den Container und setzt sleeping', async () => { assert.equal(s.dev.list().find((e) => e.sub === 'a').state, 'sleeping'); assert.equal((await s.dev.wake('a')).state, 'starting'); }); + +test('R18: known liefert Subdomains mit Spezifikation (auch ohne Eintrag), stop vergisst sie', async () => { + const s = setup(); + await s.dev.register('a', job('a')); + assert.deepEqual(s.dev.known(), ['a']); + await s.dev.stop('a'); + assert.deepEqual(s.dev.known(), []); +}); diff --git a/runner/test/server.test.js b/runner/test/server.test.js index 9f1d9c1..140375d 100644 --- a/runner/test/server.test.js +++ b/runner/test/server.test.js @@ -64,7 +64,7 @@ test('GET /status', async () => { await withServer(config, async (base) => { const r = await fetch(`${base}/status`, { headers: auth }); assert.equal(r.status, 200); - assert.deepEqual(await r.json(), { dev: [], queue: 0, memAvailable: 123 }); + assert.deepEqual(await r.json(), { dev: [], known: [], queue: 0, memAvailable: 123 }); }); });