refactor: prune dead IPC surface and orphaned modules

Drop code that nothing consumed. Verified by full renderer+shared grep:
every removed channel had zero callers via window.agentCompany.* and
zero references from desktop-api types. No backend internal use either —
the database/API-server layers keep their methods, only the IPC exposure
goes.

Removed IPC handlers (26 total):

  Thread CRUD surface (12) — writes happen inside the backend
    createThread, listThreads, addThreadEvent,
    setThreadWaitState, resolveThreadWaitState,
    addParticipant, removeParticipant, listParticipants,
    subscribeThread, unsubscribeThread,
    listSubscriptions, listSubscribedThreads
    (kept reads: getThread, listThreadEvents, listThreadWaitStates)

  Half-implemented features (13)
    saveSecret, listComments, getAgentMetrics, getApiPort,
    listWakeupRequests, listAgentMessages, autoAssignTask,
    listRunEvents, recoveryDismiss,
    getHeartbeatPolicy, setHeartbeatPolicy,
    getRuntimeState, setRuntimeState

  Whole vertical slice: openConnectorAuthTerminal
    IPC handler + channel + preload + DesktopApi type +
    connector-auth-service function + useConnectorCallbacks
    handleLoginConnector + OnboardingContext.onLoginConnector +
    OnboardingWizard wiring. Pi-mono has no CLI auth flow;
    the no-op that "returned false for legacy UI compatibility"
    had no legacy UI left.

Orphaned modules (zero importers in repo):
  src/main/runtime-env.ts
  src/main/database-stale-recovery.ts

Dead schema files (only referenced by their own barrel re-export):
  schemas-participants, schemas-subscriptions, schemas-heartbeat,
  schemas-run-events, schemas-runtime-state, schemas-wakeup

Renderer leftovers:
  .activity-row-enter CSS + its two unreferenced keyframes
  5 orphan i18n keys (app.console, app.refresh, app.expand,
  activity.timeline, auto.trigger) left over from earlier feature
  deletions

Also update two unit tests that mocked openConnectorAuthTerminal in
the RegisterCoreHandlersDependencies pick.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-17 22:38:10 -04:00
1 parent 1f7230fe87
commit c71d033b0c
37 files changed
+17 -929

No files matched your search

