Install
openclaw skills install @obuchowski/cron-to-transcriptIsolated crons, scripts, reminders, and status checkers sent it but the agent forgot? Write deliveries into the session transcript.
openclaw skills install @obuchowski/cron-to-transcriptCommand crons and scripts can send messages that users see, while the owning agent never records them. Cron To Session Transcript closes that gap.
Use it when a deterministic --command cron, dispatcher, reminder script, or
status checker calls openclaw message send and the agent should remember that
delivery in its own session history.
All commands:
bash "{baseDir}/scripts/send-to-transcript.sh" <flags>
openclaw message send reaches the chat, but it bypasses the agent run loop.
That means no assistant row is appended to the agent's session transcript. On a
later turn, the agent has no durable record that the cron/script sent anything.
Agent replies and agentTurn crons already go through OpenClaw's delivery layer
and are recorded normally. This skill is only for direct command/script sends.
openclaw message send ... --json.sessionFile from
agents/<agent>/sessions/sessions.json.parentId.--idem <key>.The row intentionally uses OpenClaw's internal delivery marker:
provider: "openclaw", model: "delivery-mirror", zeroed usage, and
openclawDeliveryMirror: {kind:"channel-final"}. Keep that internal model string
unchanged: OpenClaw core recognizes transcript-only delivery rows by it.
Appending is best-effort. If the send succeeds but the transcript cannot be resolved, the helper exits 0 with a warning so the real user-facing delivery is not failed by a memory append problem.
This skill performs local filesystem writes and runs the openclaw CLI:
<openclaw-home>/agents/<agent>/sessions/sessions.json.<openclaw-home>/cron-to-transcript/.<sessionFile>.transcript.lock while appending.openclaw message send.It does not run any model, make network calls of its own, edit existing
transcript records, delete data, or read ambient environment variables for
message data. Inputs are passed to the embedded Python as positional argv.
Use --openclaw-home to confine paths for tests.
scripts/send-to-transcript.sh \
--agent ula \
--account ula \
--to -1003971971641 \
--thread-id 131 \
--source agenda-dispatch \
--idem "agenda:131:$(date +%F):morning" \
--message "$MSG"
Message input can be --message "...", --message-file PATH, or
--message-file - for stdin.
Replace a bare send:
openclaw message send --channel telegram -t "$CHAT" --thread-id "$TOPIC" -m "$MSG"
with:
bash ~/.openclaw/skills/cron-to-transcript/scripts/send-to-transcript.sh \
--agent ula --account ula \
--to "$CHAT" --thread-id "$TOPIC" \
--source agenda-dispatch \
--message "$MSG"
| flag | meaning |
|---|---|
--message / --message-file | message text (file or - for stdin) |
--to | channel target, for example Telegram chat id |
--agent | agent id that owns the transcript |
--account | channel account id for send (default: --agent) |
--channel | channel (default telegram) |
--thread-id | Telegram forum topic id |
--session-key | explicit session key (else auto-resolved) |
--source | label recorded in helper logs |
--idem | idempotency key; skip if already handled |
--openclaw-home | OpenClaw home (default $OPENCLAW_HOME or ~/.openclaw) |
--openclaw-bin | openclaw binary (default openclaw on PATH) |
--dry-run | print the plan, do nothing |
--no-send | append only (testing) |
--no-transcript | send only |
Compatibility alias: --no-mirror is accepted and behaves like
--no-transcript.
| code | meaning |
|---|---|
| 0 | delivered; transcript append succeeded or was skipped best-effort |
| 2 | bad usage / missing required args |
| 3 | idempotency key already handled |
| 4 | send failed; nothing appended |
The helper finds the transcript by explicit --session-key, then by
auto-constructed keys:
agent:<agent>:<channel>:group:<to>:topic:<thread>agent:<agent>:<channel>:group:<to>agent:<agent>:<channel>:direct:<to>If no key matches, it scans sessions.json for a matching delivery target and
thread id. It appends to the entry's sessionFile, so compaction rotation is
followed automatically.
flock, but the gateway does not take that lock.
Dispatcher-style schedules where the target agent is idle are the intended
use case.scripts/send-to-transcript.sh --dry-run --agent X --to <chat> --thread-id <t> --message "hi"
scripts/send-to-transcript.sh --no-send --agent X --to <chat> --thread-id <t> --message "hi"