style: apply prettier formatting
This commit is contained in:
@@ -469,7 +469,6 @@ describe('session accessors', () => {
|
|||||||
expect(hasServiceSessions).toBe(false);
|
expect(hasServiceSessions).toBe(false);
|
||||||
migratedDb.close();
|
migratedDb.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// --- storeChatMetadata ---
|
// --- storeChatMetadata ---
|
||||||
@@ -1181,7 +1180,9 @@ describe('paired task state', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('preserves stored reviewer service ids during init even when reviewer agent metadata exists', () => {
|
it('preserves stored reviewer service ids during init even when reviewer agent metadata exists', () => {
|
||||||
const tempDir = fs.mkdtempSync('/tmp/ejclaw-channel-owner-stored-reviewer-');
|
const tempDir = fs.mkdtempSync(
|
||||||
|
'/tmp/ejclaw-channel-owner-stored-reviewer-',
|
||||||
|
);
|
||||||
const dbPath = path.join(tempDir, 'messages.db');
|
const dbPath = path.join(tempDir, 'messages.db');
|
||||||
const legacyDb = new Database(dbPath);
|
const legacyDb = new Database(dbPath);
|
||||||
|
|
||||||
@@ -2858,7 +2859,6 @@ describe('service handoff completion', () => {
|
|||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('message seq cursors', () => {
|
describe('message seq cursors', () => {
|
||||||
@@ -3029,10 +3029,12 @@ describe('message seq cursors', () => {
|
|||||||
_initTestDatabaseFromFile(dbPath);
|
_initTestDatabaseFromFile(dbPath);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
getMessagesSinceSeq('dc:legacy-partial-seq', 0, 'Andy').map((message) => ({
|
getMessagesSinceSeq('dc:legacy-partial-seq', 0, 'Andy').map(
|
||||||
id: message.id,
|
(message) => ({
|
||||||
seq: message.seq,
|
id: message.id,
|
||||||
})),
|
seq: message.seq,
|
||||||
|
}),
|
||||||
|
),
|
||||||
).toEqual([
|
).toEqual([
|
||||||
{ id: 'legacy-existing-seq', seq: 1 },
|
{ id: 'legacy-existing-seq', seq: 1 },
|
||||||
{ id: 'legacy-missing-seq', seq: 2 },
|
{ id: 'legacy-missing-seq', seq: 2 },
|
||||||
@@ -3309,7 +3311,9 @@ describe('legacy schema writes after init', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('creates channel owner leases after init on a canonical channel_owner schema without service id columns', () => {
|
it('creates channel owner leases after init on a canonical channel_owner schema without service id columns', () => {
|
||||||
const tempDir = fs.mkdtempSync('/tmp/ejclaw-canonical-channel-owner-write-');
|
const tempDir = fs.mkdtempSync(
|
||||||
|
'/tmp/ejclaw-canonical-channel-owner-write-',
|
||||||
|
);
|
||||||
const dbPath = path.join(tempDir, 'messages.db');
|
const dbPath = path.join(tempDir, 'messages.db');
|
||||||
const legacyDb = new Database(dbPath);
|
const legacyDb = new Database(dbPath);
|
||||||
|
|
||||||
@@ -3594,9 +3598,15 @@ describe('work items', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
getOpenWorkItem('dc:stored-service-mismatch', 'codex', CODEX_MAIN_SERVICE_ID),
|
getOpenWorkItem(
|
||||||
|
'dc:stored-service-mismatch',
|
||||||
|
'codex',
|
||||||
|
CODEX_MAIN_SERVICE_ID,
|
||||||
|
),
|
||||||
|
).toBeUndefined();
|
||||||
|
expect(
|
||||||
|
getOpenWorkItemForChat('dc:stored-service-mismatch'),
|
||||||
).toBeUndefined();
|
).toBeUndefined();
|
||||||
expect(getOpenWorkItemForChat('dc:stored-service-mismatch')).toBeUndefined();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('allows a current-service open work item even when a stale-service open row already exists', () => {
|
it('allows a current-service open work item even when a stale-service open row already exists', () => {
|
||||||
@@ -3611,7 +3621,9 @@ describe('work items', () => {
|
|||||||
result_payload: 'stale reviewer output',
|
result_payload: 'stale reviewer output',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(getOpenWorkItemForChat('dc:repro', CODEX_MAIN_SERVICE_ID)).toBeUndefined();
|
expect(
|
||||||
|
getOpenWorkItemForChat('dc:repro', CODEX_MAIN_SERVICE_ID),
|
||||||
|
).toBeUndefined();
|
||||||
|
|
||||||
const currentItem = createProducedWorkItem({
|
const currentItem = createProducedWorkItem({
|
||||||
group_folder: 'discord_test',
|
group_folder: 'discord_test',
|
||||||
@@ -3624,9 +3636,9 @@ describe('work items', () => {
|
|||||||
result_payload: 'current reviewer output',
|
result_payload: 'current reviewer output',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(
|
expect(getOpenWorkItemForChat('dc:repro', CODEX_MAIN_SERVICE_ID)?.id).toBe(
|
||||||
getOpenWorkItemForChat('dc:repro', CODEX_MAIN_SERVICE_ID)?.id,
|
currentItem.id,
|
||||||
).toBe(currentItem.id);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('backfills work item service ids during init on a canonical work_items schema without service_id columns', () => {
|
it('backfills work item service ids during init on a canonical work_items schema without service_id columns', () => {
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
import { Database } from 'bun:sqlite';
|
import { Database } from 'bun:sqlite';
|
||||||
|
|
||||||
import {
|
import { ARBITER_AGENT_TYPE, REVIEWER_AGENT_TYPE } from '../config.js';
|
||||||
ARBITER_AGENT_TYPE,
|
|
||||||
REVIEWER_AGENT_TYPE,
|
|
||||||
} from '../config.js';
|
|
||||||
import {
|
import {
|
||||||
collectRegisteredAgentTypes,
|
collectRegisteredAgentTypes,
|
||||||
collectRegisteredAgentTypesForFolder,
|
collectRegisteredAgentTypesForFolder,
|
||||||
|
|||||||
@@ -570,22 +570,25 @@ function backfillCanonicalWorkItemServiceIds(database: Database): void {
|
|||||||
SET service_id = ?
|
SET service_id = ?
|
||||||
WHERE id = ?`,
|
WHERE id = ?`,
|
||||||
);
|
);
|
||||||
const tx = database.transaction((workItemRows: StoredWorkItemServiceRow[]) => {
|
const tx = database.transaction(
|
||||||
for (const row of workItemRows) {
|
(workItemRows: StoredWorkItemServiceRow[]) => {
|
||||||
const agentType = normalizeStoredAgentType(row.agent_type) ?? 'claude-code';
|
for (const row of workItemRows) {
|
||||||
const deliveryRole = normalizePairedRole(row.delivery_role) ?? 'owner';
|
const agentType =
|
||||||
const serviceId =
|
normalizeStoredAgentType(row.agent_type) ?? 'claude-code';
|
||||||
(row.service_id ? normalizeServiceId(row.service_id) : null) ??
|
const deliveryRole = normalizePairedRole(row.delivery_role) ?? 'owner';
|
||||||
resolveRoleServiceShadow(deliveryRole, agentType) ??
|
const serviceId =
|
||||||
SERVICE_SESSION_SCOPE;
|
(row.service_id ? normalizeServiceId(row.service_id) : null) ??
|
||||||
|
resolveRoleServiceShadow(deliveryRole, agentType) ??
|
||||||
|
SERVICE_SESSION_SCOPE;
|
||||||
|
|
||||||
if (row.service_id === serviceId) {
|
if (row.service_id === serviceId) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
update.run(serviceId, row.id);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
update.run(serviceId, row.id);
|
);
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
tx(rows);
|
tx(rows);
|
||||||
}
|
}
|
||||||
@@ -735,7 +738,10 @@ export function applySchemaMigrations(
|
|||||||
database,
|
database,
|
||||||
`ALTER TABLE work_items ADD COLUMN delivery_role TEXT`,
|
`ALTER TABLE work_items ADD COLUMN delivery_role TEXT`,
|
||||||
);
|
);
|
||||||
tryExecMigration(database, `ALTER TABLE work_items ADD COLUMN service_id TEXT`);
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE work_items ADD COLUMN service_id TEXT`,
|
||||||
|
);
|
||||||
|
|
||||||
database.exec(
|
database.exec(
|
||||||
`UPDATE service_handoffs
|
`UPDATE service_handoffs
|
||||||
@@ -766,7 +772,10 @@ export function applySchemaMigrations(
|
|||||||
'reviewer_agent_type',
|
'reviewer_agent_type',
|
||||||
'arbiter_agent_type',
|
'arbiter_agent_type',
|
||||||
]) {
|
]) {
|
||||||
tryExecMigration(database, `ALTER TABLE channel_owner ADD COLUMN ${column} TEXT`);
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE channel_owner ADD COLUMN ${column} TEXT`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
backfillCanonicalPairedTaskServiceIds(database);
|
backfillCanonicalPairedTaskServiceIds(database);
|
||||||
@@ -1127,5 +1136,4 @@ export function applySchemaMigrations(
|
|||||||
} catch {
|
} catch {
|
||||||
/* columns already exist */
|
/* columns already exist */
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,8 @@ function resolvePreferredWorkItemRole(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const inferredAgentType = inferAgentTypeFromServiceShadow(normalizedServiceId);
|
const inferredAgentType =
|
||||||
|
inferAgentTypeFromServiceShadow(normalizedServiceId);
|
||||||
return inferRoleFromServiceShadow(inferredAgentType, normalizedServiceId);
|
return inferRoleFromServiceShadow(inferredAgentType, normalizedServiceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,9 +132,7 @@ export function getOpenWorkItemFromDatabase(
|
|||||||
normalizedServiceId,
|
normalizedServiceId,
|
||||||
preferredRole,
|
preferredRole,
|
||||||
preferredRole,
|
preferredRole,
|
||||||
) as
|
) as StoredWorkItemRow | undefined;
|
||||||
| StoredWorkItemRow
|
|
||||||
| undefined;
|
|
||||||
return row ? hydrateWorkItemRow(row) : undefined;
|
return row ? hydrateWorkItemRow(row) : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,10 +135,7 @@ export function recoverPendingMessages(args: {
|
|||||||
}): void {
|
}): void {
|
||||||
const registeredGroups = args.getRegisteredGroups();
|
const registeredGroups = args.getRegisteredGroups();
|
||||||
for (const [chatJid, group] of Object.entries(registeredGroups)) {
|
for (const [chatJid, group] of Object.entries(registeredGroups)) {
|
||||||
const openWorkItem = getOpenWorkItemForChat(
|
const openWorkItem = getOpenWorkItemForChat(chatJid, SERVICE_SESSION_SCOPE);
|
||||||
chatJid,
|
|
||||||
SERVICE_SESSION_SCOPE,
|
|
||||||
);
|
|
||||||
if (openWorkItem) {
|
if (openWorkItem) {
|
||||||
logger.info(
|
logger.info(
|
||||||
{ chatJid, group: group.name, workItemId: openWorkItem.id },
|
{ chatJid, group: group.name, workItemId: openWorkItem.id },
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ import {
|
|||||||
getLastBotFinalMessage,
|
getLastBotFinalMessage,
|
||||||
getLatestOpenPairedTaskForChat,
|
getLatestOpenPairedTaskForChat,
|
||||||
} from './db.js';
|
} from './db.js';
|
||||||
import { isSessionCommandSenderAllowed, SERVICE_SESSION_SCOPE } from './config.js';
|
import {
|
||||||
|
isSessionCommandSenderAllowed,
|
||||||
|
SERVICE_SESSION_SCOPE,
|
||||||
|
} from './config.js';
|
||||||
import { GroupQueue, GroupRunContext } from './group-queue.js';
|
import { GroupQueue, GroupRunContext } from './group-queue.js';
|
||||||
import {
|
import {
|
||||||
findChannel,
|
findChannel,
|
||||||
@@ -480,10 +483,7 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
|
|||||||
|
|
||||||
// Delivery retries can come from forced fallback runs whose agent_type
|
// Delivery retries can come from forced fallback runs whose agent_type
|
||||||
// differs from the room owner's registered agent type.
|
// differs from the room owner's registered agent type.
|
||||||
const openWorkItem = getOpenWorkItemForChat(
|
const openWorkItem = getOpenWorkItemForChat(chatJid, SERVICE_SESSION_SCOPE);
|
||||||
chatJid,
|
|
||||||
SERVICE_SESSION_SCOPE,
|
|
||||||
);
|
|
||||||
const openWorkItemOutcome = await processOpenWorkItemDelivery({
|
const openWorkItemOutcome = await processOpenWorkItemDelivery({
|
||||||
chatJid,
|
chatJid,
|
||||||
runId,
|
runId,
|
||||||
|
|||||||
@@ -76,7 +76,9 @@ function normalizeLeaseRow(
|
|||||||
reviewer_agent_type: reviewerAgentType,
|
reviewer_agent_type: reviewerAgentType,
|
||||||
arbiter_agent_type: arbiterAgentType,
|
arbiter_agent_type: arbiterAgentType,
|
||||||
owner_service_id:
|
owner_service_id:
|
||||||
(row.owner_service_id ? normalizeServiceId(row.owner_service_id) : null) ??
|
(row.owner_service_id
|
||||||
|
? normalizeServiceId(row.owner_service_id)
|
||||||
|
: null) ??
|
||||||
resolveRoleServiceShadow('owner', ownerAgentType) ??
|
resolveRoleServiceShadow('owner', ownerAgentType) ??
|
||||||
normalizeServiceId(SERVICE_ID),
|
normalizeServiceId(SERVICE_ID),
|
||||||
reviewer_service_id:
|
reviewer_service_id:
|
||||||
|
|||||||
Reference in New Issue
Block a user