+1 -30
View File
@@ -14,7 +14,6 @@ export const IPC_CHANNELS = {
saveTask: "agent-company:save-task",
requestApproval: "agent-company:request-approval",
decideApproval: "agent-company:decide-approval",
saveSecret: "agent-company:save-secret",
startTaskRun: "agent-company:start-task-run",
cancelRun: "agent-company:cancel-run",
getRunLog: "agent-company:get-run-log",
@@ -33,16 +32,12 @@ export const IPC_CHANNELS = {
deleteSecret: "agent-company:delete-secret",
getSidebarBadges: "agent-company:get-sidebar-badges",
listConnectorModels: "agent-company:list-connector-models",
openConnectorAuthTerminal: "agent-company:open-connector-auth-terminal",
addComment: "agent-company:add-comment",
listComments: "agent-company:list-comments",
setHeartbeat: "agent-company:set-heartbeat",
triggerHeartbeat: "agent-company:trigger-heartbeat",
getApiPort: "agent-company:get-api-port",
rendererEvent: "agent-company:event",
getInbox: "agent-company:get-inbox",
getCompanyMetrics: "agent-company:get-company-metrics",
getAgentMetrics: "agent-company:get-agent-metrics",
getStandupReport: "agent-company:get-standup-report",
bootstrapOnboarding: "agent-company:bootstrap-onboarding",
checkNodeInstalled: "agent-company:check-node-installed",
@@ -65,12 +60,10 @@ export const IPC_CHANNELS = {
toggleAutomationRule: "agent-company:toggle-automation-rule",
getAutomationLog: "agent-company:get-automation-log",
sendAgentMessage: "agent-company:send-agent-message",
listAgentMessages: "agent-company:list-agent-messages",
markMessageRead: "agent-company:mark-message-read",
saveWorkflow: "agent-company:save-workflow",
deleteWorkflow: "agent-company:delete-workflow",
runWorkflow: "agent-company:run-workflow",
autoAssignTask: "agent-company:auto-assign-task",
searchMessages: "agent-company:search-messages",
importSkill: "agent-company:import-skill",
listSkills: "agent-company:list-skills",
@@ -82,7 +75,6 @@ export const IPC_CHANNELS = {
checkSkillUpdate: "agent-company:check-skill-update",
listSkillAgents: "agent-company:list-skill-agents",
listAgentSkills: "agent-company:list-agent-skills",
listWakeupRequests: "agent-company:list-wakeup-requests",
saveBudgetPolicy: "agent-company:save-budget-policy",
deleteBudgetPolicy: "agent-company:delete-budget-policy",
listBudgetPolicies: "agent-company:list-budget-policies",
@@ -97,32 +89,11 @@ export const IPC_CHANNELS = {
setConnectorDisabledModels: "agent-company:set-connector-disabled-models",
// Recovery
recoveryRetry: "recovery:retry",
recoveryDismiss: "recovery:dismiss",
recoveryFail: "recovery:fail",
// Run events
listRunEvents: "agent-company:list-run-events",
// Heartbeat policy
getHeartbeatPolicy: "agent-company:get-heartbeat-policy",
setHeartbeatPolicy: "agent-company:set-heartbeat-policy",
// Runtime state
getRuntimeState: "agent-company:get-runtime-state",
setRuntimeState: "agent-company:set-runtime-state",
// Thread runtime
createThread: "agent-company:create-thread",
listThreads: "agent-company:list-threads",
// Thread runtime (read-only — writes happen inside the backend)
getThread: "agent-company:get-thread",
addThreadEvent: "agent-company:add-thread-event",
listThreadEvents: "agent-company:list-thread-events",
setThreadWaitState: "agent-company:set-thread-wait-state",
resolveThreadWaitState: "agent-company:resolve-thread-wait-state",
listThreadWaitStates: "agent-company:list-thread-wait-states",
listParticipants: "agent-company:list-participants",
addParticipant: "agent-company:add-participant",
removeParticipant: "agent-company:remove-participant",
subscribeThread: "agent-company:subscribe-thread",
unsubscribeThread: "agent-company:unsubscribe-thread",
listSubscriptions: "agent-company:list-subscriptions",
listSubscribedThreads: "agent-company:list-subscribed-threads",
windowMinimize: "window:minimize",
windowMaximize: "window:maximize",
windowClose: "window:close",
+3 -8
View File
@@ -1,20 +1,15 @@
import type { z } from "zod";
import type { AgentMetrics, AgentRecord } from "../../types";
import type { AgentRecord } from "../../types";
import type { agentInputSchema, heartbeatSettingsSchema, hireRequestSchema, triggerHeartbeatSchema } from "../schemas-agents";
import type { entityGetterSchema, metricsQuerySchema } from "../schemas-badges";
import type { entityGetterSchema } from "../schemas-badges";
import type { deleteEntitySchema } from "../schemas-badges";
import type { DesktopResult, HeartbeatPolicy } from "./common";
import type { DesktopResult } from "./common";
export type AgentsApi = {
saveAgent: (input: z.infer<typeof agentInputSchema>) => Promise<DesktopResult<string>>;
requestHire: (input: z.infer<typeof hireRequestSchema>) => Promise<DesktopResult<{ agentId: string; approvalId: string; autoApproved: boolean }>>;
deleteAgent: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
getAgent: (input: z.infer<typeof entityGetterSchema>) => Promise<DesktopResult<AgentRecord>>;
getAgentMetrics: (input: z.infer<typeof metricsQuerySchema>) => Promise<DesktopResult<AgentMetrics>>;
setHeartbeat: (input: z.infer<typeof heartbeatSettingsSchema>) => Promise<DesktopResult<boolean>>;
triggerHeartbeat: (input: z.infer<typeof triggerHeartbeatSchema>) => Promise<DesktopResult<string>>;
getHeartbeatPolicy: (agentId: string, companyId: string) => Promise<DesktopResult<HeartbeatPolicy>>;
setHeartbeatPolicy: (companyId: string, agentId: string, policy: Partial<HeartbeatPolicy>) => Promise<DesktopResult<boolean>>;
getRuntimeState: (agentId: string, companyId: string) => Promise<DesktopResult<Record<string, unknown>>>;
setRuntimeState: (companyId: string, agentId: string, state: Record<string, unknown>) => Promise<DesktopResult<boolean>>;
};
@@ -4,7 +4,6 @@ import type { automationRuleInputSchema, toggleAutomationRuleSchema } from "../s
import type { browserActionQuerySchema, cancelBrowserActionSchema, openTerminalCommandSchema, runWorkflowSchema, triggerBrowserLoginSchema, workflowInputSchema } from "../schemas-execution";
import type { socialAccountInputSchema } from "../schemas-company";
import type { deleteEntitySchema } from "../schemas-badges";
import type { wakeupQuerySchema, WakeupRequestRecord } from "../schemas-wakeup";
import type { DesktopResult } from "./common";
export type AutomationApi = {
@@ -15,7 +14,6 @@ export type AutomationApi = {
saveWorkflow: (input: z.infer<typeof workflowInputSchema>) => Promise<DesktopResult<string>>;
deleteWorkflow: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
runWorkflow: (input: z.infer<typeof runWorkflowSchema>) => Promise<DesktopResult<boolean>>;
listWakeupRequests: (input: z.infer<typeof wakeupQuerySchema>) => Promise<DesktopResult<WakeupRequestRecord[]>>;
saveSocialAccount: (input: z.infer<typeof socialAccountInputSchema>) => Promise<DesktopResult<string>>;
deleteSocialAccount: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
listBrowserActions: (input: z.infer<typeof browserActionQuerySchema>) => Promise<DesktopResult<BrowserActionRecord[]>>;
@@ -1,12 +1,11 @@
import type { z } from "zod";
import type { AgentMessageRecord, CommentRecord, DocumentRecord, KnowledgeEntryRecord } from "../../types";
import type { agentMessageInputSchema, commentInputSchema, documentInputSchema, knowledgeEntryInputSchema, listCommentsSchema, markMessageReadSchema, meetingInputSchema, messageQuerySchema, searchMessagesSchema } from "../schemas-messages";
import type { AgentMessageRecord, DocumentRecord, KnowledgeEntryRecord } from "../../types";
import type { agentMessageInputSchema, commentInputSchema, documentInputSchema, knowledgeEntryInputSchema, markMessageReadSchema, meetingInputSchema, searchMessagesSchema } from "../schemas-messages";
import type { deleteEntitySchema } from "../schemas-badges";
import type { DesktopResult } from "./common";
export type CommunicationApi = {
addComment: (input: z.infer<typeof commentInputSchema>) => Promise<DesktopResult<string>>;
listComments: (input: z.infer<typeof listCommentsSchema>) => Promise<DesktopResult<CommentRecord[]>>;
saveMeeting: (input: z.infer<typeof meetingInputSchema>) => Promise<DesktopResult<string>>;
deleteMeeting: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
saveDocument: (input: z.infer<typeof documentInputSchema>) => Promise<DesktopResult<string>>;
@@ -14,7 +13,6 @@ export type CommunicationApi = {
saveKnowledgeEntry: (input: z.infer<typeof knowledgeEntryInputSchema>) => Promise<DesktopResult<string>>;
deleteKnowledgeEntry: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
sendAgentMessage: (input: z.infer<typeof agentMessageInputSchema>) => Promise<DesktopResult<import("@shared/types").SendMessageResult>>;
listAgentMessages: (input: z.infer<typeof messageQuerySchema>) => Promise<DesktopResult<AgentMessageRecord[]>>;
markMessageRead: (input: z.infer<typeof markMessageReadSchema>) => Promise<DesktopResult<boolean>>;
searchMessages: (input: z.infer<typeof searchMessagesSchema>) => Promise<DesktopResult<AgentMessageRecord[]>>;
// Keep reference to silence unused-import checker for DocumentRecord/KnowledgeEntryRecord — consumers infer via schemas.
@@ -19,8 +19,6 @@ export type CompaniesApi = {
listConnectorModels: (connectorId: string) => Promise<DesktopResult<Array<{ id: string; label: string }>>>;
getConnectorDisabledModels: (connectorId: string) => Promise<DesktopResult<Array<{ id: string; label: string }>>>;
setConnectorDisabledModels: (input: z.infer<typeof connectorDisabledModelsSchema>) => Promise<DesktopResult<boolean>>;
openConnectorAuthTerminal: (connectorId: z.infer<typeof connectorInputSchema.shape.id>) => Promise<DesktopResult<boolean>>;
getApiPort: () => Promise<DesktopResult<number>>;
getInbox: (companyId: string) => Promise<DesktopResult<InboxItem[]>>;
getCompanyMetrics: (input: z.infer<typeof metricsQuerySchema>) => Promise<DesktopResult<CompanyMetrics>>;
getStandupReport: (companyId: string) => Promise<DesktopResult<StandupReport>>;
@@ -1,6 +1,5 @@
import type { z } from "zod";
import type { secretInputSchema } from "../schemas-company";
import type { deleteEntitySchema } from "../schemas-badges";
import type { z } from "zod";
import type {
CredentialSummary,
SaveCredentialInput,
@@ -13,7 +12,6 @@ import type {
import type { DesktopResult } from "./common";
export type CredentialsApi = {
saveSecret: (input: z.infer<typeof secretInputSchema>) => Promise<DesktopResult<string>>;
deleteSecret: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
// pi-mono credentials
listCredentials: () => Promise<DesktopResult<CredentialSummary[]>>;
+1 -3
View File
@@ -2,7 +2,7 @@ import type { z } from "zod";
import type { RunLogChunk, RunRecord } from "../../types";
import type { cancelRunSchema, runLogChunkSchema, runLogSchema, startRunSchema } from "../schemas-execution";
import type { entityGetterSchema } from "../schemas-badges";
import type { DesktopResult, RunEventRecord } from "./common";
import type { DesktopResult } from "./common";
export type RunsApi = {
startTaskRun: (input: z.infer<typeof startRunSchema>) => Promise<DesktopResult<string>>;
@@ -10,8 +10,6 @@ export type RunsApi = {
getRunLog: (input: z.infer<typeof runLogSchema>) => Promise<DesktopResult<string>>;
getRunLogChunk: (input: z.infer<typeof runLogChunkSchema>) => Promise<DesktopResult<RunLogChunk>>;
getRun: (input: z.infer<typeof entityGetterSchema>) => Promise<DesktopResult<RunRecord>>;
listRunEvents: (companyId: string, runId: string, opts?: { offset?: number; limit?: number }) => Promise<DesktopResult<RunEventRecord[]>>;
recoveryRetry: (taskId: string, agentId: string, companyId: string) => Promise<DesktopResult<null>>;
recoveryDismiss: (taskId: string, companyId: string) => Promise<DesktopResult<null>>;
recoveryFail: (taskId: string, companyId: string) => Promise<DesktopResult<null>>;
};
+1 -2
View File
@@ -1,6 +1,6 @@
import type { z } from "zod";
import type { TaskRecord } from "../../types";
import type { autoAssignSchema, goalInputSchema, projectInputSchema, sprintInputSchema, taskInputSchema } from "../schemas-tasks";
import type { goalInputSchema, projectInputSchema, sprintInputSchema, taskInputSchema } from "../schemas-tasks";
import type { workspaceInputSchema } from "../schemas-company";
import type { deleteEntitySchema, entityGetterSchema } from "../schemas-badges";
import type { DesktopResult, SaveTaskResult } from "./common";
@@ -17,5 +17,4 @@ export type TasksApi = {
deleteWorkspace: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
deleteSprint: (input: z.infer<typeof deleteEntitySchema>) => Promise<DesktopResult<boolean>>;
getTask: (input: z.infer<typeof entityGetterSchema>) => Promise<DesktopResult<TaskRecord>>;
autoAssignTask: (input: z.infer<typeof autoAssignSchema>) => Promise<DesktopResult<string>>;
};
+2 -16
View File
@@ -1,24 +1,10 @@
import type { z } from "zod";
import type { ConversationEventRecord, ConversationParticipantRecord, ConversationThreadRecord, ThreadSubscriptionRecord, ThreadWaitStateRecord } from "../../types";
import type { addThreadEventSchema, createThreadSchema, listThreadEventsSchema, listThreadsSchema, listThreadWaitStatesSchema, resolveThreadWaitStateSchema, setThreadWaitStateSchema, threadGetterSchema } from "../schemas-threads";
import type { addParticipantSchema, listParticipantsSchema, removeParticipantSchema } from "../schemas-participants";
import type { listSubscribedThreadsSchema, listSubscriptionsSchema, subscribeThreadSchema, unsubscribeThreadSchema } from "../schemas-subscriptions";
import type { ConversationEventRecord, ConversationThreadRecord, ThreadWaitStateRecord } from "../../types";
import type { listThreadEventsSchema, listThreadWaitStatesSchema, threadGetterSchema } from "../schemas-threads";
import type { DesktopResult } from "./common";
export type ThreadsApi = {
createThread: (input: z.infer<typeof createThreadSchema>) => Promise<DesktopResult<ConversationThreadRecord>>;
listThreads: (input: z.infer<typeof listThreadsSchema>) => Promise<DesktopResult<ConversationThreadRecord[]>>;
getThread: (input: z.infer<typeof threadGetterSchema>) => Promise<DesktopResult<ConversationThreadRecord>>;
addThreadEvent: (input: z.infer<typeof addThreadEventSchema>) => Promise<DesktopResult<ConversationEventRecord>>;
listThreadEvents: (input: z.infer<typeof listThreadEventsSchema>) => Promise<DesktopResult<ConversationEventRecord[]>>;
setThreadWaitState: (input: z.infer<typeof setThreadWaitStateSchema>) => Promise<DesktopResult<ThreadWaitStateRecord>>;
resolveThreadWaitState: (input: z.infer<typeof resolveThreadWaitStateSchema>) => Promise<DesktopResult<boolean>>;
listThreadWaitStates: (input: z.infer<typeof listThreadWaitStatesSchema>) => Promise<DesktopResult<ThreadWaitStateRecord[]>>;
listParticipants: (input: z.infer<typeof listParticipantsSchema>) => Promise<DesktopResult<ConversationParticipantRecord[]>>;
addParticipant: (input: z.infer<typeof addParticipantSchema>) => Promise<DesktopResult<ConversationParticipantRecord>>;
removeParticipant: (input: z.infer<typeof removeParticipantSchema>) => Promise<DesktopResult<boolean>>;
subscribeThread: (input: z.infer<typeof subscribeThreadSchema>) => Promise<DesktopResult<ThreadSubscriptionRecord>>;
unsubscribeThread: (input: z.infer<typeof unsubscribeThreadSchema>) => Promise<DesktopResult<boolean>>;
listSubscriptions: (input: z.infer<typeof listSubscriptionsSchema>) => Promise<DesktopResult<ThreadSubscriptionRecord[]>>;
listSubscribedThreads: (input: z.infer<typeof listSubscribedThreadsSchema>) => Promise<DesktopResult<ConversationThreadRecord[]>>;
};
-16
View File
@@ -1,16 +0,0 @@
import { z } from "zod";
export const heartbeatPolicySchema = z.object({
companyId: z.string().min(1),
agentId: z.string().min(1),
});
export const setHeartbeatPolicySchema = z.object({
companyId: z.string().min(1),
agentId: z.string().min(1),
enabled: z.boolean().optional(),
intervalSec: z.number().optional(),
cooldownSec: z.number().optional(),
maxConcurrentRuns: z.number().optional(),
wakeOnDemand: z.boolean().optional(),
});
-6
View File
@@ -3,10 +3,4 @@
export * from "./schemas-badges";
export * from "./schemas-automation";
export * from "./schemas-budget";
export * from "./schemas-wakeup";
export * from "./schemas-run-events";
export * from "./schemas-heartbeat";
export * from "./schemas-runtime-state";
export * from "./schemas-threads";
export * from "./schemas-participants";
export * from "./schemas-subscriptions";
@@ -1,20 +0,0 @@
import { z } from "zod";
export const listParticipantsSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
});
export const addParticipantSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
participantId: z.string(),
participantType: z.enum(["agent", "user", "system"]),
role: z.enum(["owner", "member", "observer"]).default("member"),
});
export const removeParticipantSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
participantId: z.string(),
});
@@ -1,8 +0,0 @@
import { z } from "zod";
export const listRunEventsSchema = z.object({
companyId: z.string().min(1),
runId: z.string().min(1),
offset: z.number().optional(),
limit: z.number().optional(),
});
@@ -1,12 +0,0 @@
import { z } from "zod";
export const runtimeStateSchema = z.object({
companyId: z.string().min(1),
agentId: z.string().min(1),
});
export const setRuntimeStateSchema = z.object({
companyId: z.string().min(1),
agentId: z.string().min(1),
state: z.record(z.string(), z.unknown()),
});
@@ -1,25 +0,0 @@
import { z } from "zod";
export const subscribeThreadSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
subscriberId: z.string(),
subscriberType: z.enum(["agent", "user", "system"]),
notifyOn: z.enum(["all", "mentions", "none"]).default("all"),
});
export const unsubscribeThreadSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
subscriberId: z.string(),
});
export const listSubscriptionsSchema = z.object({
threadId: z.string().uuid(),
companyId: z.string().uuid(),
});
export const listSubscribedThreadsSchema = z.object({
subscriberId: z.string(),
companyId: z.string().uuid(),
});
-40
View File
@@ -1,37 +1,10 @@
import { z } from "zod";
export const createThreadSchema = z.object({
companyId: z.string().uuid(),
title: z.string().min(1).max(200),
type: z.enum(["task", "approval", "general", "announcement"]),
relatedEntityType: z.string().nullable().optional(),
relatedEntityId: z.string().nullable().optional(),
});
export const listThreadsSchema = z.object({
companyId: z.string().uuid(),
type: z.enum(["task", "approval", "general", "announcement"]).optional(),
relatedEntityType: z.string().optional(),
relatedEntityId: z.string().optional(),
limit: z.number().int().min(1).max(100).default(50),
offset: z.number().int().min(0).default(0),
});
export const threadGetterSchema = z.object({
companyId: z.string().uuid(),
threadId: z.string().uuid(),
});
export const addThreadEventSchema = z.object({
companyId: z.string().uuid(),
threadId: z.string().uuid(),
actorId: z.string().min(1),
actorType: z.enum(["agent", "user", "system"]),
eventType: z.enum(["message", "status_change", "approval_request", "approval_decision", "file_attachment", "system_note"]),
body: z.string().default(""),
metadataJson: z.string().default("{}"),
});
export const listThreadEventsSchema = z.object({
companyId: z.string().uuid(),
threadId: z.string().uuid(),
@@ -39,19 +12,6 @@ export const listThreadEventsSchema = z.object({
offset: z.number().int().min(0).default(0),
});
export const setThreadWaitStateSchema = z.object({
companyId: z.string().uuid(),
threadId: z.string().uuid(),
waitingFor: z.enum(["user_review", "user_approval", "user_reply"]),
relatedApprovalId: z.string().nullable().optional(),
reason: z.string().min(1).max(500),
});
export const resolveThreadWaitStateSchema = z.object({
companyId: z.string().uuid(),
waitStateId: z.string().uuid(),
});
export const listThreadWaitStatesSchema = z.object({
companyId: z.string().uuid(),
resolvedOnly: z.boolean().default(false),
-24
View File
@@ -1,24 +0,0 @@
import { z } from "zod";
export const wakeupQuerySchema = z.object({
companyId: z.string().uuid(),
status: z.enum(["queued", "claimed", "coalesced", "deferred", "completed"]).optional(),
agentId: z.string().uuid().optional(),
limit: z.number().int().min(1).max(100).default(50),
});
export interface WakeupRequestRecord {
id: string;
companyId: string;
agentId: string;
source: string;
triggerDetail: string | null;
status: string;
coalescedCount: number;
runId: string | null;
requestedAt: string;
claimedAt: string | null;
finishedAt: string | null;
createdAt: string;
updatedAt: string;
}