[{"data":1,"prerenderedAt":487},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Farchitecture":169,"\u002Fgetting-started\u002Farchitecture-surround":482},[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":23,"body":171,"description":475,"extension":476,"links":477,"meta":478,"navigation":479,"path":24,"seo":480,"stem":25,"__hash__":481},"docs\u002F1.getting-started\u002F4.architecture.md",{"type":172,"value":173,"toc":466},"minimark",[174,197,202,213,224,228,231,302,308,312,318,345,352,356,359,365,371,382,392,398,422,431,435],[175,176,177,178,182,183,186,187,191,192,196],"p",{},"teaspill is a small number of parts with sharply drawn jobs: a ",[179,180,181],"strong",{},"gateway"," in front, ",[179,184,185],{},"Restate"," coordinating every agent in the middle, two service planes you deploy — one running your agents, one running their ",[188,189,190],"a",{"href":66},"workspaces"," — and read-side stores that everything flows ",[193,194,195],"em",{},"out"," to, never back from. This page is the map; each stop links to the Concepts page that teaches it properly.",[198,199,201],"h2",{"id":200},"the-map","The map",[203,204,209],"pre",{"className":205,"code":207,"language":208},[206],"language-text","          your backend · your UI · the teaspill CLI\n                            │\n                            │  HTTP — API key, or read token (reads only)\n                            ▼\n                     ┌─────────────┐\n                     │   gateway   │  the single front door\n                     └──┬───────┬──┘\n       commands &       │       │      reads\n       registration     │       │      (timelines, live queries)\n                        ▼       └────────────────────────────────┐\n                 ┌─────────────┐                                 │\n                 │   Restate   │  coordination:                  │\n                 │             │  runs every agent durably       │\n                 └──────┬──────┘                                 │\n                        │  dials your registered                 │\n                        │  services directly                     │\n            ┌───────────┴───────────┐                            │\n            ▼                       ▼                            │\n   ┌─────────────────┐     ┌─────────────────┐                   │\n   │ agent-loop plane│     │  executor plane │                   │\n   │   your agents   │     │    workspaces   │                   │\n   └────────┬────────┘     └────────┬────────┘                   │\n            │                       │                            │\n            │    projections — one way                           │\n            ▼                       ▼                            │\n   ┌─────────────────┐   ┌──────────────────────────────┐        │\n   │ durable streams │   │ Postgres catalog ──► Electric │       │\n   │    (history)    │   │  (registry + archive)  (sync) │       │\n   └────────┬────────┘   └───────────────┬──────────────┘        │\n            │                            │                       │\n            └──────── reads answered by the gateway ─────────────┘\n","text",[210,211,207],"code",{"__ignoreMap":212},"",[175,214,215,216,219,220,223],{},"Follow a command through it. Your backend ",[210,217,218],{},"POST","s a spawn to the gateway; the gateway hands it to Restate; Restate dials your agent-loop service and runs the new agent's first ",[188,221,222],{"href":36},"wake"," as a durable invocation. Everything the agent does is projected outward — events to the history store, its row to the catalog. Reads take the other path: your UI reads timelines and live queries back through the gateway straight from those stores, never through Restate. At no point does anything read those stores to decide what an agent does next.",[198,225,227],{"id":226},"one-owner-per-concern","One owner per concern",[175,229,230],{},"Three stores, three jobs — and no piece of data with two homes:",[232,233,234,250],"table",{},[235,236,237],"thead",{},[238,239,240,244,247],"tr",{},[241,242,243],"th",{},"Store",[241,245,246],{},"Owns",[241,248,249],{},"Why it's the owner",[251,252,253,266,282],"tbody",{},[238,254,255,260,263],{},[256,257,258],"td",{},[179,259,185],{},[256,261,262],{},"Working state and control flow — each agent's durable memory and what happens next",[256,264,265],{},"It runs the agents. State lives with the one writer that changes it, so there's no copy to drift out of sync.",[238,267,268,273,279],{},[256,269,270],{},[179,271,272],{},"Durable streams server",[256,274,275,276],{},"History — every entity's ",[188,277,278],{"href":56},"timeline",[256,280,281],{},"Append-only and resumable over plain HTTP: cheap for any number of readers, harmless to replay, safe to cache.",[238,283,284,289,292],{},[256,285,286],{},[179,287,288],{},"Postgres catalog",[256,290,291],{},"The registry and archive — every entity's type, status, parent, and archived snapshot",[256,293,294,295,301],{},"It's the queryable index. ",[188,296,300],{"href":297,"rel":298},"https:\u002F\u002Felectric-sql.com",[299],"nofollow","Electric"," syncs it into browsers as live-updating queries.",[175,303,304,305,307],{},"The rule this table encodes: when you wonder \"where does X live?\", there is exactly one answer, and the other stores hold at most a projection of it. ",[188,306,60],{"href":61}," teaches the read side in full.",[198,309,311],{"id":310},"the-two-planes-you-deploy","The two planes you deploy",[175,313,314,315,317],{},"The compose stack from ",[188,316,13],{"href":14}," is infrastructure — you configure it, but you don't write code in it. Your code lives in two independently deployed, independently scaled planes:",[319,320,321,336],"ul",{},[322,323,324,327,328,331,332,335],"li",{},[179,325,326],{},"The agent-loop plane"," hosts your ",[210,329,330],{},"defineAgent"," definitions behind ",[210,333,334],{},"serve()",". It scales with how many agents run model loops concurrently. Replicas are interchangeable — an agent's state lives in Restate, not in the process.",[322,337,338,341,342,344],{},[179,339,340],{},"The executor plane"," hosts workspaces — the sandboxed environments where agents run commands and edit files. It scales with workspace demand: heavy shell work doesn't compete with model loops for the same machines. ",[188,343,65],{"href":66}," covers it.",[175,346,347,348,351],{},"Both register themselves with Restate through the gateway, and Restate dials them directly from then on. A deployment can be a compose service, a host process, or a fleet — the ",[188,349,350],{"href":114},"Self-hosting guide"," walks through each shape.",[198,353,355],{"id":354},"design-principles","Design principles",[175,357,358],{},"Five stances shape everything above. Knowing them makes the rest of the docs predictable.",[175,360,361,364],{},[179,362,363],{},"Projections flow one way."," Everything you can read — timelines, catalog rows — is written outward from agent handlers, exactly once. Nothing is ever synced back in. One-way flow means there are no replication loops to keep consistent, and a slow or broken reader can never affect a running agent.",[175,366,367,370],{},[179,368,369],{},"History is never control flow."," Roughly: the timeline is for you and your UI; the platform writes it and never reads it to decide anything. The agent's own durable state is the single source of truth for behavior.",[372,373,374],"accordion",{},[375,376,379],"accordion-item",{"icon":377,"label":378},"i-lucide-microscope","What the one-way rule quietly rules out",[175,380,381],{},"The tempting alternative is to make the event stream the source of truth: rebuild agent state by replaying history, and sync stores into each other so each surface has the data it wants. Every one of those edges — stream to state, store to store, cache to store — is its own consistency problem, and each pair of stores that can disagree needs code to decide who wins. teaspill's answer is structural: state has one writer (the agent object), history and the catalog are write-only copies of what it did, and disagreement is impossible by construction rather than reconciled after the fact.",[175,383,384,387,388,391],{},[179,385,386],{},"Writes never bypass your backend."," teaspill has no platform-level permissions model, on purpose. The gateway authenticates callers (API keys; read tokens can only read), and ",[193,389,390],{},"your"," code decides who may spawn, send, or control what. There is no second authorization system to configure, audit, or contradict yours.",[175,393,394,397],{},[179,395,396],{},"One deployment is one tenant."," You isolate customers by running separate stacks, not by trusting tenancy configuration inside a shared one. Small blast radius, no cross-tenant bug class.",[175,399,400,403,404,407,408,407,411,414,415,418,419,421],{},[179,401,402],{},"Control is four verbs, not process signals."," Outside intervention is ",[210,405,406],{},"interrupt",", ",[210,409,410],{},"pause",[210,412,413],{},"resume",", or ",[210,416,417],{},"archive"," — agents aren't OS processes, and anything richer you want to say to one is an ordinary typed message. ",[188,420,80],{"href":81}," covers all four, plus how archived agents come back.",[372,423,424],{},[375,425,428],{"icon":426,"label":427},"i-lucide-history","Why there's no built-in permissions model",[175,429,430],{},"A platform-level permissions system would sit between your backend and your agents, and it would always be either too coarse to express your rules or complex enough to become its own product. Since every write already passes through your backend (browsers hold reads-only tokens at most), your existing authorization layer is the permissions model — with your session handling, your roles, and your audit trail. The cost is honest: teaspill will never enforce a rule you didn't write.",[198,432,434],{"id":433},"where-to-go-deeper","Where to go deeper",[175,436,437,438,407,441,407,443,407,446,407,449,407,452,407,455,407,458,461,462,465],{},"The Concepts section teaches this picture one idea at a time, in reading order: ",[188,439,440],{"href":36},"durable agents & the wake model",[188,442,45],{"href":46},[188,444,445],{"href":51},"entities & addressing",[188,447,448],{"href":56},"timelines & events",[188,450,451],{"href":61},"projections & the catalog",[188,453,454],{"href":66},"workspaces & execution",[188,456,457],{"href":71},"harnesses",[188,459,460],{"href":76},"multi-agent patterns",", and ",[188,463,464],{"href":81},"lifecycle & control",". If you only read one, read the first — the wake model is the idea the rest lean on.",{"title":212,"searchDepth":467,"depth":468,"links":469},1,2,[470,471,472,473,474],{"id":200,"depth":468,"text":201},{"id":226,"depth":468,"text":227},{"id":310,"depth":468,"text":311},{"id":354,"depth":468,"text":355},{"id":433,"depth":468,"text":434},"The gateway, the coordination core, the two planes you deploy, and the one-way flow that keeps every store honest.","md",null,{},{"icon":26},{"title":23,"description":475},"88WAJpeCxcUYjfVliUXrj0hwnErKtqhX2b9-vSVyHuk",[483,485],{"title":18,"path":19,"stem":20,"description":484,"icon":21,"children":-1},"Define a researcher agent, deploy it against the running stack, talk to it from the CLI, and watch its timeline live — then make it multi-agent.",{"title":35,"path":36,"stem":37,"description":486,"icon":38,"children":-1},"How teaspill agents survive crashes, restarts, and deploys — and the wake model that shapes every turn of their life.",1784473422163]