[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Frestate-primer":169,"\u002Fconcepts\u002Frestate-primer-surround":337},[4,28,85,127,157],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":23,"path":24,"stem":25,"icon":26},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":84},"Concepts","i-lucide-lightbulb","\u002Fconcepts","2.concepts",[34,39,44,49,54,59,64,69,74,79],{"title":35,"path":36,"stem":37,"icon":38},"Durable agents","\u002Fconcepts\u002Fdurable-agents","2.concepts\u002F1.durable-agents","i-lucide-infinity",{"title":40,"path":41,"stem":42,"icon":43},"Glossary","\u002Fconcepts\u002Fglossary","2.concepts\u002F10.glossary","i-lucide-book-a",{"title":45,"path":46,"stem":47,"icon":48},"Restate in five minutes","\u002Fconcepts\u002Frestate-primer","2.concepts\u002F2.restate-primer","i-lucide-cpu",{"title":50,"path":51,"stem":52,"icon":53},"Entities & addressing","\u002Fconcepts\u002Fentities-addressing","2.concepts\u002F3.entities-addressing","i-lucide-at-sign",{"title":55,"path":56,"stem":57,"icon":58},"Timelines & events","\u002Fconcepts\u002Ftimelines-events","2.concepts\u002F4.timelines-events","i-lucide-list-ordered",{"title":60,"path":61,"stem":62,"icon":63},"Projections & the catalog","\u002Fconcepts\u002Fprojections-catalog","2.concepts\u002F5.projections-catalog","i-lucide-database",{"title":65,"path":66,"stem":67,"icon":68},"Workspaces & execution","\u002Fconcepts\u002Fworkspaces","2.concepts\u002F6.workspaces","i-lucide-terminal",{"title":70,"path":71,"stem":72,"icon":73},"Harnesses","\u002Fconcepts\u002Fharnesses","2.concepts\u002F7.harnesses","i-lucide-plug",{"title":75,"path":76,"stem":77,"icon":78},"Multi-agent patterns","\u002Fconcepts\u002Fmulti-agent","2.concepts\u002F8.multi-agent","i-lucide-network",{"title":80,"path":81,"stem":82,"icon":83},"Lifecycle & control","\u002Fconcepts\u002Flifecycle","2.concepts\u002F9.lifecycle","i-lucide-sliders-horizontal",false,{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":84},"Guides","i-lucide-book-open","\u002Fguides","3.guides",[91,106],{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":84},"Agents","i-lucide-bot","\u002Fguides\u002Fagents","3.guides\u002F1.agents",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Building agents","\u002Fguides\u002Fagents\u002Fbuilding-agents","3.guides\u002F1.agents\u002F1.building-agents",{"title":102,"path":103,"stem":104,"icon":105},"Frontend integration","\u002Fguides\u002Fagents\u002Ffrontend-integration","3.guides\u002F1.agents\u002F2.frontend-integration","i-lucide-monitor",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":84},"Operations","i-lucide-server-cog","\u002Fguides\u002Foperations","3.guides\u002F2.operations",[112,117,122],{"title":113,"path":114,"stem":115,"icon":116},"Self-hosting","\u002Fguides\u002Foperations\u002Fself-hosting","3.guides\u002F2.operations\u002F1.self-hosting","i-lucide-server",{"title":118,"path":119,"stem":120,"icon":121},"Auth & API keys","\u002Fguides\u002Foperations\u002Fauth-api-keys","3.guides\u002F2.operations\u002F2.auth-api-keys","i-lucide-key-round",{"title":123,"path":124,"stem":125,"icon":126},"Backup & restore","\u002Fguides\u002Foperations\u002Fbackup-restore","3.guides\u002F2.operations\u002F3.backup-restore","i-lucide-database-backup",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":84},"Reference","i-lucide-book-marked","\u002Freference","4.reference",[133,138,143,148,153],{"title":134,"path":135,"stem":136,"icon":137},"Event schema","\u002Freference\u002Fevents","4.reference\u002F1.events","i-lucide-list-tree",{"title":139,"path":140,"stem":141,"icon":142},"Addressing","\u002Freference\u002Faddressing","4.reference\u002F2.addressing","i-lucide-map-pin",{"title":144,"path":145,"stem":146,"icon":147},"Gateway HTTP API","\u002Freference\u002Fgateway-api","4.reference\u002F3.gateway-api","i-lucide-webhook",{"title":149,"path":150,"stem":151,"icon":152},"CLI","\u002Freference\u002Fcli","4.reference\u002F4.cli","i-lucide-square-terminal",{"title":154,"path":155,"stem":156,"icon":83},"Configuration","\u002Freference\u002Fconfiguration","4.reference\u002F5.configuration",{"title":158,"path":159,"stem":160,"children":161,"icon":163},"Contributing","\u002Fcontributing","5.contributing\u002F1.index",[162,164],{"title":158,"path":159,"stem":160,"icon":163},"i-lucide-git-pull-request",{"title":165,"path":166,"stem":167,"icon":168},"The package map","\u002Fcontributing\u002Fpackage-map","5.contributing\u002F2.package-map","i-lucide-boxes",{"id":170,"title":45,"body":171,"description":330,"extension":331,"links":332,"meta":333,"navigation":334,"path":46,"seo":335,"stem":47,"__hash__":336},"docs\u002F2.concepts\u002F2.restate-primer.md",{"type":172,"value":173,"toc":320},"minimark",[174,178,183,191,204,208,216,228,236,240,246,257,261,264,296,310,314],[175,176,177],"p",{},"teaspill's coordination runs on Restate, an open-source durable-execution engine. You never talk to Restate directly — the gateway and the SDKs do — but five minutes of its vocabulary makes the rest of these docs click.",[179,180,182],"h2",{"id":181},"what-restate-is","What Restate is",[175,184,185,186,190],{},"Restate is an engine for running code durably. It records what your code does as it does it, and when a process dies, it resumes the interrupted work from the last completed step — the ",[187,188,189],"a",{"href":36},"durable execution"," you met on the previous page. teaspill runs Restate as one of the services in its self-hosted stack; your agent code registers with it and gets durability without writing any recovery logic.",[192,193,194],"note",{},[175,195,196,197,203],{},"Restate has its own excellent documentation at ",[187,198,202],{"href":199,"rel":200},"https:\u002F\u002Frestate.dev",[201],"nofollow","restate.dev"," — none of it is required reading for teaspill, but it goes as deep as you like.",[179,205,207],{"id":206},"virtual-objects","Virtual objects",[175,209,210,211,215],{},"A ",[212,213,214],"strong",{},"virtual object"," is a named, addressable unit with its own state that handles one invocation at a time. Every teaspill agent is one. \"Single-writer\" means nothing else can mutate its state concurrently — which is what makes its event ordering trustworthy.",[175,217,218,219,223,224,227],{},"Concretely: when three messages arrive for the same ",[220,221,222],"code",{},"researcher"," at once, Restate queues them and the researcher handles them one at a time, in order. There is never a moment where two turns of the same agent run concurrently and disagree about what happened. That guarantee is the foundation under the ",[187,225,226],{"href":56},"timeline",": events can be numbered 0, 1, 2, … with no ambiguity because only one writer ever exists.",[175,229,230,231,235],{},"Virtual objects are also ",[232,233,234],"em",{},"virtual",": an object that isn't handling anything occupies no process, no thread, no connection. A million sleeping agents cost what a million database rows cost.",[179,237,239],{"id":238},"durable-sends","Durable sends",[175,241,210,242,245],{},[212,243,244],{},"durable send"," is a fire-and-forget message that cannot be lost. Restate records it before delivery and keeps trying until the target object processes it — across crashes on either side. When an agent spawns a child or sends a message to another agent, that's a durable send. There is no message broker to deploy and no delivery code to write; it is built into the coordination layer.",[175,247,248,249,252,253,256],{},"This is why the ",[187,250,251],{"href":36},"wake model"," can promise \"the result arrives as a later wake\": the ",[220,254,255],{},"child_finished"," message a child sends its parent is a durable send, so it arrives even if the parent's process was mid-deploy when the child finished.",[179,258,260],{"id":259},"what-teaspill-hides-and-what-shows-through","What teaspill hides — and what shows through",[175,262,263],{},"Using teaspill, you never construct a Restate invocation, read its journal, or manage its state. Two things do show through, usefully:",[265,266,267,282],"ul",{},[268,269,270,273,274,277,278,281],"li",{},[212,271,272],{},"Registration."," Your agent service announces itself through the gateway, and from then on Restate dials your service's URL directly for every invocation. That URL must be reachable ",[232,275,276],{},"from inside the stack"," — the one networking rule that bites everyone. The ",[187,279,280],{"href":114},"Self-hosting guide"," covers it.",[268,283,284,287,288,291,292,295],{},[212,285,286],{},"The ingress URL."," Agent configuration carries the address agents use to reach each other — the ",[220,289,290],{},"ingressUrl"," field you'll meet in ",[187,293,294],{"href":71},"harness"," configuration. It points at the stack's coordination endpoint.",[297,298,299],"accordion",{},[300,301,304],"accordion-item",{"icon":302,"label":303},"i-lucide-microscope","Under the hood: how teaspill maps onto Restate",[175,305,306,307,309],{},"Each agent type registers as its own Restate virtual-object service, keyed by instance id — so one ",[220,308,222],{}," instance is one object. Spawning is a durable send that creates-or-reaches the object for that key; sending a message is a durable send to an existing one. Workspaces are virtual objects too, keyed by workspace, which is how commands in one workspace stay serialized. The idle-archive timer that eventually puts a quiet agent to sleep is a Restate durable timer — it survives restarts like everything else.",[179,311,313],{"id":312},"next-steps","Next steps",[175,315,316,317,319],{},"Every agent — every virtual object — needs a name. ",[187,318,50],{"href":51}," explains the one URL-shaped id that identifies an agent everywhere.",{"title":321,"searchDepth":322,"depth":323,"links":324},"",1,2,[325,326,327,328,329],{"id":181,"depth":323,"text":182},{"id":206,"depth":323,"text":207},{"id":238,"depth":323,"text":239},{"id":259,"depth":323,"text":260},{"id":312,"depth":323,"text":313},"What Restate is, what a virtual object is, and why teaspill builds on both — for developers who have never used it.","md",null,{},{"icon":48},{"title":45,"description":330},"Sbj7frDFDf4cIgPcfJempiz5QTavd13f8c7y5Wa1ec4",[338,340],{"title":40,"path":41,"stem":42,"description":339,"icon":43,"children":-1},"Every teaspill term in one place, alphabetically, with a link to the page that teaches it.",{"title":50,"path":51,"stem":52,"description":341,"icon":53,"children":-1},"Every running agent is an entity with one URL-shaped id, and that single string identifies it everywhere.",1784473422235]