Install
openclaw skills install calendar-extractorPeriodically scans recent transcripts to extract calendar events and sends a daily summary of meetings to your iOS chat via push notifications.
openclaw skills install calendar-extractorPeriodically scan recent recording sessions, extract calendar events from transcripts, and push a daily summary to your iOS chat.
# Register (first use)
node scripts/register.js <userId> <name>
# Run today's flow (also what the cron triggers)
node scripts/calendar-extractor.js <userId>
# Push management
node scripts/push-toggle.js on <userId> [--time HH:MM] [--channel iOS|Telegram|Discord|Slack]
node scripts/push-toggle.js off <userId>
node scripts/push-toggle.js status <userId>
http://javis-server:8000/api/agent/push with {"skill": "calendar-extractor", "content": "<formatted>"} using OPENCLAW_GATEWAY_TOKEN for auth.When user requests scheduled push:
node scripts/push-toggle.js on <userId> --time <HH:MM> --channel <channel>
openclaw cron add \
--name "calendar-extractor-<userId>" \
--schedule "0 8,18 * * *" \
--tz "America/Los_Angeles" \
--channel <channel> \
--to "<channel-target-id>" \
--session isolated \
--command "Run /calendar-extractor: execute node scripts/calendar-extractor.js <userId>, format output nicely. Then POST to http://javis-server:8000/api/agent/push with JSON body {\"skill\": \"calendar-extractor\", \"content\": \"<formatted output>\"} using the gateway bearer token for auth."
Push is set up; results land in iOS agent chat under /calendar-extractor.
Supported channels: iOS, Telegram, Discord, Slack
data/users/<userId>.json; external HTTP source configured separately via HTTP_SOURCE_URL env var.npm install before first run (none needed beyond Node 18+ built-ins, but the engines field gates the runtime).-, _ (path-traversal guard in data.js).main(): pure-local-state and user-typed-text. The template only emits code for the first 2 sources (transcripts + external-http). To activate the others, hand-edit scripts/calendar-extractor.js:
const userState = fs.existsSync(safeUserPath(userId)) ? readJson(safeUserPath(userId)) : {};const text = process.argv.slice(3).join(' ');America/Los_Angeles at registration time. If you travel, re-register with the new tz: node scripts/push-toggle.js off <userId>, then node scripts/push-toggle.js on <userId> --tz <new-tz>, then re-run the openclaw cron add command above with the new --tz.openclaw cron add with its own --channel and --to <channel-target-id>. iOS push is automatic via the /api/agent/push call (no separate cron needed for iOS).audio_recordings.session_completed flips and POSTs a synthetic prompt to the user's openclaw container /v1/responses to invoke this script with the finalized session id. Track as a follow-up in javis-server.