refactor: remove paired room legacy helper
This commit is contained in:
@@ -35,7 +35,6 @@ import {
|
|||||||
getPairedTaskById,
|
getPairedTaskById,
|
||||||
getPairedWorkspace,
|
getPairedWorkspace,
|
||||||
getRouterStateForService,
|
getRouterStateForService,
|
||||||
isPairedRoomJid,
|
|
||||||
getSession,
|
getSession,
|
||||||
getTaskById,
|
getTaskById,
|
||||||
listPairedWorkspacesForTask,
|
listPairedWorkspacesForTask,
|
||||||
@@ -796,7 +795,7 @@ describe('paired room registration', () => {
|
|||||||
]);
|
]);
|
||||||
expect(getExplicitRoomMode('dc:123')).toBeUndefined();
|
expect(getExplicitRoomMode('dc:123')).toBeUndefined();
|
||||||
expect(getEffectiveRoomMode('dc:123')).toBe('tribunal');
|
expect(getEffectiveRoomMode('dc:123')).toBe('tribunal');
|
||||||
expect(isPairedRoomJid('dc:123')).toBe(true);
|
expect(getEffectiveRuntimeRoomMode('dc:123')).toBe('tribunal');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not mark solo rooms as paired', () => {
|
it('does not mark solo rooms as paired', () => {
|
||||||
@@ -809,7 +808,7 @@ describe('paired room registration', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(getRegisteredAgentTypesForJid('dc:solo')).toEqual(['claude-code']);
|
expect(getRegisteredAgentTypesForJid('dc:solo')).toEqual(['claude-code']);
|
||||||
expect(isPairedRoomJid('dc:solo')).toBe(false);
|
expect(getEffectiveRuntimeRoomMode('dc:solo')).toBe('single');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('keeps inferred room mode available when no explicit override exists', () => {
|
it('keeps inferred room mode available when no explicit override exists', () => {
|
||||||
@@ -831,7 +830,6 @@ describe('paired room registration', () => {
|
|||||||
expect(getExplicitRoomMode('dc:legacy-paired')).toBeUndefined();
|
expect(getExplicitRoomMode('dc:legacy-paired')).toBeUndefined();
|
||||||
expect(getEffectiveRoomMode('dc:legacy-paired')).toBe('tribunal');
|
expect(getEffectiveRoomMode('dc:legacy-paired')).toBe('tribunal');
|
||||||
expect(getEffectiveRuntimeRoomMode('dc:legacy-paired')).toBe('tribunal');
|
expect(getEffectiveRuntimeRoomMode('dc:legacy-paired')).toBe('tribunal');
|
||||||
expect(isPairedRoomJid('dc:legacy-paired')).toBe(true);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('backfills inferred room modes for legacy SQL rows missing room_settings', () => {
|
it('backfills inferred room modes for legacy SQL rows missing room_settings', () => {
|
||||||
@@ -899,7 +897,6 @@ describe('paired room registration', () => {
|
|||||||
expect(getExplicitRoomMode('dc:legacy-sql')).toBeUndefined();
|
expect(getExplicitRoomMode('dc:legacy-sql')).toBeUndefined();
|
||||||
expect(getEffectiveRoomMode('dc:legacy-sql')).toBe('tribunal');
|
expect(getEffectiveRoomMode('dc:legacy-sql')).toBe('tribunal');
|
||||||
expect(getEffectiveRuntimeRoomMode('dc:legacy-sql')).toBe('tribunal');
|
expect(getEffectiveRuntimeRoomMode('dc:legacy-sql')).toBe('tribunal');
|
||||||
expect(isPairedRoomJid('dc:legacy-sql')).toBe(true);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('lets explicit single override dual registration for paired-room checks', () => {
|
it('lets explicit single override dual registration for paired-room checks', () => {
|
||||||
@@ -923,7 +920,6 @@ describe('paired room registration', () => {
|
|||||||
expect(getExplicitRoomMode('dc:explicit-single')).toBe('single');
|
expect(getExplicitRoomMode('dc:explicit-single')).toBe('single');
|
||||||
expect(getEffectiveRoomMode('dc:explicit-single')).toBe('single');
|
expect(getEffectiveRoomMode('dc:explicit-single')).toBe('single');
|
||||||
expect(getEffectiveRuntimeRoomMode('dc:explicit-single')).toBe('single');
|
expect(getEffectiveRuntimeRoomMode('dc:explicit-single')).toBe('single');
|
||||||
expect(isPairedRoomJid('dc:explicit-single')).toBe(false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('lets explicit tribunal become runnable when the configured reviewer can run on the solo registration', () => {
|
it('lets explicit tribunal become runnable when the configured reviewer can run on the solo registration', () => {
|
||||||
@@ -944,14 +940,12 @@ describe('paired room registration', () => {
|
|||||||
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal')).toBe(
|
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal')).toBe(
|
||||||
'tribunal',
|
'tribunal',
|
||||||
);
|
);
|
||||||
expect(isPairedRoomJid('dc:explicit-tribunal')).toBe(true);
|
|
||||||
|
|
||||||
clearExplicitRoomMode('dc:explicit-tribunal');
|
clearExplicitRoomMode('dc:explicit-tribunal');
|
||||||
|
|
||||||
expect(getExplicitRoomMode('dc:explicit-tribunal')).toBeUndefined();
|
expect(getExplicitRoomMode('dc:explicit-tribunal')).toBeUndefined();
|
||||||
expect(getEffectiveRoomMode('dc:explicit-tribunal')).toBe('single');
|
expect(getEffectiveRoomMode('dc:explicit-tribunal')).toBe('single');
|
||||||
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal')).toBe('single');
|
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal')).toBe('single');
|
||||||
expect(isPairedRoomJid('dc:explicit-tribunal')).toBe(false);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('keeps explicit tribunal non-runnable when the configured reviewer service is unavailable', () => {
|
it('keeps explicit tribunal non-runnable when the configured reviewer service is unavailable', () => {
|
||||||
@@ -969,7 +963,6 @@ describe('paired room registration', () => {
|
|||||||
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal-codex')).toBe(
|
expect(getEffectiveRuntimeRoomMode('dc:explicit-tribunal-codex')).toBe(
|
||||||
'single',
|
'single',
|
||||||
);
|
);
|
||||||
expect(isPairedRoomJid('dc:explicit-tribunal-codex')).toBe(false);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
13
src/db.ts
13
src/db.ts
@@ -1974,7 +1974,12 @@ export function inferRoomModeFromRegisteredAgentTypes(
|
|||||||
return types.has('claude-code') && types.has('codex') ? 'tribunal' : 'single';
|
return types.has('claude-code') && types.has('codex') ? 'tribunal' : 'single';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function inferRoomModeForJid(jid: string): RoomMode {
|
/**
|
||||||
|
* Internal registration/backfill helper.
|
||||||
|
* This infers the stored room mode from current registrations and must not be
|
||||||
|
* treated as runtime source-of-truth by callers.
|
||||||
|
*/
|
||||||
|
function inferStoredRoomModeForJid(jid: string): RoomMode {
|
||||||
return inferRoomModeFromRegisteredAgentTypes(
|
return inferRoomModeFromRegisteredAgentTypes(
|
||||||
getRegisteredAgentTypesForJid(jid),
|
getRegisteredAgentTypesForJid(jid),
|
||||||
);
|
);
|
||||||
@@ -2022,7 +2027,7 @@ function upsertStoredRoomMode(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function syncInferredRoomModeForJid(chatJid: string): void {
|
function syncInferredRoomModeForJid(chatJid: string): void {
|
||||||
upsertStoredRoomMode(chatJid, inferRoomModeForJid(chatJid), 'inferred');
|
upsertStoredRoomMode(chatJid, inferStoredRoomModeForJid(chatJid), 'inferred');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getExplicitRoomMode(chatJid: string): RoomMode | undefined {
|
export function getExplicitRoomMode(chatJid: string): RoomMode | undefined {
|
||||||
@@ -2070,10 +2075,6 @@ export function getEffectiveRuntimeRoomMode(chatJid: string): RoomMode {
|
|||||||
: 'single';
|
: 'single';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isPairedRoomJid(jid: string): boolean {
|
|
||||||
return getEffectiveRuntimeRoomMode(jid) === 'tribunal';
|
|
||||||
}
|
|
||||||
|
|
||||||
function backfillStoredRoomModes(database: Database): void {
|
function backfillStoredRoomModes(database: Database): void {
|
||||||
const rows = database
|
const rows = database
|
||||||
.prepare(
|
.prepare(
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ import {
|
|||||||
createProducedWorkItem,
|
createProducedWorkItem,
|
||||||
getOpenWorkItem,
|
getOpenWorkItem,
|
||||||
setRegisteredGroup,
|
setRegisteredGroup,
|
||||||
isPairedRoomJid,
|
|
||||||
getLastBotFinalMessage,
|
getLastBotFinalMessage,
|
||||||
markWorkItemDelivered,
|
markWorkItemDelivered,
|
||||||
} from './db.js';
|
} from './db.js';
|
||||||
import { normalizeMessageForDedupe } from './router.js';
|
import { normalizeMessageForDedupe } from './router.js';
|
||||||
|
import { hasReviewerLease } from './service-routing.js';
|
||||||
import { isDuplicateOfLastBotFinal } from './message-runtime.js';
|
import { isDuplicateOfLastBotFinal } from './message-runtime.js';
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -52,7 +52,7 @@ const setupChat = (jid: string) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
describe('isPairedRoomJid', () => {
|
describe('hasReviewerLease', () => {
|
||||||
it('returns true when both claude-code and codex are registered', () => {
|
it('returns true when both claude-code and codex are registered', () => {
|
||||||
const jid = 'dc:paired-room';
|
const jid = 'dc:paired-room';
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ describe('isPairedRoomJid', () => {
|
|||||||
agentType: 'codex',
|
agentType: 'codex',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(isPairedRoomJid(jid)).toBe(true);
|
expect(hasReviewerLease(jid)).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns false when only claude-code is registered', () => {
|
it('returns false when only claude-code is registered', () => {
|
||||||
@@ -86,7 +86,7 @@ describe('isPairedRoomJid', () => {
|
|||||||
agentType: 'claude-code',
|
agentType: 'claude-code',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(isPairedRoomJid(jid)).toBe(false);
|
expect(hasReviewerLease(jid)).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns false when only codex is registered', () => {
|
it('returns false when only codex is registered', () => {
|
||||||
@@ -100,7 +100,7 @@ describe('isPairedRoomJid', () => {
|
|||||||
agentType: 'codex',
|
agentType: 'codex',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(isPairedRoomJid(jid)).toBe(false);
|
expect(hasReviewerLease(jid)).toBe(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ describe('isDuplicateOfLastBotFinal (runtime function)', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Verify it's a paired room
|
// Verify it's a paired room
|
||||||
expect(isPairedRoomJid(jid)).toBe(true);
|
expect(hasReviewerLease(jid)).toBe(true);
|
||||||
|
|
||||||
// Verify duplicate detection works via the actual runtime function
|
// Verify duplicate detection works via the actual runtime function
|
||||||
expect(
|
expect(
|
||||||
@@ -246,7 +246,7 @@ describe('isDuplicateOfLastBotFinal (runtime function)', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Verify it's NOT a paired room
|
// Verify it's NOT a paired room
|
||||||
expect(isPairedRoomJid(jid)).toBe(false);
|
expect(hasReviewerLease(jid)).toBe(false);
|
||||||
|
|
||||||
// Duplicate check should be bypassed (return false)
|
// Duplicate check should be bypassed (return false)
|
||||||
expect(isDuplicateOfLastBotFinal(jid, 'DONE — Task completed')).toBe(false);
|
expect(isDuplicateOfLastBotFinal(jid, 'DONE — Task completed')).toBe(false);
|
||||||
|
|||||||
Reference in New Issue
Block a user