/** * Ambient presence ledger (TRL — Layer 1 of agent stigmergy). * * Each agent session writes a heartbeat to `.trellis/presence/.json`. * `trellis who` reads all non-stale heartbeats to give ambient awareness of * who else is working in the repo right now — no server, no relay. This is * pure stigmergy: presence is discovered through the shared repo environment. * * Presence lives OUTSIDE the causal op log on purpose: liveness is ephemeral * and must not pollute milestones, the garden, or sync. It rides beside the * repo, not in it. */ /** A single agent's live presence record. */ export interface PresenceInfo { /** Stable per-session key: TRELLIS_SESSION_ID || TRELLIS_LANE_ID || generated. */ sessionId: string; /** Agent identity entity id (identity:). */ agentId: string; /** Human-readable name from local identity. */ displayName: string; /** Client/provider: opencode | claude | gemini | codex | unknown. */ client: string; /** Lane this session is working in, if any. */ laneId?: string; /** Current branch name, if known. */ branch?: string; /** Issue this session has claimed, if any. */ claimedIssueId?: string; /** Title of the claimed issue, for quick scan. */ claimedIssueTitle?: string; /** Self-reported liveness. */ status: 'active' | 'idle' | 'away'; /** ISO timestamp this session first announced. */ startedAt: string; /** ISO timestamp of the last heartbeat (drives staleness pruning). */ lastHeartbeat: string; } /** Heartbeats older than this are considered offline. */ export declare const DEFAULT_STALE_MS: number; export declare function presenceDir(rootPath: string): string; export declare function writeHeartbeat(rootPath: string, info: PresenceInfo): void; export declare function clearHeartbeat(rootPath: string, sessionId: string): void; export interface ReadPresenceOpts { /** Override the staleness window (ms). */ staleMs?: number; /** Include the calling session's own record (default: false). */ includeSelf?: boolean; /** The calling session's id, used to exclude self unless includeSelf. */ selfSessionId?: string; } /** Read all non-stale presence records, newest heartbeat first. */ export declare function readPresence(rootPath: string, opts?: ReadPresenceOpts): PresenceInfo[]; /** Stable session key for this process: session id, else lane id, else ephemeral uuid. */ export declare function resolveSessionId(): string; //# sourceMappingURL=presence.d.ts.map