Rewrite ~525 call sites from `db.<method>()` to `db.<module>.<method>()` for tasks and agents domains (including `getAgent`/`findAgent`/`getTask` which live on the `entityCrud` field). Delete the corresponding pass-through methods on AppDatabaseBase. Structural types that narrowed `db` to a bag of flat methods (CapabilityMatchDb, EscalationDeps, SweepStaleReviewsDeps) are reshaped to match the new namespace. Internal callback references inside database.ts/database-base.ts now invoke the owning module directly (e.g. `this.agents.saveAgent`) rather than the deleted pass-through. The codemod lives at scripts/codemod/remove-appdatabase-passthrough.mjs and filters by owning module + optional explicit method list. It is idempotent and does not re-rewrite already-namespaced calls.
51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import type { OrchestrationDependencies } from "./types";
|
|
|
|
export function createIdleAutomationScheduler(deps: OrchestrationDependencies) {
|
|
const { db, logger, dispatchAutomation, hasWorkerReady, isQuitting } = deps;
|
|
|
|
let timer: ReturnType<typeof setInterval> | null = null;
|
|
|
|
function start() {
|
|
if (timer) clearInterval(timer);
|
|
|
|
timer = setInterval(() => {
|
|
try {
|
|
if (isQuitting() || !hasWorkerReady()) return;
|
|
|
|
const activeCompanies = db.listActiveCompanyIds();
|
|
const now = Date.now();
|
|
|
|
for (const company of activeCompanies) {
|
|
try {
|
|
const companyAgents = db.agents.listActiveAgentsForCompany(company.id);
|
|
for (const agent of companyAgents) {
|
|
if (!db.agents.hasAgentAssignedTasks(agent.id, company.id)) {
|
|
const lastActive = agent.lastHeartbeatAt ? new Date(agent.lastHeartbeatAt).getTime() : 0;
|
|
const idleThreshold = 20 * 60 * 1000;
|
|
if (now - lastActive > idleThreshold) {
|
|
dispatchAutomation("agent_idle", {
|
|
companyId: company.id,
|
|
agentId: agent.id,
|
|
department: agent.department ?? undefined,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
logger.error(`[idle-automation] Error processing company ${company.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
logger.error(`[idle-automation] Scheduler error: ${error instanceof Error ? error.message : String(error)}`);
|
|
}
|
|
}, 60_000);
|
|
}
|
|
|
|
function stop() {
|
|
if (timer) clearInterval(timer);
|
|
timer = null;
|
|
}
|
|
|
|
return { start, stop };
|
|
}
|