export type CronKind = "user-brief" | "background"; export interface CronConfig { id: string; name: string; kind: CronKind; /** * v1.3.4 §F2 — empty = auto-resolve to the org's `works-` at runtime * (there is no shared "#workflow" channel). A non-empty value is an explicit * advanced override. */ channel: string; /** System thread inside #workflow for background crons. user-brief posts to channel root. */ threadName?: string; emoji: string; memoryTargets: string[]; } /** * v0.8.5 cron layout — four entries total: * - 2 user-facing briefs (morning, evening) post to works- * - 1 PM-compaction (background, context management) * - 1 system-housekeeping (silent infra — archive rotation + log retention) * * Removed in v0.8.5 (was v0.2.4 background analysis layer): `signal-scan`, * `experiment-check`, `weekly-review`, `v06-retrospective-stats`. They were * speculative analysis crons that required the user to author a product * brief / experiment ledger before producing useful output — friction without * payoff. Domain-specific analysis should ship as user-authored workflows or * goals, not as default-on cron jobs. * * Merged in v0.8.5: `archive-rotate` + `log-rotate` → `system-housekeeping`. * Both are deterministic midnight cleanup jobs (no LLM, no user notification); * a single cron + a single inline dispatch reduces UI clutter without losing * isolation (the dispatch wraps each cleanup call in try/catch). * * Cron times are resolved at scheduler startup from workspace.yaml * (`briefings` for morning/evening). */ export declare const CRONS: CronConfig[]; /** * v1.3.3 §C — a run is "silent" when its output is empty or begins with a * `[SILENT]` marker (Hermes `[SILENT]` / OpenClaw `NO_REPLY` pattern). The * scheduler still logs/records a silent run but does not post it to the channel * — lets a cron be a quiet poller that only speaks when it has something to say. */ export declare function isSilentResult(result: string): boolean; /** Load a cron prompt from `{id}.md`. * - Built-in crons resolve from the bundle/legacy resolver (`getCronsDir`). * - v1.3.5 B-D3: org-scoped user crons live in `/crons/.md`; pass the * org slug to read it there (falling back to the resolver if absent). */ export declare function loadCronPrompt(cronId: string, orgSlug?: string): string; /** Convert "HH:MM" into a node-cron expression for daily execution. */ export declare function timeToDailyCron(hhmm: string): string; /** Convert ("sunday", "20:00") into a node-cron weekly expression. */ export declare function weeklyToCron(day: string, hhmm: string): string;