import type { LifecycleFailure } from "../application/ports.js"; import type { Db } from "@paperclipai/db"; import type { budgetPolicies } from "@paperclipai/db"; import type { CreateAgentData, CreateAgentOptions, AgentConfigurationPatch, AgentConfigurationRecord, AgentHireRecord, UpdateAgentOptions } from "../../../lib/agent-records.js"; import type { ActivityPublication } from "../../../types/activity-publication.js"; /** Services supply integrations; lifecycle owns the transaction and state writes. */ export interface LifecycleEffects { setupRequiresPreparation(db: Db, companyId: string, environmentId?: string | null): Promise; notifyWork(db: Db): Promise; beforeStatusChange(db: Db, companyId: string, agentId: string, before: string, after: string): Promise; reportFailure(context: LifecycleFailure, error: unknown): void; deleteDependencies(db: Db, companyId: string, agentId: string): Promise; prepareConfiguration(db: Db, current: AgentConfigurationRecord, data: AgentConfigurationPatch, options?: UpdateAgentOptions): Promise; completeConfiguration(db: Db, before: AgentConfigurationRecord, after: AgentConfigurationRecord, patch: AgentConfigurationPatch, options: UpdateAgentOptions | undefined, publications: ActivityPublication[]): Promise; transaction(db: Db, companyId: string, work: (tx: Db, publications: ActivityPublication[]) => Promise): Promise; policyBlocks(db: Db, policy: typeof budgetPolicies.$inferSelect): Promise; setAgentBudget(db: Db, publications: ActivityPublication[], companyId: string, agentId: string, amount: number, userId: string | null, isActive?: boolean): Promise; recordCreation(db: Db, companyId: string, agentId: string): Promise; recordStatus(db: Db, companyId: string, agentId: string, before: string, after: string): Promise; clearPrimary(db: Db, companyId: string, agentId: string): Promise; prepareHire(db: Db, companyId: string, data: CreateAgentData, options?: CreateAgentOptions): Promise; initializeHire(db: Db, agent: AgentHireRecord, options?: CreateAgentOptions): Promise; prepareHireApproval(db: Db, agent: AgentHireRecord, payload?: Record | null): Promise; completeHireApproval(db: Db, agent: AgentHireRecord, previous: AgentHireRecord): Promise; }