* feat: add next_action field to update_job_status response * docs: add Batch-loop section to README * feat: presence layer — registerWorker, startHeartbeat, registerShutdownHandlers * feat: bootstrap worker presence at server startup, remove inline presence from wait-for-job * docs: document worker presence layer in CLAUDE.md * docs: refine Batch-loop intro — add 'Hier is de flow:' per implementation plan
23 lines
652 B
TypeScript
23 lines
652 B
TypeScript
import { prisma } from '../prisma.js'
|
|
|
|
export function startHeartbeat(opts: {
|
|
tokenId: string
|
|
intervalMs?: number
|
|
}): { stop: () => void } {
|
|
const timer = setInterval(async () => {
|
|
try {
|
|
const result = await prisma.claudeWorker.updateMany({
|
|
where: { token_id: opts.tokenId },
|
|
data: { last_seen_at: new Date() },
|
|
})
|
|
if (result.count === 0) {
|
|
console.error('[scrum4me-mcp] Heartbeat: worker record not found — token may be revoked. Stopping.')
|
|
clearInterval(timer)
|
|
}
|
|
} catch {
|
|
// non-fatal
|
|
}
|
|
}, opts.intervalMs ?? 5_000)
|
|
|
|
return { stop: () => clearInterval(timer) }
|
|
}
|