[{"data":1,"prerenderedAt":1125},["ShallowReactive",2],{"navigation":3,"\u002Freference\u002Fconfiguration":169,"\u002Freference\u002Fconfiguration-surround":1120},[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":154,"body":171,"description":1113,"extension":1114,"links":1115,"meta":1116,"navigation":1117,"path":155,"seo":1118,"stem":156,"__hash__":1119},"docs\u002F4.reference\u002F5.configuration.md",{"type":172,"value":173,"toc":1101},"minimark",[174,183,188,205,433,443,447,453,716,721,725,730,803,807,810,1038,1043,1046],[175,176,177,178,182],"p",{},"Every knob is an environment variable. Defaults are chosen so an unedited ",[179,180,181],"code",{},".env"," boots a working local stack; the tables below are for anyone who wants non-default ports, credentials, or behavior. Longer stories link to the guide that owns them.",[184,185,187],"h2",{"id":186},"the-compose-stack","The compose stack",[175,189,190,191,193,194,197,198,201,202,204],{},"These live in ",[179,192,181],{}," (copy ",[179,195,196],{},".env.example","). Every one has a working default baked into ",[179,199,200],{},"docker-compose.yml",", so a missing ",[179,203,181],{}," still boots.",[206,207,208,224],"table",{},[209,210,211],"thead",{},[212,213,214,218,221],"tr",{},[215,216,217],"th",{},"Variable",[215,219,220],{},"Default",[215,222,223],{},"Meaning",[225,226,227,243,257,271,286,301,316,331,346,361,380,395,418],"tbody",{},[212,228,229,235,240],{},[230,231,232],"td",{},[179,233,234],{},"POSTGRES_USER",[230,236,237],{},[179,238,239],{},"teaspill",[230,241,242],{},"Postgres role (catalog store; also feeds Electric).",[212,244,245,250,254],{},[230,246,247],{},[179,248,249],{},"POSTGRES_PASSWORD",[230,251,252],{},[179,253,239],{},[230,255,256],{},"Postgres password. Change it before exposing the port.",[212,258,259,264,268],{},[230,260,261],{},[179,262,263],{},"POSTGRES_DB",[230,265,266],{},[179,267,239],{},[230,269,270],{},"Database name.",[212,272,273,278,283],{},[230,274,275],{},[179,276,277],{},"POSTGRES_PORT",[230,279,280],{},[179,281,282],{},"5432",[230,284,285],{},"Host-side published port.",[212,287,288,293,298],{},[230,289,290],{},[179,291,292],{},"RESTATE_INGRESS_PORT",[230,294,295],{},[179,296,297],{},"8080",[230,299,300],{},"Restate ingress (invocations in).",[212,302,303,308,313],{},[230,304,305],{},[179,306,307],{},"RESTATE_ADMIN_PORT",[230,309,310],{},[179,311,312],{},"9070",[230,314,315],{},"Restate admin API (deployment registration).",[212,317,318,323,328],{},[230,319,320],{},[179,321,322],{},"RESTATE_METRICS_PORT",[230,324,325],{},[179,326,327],{},"9071",[230,329,330],{},"Prometheus metrics.",[212,332,333,338,343],{},[230,334,335],{},[179,336,337],{},"RESTATE_NODE_PORT",[230,339,340],{},[179,341,342],{},"5122",[230,344,345],{},"Node-to-node (reserved; unused single-node).",[212,347,348,353,358],{},[230,349,350],{},[179,351,352],{},"ELECTRIC_PORT_HOST",[230,354,355],{},[179,356,357],{},"3000",[230,359,360],{},"Host-side published port for the shape API.",[212,362,363,368,373],{},[230,364,365],{},[179,366,367],{},"ELECTRIC_INSECURE",[230,369,370],{},[179,371,372],{},"true",[230,374,375,376,379],{},"Dev-only. Disables shape-API auth. Set ",[179,377,378],{},"false"," before exposing Electric.",[212,381,382,387,392],{},[230,383,384],{},[179,385,386],{},"DURABLE_STREAMS_PORT",[230,388,389],{},[179,390,391],{},"4437",[230,393,394],{},"Host-side published port for the history store.",[212,396,397,402,407],{},[230,398,399],{},[179,400,401],{},"DURABLE_STREAMS_LOG",[230,403,404],{},[179,405,406],{},"info",[230,408,409,410,413,414,417],{},"History-store log filter (",[179,411,412],{},"error","…",[179,415,416],{},"trace",").",[212,419,420,425,430],{},[230,421,422],{},[179,423,424],{},"GATEWAY_PORT",[230,426,427],{},[179,428,429],{},"8787",[230,431,432],{},"Host-side published port for the gateway.",[434,435,436],"caution",{},[175,437,438,439,442],{},"Published ports are for local debugging. In production the gateway is the only surface you expose; the other services stay on the internal network. See ",[440,441,113],"a",{"href":114},".",[184,444,446],{"id":445},"gateway","Gateway",[175,448,449,450,452],{},"The ",[440,451,445],{"href":145}," reads everything from env. The defaults below are the standalone defaults; the compose stack overrides the upstream URLs to internal service names.",[206,454,455,465],{},[209,456,457],{},[212,458,459,461,463],{},[215,460,217],{},[215,462,220],{},[215,464,223],{},[225,466,467,481,496,514,532,550,568,586,599,611,626,641,653,668,690,704],{},[212,468,469,474,478],{},[230,470,471],{},[179,472,473],{},"PORT",[230,475,476],{},[179,477,429],{},[230,479,480],{},"Listen port.",[212,482,483,488,493],{},[230,484,485],{},[179,486,487],{},"HOST",[230,489,490],{},[179,491,492],{},"0.0.0.0",[230,494,495],{},"Listen host.",[212,497,498,503,508],{},[230,499,500],{},[179,501,502],{},"TEASPILL_TENANT",[230,504,505],{},[179,506,507],{},"default",[230,509,510,511,442],{},"Deployment tenant used to expand ",[179,512,513],{},"\u002Fa\u002F\u003Ctype>\u002F\u003Cid>",[212,515,516,521,526],{},[230,517,518],{},[179,519,520],{},"RESTATE_INGRESS_URL",[230,522,523],{},[179,524,525],{},"http:\u002F\u002Flocalhost:8080",[230,527,528,529,417],{},"Restate ingress (compose: ",[179,530,531],{},"http:\u002F\u002Frestate:8080",[212,533,534,539,544],{},[230,535,536],{},[179,537,538],{},"RESTATE_ADMIN_URL",[230,540,541],{},[179,542,543],{},"http:\u002F\u002Flocalhost:9070",[230,545,546,547,417],{},"Restate admin API (compose: ",[179,548,549],{},"http:\u002F\u002Frestate:9070",[212,551,552,557,562],{},[230,553,554],{},[179,555,556],{},"ELECTRIC_URL",[230,558,559],{},[179,560,561],{},"http:\u002F\u002Flocalhost:3000",[230,563,564,565,417],{},"Electric shape API (compose: ",[179,566,567],{},"http:\u002F\u002Felectric:3000",[212,569,570,575,580],{},[230,571,572],{},[179,573,574],{},"DURABLE_STREAMS_URL",[230,576,577],{},[179,578,579],{},"http:\u002F\u002Flocalhost:4437",[230,581,582,583,417],{},"History store (compose: ",[179,584,585],{},"http:\u002F\u002Fdurable-streams:4437",[212,587,588,593,596],{},[230,589,590],{},[179,591,592],{},"DATABASE_URL",[230,594,595],{},"—",[230,597,598],{},"Postgres for API keys. Optional only if a bootstrap key is set.",[212,600,601,606,608],{},[230,602,603],{},[179,604,605],{},"GATEWAY_BOOTSTRAP_API_KEY",[230,607,595],{},[230,609,610],{},"Dev-only literal key accepted without a database row.",[212,612,613,618,623],{},[230,614,615],{},[179,616,617],{},"GATEWAY_MAX_BODY_BYTES",[230,619,620],{},[179,621,622],{},"1048576",[230,624,625],{},"Body cap (1 MiB) on commands and proxied writes. Oversize → 413.",[212,627,628,633,638],{},[230,629,630],{},[179,631,632],{},"GATEWAY_UPSTREAM_HEADERS_TIMEOUT_MS",[230,634,635],{},[179,636,637],{},"120000",[230,639,640],{},"Upstream first-byte timeout; must exceed the long-poll park.",[212,642,643,648,650],{},[230,644,645],{},[179,646,647],{},"GATEWAY_JWT_SECRET",[230,649,595],{},[230,651,652],{},"HS256 secret enabling the browser read-token path. Unset ⇒ API keys only.",[212,654,655,660,665],{},[230,656,657],{},[179,658,659],{},"GATEWAY_JWT_CLOCK_TOLERANCE_SECONDS",[230,661,662],{},[179,663,664],{},"60",[230,666,667],{},"Clock-skew leeway when verifying a read token's expiry.",[212,669,670,675,680],{},[230,671,672],{},[179,673,674],{},"GATEWAY_CORS_ALLOW_ORIGINS",[230,676,677],{},[179,678,679],{},"*",[230,681,682,683,686,687,442],{},"Allowed origins for GET on ",[179,684,685],{},"\u002Fstreams\u002F*"," and ",[179,688,689],{},"\u002Fshapes\u002F*",[212,691,692,697,701],{},[230,693,694],{},[179,695,696],{},"LOG_LEVEL",[230,698,699],{},[179,700,406],{},[230,702,703],{},"Structured-logging level.",[212,705,706,711,713],{},[230,707,708],{},[179,709,710],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[230,712,595],{},[230,714,715],{},"When set, spans export via OTLP\u002FHTTP; otherwise tracing is a no-op.",[175,717,718,719,442],{},"Auth-related variables are covered in depth in ",[440,720,118],{"href":119},[184,722,724],{"id":723},"cli-and-clients","CLI and clients",[175,726,449,727,729],{},[440,728,149],{"href":150}," and the SDK clients are gateway clients. Their env names are deliberately distinct from the gateway's own server-side variables.",[206,731,732,742],{},[209,733,734],{},[212,735,736,738,740],{},[215,737,217],{},[215,739,220],{},[215,741,223],{},[225,743,744,759,771,784],{},[212,745,746,751,756],{},[230,747,748],{},[179,749,750],{},"TEASPILL_GATEWAY_URL",[230,752,753],{},[179,754,755],{},"http:\u002F\u002Flocalhost:8787",[230,757,758],{},"Gateway base URL.",[212,760,761,766,768],{},[230,762,763],{},[179,764,765],{},"TEASPILL_API_KEY",[230,767,595],{},[230,769,770],{},"Gateway API key.",[212,772,773,777,781],{},[230,774,775],{},[179,776,502],{},[230,778,779],{},[179,780,507],{},[230,782,783],{},"Deployment tenant.",[212,785,786,791,796],{},[230,787,788],{},[179,789,790],{},"TEASPILL_DEPLOYMENT_URL",[230,792,793],{},[179,794,795],{},"http:\u002F\u002Fhost.docker.internal:9080",[230,797,798,799,802],{},"Deployment URL(s) ",[179,800,801],{},"teaspill dev"," registers (comma-separated).",[184,804,806],{"id":805},"agent-loop-and-executor","Agent-loop and executor",[175,808,809],{},"The two developer-deployed services (the reference deployment's agent-loop and executor-host) read these. The defaults shown are the overlay values.",[206,811,812,822],{},[209,813,814],{},[212,815,816,818,820],{},[215,817,217],{},[215,819,220],{},[215,821,223],{},[225,823,824,842,856,870,884,908,919,931,946,961,980,1001,1020],{},[212,825,826,830,839],{},[230,827,828],{},[179,829,473],{},[230,831,832,835,836],{},[179,833,834],{},"9080"," \u002F ",[179,837,838],{},"9081",[230,840,841],{},"Listen port (agent-loop \u002F executor).",[212,843,844,848,853],{},[230,845,846],{},[179,847,750],{},[230,849,850],{},[179,851,852],{},"http:\u002F\u002Fgateway:8787",[230,854,855],{},"Gateway for health-wait and registration.",[212,857,858,863,867],{},[230,859,860],{},[179,861,862],{},"TEASPILL_INGRESS_URL",[230,864,865],{},[179,866,531],{},[230,868,869],{},"Restate ingress for tool and workspace clients.",[212,871,872,877,881],{},[230,873,874],{},[179,875,876],{},"TEASPILL_STREAMS_URL",[230,878,879],{},[179,880,585],{},[230,882,883],{},"History store for event and exec output.",[212,885,886,890,898],{},[230,887,888],{},[179,889,790],{},[230,891,892,835,895],{},[179,893,894],{},"http:\u002F\u002Fagent-loop:9080",[179,896,897],{},"http:\u002F\u002Fexecutor:9081",[230,899,900,901,904,905,442],{},"The URL Restate dials — service name in-network; ",[179,902,903],{},"http:\u002F\u002Fhost.docker.internal:\u003Cport>"," for host-run. Never ",[179,906,907],{},"localhost",[212,909,910,914,916],{},[230,911,912],{},[179,913,765],{},[230,915,595],{},[230,917,918],{},"Gateway API key for registration.",[212,920,921,925,928],{},[230,922,923],{},[179,924,592],{},[230,926,927],{},"synthesized by compose",[230,929,930],{},"Catalog connection. Absent ⇒ a loud degraded mode.",[212,932,933,938,943],{},[230,934,935],{},[179,936,937],{},"TEASPILL_MIGRATE",[230,939,940],{},[179,941,942],{},"1",[230,944,945],{},"Run idempotent catalog migrations on boot.",[212,947,948,953,958],{},[230,949,950],{},[179,951,952],{},"TEASPILL_MIGRATIONS_DIR",[230,954,955],{},[179,956,957],{},"\u002Fapp\u002Fdrizzle",[230,959,960],{},"Migration directory (in the image).",[212,962,963,968,973],{},[230,964,965],{},[179,966,967],{},"TEASPILL_RECONCILER",[230,969,970],{},[179,971,972],{},"on",[230,974,975,976,979],{},"The background consistency loop. ",[179,977,978],{},"off"," disables it.",[212,981,982,987,990],{},[230,983,984],{},[179,985,986],{},"TEASPILL_IDLE_ARCHIVE_MS",[230,988,989],{},"— (30 min)",[230,991,992,993,996,997,1000],{},"Idle auto-",[440,994,995],{"href":81},"archive"," delay override, ms. Unset ⇒ the 30-minute default; ",[179,998,999],{},"0"," disables auto-archive. Short values are for testing the archive\u002Fresurrect round-trip only — never run production with a short window.",[212,1002,1003,1008,1013],{},[230,1004,1005],{},[179,1006,1007],{},"TEASPILL_WORKSPACE_ADAPTER",[230,1009,1010],{},[179,1011,1012],{},"docker",[230,1014,1015,1016,1019],{},"Adapter that private ",[440,1017,1018],{"href":66},"workspaces"," run in.",[212,1021,1022,1027,1031],{},[230,1023,1024],{},[179,1025,1026],{},"TEASPILL_EXECUTOR_ADAPTER",[230,1028,1029],{},[179,1030,1012],{},[230,1032,1033,1034,1037],{},"Executor adapter. ",[179,1035,1036],{},"local-unrestricted"," opts into host exec (doubly gated).",[1039,1040,1042],"h3",{"id":1041},"demo-agent-gating","Demo-agent gating",[175,1044,1045],{},"The reference deployment's demo agents are served only when their key or opt-in is present; a missing one skips the agent cleanly rather than crashing.",[206,1047,1048,1056],{},[209,1049,1050],{},[212,1051,1052,1054],{},[215,1053,217],{},[215,1055,223],{},[225,1057,1058,1068,1081,1091],{},[212,1059,1060,1065],{},[230,1061,1062],{},[179,1063,1064],{},"ANTHROPIC_API_KEY",[230,1066,1067],{},"Enables the model-backed demo agents (both the native and Claude Agent SDK demos need it).",[212,1069,1070,1075],{},[230,1071,1072],{},[179,1073,1074],{},"TEASPILL_DEMO_CASDK",[230,1076,1077,1078,1080],{},"Set to ",[179,1079,942],{}," to additionally serve the Claude Agent SDK demo agent.",[212,1082,1083,1088],{},[230,1084,1085],{},[179,1086,1087],{},"TEASPILL_DEMO_MODEL",[230,1089,1090],{},"Overrides the demo model.",[212,1092,1093,1098],{},[230,1094,1095],{},[179,1096,1097],{},"TEASPILL_CASDK_SESSION_DIR",[230,1099,1100],{},"Session directory for the Claude Agent SDK demo.",{"title":1102,"searchDepth":1103,"depth":1104,"links":1105},"",1,2,[1106,1107,1108,1109],{"id":186,"depth":1104,"text":187},{"id":445,"depth":1104,"text":446},{"id":723,"depth":1104,"text":724},{"id":805,"depth":1104,"text":806,"children":1110},[1111],{"id":1041,"depth":1112,"text":1042},3,"Every environment variable, grouped by surface — the compose stack, the gateway, the CLI and clients, and the developer-deployed agent-loop and executor.","md",null,{},{"icon":83},{"title":154,"description":1113},"279wZUSG81vZImI-awfe0sUe_qRTzLrP-_Z1bxfa3yk",[1121,1123],{"title":149,"path":150,"stem":151,"description":1122,"icon":152,"children":-1},"The teaspill command-line tool — global configuration and every command: dev, agents, spawn, send, control, logs, and keys.",{"title":158,"path":159,"stem":160,"description":1124,"icon":163,"children":-1},"How to work on teaspill itself — the repo layout, the build and test bar, the conventions, and where the design history lives.",1784473424033]