[{"data":1,"prerenderedAt":477},["ShallowReactive",2],{"navigation_docs":3,"-tools-heartbeats":139,"-tools-heartbeats-surround":472},[4,8,12,16,20,24,28,32,59,63,117,121,135],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","1.introduction",{"title":9,"path":10,"stem":11},"Memory","\u002Fmemory","10.memory",{"title":13,"path":14,"stem":15},"Customization","\u002Fcustomization","11.customization",{"title":17,"path":18,"stem":19},"Deployment","\u002Fdeployment","12.deployment",{"title":21,"path":22,"stem":23},"Reference","\u002Freference","13.reference",{"title":25,"path":26,"stem":27},"Quickstart","\u002Fquickstart","2.quickstart",{"title":29,"path":30,"stem":31},"Installation","\u002Finstallation","3.installation",{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":58},"Connectors","i-lucide-cable","\u002Fconnectors","4.connectors",[38,42,46,50,54],{"title":39,"path":40,"stem":41},"Telegram","\u002Fconnectors\u002Ftelegram","4.connectors\u002F1.telegram",{"title":43,"path":44,"stem":45},"Slack","\u002Fconnectors\u002Fslack","4.connectors\u002F2.slack",{"title":47,"path":48,"stem":49},"Email","\u002Fconnectors\u002Femail","4.connectors\u002F3.email",{"title":51,"path":52,"stem":53},"API","\u002Fconnectors\u002Fapi","4.connectors\u002F4.api",{"title":55,"path":56,"stem":57},"Terminal","\u002Fconnectors\u002Fterminal","4.connectors\u002F5.terminal",false,{"title":60,"path":61,"stem":62},"Attachments","\u002Fattachments","5.attachments",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":58},"Tools","i-lucide-wrench","\u002Ftools","6.tools",[69,73,77,81,85,89,93,97,101,105,109,113],{"title":70,"path":71,"stem":72},"File Manager","\u002Ftools\u002Ffile-manager","6.tools\u002F1.file-manager",{"title":74,"path":75,"stem":76},"Text-to-Speech","\u002Ftools\u002Ftext-to-speech","6.tools\u002F10.text-to-speech",{"title":78,"path":79,"stem":80},"Confirmations","\u002Ftools\u002Fconfirmations","6.tools\u002F11.confirmations",{"title":82,"path":83,"stem":84},"Adding Custom Tools","\u002Ftools\u002Fadding-custom-tools","6.tools\u002F12.adding-custom-tools",{"title":86,"path":87,"stem":88},"Image Manager","\u002Ftools\u002Fimage-manager","6.tools\u002F2.image-manager",{"title":90,"path":91,"stem":92},"Web Request","\u002Ftools\u002Fweb-request","6.tools\u002F3.web-request",{"title":94,"path":95,"stem":96},"Reminders","\u002Ftools\u002Freminders","6.tools\u002F4.reminders",{"title":98,"path":99,"stem":100},"Heartbeats","\u002Ftools\u002Fheartbeats","6.tools\u002F5.heartbeats",{"title":102,"path":103,"stem":104},"Email Manager","\u002Ftools\u002Femail-manager","6.tools\u002F6.email-manager",{"title":106,"path":107,"stem":108},"Calendar","\u002Ftools\u002Fcalendar","6.tools\u002F7.calendar",{"title":110,"path":111,"stem":112},"Read Database","\u002Ftools\u002Fread-database","6.tools\u002F8.read-database",{"title":114,"path":115,"stem":116},"Headless Browser","\u002Ftools\u002Fbrowser","6.tools\u002F9.browser",{"title":118,"path":119,"stem":120},"Tinker","\u002Ftinker","7.tinker",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":58},"Skills","i-lucide-sparkles","\u002Fskills","8.skills",[127,131],{"title":128,"path":129,"stem":130},"Overview","\u002Fskills\u002Foverview","8.skills\u002F1.overview",{"title":132,"path":133,"stem":134},"Adding Custom Skills","\u002Fskills\u002Fadding-custom-skills","8.skills\u002F2.adding-custom-skills",{"title":136,"path":137,"stem":138},"Personas","\u002Fpersonas","9.personas",{"id":140,"title":98,"body":141,"description":465,"extension":466,"links":467,"meta":468,"navigation":469,"path":99,"seo":470,"stem":100,"__hash__":471},"docs\u002F6.tools\u002F5.heartbeats.md",{"type":142,"value":143,"toc":456},"minimark",[144,148,161,174,178,253,257,260,270,273,327,334,338,365,368,372,411,422,426,446],[145,146,5],"h2",{"id":147},"introduction",[149,150,151,152,156,157,160],"p",{},"A heartbeat is a recurring prompt that fires on a cron schedule. Each time it fires, the prompt is sent to the agent and the response is delivered through the connector. Heartbeats are stored in ",[153,154,155],"code",{},"laraclaw_heartbeats"," and dispatched by ",[153,158,159],{},"laraclaw:process-heartbeats",", which runs every minute.",[149,162,163,164,168,169,173],{},"A ",[165,166,167],"a",{"href":95},"reminder"," delivers a fixed message once. A heartbeat re-prompts the agent on every tick. Use a heartbeat for ",[170,171,172],"em",{},"\"every weekday at 9am, summarize my calendar for the day\"",".",[145,175,177],{"id":176},"creating-a-heartbeat","Creating a Heartbeat",[179,180,181,197],"table",{},[182,183,184],"thead",{},[185,186,187,191,194],"tr",{},[188,189,190],"th",{},"Parameter",[188,192,193],{},"Required",[188,195,196],{},"Description",[198,199,200,216,228,240],"tbody",{},[185,201,202,208,211],{},[203,204,205],"td",{},[153,206,207],{},"operation",[203,209,210],{},"Yes",[203,212,213],{},[153,214,215],{},"create",[185,217,218,223,225],{},[203,219,220],{},[153,221,222],{},"prompt",[203,224,210],{},[203,226,227],{},"The text the agent will be prompted with on every tick",[185,229,230,235,237],{},[203,231,232],{},[153,233,234],{},"cron",[203,236,210],{},[203,238,239],{},"A standard 5-field cron expression",[185,241,242,247,250],{},[203,243,244],{},[153,245,246],{},"connector",[203,248,249],{},"No",[203,251,252],{},"Which connector to deliver on. Defaults to the connector the user is currently messaging from.",[145,254,256],{"id":255},"cron-expressions","Cron Expressions",[149,258,259],{},"Laraclaw uses standard 5-field cron syntax:",[261,262,267],"pre",{"className":263,"code":265,"language":266},[264],"language-text","*  *  *  *  *\n│  │  │  │  │\n│  │  │  │  └─── day of week (0–6, Sunday = 0)\n│  │  │  └────── month (1–12)\n│  │  └───────── day of month (1–31)\n│  └──────────── hour (0–23)\n└─────────────── minute (0–59)\n","text",[153,268,265],{"__ignoreMap":269},"",[149,271,272],{},"Examples:",[179,274,275,285],{},[182,276,277],{},[185,278,279,282],{},[188,280,281],{},"Cron",[188,283,284],{},"Meaning",[198,286,287,297,307,317],{},[185,288,289,294],{},[203,290,291],{},[153,292,293],{},"0 9 * * 1",[203,295,296],{},"Every Monday at 9:00",[185,298,299,304],{},[203,300,301],{},[153,302,303],{},"0 9 * * 1-5",[203,305,306],{},"Every weekday at 9:00",[185,308,309,314],{},[203,310,311],{},[153,312,313],{},"*\u002F15 * * * *",[203,315,316],{},"Every 15 minutes",[185,318,319,324],{},[203,320,321],{},[153,322,323],{},"0 0 1 * *",[203,325,326],{},"The first of every month at midnight",[149,328,329,330,333],{},"The expression is validated by ",[153,331,332],{},"Cron\\CronExpression"," when the heartbeat is created. Invalid expressions are rejected with an error message.",[145,335,337],{"id":336},"listing-heartbeats","Listing Heartbeats",[179,339,340,350],{},[182,341,342],{},[185,343,344,346,348],{},[188,345,190],{},[188,347,193],{},[188,349,196],{},[198,351,352],{},[185,353,354,358,360],{},[203,355,356],{},[153,357,207],{},[203,359,210],{},[203,361,362],{},[153,363,364],{},"list",[149,366,367],{},"Returns all active heartbeats for the owner as JSON.",[145,369,371],{"id":370},"cancelling-a-heartbeat","Cancelling a Heartbeat",[179,373,374,384],{},[182,375,376],{},[185,377,378,380,382],{},[188,379,190],{},[188,381,193],{},[188,383,196],{},[198,385,386,399],{},[185,387,388,392,394],{},[203,389,390],{},[153,391,207],{},[203,393,210],{},[203,395,396],{},[153,397,398],{},"cancel",[185,400,401,406,408],{},[203,402,403],{},[153,404,405],{},"id",[203,407,210],{},[203,409,410],{},"The heartbeat ID",[149,412,413,414,417,418,421],{},"The heartbeat is deactivated rather than deleted (",[153,415,416],{},"is_active"," is set to ",[153,419,420],{},"false","), so it stops firing without losing the record.",[145,423,425],{"id":424},"how-heartbeats-are-delivered","How Heartbeats Are Delivered",[149,427,428,429,431,432,435,436,439,440,443,444,173],{},"Every minute, ",[153,430,159],{}," iterates over active heartbeats. For each one, it computes the next run date from ",[153,433,434],{},"last_run_at"," and the cron expression, and dispatches a ",[153,437,438],{},"SendHeartbeat"," job if that date is in the past. The job builds a fresh ",[153,441,442],{},"IncomingMessage",", runs the agent, delivers the response, and updates ",[153,445,434],{},[447,448,449],"blockquote",{},[149,450,451,455],{},[452,453,454],"span",{},"!NOTE","\nWhen a heartbeat fires in a Slack channel, the conversation context is reset so each tick posts a new top-level message instead of replying inside the same thread.",{"title":269,"searchDepth":457,"depth":457,"links":458},2,[459,460,461,462,463,464],{"id":147,"depth":457,"text":5},{"id":176,"depth":457,"text":177},{"id":255,"depth":457,"text":256},{"id":336,"depth":457,"text":337},{"id":370,"depth":457,"text":371},{"id":424,"depth":457,"text":425},"Schedule recurring prompts that fire on a cron schedule.","md",null,{},true,{"title":98,"description":465},"gD2G6PAi7Uva_DPVraUe4An-ijTC7XDUh90BGSx8FqQ",[473,475],{"title":94,"path":95,"stem":96,"description":474,"children":-1},"Schedule one-shot messages to be delivered at a specific time.",{"title":102,"path":103,"stem":104,"description":476,"children":-1},"Read, send, reply to, and organize messages in your inbox.",1786661906119]