[{"data":1,"prerenderedAt":607},["ShallowReactive",2],{"navigation_docs":3,"-personas":139,"-personas-surround":604},[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":136,"body":141,"description":598,"extension":599,"links":600,"meta":601,"navigation":417,"path":137,"seo":602,"stem":138,"__hash__":603},"docs\u002F9.personas.md",{"type":142,"value":143,"toc":587},"minimark",[144,148,152,160,168,171,175,187,194,204,218,232,242,246,253,266,275,278,296,314,318,333,344,349,359,362,384,388,391,394,460,463,468,471,480,483,491,494,527,531,549,553,580,583],[145,146,5],"h2",{"id":147},"introduction",[149,150,151],"p",{},"Out of the box, your Laraclaw agent is a generic helpful assistant — perfectly fine, but a bit... beige. What if you want it to sound like an ops engineer who keeps replies short? Or a friendly support rep who always signs off the same way? Or a project manager who answers in bullet points?",[149,153,154,155,159],{},"That's what ",[156,157,158],"strong",{},"personas"," are for.",[149,161,162,163,167],{},"A persona is a Markdown file that gets ",[164,165,166],"em",{},"appended"," to the agent's base system prompt. Personas change how the agent talks — its tone, focus, and conventions — without touching any code. Drop a file on disk, point a thread at it, done.",[149,169,170],{},"Let's see how they work.",[145,172,174],{"id":173},"where-personas-live","Where Personas Live",[149,176,177,178,182,183,186],{},"Personas live under ",[179,180,181],"code",{},"LARACLAW_PERSONAS_PATH",", which defaults to ",[179,184,185],{},"laraclaw\u002Fpersonas\u002F"," at the root of your project.",[149,188,189,190,193],{},"Each persona is a single ",[179,191,192],{},".md"," file. No frontmatter, no directory structure — just the prompt content:",[195,196,201],"pre",{"className":197,"code":199,"language":200},[198],"language-text","laraclaw\u002F\n  personas\u002F\n    default.md\n    ops.md\n    pm.md\n","text",[179,202,199],{"__ignoreMap":203},"",[149,205,206,207,209,210,213,214,217],{},"The filename (without ",[179,208,192],{},") is the persona's name, so ",[179,211,212],{},"ops.md"," is the ",[179,215,216],{},"ops"," persona. Pretty simple, right?",[149,219,220,221,227,228,231],{},"One name is special: ",[156,222,223,226],{},[179,224,225],{},"default.md"," is picked up automatically",". Drop it in and it applies to every thread, with nothing to configure. ",[179,229,230],{},"vendor:publish --tag=laraclaw"," writes a starter copy, so you may already have one.",[233,234,235],"blockquote",{},[149,236,237,241],{},[238,239,240],"span",{},"!TIP","\nAfter adding or editing a persona, restart the queue worker so it picks up the change. Long-lived processes cache the resolved persona path at boot. The terminal connector boots fresh every time, so it sees edits immediately.",[145,243,245],{"id":244},"setting-a-default-persona","Setting a Default Persona",[149,247,248,249,252],{},"Want every new thread to start with a specific persona? Set it in your ",[179,250,251],{},".env",":",[195,254,258],{"className":255,"code":256,"language":257,"meta":203,"style":203},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LARACLAW_PERSONAS_DEFAULT=ops\n","env",[179,259,260],{"__ignoreMap":203},[238,261,264],{"class":262,"line":263},"line",1,[238,265,256],{},[149,267,268,269,271,272,274],{},"The value is the filename without the ",[179,270,192],{}," extension, and it wins over ",[179,273,225],{},".",[149,276,277],{},"So the resolution order for a thread with no persona of its own is:",[279,280,281,288,293],"ol",{},[282,283,284,287],"li",{},[179,285,286],{},"LARACLAW_PERSONAS_DEFAULT",", if set and the file exists",[282,289,290,292],{},[179,291,225],{},", if it exists",[282,294,295],{},"no persona at all, just the base prompt",[233,297,298],{},[149,299,300,303,304,307,308,310,311,313],{},[238,301,302],{},"!NOTE","\nAn empty ",[179,305,306],{},"LARACLAW_PERSONAS_DEFAULT="," counts as unset, so it falls through to ",[179,309,225],{}," rather than disabling personas. To run with no persona, delete ",[179,312,225],{}," instead.",[145,315,317],{"id":316},"switching-personas-at-runtime","Switching Personas at Runtime",[149,319,320,321,324,325,328,329,332],{},"Each ",[179,322,323],{},"Thread"," has its own persona, stored in the ",[179,326,327],{},"persona"," column of ",[179,330,331],{},"laraclaw_threads",". The active persona is whatever the thread says it is — independent per Telegram chat, per Slack channel, per email thread.",[149,334,335,336,339,340,343],{},"The agent switches personas by calling the built-in ",[179,337,338],{},"Persona"," tool. So a user can just ",[164,341,342],{},"ask"," in chat:",[233,345,346],{},[149,347,348],{},"\"Switch to the ops persona.\"",[149,350,351,352,354,355,358],{},"The agent calls the ",[179,353,338],{}," tool's ",[179,356,357],{},"switch"," operation, the thread is updated, and the new persona takes effect on the next message. No restart, no config edit.",[149,360,361],{},"The same tool supports two more operations:",[363,364,365,373],"ul",{},[282,366,367,372],{},[156,368,369],{},[179,370,371],{},"list"," — see what personas are available. Great for \"remind me what personas I have.\"",[282,374,375,380,381,383],{},[156,376,377],{},[179,378,379],{},"clear"," — drop the override and revert to ",[179,382,286],{}," (or no persona, if there's no default).",[145,385,387],{"id":386},"writing-a-persona","Writing a Persona",[149,389,390],{},"A persona file is just instructions. Keep them tight — the agent already has a base prompt, so you only need to override the parts that matter.",[149,392,393],{},"Here's an example for a Laravel-flavored coding assistant:",[195,395,399],{"className":396,"code":397,"language":398,"meta":203,"style":203},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","You are a senior Laravel developer who answers questions with code first and\nexplanation second. When you write code, you follow these conventions:\n\n- Use single quotes for strings unless interpolation is required.\n- Prefer collection methods over array_* functions.\n- Use match instead of switch.\n- Write methods with explicit return types, including : void.\n\nWhen asked a conceptual question with no code in the answer, keep your reply\nto three sentences or fewer.\n","markdown",[179,400,401,406,412,419,425,431,437,443,448,454],{"__ignoreMap":203},[238,402,403],{"class":262,"line":263},[238,404,405],{},"You are a senior Laravel developer who answers questions with code first and\n",[238,407,409],{"class":262,"line":408},2,[238,410,411],{},"explanation second. When you write code, you follow these conventions:\n",[238,413,415],{"class":262,"line":414},3,[238,416,418],{"emptyLinePlaceholder":417},true,"\n",[238,420,422],{"class":262,"line":421},4,[238,423,424],{},"- Use single quotes for strings unless interpolation is required.\n",[238,426,428],{"class":262,"line":427},5,[238,429,430],{},"- Prefer collection methods over array_* functions.\n",[238,432,434],{"class":262,"line":433},6,[238,435,436],{},"- Use match instead of switch.\n",[238,438,440],{"class":262,"line":439},7,[238,441,442],{},"- Write methods with explicit return types, including : void.\n",[238,444,446],{"class":262,"line":445},8,[238,447,418],{"emptyLinePlaceholder":417},[238,449,451],{"class":262,"line":450},9,[238,452,453],{},"When asked a conceptual question with no code in the answer, keep your reply\n",[238,455,457],{"class":262,"line":456},10,[238,458,459],{},"to three sentences or fewer.\n",[149,461,462],{},"The persona content is appended to the base system prompt, so anything in the base prompt still applies — you're shaping the agent, not replacing it.",[464,465,467],"h3",{"id":466},"addressing-people-by-name","Addressing People by Name",[149,469,470],{},"The agent is told who sent the message, so a persona can use the sender's name directly:",[195,472,474],{"className":396,"code":473,"language":398,"meta":203,"style":203},"Address the user by their first name once per reply, no more.\n",[179,475,476],{"__ignoreMap":203},[238,477,478],{"class":262,"line":263},[238,479,473],{},[149,481,482],{},"The name is read off the inbound message rather than off the thread's owner, which matters in a group chat: a Telegram group resolves to your configured owner user, but each message still carries the name of whoever actually typed it. In a group the agent is also told that other people may be present, so it does not assume every message comes from the same person.",[233,484,485],{},[149,486,487,490],{},[238,488,489],{},"!WARNING","\nThat name comes from a profile the sender controls, so treat it as a label rather than proof of identity. Laraclaw flattens it to a single short line before it reaches the prompt, and it grants no permissions on its own. Do not write a persona that hands out anything sensitive based on a name alone.",[149,492,493],{},"A few tips for writing good personas:",[363,495,496,502,508,521],{},[282,497,498,501],{},[156,499,500],{},"Be specific about format."," \"Reply in bullet points\" gets more reliable behavior than \"be concise.\"",[282,503,504,507],{},[156,505,506],{},"Lean on examples."," \"Sign off with 'Cheers, your assistant.'\" beats \"be friendly at the end.\"",[282,509,510,513,514,517,518,274],{},[156,511,512],{},"Don't redefine tools."," The base prompt already explains what the agent can do — don't duplicate that. Personas shape ",[164,515,516],{},"how",", not ",[164,519,520],{},"what",[282,522,523,526],{},[156,524,525],{},"Keep it short."," A persona that's a wall of text becomes a wall of context every turn. 10–30 lines is a healthy zone.",[145,528,530],{"id":529},"clearing-a-persona","Clearing a Persona",[149,532,533,534,354,536,538,539,541,542,545,546,548],{},"To revert a thread to the default, ask the agent to clear the persona, or call the ",[179,535,338],{},[179,537,379],{}," operation directly. The ",[179,540,327],{}," column is set back to ",[179,543,544],{},"null"," and the next message uses whatever ",[179,547,286],{}," resolves to.",[145,550,552],{"id":551},"whats-next","What's Next",[363,554,555,567],{},[282,556,557,563,564,274],{},[156,558,559,560],{},"Want the agent to ",[164,561,562],{},"follow procedures"," rather than just shift tone? You're looking for ",[565,566,122],"a",{"href":129},[282,568,569,572,573,576,577,579],{},[156,570,571],{},"Want to change the base prompt that personas overlay?"," Edit ",[179,574,575],{},"laraclaw\u002Finstructions.md"," (published by ",[179,578,230],{},").",[149,581,582],{},"Until next time!",[584,585,586],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":203,"searchDepth":408,"depth":408,"links":588},[589,590,591,592,593,596,597],{"id":147,"depth":408,"text":5},{"id":173,"depth":408,"text":174},{"id":244,"depth":408,"text":245},{"id":316,"depth":408,"text":317},{"id":386,"depth":408,"text":387,"children":594},[595],{"id":466,"depth":414,"text":467},{"id":529,"depth":408,"text":530},{"id":551,"depth":408,"text":552},"Override the agent's tone, focus, and conventions with a Markdown file.","md",null,{},{"title":136,"description":598},"oM_kdBmSwyoB0vBBQaNXYn2JtJTPiXYhR-b_arKx4YQ",[605,600],{"title":132,"path":133,"stem":134,"description":606,"children":-1},"Create your own skills by dropping Markdown files into the skills directory.",1786661906119]