db: split runtime facade by domain

This commit is contained in:
ejclaw
2026-04-11 08:09:29 +09:00
parent 10fa7fb747
commit af04fe04cf
5 changed files with 1117 additions and 956 deletions

311
src/db/runtime-paired.ts Normal file
View File

@@ -0,0 +1,311 @@
import { SERVICE_SESSION_SCOPE } from '../config.js';
import { type PairedTurnIdentity } from '../paired-turn-identity.js';
import {
AgentType,
PairedProject,
PairedRoomRole,
PairedTask,
PairedTurnOutput,
PairedTurnReservationIntentKind,
PairedWorkspace,
} from '../types.js';
import {
clearChannelOwnerLeaseInDatabase,
getAllChannelOwnerLeasesFromDatabase,
getChannelOwnerLeaseFromDatabase,
setChannelOwnerLeaseInDatabase,
type ChannelOwnerLeaseRow,
type SetChannelOwnerLeaseInput,
} from './channel-owner-leases.js';
import {
claimPairedTurnReservationInDatabase,
clearPairedTaskExecutionLeasesInDatabase,
clearPairedTurnReservationsInDatabase,
type PairedTaskUpdates,
createPairedTaskInDatabase,
getLastBotFinalMessageFromDatabase,
getLatestOpenPairedTaskForChatFromDatabase,
getLatestPairedTaskForChatFromDatabase,
getPairedProjectFromDatabase,
getPairedTaskByIdFromDatabase,
getPairedWorkspaceFromDatabase,
listPairedWorkspacesForTaskFromDatabase,
refreshPairedTaskExecutionLeaseInDatabase,
releasePairedTaskExecutionLeaseInDatabase,
reservePairedTurnReservationInDatabase,
updatePairedTaskIfUnchangedInDatabase,
updatePairedTaskInDatabase,
upsertPairedProjectInDatabase,
upsertPairedWorkspaceInDatabase,
} from './paired-state.js';
import {
clearPairedTurnAttemptsInDatabase,
getPairedTurnAttemptsForTurnFromDatabase,
type PairedTurnAttemptRecord,
} from './paired-turn-attempts.js';
import {
getLatestTurnNumberFromDatabase,
getPairedTurnOutputsFromDatabase,
insertPairedTurnOutputInDatabase,
} from './paired-turn-outputs.js';
import {
clearPairedTurnsInDatabase,
completePairedTurnInDatabase,
failPairedTurnInDatabase,
getPairedTurnByIdFromDatabase,
getPairedTurnsForTaskFromDatabase,
markPairedTurnRunningInDatabase,
type PairedTurnRecord,
} from './paired-turns.js';
import { requireDatabase } from './runtime-database.js';
import {
type CompleteServiceHandoffCursorInput,
type CreateServiceHandoffInput,
type ServiceHandoff,
claimServiceHandoffInDatabase,
completeServiceHandoffAndAdvanceTargetCursorInDatabase,
completeServiceHandoffInDatabase,
createServiceHandoffInDatabase,
failServiceHandoffInDatabase,
getAllPendingServiceHandoffsFromDatabase,
getPendingServiceHandoffsFromDatabase,
} from './service-handoffs.js';
export function upsertPairedProject(project: PairedProject): void {
upsertPairedProjectInDatabase(requireDatabase(), project);
}
export function getPairedProject(chatJid: string): PairedProject | undefined {
return getPairedProjectFromDatabase(requireDatabase(), chatJid);
}
export function createPairedTask(task: PairedTask): void {
createPairedTaskInDatabase(requireDatabase(), task);
}
export function getPairedTaskById(id: string): PairedTask | undefined {
return getPairedTaskByIdFromDatabase(requireDatabase(), id);
}
export function getLatestPairedTaskForChat(
chatJid: string,
): PairedTask | undefined {
return getLatestPairedTaskForChatFromDatabase(requireDatabase(), chatJid);
}
export function getLatestOpenPairedTaskForChat(
chatJid: string,
): PairedTask | undefined {
return getLatestOpenPairedTaskForChatFromDatabase(requireDatabase(), chatJid);
}
export function updatePairedTask(id: string, updates: PairedTaskUpdates): void {
updatePairedTaskInDatabase(requireDatabase(), id, updates);
}
export function updatePairedTaskIfUnchanged(
id: string,
expectedUpdatedAt: string,
updates: PairedTaskUpdates,
): boolean {
return updatePairedTaskIfUnchangedInDatabase(
requireDatabase(),
id,
expectedUpdatedAt,
updates,
);
}
export function reservePairedTurnReservation(args: {
chatJid: string;
taskId: string;
taskStatus: PairedTask['status'];
roundTripCount: number;
taskUpdatedAt: string;
intentKind: PairedTurnReservationIntentKind;
runId: string;
}): boolean {
return reservePairedTurnReservationInDatabase(requireDatabase(), args);
}
export function claimPairedTurnReservation(args: {
chatJid: string;
taskId: string;
taskStatus: PairedTask['status'];
roundTripCount: number;
taskUpdatedAt: string;
intentKind: PairedTurnReservationIntentKind;
runId: string;
}): boolean {
return claimPairedTurnReservationInDatabase(requireDatabase(), args);
}
export function releasePairedTaskExecutionLease(args: {
taskId: string;
runId: string;
}): void {
releasePairedTaskExecutionLeaseInDatabase(requireDatabase(), args);
}
export function refreshPairedTaskExecutionLease(args: {
taskId: string;
runId: string;
now?: string;
}): boolean {
return refreshPairedTaskExecutionLeaseInDatabase(requireDatabase(), args);
}
export function markPairedTurnRunning(args: {
turnIdentity: PairedTurnIdentity;
executorServiceId?: string | null;
executorAgentType?: AgentType | null;
runId?: string | null;
}): void {
markPairedTurnRunningInDatabase(requireDatabase(), args);
}
export function completePairedTurn(turnIdentity: PairedTurnIdentity): void {
completePairedTurnInDatabase(requireDatabase(), turnIdentity);
}
export function failPairedTurn(args: {
turnIdentity: PairedTurnIdentity;
error?: string | null;
}): void {
failPairedTurnInDatabase(requireDatabase(), args);
}
export function getPairedTurnById(
turnId: string,
): PairedTurnRecord | undefined {
return getPairedTurnByIdFromDatabase(requireDatabase(), turnId);
}
export function getPairedTurnsForTask(taskId: string): PairedTurnRecord[] {
return getPairedTurnsForTaskFromDatabase(requireDatabase(), taskId);
}
export function getPairedTurnAttempts(
turnId: string,
): PairedTurnAttemptRecord[] {
return getPairedTurnAttemptsForTurnFromDatabase(requireDatabase(), turnId);
}
export function upsertPairedWorkspace(workspace: PairedWorkspace): void {
upsertPairedWorkspaceInDatabase(requireDatabase(), workspace);
}
export function getPairedWorkspace(
taskId: string,
role: PairedWorkspace['role'],
): PairedWorkspace | undefined {
return getPairedWorkspaceFromDatabase(requireDatabase(), taskId, role);
}
export function listPairedWorkspacesForTask(taskId: string): PairedWorkspace[] {
return listPairedWorkspacesForTaskFromDatabase(requireDatabase(), taskId);
}
/** @internal - for tests only. */
export function _clearPairedTurnReservationsForTests(): void {
const db = requireDatabase();
clearPairedTurnReservationsInDatabase(db);
clearPairedTaskExecutionLeasesInDatabase(db);
clearPairedTurnAttemptsInDatabase(db);
clearPairedTurnsInDatabase(db);
}
export function getLastBotFinalMessage(
chatJid: string,
agentType: AgentType = 'claude-code',
limit: number = 1,
): Array<{ content: string; timestamp: string }> {
return getLastBotFinalMessageFromDatabase(
requireDatabase(),
chatJid,
agentType,
limit,
);
}
export function getChannelOwnerLease(
chatJid: string,
): ChannelOwnerLeaseRow | undefined {
return getChannelOwnerLeaseFromDatabase(requireDatabase(), chatJid);
}
export function getAllChannelOwnerLeases(): ChannelOwnerLeaseRow[] {
return getAllChannelOwnerLeasesFromDatabase(requireDatabase());
}
export function setChannelOwnerLease(input: SetChannelOwnerLeaseInput): void {
setChannelOwnerLeaseInDatabase(requireDatabase(), input);
}
export function clearChannelOwnerLease(chatJid: string): void {
clearChannelOwnerLeaseInDatabase(requireDatabase(), chatJid);
}
export function createServiceHandoff(
input: CreateServiceHandoffInput,
): ServiceHandoff {
return createServiceHandoffInDatabase(requireDatabase(), input);
}
export function getPendingServiceHandoffs(
targetServiceId: string = SERVICE_SESSION_SCOPE,
): ServiceHandoff[] {
return getPendingServiceHandoffsFromDatabase(
requireDatabase(),
targetServiceId,
);
}
export function getAllPendingServiceHandoffs(): ServiceHandoff[] {
return getAllPendingServiceHandoffsFromDatabase(requireDatabase());
}
export function claimServiceHandoff(id: number): boolean {
return claimServiceHandoffInDatabase(requireDatabase(), id);
}
export function completeServiceHandoff(id: number): void {
completeServiceHandoffInDatabase(requireDatabase(), id);
}
export function failServiceHandoff(id: number, error: string): void {
failServiceHandoffInDatabase(requireDatabase(), id, error);
}
export function completeServiceHandoffAndAdvanceTargetCursor(
input: CompleteServiceHandoffCursorInput,
): string | null {
return completeServiceHandoffAndAdvanceTargetCursorInDatabase(
requireDatabase(),
input,
);
}
export function insertPairedTurnOutput(
taskId: string,
turnNumber: number,
role: PairedRoomRole,
outputText: string,
): void {
insertPairedTurnOutputInDatabase(
requireDatabase(),
taskId,
turnNumber,
role,
outputText,
);
}
export function getPairedTurnOutputs(taskId: string): PairedTurnOutput[] {
return getPairedTurnOutputsFromDatabase(requireDatabase(), taskId);
}
export function getLatestTurnNumber(taskId: string): number {
return getLatestTurnNumberFromDatabase(requireDatabase(), taskId);
}