[{"data":1,"prerenderedAt":690},["ShallowReactive",2],{"integrations-en:/integrations/pi":3},{"id":4,"title":5,"active":6,"body":7,"description":676,"extension":677,"eyebrow":70,"icon":678,"image":679,"meta":680,"name":681,"navTitle":681,"navigation":6,"order":682,"path":683,"seo":684,"slug":685,"status":686,"stem":687,"summary":688,"toc":678,"__hash__":689},"integrations_en/integrations/pi.md","Pi + OpenPets",true,{"type":8,"value":9,"toc":660},"minimark",[10,121,175,273,482,561,589,643],[11,12,16,17,16,22,16,31,16,118],"section",{"id":13,"className":14},"overview",[15],"docs-section","\n  ",[18,19,21],"h2",{"id":20},"what-this-integration-does","What this integration does",[23,24,25,26,30],"p",{},"\n    The Pi integration is an extension package, not an MCP setup. It loads\n    inside Pi, listens to Pi session and tool events directly, and forwards a\n    small set of safe reactions to your running OpenPets desktop app through\n    ",[27,28,29],"code",{},"@open-pets/client",".\n  ",[32,33,36,37,16],"div",{"className":34},[35],"docs-table-wrap","\n    ",[38,39,40,41,40,58,36],"table",{},"\n      ",[42,43,44,45,40],"thead",{},"\n        ",[46,47,48,52,55],"tr",{},[49,50,51],"th",{},"Part",[49,53,54],{},"What it does",[49,56,57],{},"Why it matters",[59,60,44,61,44,77,44,90,40],"tbody",{},[46,62,63,64,63,71,63,74,44],{},"\n          ",[65,66,67],"td",{},[68,69,70],"strong",{},"Pi extension",[65,72,73],{},"Subscribes to Pi session, agent, and tool events.",[65,75,76],{},"The pet can react automatically while Pi thinks, edits, runs commands, succeeds, or errors.",[46,78,63,79,63,84,63,87,44],{},[65,80,81],{},[68,82,83],{},"OpenPets IPC client",[65,85,86],{},"Sends reactions and short status messages over local IPC.",[65,88,89],{},"Runtime is local. Pi never depends on a remote service to control the pet.",[46,91,63,92,63,97,63,115,44],{},[65,93,94],{},[68,95,96],{},"/openpets commands",[65,98,99,100,103,104,103,107,110,111,114],{},"Adds ",[27,101,102],{},"status",", ",[27,105,106],{},"test",[27,108,109],{},"react",", and ",[27,112,113],{},"say"," subcommands.",[65,116,117],{},"Users can verify the connection and trigger manual reactions from inside Pi.",[23,119,120],{},"\n    Runtime control is best-effort. Pi keeps working if the OpenPets desktop app\n    is closed; the extension quietly skips pet updates until the desktop app is\n    reachable again.\n  ",[11,122,16,125,16,128,16,131,16,152,16,168],{"id":123,"className":124},"install",[15],[18,126,127],{"id":123},"Install",[23,129,130],{},"\n    Keep the OpenPets desktop app running, then install the Pi extension package\n    with Pi. Use global setup for your machine, or project-local setup for a\n    single repository.\n  ",[32,132,36,135,36,146,16],{"className":133},[134],"docs-code",[32,136,139,143],{"className":137},[138],"docs-code-bar",[140,141,142],"span",{},"Global setup",[140,144,145],{},"bash",[147,148,149],"pre",{},[27,150,151],{},"pi install npm:@open-pets/pi",[32,153,36,155,36,163,16],{"className":154},[134],[32,156,158,161],{"className":157},[138],[140,159,160],{},"Project-local setup",[140,162,145],{},[147,164,165],{},[27,166,167],{},"pi install -l npm:@open-pets/pi",[23,169,170,171,174],{},"\n    Global setup writes to Pi's global package settings. Project-local setup\n    writes to ",[27,172,173],{},".pi/settings.json",", which is better when a repository\n    should explicitly carry its OpenPets behavior. Reload or restart Pi after\n    changing package settings so the new extension is loaded.\n  ",[11,176,16,179,16,183,16,186,16,267],{"id":177,"className":178},"commands",[15],[18,180,182],{"id":181},"slash-commands","Slash commands",[23,184,185],{},"\n    The extension registers one user-facing command namespace so you can test\n    and steer the integration without adding extra Pi tools. None of these\n    commands forward prompts or tool output.\n  ",[32,187,36,189,16],{"className":188},[35],[38,190,40,191,40,201,36],{},[42,192,193],{},[46,194,195,198],{},[49,196,197],{},"Command",[49,199,200],{},"Purpose",[59,202,44,203,44,213,44,223,44,247,44,257,40],{},[46,204,205,210],{},[65,206,207],{},[27,208,209],{},"/openpets status",[65,211,212],{},"Check whether the OpenPets desktop app is reachable and which pet is targeted.",[46,214,215,220],{},[65,216,217],{},[27,218,219],{},"/openpets test",[65,221,222],{},"Send a short test reaction and waving message.",[46,224,225,230],{},[65,226,227],{},[27,228,229],{},"/openpets react \u003Creaction>",[65,231,232,233,103,236,103,239,242,243,246],{},"Manually set a safe reaction such as ",[27,234,235],{},"thinking",[27,237,238],{},"testing",[27,240,241],{},"success",", or ",[27,244,245],{},"error",".",[46,248,249,254],{},[65,250,251],{},[27,252,253],{},"/openpets say \u003Cmessage>",[65,255,256],{},"Show one short validated speech bubble.",[46,258,259,264],{},[65,260,261],{},[27,262,263],{},"/openpets help",[65,265,266],{},"Print the available subcommands inside Pi.",[23,268,269,270,272],{},"\n    Manual ",[27,271,113],{}," input goes through the same OpenPets validator the\n    desktop app uses: brief, single-line, user-facing, and never code, logs,\n    paths, URLs, prompts, or secrets.\n  ",[11,274,16,277,16,281,16,284,16,475],{"id":275,"className":276},"event-reactions",[15],[18,278,280],{"id":279},"automatic-event-reactions","Automatic event reactions",[23,282,283],{},"\n    The extension maps Pi lifecycle events to pet reactions without asking the\n    model to call a tool. Most events are silent reaction-only updates; only\n    errors may speak, and only with a fixed safe message.\n  ",[32,285,36,287,16],{"className":286},[35],[38,288,40,289,40,305,36],{},[42,290,44,291,40],{},[46,292,293,296,299,302],{},[49,294,295],{},"Pi event",[49,297,298],{},"Condition",[49,300,301],{},"Reaction",[49,303,304],{},"Speech",[59,306,44,307,44,325,44,342,44,359,44,376,44,391,44,407,44,422,44,442,44,458,40],{},[46,308,309,314,317,322],{},[65,310,311],{},[27,312,313],{},"session_start",[65,315,316],{},"Pi starts, resumes, or reloads.",[65,318,319],{},[27,320,321],{},"waving",[65,323,324],{},"None by default.",[46,326,327,332,335,339],{},[65,328,329],{},[27,330,331],{},"agent_start",[65,333,334],{},"Agent loop begins.",[65,336,337],{},[27,338,235],{},[65,340,341],{},"None.",[46,343,344,349,352,357],{},[65,345,346],{},[27,347,348],{},"turn_start",[65,350,351],{},"New turn begins.",[65,353,354],{},[27,355,356],{},"working",[65,358,341],{},[46,360,361,366,369,374],{},[65,362,363],{},[27,364,365],{},"tool_execution_start",[65,367,368],{},"Tool looks like edit/write/patch/apply.",[65,370,371],{},[27,372,373],{},"editing",[65,375,341],{},[46,377,378,382,385,389],{},[65,379,380],{},[27,381,365],{},[65,383,384],{},"Tool or shell command looks test-like.",[65,386,387],{},[27,388,238],{},[65,390,341],{},[46,392,393,397,400,405],{},[65,394,395],{},[27,396,365],{},[65,398,399],{},"Shell/bash command, non-test.",[65,401,402],{},[27,403,404],{},"running",[65,406,341],{},[46,408,409,413,416,420],{},[65,410,411],{},[27,412,365],{},[65,414,415],{},"Other tool.",[65,417,418],{},[27,419,356],{},[65,421,341],{},[46,423,424,429,435,439],{},[65,425,426],{},[27,427,428],{},"tool_execution_end",[65,430,431,434],{},[27,432,433],{},"isError"," is true.",[65,436,437],{},[27,438,245],{},[65,440,441],{},"Short fixed error-pool message, throttled.",[46,443,444,449,452,456],{},[65,445,446],{},[27,447,448],{},"agent_end",[65,450,451],{},"Agent loop finishes without a recent tool error.",[65,453,454],{},[27,455,241],{},[65,457,341],{},[46,459,460,465,468,473],{},[65,461,462],{},[27,463,464],{},"session_shutdown",[65,466,467],{},"Pi quits, reloads, switches, or forks.",[65,469,470],{},[27,471,472],{},"idle",[65,474,341],{},[23,476,477,478,481],{},"\n    The extension may inspect bounded tool-name and command slices only to\n    classify reactions. It does not speak raw commands, output, prompts, or file\n    paths. ",[27,479,480],{},"OpenPets","-related commands are filtered out so the pet\n    cannot self-trigger.\n  ",[11,483,16,486,16,490,16,493],{"id":484,"className":485},"safety",[15],[18,487,489],{"id":488},"safety-and-behavior","Safety and behavior",[23,491,492],{},"\n    The Pi extension follows the same safety model as Claude Code, OpenCode,\n    and the MCP server. It is designed for ambient visible status only.\n  ",[32,494,36,496,16],{"className":495},[35],[38,497,40,498,40,508,36],{},[42,499,500],{},[46,501,502,505],{},[49,503,504],{},"Protection",[49,506,507],{},"Behavior",[59,509,44,510,44,518,44,529,44,537,44,545,44,553,40],{},[46,511,512,515],{},[65,513,514],{},"No transcript forwarding",[65,516,517],{},"Automatic events never send prompts, assistant text, tool input, tool output, file contents, URLs, paths, or secrets.",[46,519,520,523],{},[65,521,522],{},"Validated manual speech",[65,524,525,528],{},[27,526,527],{},"/openpets say"," rejects multi-line, long, code-like, URL/path-like, or secret-looking text.",[46,530,531,534],{},[65,532,533],{},"Best-effort runtime",[65,535,536],{},"OpenPets failures never block Pi model calls or tool execution.",[46,538,539,542],{},[65,540,541],{},"No Pi tools in MVP",[65,543,544],{},"The extension registers a user slash command only. It does not expose model-callable Pi tools.",[46,546,547,550],{},[65,548,549],{},"Trusted package boundary",[65,551,552],{},"Pi extensions run with local system permissions, so install only packages you trust.",[46,554,555,558],{},[65,556,557],{},"Self-trigger guard",[65,559,560],{},"Tool calls related to OpenPets are ignored by the event mapper.",[11,562,16,565,16,569,16,572],{"id":563,"className":564},"pet-targeting",[15],[18,566,568],{"id":567},"pet-routing","Pet routing",[23,570,571],{},"\n    By default, automatic reactions and manual commands target the desktop\n    default pet. Explicit per-extension pet routing is deferred until a later\n    Pi subphase so the runtime contract stays simple.\n  ",[32,573,36,575,36,584,16],{"className":574},[134],[32,576,578,581],{"className":577},[138],[140,579,580],{},"Runtime path",[140,582,583],{},"text",[147,585,586],{},[27,587,588],{},"Pi\n  -> @open-pets/pi extension\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet",[11,590,16,593,16,596,16,601,16,620,16,624,16,640],{"id":591,"className":592},"troubleshooting",[15],[18,594,595],{"id":591},"Troubleshooting",[597,598,600],"h3",{"id":599},"the-pet-does-not-react","The pet does not react",[602,603,36,604,36,608,36,614,36,617,16],"ul",{},[605,606,607],"li",{},"Confirm the OpenPets desktop app is running.",[605,609,610,611,613],{},"Run ",[27,612,209],{}," inside Pi.",[605,615,616],{},"Reload or restart Pi after installing or removing the package.",[605,618,619],{},"Remember that most automatic events are reaction-only and intentionally silent.",[597,621,623],{"id":622},"remove-the-package","Remove the package",[32,625,36,627,36,635,16],{"className":626},[134],[32,628,630,633],{"className":629},[138],[140,631,632],{},"Remove global install",[140,634,145],{},[147,636,637],{},[27,638,639],{},"pi remove npm:@open-pets/pi",[23,641,642],{},"\n    For project-local installs, run the remove command from the project where\n    you installed the package and follow Pi's project settings behavior.\n  ",[11,644,16,646,16,649],{"id":102,"className":645},[15],[18,647,648],{"id":102},"Status",[23,650,651,652,655,656,659],{},"\n    The ",[27,653,654],{},"@open-pets/pi"," package is published on npm and follows the\n    same safety model as the other OpenPets integrations. The Pi package API\n    surface this version is built against is\n    ",[27,657,658],{},"@earendil-works/pi-coding-agent","; pin or upgrade Pi as part of\n    your normal Pi update flow.\n  ",{"title":661,"searchDepth":662,"depth":662,"links":663},"",2,[664,665,666,667,668,669,670,675],{"id":20,"depth":662,"text":21},{"id":123,"depth":662,"text":127},{"id":181,"depth":662,"text":182},{"id":279,"depth":662,"text":280},{"id":488,"depth":662,"text":489},{"id":567,"depth":662,"text":568},{"id":591,"depth":662,"text":595,"children":671},[672,674],{"id":599,"depth":673,"text":600},3,{"id":622,"depth":673,"text":623},{"id":102,"depth":662,"text":648},"Connect Pi to OpenPets with the @open-pets/pi extension package, automatic safe reactions, manual slash commands, and no prompt or tool-output forwarding.","md",null,"/integrations/pi.svg",{},"Pi",4,"/integrations/pi",{"title":5,"description":676},"pi","Active","integrations/pi","Use the @open-pets/pi extension package to turn Pi coding-agent activity into local desktop pet reactions without forwarding prompts or tool output.","sjg8cCk8693fEBhVQkp080QPOjST2Jhy-Qu4qT90i5c",1779284862364]