import type { AgentDefinition, AgentSlot, AgentSlotConfig, AgentSlotId, AgentStep } from '../../core/types/thread-types.js'; /** Check if a thread is using the default single-agent template */ export declare function isDefaultThread(threadId: string): boolean; /** Check if a thread is ad-hoc (no template) */ export declare function isAdHocThread(threadId: string): boolean; /** Get the session key for a specific agent slot in a thread */ export declare function getSessionKey(threadId: string, slotId: AgentSlotId): string; /** Parse a transition endpoint string — either `"agent"` or `"agent:stage"` — into its components. * When the stage suffix is absent, resolve to the agent's `entryStage` (or the first declared * stage, or null for agents with no `stages` map). The agent itself need not be loaded to parse; * `getStageEntry` on the returned shape handles unknown agents gracefully. */ export declare function parseTarget(endpoint: string): { agent: string; stage: string | null; }; /** Resolve the backend `--resume` target for a hook targeting an existing agent slot. * Track/backend id decoupling aware: prefers the slot's `backendSessionId`; on legacy records * (field absent) `sessionId` held the backend id, so it is the fallback. When the slot knows * nothing, falls back to the slot's most recent recorded step (same new/legacy distinction). * NEVER returns a track id from a new-form record — a fresh backend session beats resuming a * nonexistent transcript. */ export declare function resolveTargetResumeId(slot: AgentSlot, steps: AgentStep[]): string | null; /** Resolve the stage name that should actually run for an agent given an explicit stage or null. * Returns null for single-stage agents (no `stages` map). Falls back to entryStage, then to * the first declared stage name. */ export declare function resolveStageName(agentDef: AgentDefinition | AgentSlotConfig | null, explicit: string | null): string | null;