Codemod db pass-through calls: messages + runs + approvals + company (C1 part 2/3)

Rewrite ~376 call sites for messages, runs, approvalsMod, and company
domains and delete the corresponding pass-through methods on
AppDatabase / AppDatabaseBase. Structural type references
(ReturnType<HandlerDeps["db"]["getRun"]>) and SweepStaleReviewsDeps-style
mocks are updated to route through the owning sub-module.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-20 13:20:15 -04:00
1 parent 5e9b7acbc6
commit a69fbb053b
86 files changed
+393 -454

No files matched your search

@@ -58,7 +58,7 @@ function createHarness(db: AppDatabase) {
runDispatch.resolveWorkspace,
runDispatch.getRunEligibilityFailure,
runDispatch.dispatchRunToWorker,
(filter) => db.hasActiveRun(filter),
(filter) => db.runs.hasActiveRun(filter),
);
return { enqueueWorkerRun, taskRunner };
@@ -78,7 +78,7 @@ describe("agent model switching", () => {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Model Switch Co",
description: "Tests post-hire model switching",
status: "active",
@@ -126,7 +126,7 @@ describe("agent model switching", () => {
throw new Error("Expected first run to queue successfully.");
}
db.finishRun({
db.runs.finishRun({
runId: firstRun.data,
status: "succeeded",
summary: "Done",
@@ -32,7 +32,7 @@ async function createHarness() {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Recursive Org Co",
description: "Tests manager-driven recursive hires",
status: "active",
@@ -81,7 +81,7 @@ async function createHarness() {
priority: "high",
status: "in_progress",
});
const run = db.createRun({ companyId, taskId, agentId: ctoId, workspaceId, connectorId: "openai-codex" });
const run = db.runs.createRun({ companyId, taskId, agentId: ctoId, workspaceId, connectorId: "openai-codex" });
const token = createAgentToken(ctoId, companyId, run.id);
const server = createApiServer(db, () => {}, () => null);
const port = await server.start();
@@ -130,12 +130,12 @@ describe("recursive org execution", () => {
expect(pendingHire.status).toBe("pending_approval");
expect(pendingHire.reportsTo).toBe(harness.ctoId);
const approval = harness.db.getApprovalRecord(body.approvalId);
const approval = harness.db.approvalsMod.getApprovalRecord(body.approvalId);
expect(approval.type).toBe("hire_agent");
expect(approval.requestedByAgentId).toBe(harness.ctoId);
expect(approval.relatedAgentId).toBe(body.agentId);
harness.db.decideApproval({
harness.db.approvalsMod.decideApproval({
approvalId: body.approvalId,
state: "approved",
decisionNote: "Approved by board",
@@ -192,7 +192,7 @@ describe("recursive org execution", () => {
priority: "high",
status: "in_progress",
});
const hrRun = harness.db.createRun({
const hrRun = harness.db.runs.createRun({
companyId: harness.companyId,
taskId: hrTaskId,
agentId: hrId,
+4 -4
View File
@@ -24,7 +24,7 @@ async function createHarness() {
const db = new AppDatabase(profileDir);
db.init();
const companyId = db.saveCompany({ name: "Orbit Foundry", description: "API test", status: "active" });
const companyId = db.company.saveCompany({ name: "Orbit Foundry", description: "API test", status: "active" });
const workspaceId = db.saveWorkspace({
companyId,
name: "Primary",
@@ -55,7 +55,7 @@ async function createHarness() {
priority: "high",
status: "todo",
});
const run = db.createRun({ companyId, taskId, agentId, workspaceId, connectorId: "openai-codex" });
const run = db.runs.createRun({ companyId, taskId, agentId, workspaceId, connectorId: "openai-codex" });
const token = createAgentToken(agentId, companyId, run.id);
const server = createApiServer(db, () => {}, () => null);
const port = await server.start();
@@ -95,7 +95,7 @@ describe("run event API", () => {
it("returns persisted run events for the active run token", async () => {
const harness = await createHarness();
try {
harness.db.appendRunEvent({
harness.db.runs.appendRunEvent({
companyId: harness.companyId,
runId: harness.runId,
agentId: harness.agentId,
@@ -141,7 +141,7 @@ describe("run event API", () => {
expect(reader).toBeDefined();
setTimeout(() => {
harness.db.appendRunEvent({
harness.db.runs.appendRunEvent({
companyId: harness.companyId,
runId: harness.runId,
agentId: harness.agentId,
@@ -14,7 +14,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
const ceoId = createAgent({ name: "CEO", role: "CEO" });
const hireId = createAgent({ name: "CTO", role: "CTO", reportsTo: ceoId, status: "pending_approval" as "idle" });
const approvalId = shared.db.requestApproval({
const approvalId = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "hire_agent",
@@ -23,7 +23,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
payloadJson: JSON.stringify({ agentId: hireId }),
});
shared.db.decideApproval({
shared.db.approvalsMod.decideApproval({
approvalId,
state: "approved",
decisionNote: "Approved by board",
@@ -37,7 +37,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
const ceoId = createAgent({ name: "CEO", role: "CEO" });
const hireId = createAgent({ name: "CTO", role: "CTO", reportsTo: ceoId, status: "pending_approval" as "idle" });
const approvalId = shared.db.requestApproval({
const approvalId = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "hire_agent",
@@ -46,7 +46,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
payloadJson: JSON.stringify({ agentId: hireId }),
});
shared.db.decideApproval({
shared.db.approvalsMod.decideApproval({
approvalId,
state: "rejected",
decisionNote: "Not needed",
@@ -59,7 +59,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
it("getApprovalRecord includes payloadJson", () => {
const ceoId = createAgent({ name: "CEO", role: "CEO" });
const hireId = createAgent({ name: "CTO", role: "CTO", reportsTo: ceoId, status: "pending_approval" as "idle" });
const approvalId = shared.db.requestApproval({
const approvalId = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "hire_agent",
@@ -68,7 +68,7 @@ describe("Step 4: Hire approval + decideApproval", () => {
payloadJson: JSON.stringify({ agentId: hireId, config: { connector: "openai-codex" } }),
});
const approval = shared.db.getApprovalRecord(approvalId);
const approval = shared.db.approvalsMod.getApprovalRecord(approvalId);
expect(approval.payloadJson).toBeTruthy();
const payload = JSON.parse(approval.payloadJson!);
expect(payload.agentId).toBe(hireId);
@@ -104,7 +104,7 @@ describe("Agent Messages", () => {
});
it("sends and retrieves direct messages", () => {
const msgId = shared.db.sendAgentMessage({
const msgId = shared.db.messages.sendAgentMessage({
companyId: shared.companyId,
fromAgentId: agentAId,
toAgentId: agentBId,
@@ -116,7 +116,7 @@ describe("Agent Messages", () => {
expect(msgId).toBeTruthy();
const messages = shared.db.listAgentMessages(shared.companyId);
const messages = shared.db.messages.listAgentMessages(shared.companyId);
expect(messages).toHaveLength(1);
expect(messages[0].subject).toBe("Need design review");
expect(messages[0].fromAgentId).toBe(agentAId);
@@ -125,7 +125,7 @@ describe("Agent Messages", () => {
});
it("marks messages as read", () => {
const msgId = shared.db.sendAgentMessage({
const msgId = shared.db.messages.sendAgentMessage({
companyId: shared.companyId,
fromAgentId: agentAId,
toAgentId: agentBId,
@@ -133,14 +133,14 @@ describe("Agent Messages", () => {
body: "Hello",
});
shared.db.markMessageReadForReader(msgId, shared.companyId);
const messages = shared.db.listAgentMessages(shared.companyId);
shared.db.messages.markMessageReadForReader(msgId, shared.companyId);
const messages = shared.db.messages.listAgentMessages(shared.companyId);
const updatedMessage = messages.find((message) => message.id === msgId);
expect(updatedMessage?.readAt).toBeTruthy();
});
it("tracks read state per agent without marking the sender unread", () => {
const msgId = shared.db.sendAgentMessage({
const msgId = shared.db.messages.sendAgentMessage({
companyId: shared.companyId,
fromAgentId: agentAId,
toAgentId: agentBId,
@@ -148,22 +148,22 @@ describe("Agent Messages", () => {
body: "Hello",
});
const senderView = shared.db.listAgentMessages(shared.companyId, { agentId: agentAId });
const senderView = shared.db.messages.listAgentMessages(shared.companyId, { agentId: agentAId });
expect(senderView).toHaveLength(1);
expect(senderView[0].id).toBe(msgId);
expect(senderView[0].readAt).toBeTruthy();
const recipientViewBefore = shared.db.listAgentMessages(shared.companyId, { agentId: agentBId, unreadOnly: true });
const recipientViewBefore = shared.db.messages.listAgentMessages(shared.companyId, { agentId: agentBId, unreadOnly: true });
expect(recipientViewBefore).toHaveLength(1);
expect(recipientViewBefore[0].id).toBe(msgId);
shared.db.markMessageReadForReader(msgId, shared.companyId, agentBId);
shared.db.messages.markMessageReadForReader(msgId, shared.companyId, agentBId);
const recipientViewAfter = shared.db.listAgentMessages(shared.companyId, { agentId: agentBId, unreadOnly: true });
const recipientViewAfter = shared.db.messages.listAgentMessages(shared.companyId, { agentId: agentBId, unreadOnly: true });
expect(recipientViewAfter).toHaveLength(0);
const thirdAgentId = createAgent({ name: "Agent C" });
const thirdView = shared.db.listAgentMessages(shared.companyId, { agentId: thirdAgentId });
const thirdView = shared.db.messages.listAgentMessages(shared.companyId, { agentId: thirdAgentId });
expect(thirdView).toHaveLength(0);
});
@@ -188,7 +188,7 @@ describe("Agent Messages", () => {
priority: "medium",
});
const deptMessageId = shared.db.sendAgentMessage({
const deptMessageId = shared.db.messages.sendAgentMessage({
companyId: shared.companyId,
fromAgentId: engineeringLeadId,
channel: "department",
@@ -196,7 +196,7 @@ describe("Agent Messages", () => {
subject: "Engineering update",
body: "Only engineering should see this",
});
const projectMessageId = shared.db.sendAgentMessage({
const projectMessageId = shared.db.messages.sendAgentMessage({
companyId: shared.companyId,
fromAgentId: engineeringLeadId,
channel: "project",
@@ -205,30 +205,30 @@ describe("Agent Messages", () => {
body: "Only project members should see this",
});
const engineeringView = shared.db.listAgentMessages(shared.companyId, { agentId: engineeringLeadId });
const engineeringView = shared.db.messages.listAgentMessages(shared.companyId, { agentId: engineeringLeadId });
expect(engineeringView.some((message) => message.id === deptMessageId)).toBe(true);
expect(engineeringView.some((message) => message.id === projectMessageId)).toBe(true);
const productView = shared.db.listAgentMessages(shared.companyId, { agentId: productLeadId });
const productView = shared.db.messages.listAgentMessages(shared.companyId, { agentId: productLeadId });
expect(productView.some((message) => message.id === deptMessageId)).toBe(false);
expect(productView.some((message) => message.id === projectMessageId)).toBe(false);
});
it("filters messages by channel", () => {
shared.db.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, subject: "Dept update", body: "All good", channel: "department", channelTargetId: "engineering" });
shared.db.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, toAgentId: agentBId, subject: "DM", body: "Hey", channel: "direct" });
shared.db.messages.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, subject: "Dept update", body: "All good", channel: "department", channelTargetId: "engineering" });
shared.db.messages.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, toAgentId: agentBId, subject: "DM", body: "Hey", channel: "direct" });
const deptMsgs = shared.db.listAgentMessages(shared.companyId, { channel: "department" });
const deptMsgs = shared.db.messages.listAgentMessages(shared.companyId, { channel: "department" });
expect(deptMsgs).toHaveLength(1);
expect(deptMsgs[0].subject).toBe("Dept update");
const directMsgs = shared.db.listAgentMessages(shared.companyId, { channel: "direct" });
const directMsgs = shared.db.messages.listAgentMessages(shared.companyId, { channel: "direct" });
expect(directMsgs).toHaveLength(1);
expect(directMsgs[0].subject).toBe("DM");
});
it("appears in snapshot", () => {
shared.db.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, channel: "company", subject: "Snapshot test", body: "Hi" });
shared.db.messages.sendAgentMessage({ companyId: shared.companyId, fromAgentId: agentAId, channel: "company", subject: "Snapshot test", body: "Hi" });
const snapshot = shared.db.listSnapshot();
expect(snapshot.agentMessages.length).toBeGreaterThanOrEqual(1);
expect(snapshot.agentMessages[0].subject).toBe("Snapshot test");
@@ -23,7 +23,7 @@ describe("Step 7: Worker crash recovery (database layer)", () => {
status: "in_progress",
});
const run = shared.db.createRun({
const run = shared.db.runs.createRun({
companyId: shared.companyId,
taskId,
agentId,
@@ -31,7 +31,7 @@ describe("Step 7: Worker crash recovery (database layer)", () => {
connectorId: "openai-codex",
});
shared.db.markRunStatus(run.id, "running", "Started");
shared.db.runs.markRunStatus(run.id, "running", "Started");
// Verify it's running
let snapshot = shared.db.listSnapshot();
@@ -61,7 +61,7 @@ describe("Step 7: Worker crash recovery (database layer)", () => {
status: "in_progress",
});
const run = shared.db.createRun({
const run = shared.db.runs.createRun({
companyId: shared.companyId,
taskId,
agentId,
@@ -69,10 +69,10 @@ describe("Step 7: Worker crash recovery (database layer)", () => {
connectorId: "openai-codex",
});
shared.db.markRunStatus(run.id, "running", "Started");
shared.db.runs.markRunStatus(run.id, "running", "Started");
// Simulate crash recovery - mark as interrupted
shared.db.finishRun({
shared.db.runs.finishRun({
runId: run.id,
status: "interrupted",
summary: "Worker process crashed.",
@@ -31,7 +31,7 @@ describe("E2E: Full autonomous CEO cold start flow", () => {
const cmoId = createAgent({ name: "Aria", role: "CMO", reportsTo: ceoId, status: "pending_approval" as "idle" });
// 3. CEO submits org strategy approval
const orgApprovalId = shared.db.requestApproval({
const orgApprovalId = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "approve_ceo_strategy",
@@ -64,7 +64,7 @@ describe("E2E: Full autonomous CEO cold start flow", () => {
expect(phase1Prompt).toContain("Awaiting Org Strategy Approval");
// 4. Board approves hires
const hireApprovalCTO = shared.db.requestApproval({
const hireApprovalCTO = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "hire_agent",
@@ -72,9 +72,9 @@ describe("E2E: Full autonomous CEO cold start flow", () => {
impactSummary: "Test",
payloadJson: JSON.stringify({ agentId: ctoId }),
});
shared.db.decideApproval({ approvalId: hireApprovalCTO, state: "approved", decisionNote: "Approved" });
shared.db.approvalsMod.decideApproval({ approvalId: hireApprovalCTO, state: "approved", decisionNote: "Approved" });
const hireApprovalCMO = shared.db.requestApproval({
const hireApprovalCMO = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "hire_agent",
@@ -82,14 +82,14 @@ describe("E2E: Full autonomous CEO cold start flow", () => {
impactSummary: "Test",
payloadJson: JSON.stringify({ agentId: cmoId }),
});
shared.db.decideApproval({ approvalId: hireApprovalCMO, state: "approved", decisionNote: "Approved" });
shared.db.approvalsMod.decideApproval({ approvalId: hireApprovalCMO, state: "approved", decisionNote: "Approved" });
// Agents now idle
expect(shared.db.entityCrud.getAgent(ctoId).status).toBe("idle");
expect(shared.db.entityCrud.getAgent(cmoId).status).toBe("idle");
// 5. Board approves org strategy
shared.db.decideApproval({ approvalId: orgApprovalId, state: "approved", decisionNote: "Go ahead" });
shared.db.approvalsMod.decideApproval({ approvalId: orgApprovalId, state: "approved", decisionNote: "Go ahead" });
// 6. CEO now in Phase 2
const updatedCto = shared.db.entityCrud.getAgent(ctoId);
@@ -287,7 +287,7 @@ describe("Review Fix: Rejected approval wakes agent", () => {
it("decideApproval with rejected state still triggers wake (tested via DB)", () => {
const ceoId = createAgent({ name: "CEO", role: "CEO" });
const approvalId = shared.db.requestApproval({
const approvalId = shared.db.approvalsMod.requestApproval({
companyId: shared.companyId,
requestedByAgentId: ceoId,
type: "approve_ceo_strategy",
@@ -295,14 +295,14 @@ describe("Review Fix: Rejected approval wakes agent", () => {
impactSummary: "test",
});
shared.db.decideApproval({
shared.db.approvalsMod.decideApproval({
approvalId,
state: "rejected",
decisionNote: "Not ready",
});
// Verify approval state
const approval = shared.db.getApprovalRecord(approvalId);
const approval = shared.db.approvalsMod.getApprovalRecord(approvalId);
expect(approval.state).toBe("rejected");
// The IPC handler in index.ts now wakes on rejected too —
// we verify the DB layer works; the wakeAgentIfPossible call is in index.ts
@@ -22,7 +22,7 @@ describe("Step 6: Run failure escalation (database layer)", () => {
status: "in_progress",
});
const run = shared.db.createRun({
const run = shared.db.runs.createRun({
companyId: shared.companyId,
taskId,
agentId,
@@ -30,9 +30,9 @@ describe("Step 6: Run failure escalation (database layer)", () => {
connectorId: "openai-codex",
});
shared.db.markRunStatus(run.id, "running", "Started");
shared.db.runs.markRunStatus(run.id, "running", "Started");
const outcome = shared.db.finishRun({
const outcome = shared.db.runs.finishRun({
runId: run.id,
status: "failed",
summary: null,
@@ -54,7 +54,7 @@ export function installSharedSetup(): SharedHandle {
state.db = new AppDatabase(profileDir);
state.db.init();
state.companyId = state.db.saveCompany({
state.companyId = state.db.company.saveCompany({
name: "Autonomous Test Corp",
description: "Test company for autonomous chain",
status: "active",
@@ -57,7 +57,7 @@ function createOrchestrationHarness(db: AppDatabase) {
runDispatch.resolveWorkspace,
runDispatch.getRunEligibilityFailure,
runDispatch.dispatchRunToWorker,
(filter) => db.hasActiveRun(filter),
(filter) => db.runs.hasActiveRun(filter),
);
return { deps, taskRunner };
@@ -77,7 +77,7 @@ describe("connector model enforcement", () => {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Runtime Enforcement Co",
description: "Blocks runs when agent models are disabled",
status: "active",
@@ -141,7 +141,7 @@ describe("connector model enforcement", () => {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Recovered Run Co",
description: "Rejects invalid queued runs during recovery",
status: "active",
@@ -177,7 +177,7 @@ describe("connector model enforcement", () => {
status: "todo",
});
const run = db.createRun({
const run = db.runs.createRun({
companyId,
taskId,
agentId,
+22 -22
View File
@@ -64,7 +64,7 @@ function scaffold(db: AppDatabase, budgetAmountCents = 500): ScaffoldResult {
notes: "Non-exempt connector for session rotation tests",
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Pipeline Test Corp",
description: "Cross-subsystem pipeline integration tests",
status: "active",
@@ -187,7 +187,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
});
// 2. CAS checkout: create run and checkout task
const { id: runId } = db.createRun({
const { id: runId } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: s.agentId,
@@ -207,9 +207,9 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
expect(budgetResult.blockedBy).toHaveLength(0);
// 4. Execute run
db.markRunStatus(runId, "running", "Starting");
db.recordCostEntry({ runId, companyId: s.companyId, agentId: s.agentId, taskId, connectorId: "gemini-cli", amountUsd: 0.05, unattributed: false });
db.finishRun({
db.runs.markRunStatus(runId, "running", "Starting");
db.runs.recordCostEntry({ runId, companyId: s.companyId, agentId: s.agentId, taskId, connectorId: "gemini-cli", amountUsd: 0.05, unattributed: false });
db.runs.finishRun({
runId,
status: "succeeded",
summary: "Login page built with form validation",
@@ -229,7 +229,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
sessionService.accumulateTokenUsage(sessionId, 5000, 2000, runId);
// 6. Verify final state
const run = db.getRun(runId);
const run = db.runs.getRun(runId);
expect(run.status).toBe("succeeded");
const task = db.entityCrud.getTask(taskId);
@@ -266,7 +266,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
});
// First agent checks out
const { id: runId1 } = db.createRun({
const { id: runId1 } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: s.agentId,
@@ -289,7 +289,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
capabilities: "Backend development",
budgetMonthlyUsd: 100,
});
const { id: runId2 } = db.createRun({
const { id: runId2 } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: agent2Id,
@@ -322,7 +322,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
status: "todo",
});
const { id: runId } = db.createRun({
const { id: runId } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: s.agentId,
@@ -331,9 +331,9 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
});
db.tasks.checkoutTask(taskId, runId);
db.markRunStatus(runId, "running", "Starting");
db.recordCostEntry({ runId, companyId: s.companyId, agentId: s.agentId, taskId, connectorId: s.connectorId, amountUsd: 1.5, unattributed: false });
db.finishRun({
db.runs.markRunStatus(runId, "running", "Starting");
db.runs.recordCostEntry({ runId, companyId: s.companyId, agentId: s.agentId, taskId, connectorId: s.connectorId, amountUsd: 1.5, unattributed: false });
db.runs.finishRun({
runId,
status: "succeeded",
summary: "Done",
@@ -382,7 +382,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
});
// Run 1: create run and accumulate tokens
const { id: runId1 } = db.createRun({
const { id: runId1 } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: s.agentId,
@@ -392,7 +392,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
sessionService.accumulateTokenUsage(sessionId, 5000, 2000, runId1);
// Run 2: create another run and accumulate more tokens
const { id: runId2 } = db.createRun({
const { id: runId2 } = db.runs.createRun({
companyId: s.companyId,
taskId,
agentId: s.agentId,
@@ -432,7 +432,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
status: "todo",
});
const { id: runId1 } = db.createRun({
const { id: runId1 } = db.runs.createRun({
companyId: s.companyId,
taskId: taskId1,
agentId: s.agentId,
@@ -440,9 +440,9 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
connectorId: s.connectorId,
});
db.tasks.checkoutTask(taskId1, runId1);
db.markRunStatus(runId1, "running", "Starting");
db.recordCostEntry({ runId: runId1, companyId: s.companyId, agentId: s.agentId, taskId: taskId1, connectorId: s.connectorId, amountUsd: 3.0, unattributed: false });
db.finishRun({
db.runs.markRunStatus(runId1, "running", "Starting");
db.runs.recordCostEntry({ runId: runId1, companyId: s.companyId, agentId: s.agentId, taskId: taskId1, connectorId: s.connectorId, amountUsd: 3.0, unattributed: false });
db.runs.finishRun({
runId: runId1,
status: "succeeded",
summary: "First task done",
@@ -473,7 +473,7 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
status: "todo",
});
const { id: runId2 } = db.createRun({
const { id: runId2 } = db.runs.createRun({
companyId: s.companyId,
taskId: taskId2,
agentId: s.agentId,
@@ -481,9 +481,9 @@ describe("Cross-Subsystem Pipeline (D-04)", () => {
connectorId: s.connectorId,
});
db.tasks.checkoutTask(taskId2, runId2);
db.markRunStatus(runId2, "running", "Starting");
db.recordCostEntry({ runId: runId2, companyId: s.companyId, agentId: s.agentId, taskId: taskId2, connectorId: s.connectorId, amountUsd: 3.0, unattributed: false });
db.finishRun({
db.runs.markRunStatus(runId2, "running", "Starting");
db.runs.recordCostEntry({ runId: runId2, companyId: s.companyId, agentId: s.agentId, taskId: taskId2, connectorId: s.connectorId, amountUsd: 3.0, unattributed: false });
db.runs.finishRun({
runId: runId2,
status: "succeeded",
summary: "Second task done",
+9 -9
View File
@@ -37,7 +37,7 @@ describe("AppDatabase", () => {
const db = new AppDatabase(profileDir);
db.init();
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Orbit Foundry",
description: "Test company",
status: "active",
@@ -113,7 +113,7 @@ describe("AppDatabase", () => {
OPENAI_API_KEY: "sk-test-123",
});
const run = db.createRun({
const run = db.runs.createRun({
companyId,
taskId,
agentId,
@@ -121,11 +121,11 @@ describe("AppDatabase", () => {
connectorId: "openai-codex",
});
await db.appendRunLog(run.id, "stdout", "hello from run\n");
expect(db.readRunLog(run.id)).toContain("hello from run");
await db.runs.appendRunLog(run.id, "stdout", "hello from run\n");
expect(db.runs.readRunLog(run.id)).toContain("hello from run");
db.markRunStatus(run.id, "running", "Connector launched");
db.finishRun({
db.runs.markRunStatus(run.id, "running", "Connector launched");
db.runs.finishRun({
runId: run.id,
status: "succeeded",
summary: "Completed successfully",
@@ -143,7 +143,7 @@ describe("AppDatabase", () => {
await db.exportBackup(backupDir);
db.saveCompany({
db.company.saveCompany({
name: "Temporary company",
description: "Should disappear after restore",
status: "active",
@@ -164,13 +164,13 @@ describe("AppDatabase", () => {
const db = new AppDatabase(profileDir);
db.init();
const alphaCompanyId = db.saveCompany({
const alphaCompanyId = db.company.saveCompany({
name: "Alpha",
description: "Alpha company",
status: "active",
});
const betaCompanyId = db.saveCompany({
const betaCompanyId = db.company.saveCompany({
name: "Beta",
description: "Beta company",
status: "active",
@@ -34,7 +34,7 @@ async function createHarness() {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Document Provenance Co",
description: "Tests document revision provenance through run completion",
status: "active",
@@ -82,7 +82,7 @@ async function createHarness() {
status: "draft",
});
const run = db.createRun({
const run = db.runs.createRun({
companyId,
taskId,
agentId,
@@ -284,7 +284,7 @@ describe("document run provenance", () => {
it("creates deliverable review approvals that stay linked to the originating task", async () => {
const harness = await createHarness();
try {
harness.db.saveCompany({
harness.db.company.saveCompany({
id: harness.companyId,
name: "Document Provenance Co",
description: "Tests document review task linkage",
+7 -7
View File
@@ -62,7 +62,7 @@ function scaffold(db: AppDatabase): ScaffoldResult {
});
// Company
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Recovery Test Corp",
description: "Process recovery integration tests",
status: "active",
@@ -157,7 +157,7 @@ function createAndStartRun(
status: "todo",
});
const { id: runId } = db.createRun({
const { id: runId } = db.runs.createRun({
companyId: opts.companyId,
taskId,
agentId: opts.agentId,
@@ -166,7 +166,7 @@ function createAndStartRun(
});
db.tasks.checkoutTask(taskId, runId);
db.markRunStatus(runId, "running", "Starting execution");
db.runs.markRunStatus(runId, "running", "Starting execution");
if (opts.claimWorkspace !== false) {
db.claimWorkspaceLock(opts.workspaceId, runId);
@@ -278,8 +278,8 @@ describe("Process Recovery -- Worker Crash Detection", () => {
const interruptedCount = simulateWorkerCrash(db);
expect(interruptedCount).toBe(2);
expect(db.getRun(run1.runId).status).toBe("interrupted");
expect(db.getRun(run2.runId).status).toBe("interrupted");
expect(db.runs.getRun(run1.runId).status).toBe("interrupted");
expect(db.runs.getRun(run2.runId).status).toBe("interrupted");
});
it("releases task locks after crash", () => {
@@ -378,7 +378,7 @@ describe("Process Recovery -- Worker Crash Detection", () => {
priority: "medium",
status: "todo",
});
const { id: newRunId } = db.createRun({
const { id: newRunId } = db.runs.createRun({
companyId: s.companyId,
taskId: taskId2,
agentId: agent2Id,
@@ -530,7 +530,7 @@ describe("Process Recovery -- Multiple Concurrent Runs", () => {
expect(interruptedCount).toBe(3);
for (const run of runs) {
expect(db.getRun(run.runId).status).toBe("interrupted");
expect(db.runs.getRun(run.runId).status).toBe("interrupted");
}
});
@@ -32,7 +32,7 @@ describe("skill-aware capability registry", () => {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Skill Match Co",
description: "Tests skill-aware assignment",
status: "active",
@@ -122,7 +122,7 @@ describe("skill-aware capability registry", () => {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Registry Co",
description: "Tests capability registry prompt injection",
status: "active",
@@ -36,7 +36,7 @@ function createScaffold(db: AppDatabase) {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Thread Wait Co",
description: "Tests cofounder wait states and replies",
status: "active",
@@ -204,7 +204,7 @@ describe("thread wait + heartbeat integration", () => {
throw new Error("Expected a task thread to exist for approval resolution testing.");
}
const approvalId = db.requestApproval({
const approvalId = db.approvalsMod.requestApproval({
companyId,
relatedTaskId: taskId,
requestedByAgentId: engineerId,
@@ -238,7 +238,7 @@ describe("thread wait + heartbeat integration", () => {
expect(waitStates).toHaveLength(1);
expect(checkpointEngine.shouldPauseHeartbeat(companyId, engineerId)).toBe(true);
db.decideApproval({
db.approvalsMod.decideApproval({
approvalId,
state: "approved",
decisionNote: "Approved by board",
@@ -53,7 +53,7 @@ async function createHarness(): Promise<Harness> {
lastError: null,
});
const companyId = db.saveCompany({
const companyId = db.company.saveCompany({
name: "Work Products Co",
description: "Tests archived visibility, bulk retirement, deliverable signal",
status: "active",
@@ -88,7 +88,7 @@ async function createHarness(): Promise<Harness> {
priority: "medium",
status: "in_progress",
});
const run = db.createRun({
const run = db.runs.createRun({
companyId,
taskId,
agentId,