Something went wrong. Try again.
small gleam coding and (not yet) persistent agent daemon with a detachable cli forked from okami.mom/albedo
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031# Daemon protocol 3. See http-api-design.md for behavioral semantics.openapi: 3.2.1info: title: Albedo daemon API version: 3.0.0 summary: 'Protocol 3: typed HTTP resources and SSE.' description: This file owns daemon request and response shapes. http-api-design.md owns ordering, atomicity, retry and recovery behavior. Server and clients switch together; there are no legacy route aliases. Unknown request fields and duplicate JSON keys are errors. Unknown response fields may be ignored by clients. No operation starts or replaces a daemon. JSON and SSE frames are at most 1 MiB unless an extension explicitly overrides that limit. Ordinary request bodies are at most 64 KiB, input bodies 72,200,000 bytes and proxy bodies 32,000,000 bytes. UTF-8 and encoded-byte limits are described with x-max-utf8-bytes/x-max-encoded-bytes; standard schema validation alone does not assert them. Examples use synthetic secrets only. JSON and text responses of at least 1 KiB, and session event streams, use Content-Encoding zstd when Accept-Encoding admits it; limits and ETags apply to the decoded representation. When capabilities include zstd_requests, a request body may use Content-Encoding zstd as one frame that declares its decoded size.jsonSchemaDialect: https://json-schema.org/draft/2020-12/schemaexternalDocs: description: Behavior, ownership, feature coverage and verification. url: http-api-design.mdsecurity:- DaemonBearer: []tags:- name: server- name: settings- name: storage- name: sessions- name: models- name: workspaces- name: hosts- name: auth- name: work- name: paperclips- name: artifacts- name: web-search- name: schedule- name: links- name: webhooks- name: discord- name: proxypaths: /events: get: operationId: getEvents summary: Upgrade to multiplexed live session events tags: - sessions description: | WebSocket upgrade endpoint, authenticated by the same bearer token and origin policy as other daemon routes. A socket owns at most 64 keyed follows. Client text frames are JSON objects: {key,type:"session",session_id,tail:0, after_generation?,after_seq?}, {key,type:"sessions",scope:"roots"}, {key,type:"stop"}, or {type:"ping"}. Keys contain 1 to 128 UTF-8 bytes. Session replay and tail validation match GET /sessions/{session_id} SSE. Subscribing an existing key replaces that follow. after_seq accepts an integer or its decimal string; tail defaults to 100 and is at most 200. Server text frames are {key,batch:<unchanged SSE batch>}: session batches carry generation,cursor,events and optional snapshot; collection batches carry events. A successful send acknowledges its session cursor. A follow ending (including stop, deletion, failure or overflow) sends {key,end:true}. Invalid commands and admission refusals send {key,failure:{code,detail}}; malformed commands without a usable key use an empty key. Session failures and collection overflow retain their SSE batch before the end frame. Ping replies and 15-second keepalives are {type:"pong"}. Commands are at most 4096 UTF-8 bytes; response frames are at most 1 MiB. Unsubscribe and socket closure release watches. Clients reconnect a follow with its last fully consumed cursor. Existing SSE routes remain available. responses: '101': description: WebSocket connection established. '400': description: Invalid WebSocket handshake; empty response body. '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '503': $ref: '#/components/responses/Problem503' /server: get: operationId: getServer summary: Read daemon identity and capabilities tags: - server responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Server' examples: Server: value: instance_id: instance-1 protocol: 3 state: ready capabilities: durable_inputs: 1 session_replay: 1 collection_invalidation: 1 tool_progress: 1 storage_report: 1 build: example-build digest: null extensions: - name: work version: 1 quota: null notices: [] '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: No startup or replacement. Authentication and protocol failures remain actionable errors. Pagination is valid only with include=quota_history. parameters: - name: include in: query required: false schema: type: string enum: [quota_history] - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' - name: quota_provider in: query required: false description: Exact provider ID to filter quota history. Requires include=quota_history, quota_account, and quota_limit. schema: type: string - name: quota_account in: query required: false description: Exact account label to filter quota history. Requires include=quota_history, quota_provider, and quota_limit. schema: type: string - name: quota_limit in: query required: false description: Exact limit ID to filter quota history. Requires include=quota_history, quota_provider, and quota_account. schema: type: string - name: quota_since in: query required: false description: Filter quota history to observations at or after this RFC 3339 UTC timestamp. Requires include=quota_history and the limit filter trio. schema: $ref: '#/components/schemas/Timestamp' /server/shutdown: post: operationId: shutdownServer summary: Drain the identified daemon tags: - server responses: '202': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Shutdown' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '409': $ref: '#/components/responses/Problem409' description: No automatic recovery or replay. The local launcher alone may offer replacement. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShutdownRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /settings: get: operationId: getSettings summary: Read shared settings or one canonical group tags: - settings responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/SettingsRead' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Without group, return Settings and observed group validators. With group, return that group only; the ETag covers that representation. parameters: - name: group in: query required: false schema: type: string enum: [providers, mcp, extensions, extension_settings, capabilities, models, ui] patch: operationId: patchSettings summary: Atomically edit one settings group tags: - settings responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SettingsChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Query group selects its corresponding schema. Omitted fields keep values. Null removes only nullable fields or map entries. Candidate validation precedes the complete group commit. No lost-response retry. parameters: - name: group in: query required: true schema: type: string enum: [providers, mcp, extensions, extension_settings, capabilities, models, ui] - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/SettingsPatch' examples: ProviderSettingsPatch: value: default_profile: personal profiles: personal: extension: openai endpoint: https://provider.example/v1 protocol: responses model: example-model effort: null image_edge: null account_id: null project: null location: null api_key: synthetic-example-key description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /storage: get: operationId: getStorage summary: Read storage accounting tags: - storage responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/StorageReport' examples: StorageReport: value: database: main_file_bytes: 8192 wal_bytes: 0 page_size_bytes: 4096 page_count: 2 free_page_count: 0 used_bytes: 8192 sessions: items: [] next: null total_count: 0 total_estimated_content_bytes: 0 images: count: 0 bytes: 0 files: items: [] next: null totals: kernel_bytes: 0 backup_bytes: 0 other_bytes: 0 recent_backup_bytes: 0 recent_backup_count: 0 measured_at: '2026-10-02T14:00:00Z' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: 'Each section has its own continuation. Totals cover complete storage. Paths never authorize local mutation. Requires capability `storage_report: 1`.' parameters: - name: sessions_next in: query required: false schema: $ref: '#/components/schemas/PageToken' - name: files_next in: query required: false schema: $ref: '#/components/schemas/PageToken' - $ref: '#/components/parameters/Limit' /sessions: get: operationId: listSessions summary: Browse sessions or watch collection changes tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SessionPage' examples: SessionPage: value: items: - id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 next: null text/event-stream: itemSchema: $ref: '#/components/schemas/CollectionSSE' headers: Vary: $ref: '#/components/headers/Vary' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: JSON defaults to roots, or all with parent/family. Parent and family are exclusive. Explicit roots with either is invalid. SSE accepts the same scope filters, excluding sort/limit/next; no cursor or replay. Subscribe, wait for ready, then read pages. Closure or overflow repeats this flow. parameters: - name: scope in: query required: false schema: type: string enum: [roots, all] - name: parent_id in: query required: false schema: $ref: '#/components/schemas/ID' - name: family_id in: query required: false schema: $ref: '#/components/schemas/ID' - name: workspace in: query required: false schema: $ref: '#/components/schemas/Workspace' - name: search in: query required: false schema: type: string maxLength: 256 - name: archived in: query required: false schema: type: boolean - name: needs_reload in: query required: false schema: type: boolean - name: sort in: query required: false schema: type: string enum: [activity, frequent] default: activity - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' /sessions/{session_id}: get: operationId: getSession summary: Read or watch one session tags: - sessions responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' Vary: $ref: '#/components/headers/Vary' content: application/json: schema: $ref: '#/components/schemas/SessionRead' examples: Session: value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 creation: submitted: kind: new workspace: /workspace/project name: null provider_profile: null model: null effort: null resolved: workspace: /workspace/project provider_profile: personal model: example-model effort: null revision: config-1 family_revision: family-1 configuration_resource: url: /sessions/01a0fcea-2b00-7000-8000-000000000001?view=configuration etag: '"session-config-1"' value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session workspace: /workspace/project provider_profile: personal model: example-model effort: null preferences: pinned: false pin_order: null archived: false selection: extensions: {} skills: {} instructions: {} mcp: {} revision: config-1 workspace_change: null selection: overrides: extensions: {} skills: {} instructions: {} mcp: {} effective: extensions: {} skills: {} instructions: {} mcp: {} composition: desired_revision: composition-1 loaded_revision: null needs_reload: true dependencies: {} quarantine: [] availability: {} kernel: instance_id: null state: none stage: null build: null stale: false staleness_reasons: [] live_job_count: 0 running_jobs: [] pending_inputs: [] input_order: 0 usage: model: null observed_at: null prompt_tokens: null cached_prompt_tokens: null cache_write_tokens: null completion_tokens: null total_tokens: null elapsed_ms: null tokens_per_second: null context_window_tokens: null cache_ttl_seconds: null cache_fade: [] history: items: [] older: null newer: null high_water: 0 glances: [] text/event-stream: itemSchema: $ref: '#/components/schemas/SessionSSE' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: JSON defaults to complete Session. Configuration and status JSON exclude tail and replay parameters. SSE accepts tail and after_generation/after_seq, without view. Initial subscription omits both cursors; reconnect keeps the fully consumed pair. A missing generation requests reset. after_generation without after_seq is invalid. Neither auth failure nor closure starts a daemon. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: false schema: type: string enum: [configuration, status] - name: tail in: query required: false schema: type: integer minimum: 0 maximum: 200 default: 100 - name: after_generation in: query required: false schema: $ref: '#/components/schemas/Generation' - name: after_seq in: query required: false schema: $ref: '#/components/schemas/Counter' put: operationId: createSession summary: Create a new, forked or child session tags: - sessions responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Session' examples: Session: value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 creation: submitted: kind: new workspace: /workspace/project name: null provider_profile: null model: null effort: null resolved: workspace: /workspace/project provider_profile: personal model: example-model effort: null revision: config-1 family_revision: family-1 configuration_resource: url: /sessions/01a0fcea-2b00-7000-8000-000000000001?view=configuration etag: '"session-config-1"' value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session workspace: /workspace/project provider_profile: personal model: example-model effort: null preferences: pinned: false pin_order: null archived: false selection: extensions: {} skills: {} instructions: {} mcp: {} revision: config-1 workspace_change: null selection: overrides: extensions: {} skills: {} instructions: {} mcp: {} effective: extensions: {} skills: {} instructions: {} mcp: {} composition: desired_revision: composition-1 loaded_revision: null needs_reload: true dependencies: {} quarantine: [] availability: {} kernel: instance_id: null state: none stage: null build: null stale: false staleness_reasons: [] live_job_count: 0 running_jobs: [] pending_inputs: [] input_order: 0 usage: model: null observed_at: null prompt_tokens: null cached_prompt_tokens: null cache_write_tokens: null completion_tokens: null total_tokens: null elapsed_ms: null tokens_per_second: null context_window_tokens: null cache_ttl_seconds: null cache_fade: [] history: items: [] older: null newer: null high_water: 0 glances: [] '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '409': $ref: '#/components/responses/Problem409' '410': $ref: '#/components/responses/Problem410' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' '429': $ref: '#/components/responses/Problem429' description: Session ID must be UUIDv7. If-None-Match:* is required. Retain the identity and submitted intent after response loss. An existing resource returns 412; GET creation.submitted proves original intent. Child membership and task admission commit together. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/UUIDv7' - $ref: '#/components/parameters/IfNoneMatch' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SessionCreationRequest' examples: NewSessionRequest: value: kind: new workspace: /workspace/project description: UTF-8 JSON; duplicate keys and unknown fields are rejected. patch: operationId: patchSession summary: Edit configuration or move workspace tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SessionChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Use the observed configuration URL and validator. Workspace is a standalone change carrying the observed session family revision. Busy target fails before commit; busy descendants follow a committed parent move at idle. Other configuration fields commit together. No automatic lost-response retry. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/SessionChangeRequest' examples: SessionPatch: value: selection: extensions: browser: null skills: candidate-1: false catalog_revision: discovery-1 description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteSession summary: Delete a leaf or captured subtree tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SessionDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Leaf requires idle and no children. Subtree requires the session's observed family revision and gates new children, interrupts captured members and deletes deepest first. Partial outcomes are explicit. Refresh before confirming a new attempt; never automatically replay after transport loss. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' - name: scope in: query required: false schema: type: string enum: [leaf, subtree] default: leaf - name: family_revision in: query required: false schema: $ref: '#/components/schemas/ID' /sessions/{session_id}/visits/{visit_id}: put: operationId: recordVisit summary: Count one deliberate opening tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Visit' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: Visit ID is UUIDv7. Same identity increments once; reads and refreshes never count. parameters: - name: visit_id in: path required: true schema: $ref: '#/components/schemas/UUIDv7' - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmptyRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/inputs/{input_id}: put: operationId: putInput summary: Admit immutable identified input tags: - sessions responses: '202': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Input' examples: Input: value: id: 01a0fcea-2b00-7000-8000-000000000002 session_id: 01a0fcea-2b00-7000-8000-000000000001 kind: message admission: accepted http_status: 202 problem: null accepted_at: '2026-10-02T14:00:00Z' acceptance_order: 1 delivery: pending blocking_reason: null transcript_position: null turn: null client_id: draft-1 '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '410': $ref: '#/components/responses/Problem410' '429': description: Retained rejection, even if capacity later clears. content: application/problem+json: schema: $ref: '#/components/schemas/Problem' examples: queue_full: value: type: about:blank title: Queue full status: 429 detail: This session already has 32 waiting inputs. code: queue_full decision: kind: input input: id: 01a0fcea-2b00-7000-8000-000000000002 session_id: 01a0fcea-2b00-7000-8000-000000000001 kind: message admission: rejected http_status: 429 problem: type: about:blank title: Queue full status: 429 detail: This session already has 32 waiting inputs. code: queue_full accepted_at: null acceptance_order: null delivery: null blocking_reason: null transcript_position: null turn: null client_id: draft-1 headers: Retry-After: $ref: '#/components/headers/RetryAfter' description: Input ID is UUIDv7. Duplicate lookup precedes mutable validation and returns the original admission status with current delivery. Queue-full rejection remains rejected. No If-None-Match. Preserve the exact intent and identity while recovering an uncertain response. parameters: - name: input_id in: path required: true schema: $ref: '#/components/schemas/UUIDv7' - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InputRequest' examples: MessageInputRequest: value: kind: message text: Fix the parser. client_id: draft-1 description: UTF-8 JSON; duplicate keys and unknown fields are rejected. get: operationId: getInput summary: Read a durable input outcome tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Input' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: Available after session deletion. Accepted is not consumed or answered. Retain pending and unfinished-turn identities; terminal decisions last seven days. Unknown old UUIDv7 returns 410, never a fresh admission. parameters: - name: input_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' /sessions/{session_id}/inputs/{input_id}/cancel: post: operationId: cancelInput summary: Cancel or interrupt only this input tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/InputCancellation' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: Never interrupts a later unrelated turn. shared_running leaves a shared turn running; retry only inspects or acts on this same input. parameters: - name: input_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmptyRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/interrupt: post: operationId: interruptSession summary: Interrupt a captured run and waiting prefix tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Interruption' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' description: Capture run_id and through_input_order from the installed session. Retry cannot interrupt a later run or cancel newer inputs. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InterruptRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/active-output/{content_id}: get: operationId: getActiveOutputContent summary: Read unfinished output at a captured snapshot cutoff tags: - sessions description: Pages contain at most 262144 UTF-8 bytes and remain within the captured cutoff. Preserve the required snapshot query when following next. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: content_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: snapshot in: query required: true schema: $ref: '#/components/schemas/PageToken' - name: next in: query schema: $ref: '#/components/schemas/PageToken' responses: '200': description: Bounded UTF-8 content page at the signed snapshot cutoff content: application/json: schema: $ref: '#/components/schemas/EntryContentPage' '400': $ref: '#/components/responses/Problem400' '403': $ref: '#/components/responses/Problem403' '410': $ref: '#/components/responses/Problem410' '503': $ref: '#/components/responses/Problem503' /sessions/{session_id}/history: get: operationId: getHistory summary: Page history or fork checkpoints tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HistoryRead' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Use only one of before/after/next. Durable positions are independent of actor replay. Pages are ascending and preserve complete display groups where bounded. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: false schema: type: string enum: [entries, checkpoints] default: entries - name: before in: query required: false schema: $ref: '#/components/schemas/Counter' - name: after in: query required: false schema: $ref: '#/components/schemas/Counter' - $ref: '#/components/parameters/Next' - name: limit in: query required: false schema: type: integer minimum: 1 maximum: 200 default: 100 /sessions/{session_id}/history/content: get: operationId: getHistoryContentBatch summary: Read several entries' full content in one walk tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/EntryContentBatch' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: The same parts and byte offsets as the single-entry route, for up to 200 entries, in the order `entries` names them. Follow next until null, repeating entries. One page stays inside the common encoded response bound, so a page whose entries are mostly references costs one request per byte budget instead of one request per entry. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: entries in: query required: true description: Comma separated history entry ids, in display order, at most 200 of them, each at most 128 characters. schema: type: string minLength: 1 maxLength: 26000 - $ref: '#/components/parameters/Next' /sessions/{session_id}/history/{entry_id}: get: operationId: getHistoryContent summary: Read full content in bounded pieces tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/EntryContentPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Follow next until null. UTF-8 pieces end at character boundaries. Reconstruct stored content, not shortened previews. Image fields are not paged here; their references name the image resource. parameters: - name: entry_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/Next' /sessions/{session_id}/history/{entry_id}/{field}: get: operationId: getHistoryImage summary: Read one image field as its own bytes tags: - sessions responses: '200': description: The decoded image, typed by its MIME type. content: image/png: schema: type: string contentMediaType: image/png image/jpeg: schema: type: string contentMediaType: image/jpeg image/webp: schema: type: string contentMediaType: image/webp '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Image references in history point here. The body is the stored image itself, not base64, and is never content-coded. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: entry_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: field in: path required: true schema: type: string minLength: 1 maxLength: 256 /sessions/{session_id}/context: get: operationId: getContext summary: Inspect prepared context or request records tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ContextRead' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: 'Summary never prepares a request. Section requires snapshot_id, section_id, page and forbids request-pagination fields. Requests accepts after/since_ms/limit/next. Stale snapshot is 410 context_changed, never another section. Requires capability `context: 1`.' parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: false schema: type: string enum: [summary, section, requests] default: summary - name: snapshot_id in: query required: false schema: $ref: '#/components/schemas/ID' - name: section_id in: query required: false schema: $ref: '#/components/schemas/ID' - name: page in: query required: false schema: $ref: '#/components/schemas/Counter' - name: after in: query required: false schema: $ref: '#/components/schemas/Counter' - name: since_ms in: query required: false description: Requests only. Include attempts finished at or after this Unix timestamp in milliseconds. schema: $ref: '#/components/schemas/Counter' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' /sessions/{session_id}/catalog: get: operationId: getCatalog summary: Discover candidates, loaded commands and pages tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Catalog' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: 'Discovery and loaded composition are separate. Reads do not reload. Continuation identifies its section; candidate revision guards discovery-based selection. Requires capability `catalog: 1`.' parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: kind in: query required: false schema: type: string enum: [extensions, skills, instructions, mcp, commands] - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' /sessions/{session_id}/context-window: get: operationId: getContextWindow summary: Read the window this session compacts against tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ContextWindow' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: 'The session''s own window outranks the model''s. Reads do not prepare a request, so the answer is available while the prepared context is pending. Requires capability `context: 1`.' parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' /sessions/{session_id}/files: get: operationId: getSessionFile summary: Read a text file in the session's workspace tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SessionFile' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '413': description: The file is over 1 MiB, or its JSON answer would exceed the response limit (`file_too_large`). content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '415': description: The file is binary or not valid UTF-8 (`file_not_text`). content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '502': description: The gather on the workspace's host failed or answered badly (`workspace_unavailable`). content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Reads on the machine the workspace is on: the daemon for a local workspace, the host through one SSH gather for a remote one. A missing file, a directory or another non-regular file answers 404 `file_not_found`; an unknown session answers 404 like other session routes. A remote host that is not ready answers 503 `workspace_unavailable`, a failed gather 502. Requires capability `file_reading: 1`.' parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: path in: query required: true description: Absolute on the workspace's machine, relative to the workspace, `~/...` in a local workspace, or the host-prefixed spelling `path` answers with. schema: type: string minLength: 1 /sessions/{session_id}/reload: post: operationId: reloadSession summary: Reload composition, models or both tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ReloadResult' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: Session reload requires idle. Both targets return separate outcomes, preserving confirmed success when the other fails. Lost-response replay is not automatic. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ReloadRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/kernel/upgrade: post: operationId: upgradeKernel summary: Explicitly upgrade an idle kernel tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/KernelUpgradeResult' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: Stage and validate before swap. Report external jobs stopped during an unsuccessful upgrade; do not claim them restored. No automatic retry. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmptyRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/compaction: post: operationId: compactSession summary: Compact model context while retaining history tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/CompactionResult' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: Idle required. Selecting a strategy can succeed even if compaction later fails; report both. Full durable history stays intact. No automatic retry. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompactionRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /sessions/{session_id}/rewind: post: operationId: rewindSession summary: Cut a session back to before a user message and keep the removed tail as an archived session tags: - sessions responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/RewindResult' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: 'Idle required. The checkpoint must be a user message from the checkpoint view. The session keeps every row before it, and the full prior conversation is copied first into a new archived session. The session actor stops, so attached streams reconnect and reset. Python namespace and files on disk are not rewound. A requested summary is made before anything changes, so a failed summary leaves the session untouched. Requires capability `history_rewind: 1`.' parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RewindRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /models: get: operationId: listModels summary: Read provider model metadata tags: - models responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ModelRead' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: In catalogue view, exactly one of provider_profile/provider is required. Endpoint is allowed only with provider. Unknown facts are null. A manual unlisted ID remains usable. Optional model returns one metadata row, including cap_key, for an unlisted manual ID; unknown facts stay null. parameters: - name: view in: query required: false schema: type: string enum: [catalogue, cache-policy] default: catalogue - name: extension in: query required: false description: Cache-policy matching only; defaults to the empty selector. schema: type: string maxLength: 256 - name: host in: query required: false description: Cache-policy matching only; defaults to the empty selector. schema: type: string maxLength: 4096 - name: model in: query required: false schema: $ref: '#/components/schemas/ID' - name: provider_profile in: query required: false schema: $ref: '#/components/schemas/ID' - name: provider in: query required: false schema: $ref: '#/components/schemas/ID' - name: endpoint in: query required: false schema: type: string format: uri maxLength: 4096 - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' /workspaces: get: operationId: getWorkspaces summary: Browse recent locations or a directory tags: - workspaces responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/WorkspaceRead' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: 'Without location return recent workspaces. include=preview requires location. Paths resolve on the daemon host; cached host state does not perform SSH sign-in. Requires capability `workspace_browsing: 1`.' parameters: - name: location in: query required: false schema: $ref: '#/components/schemas/Workspace' - name: include in: query required: false schema: type: string enum: [preview] - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' /hosts: get: operationId: listHosts summary: Read known SSH hosts and cached state tags: - hosts responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HostPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' parameters: - name: target in: query required: false schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' description: 'Requires capability `host_probes: 1`.' /hosts/{host}/probe: post: operationId: probeHost summary: Start or join a host probe tags: - hosts responses: '202': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Host' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' description: 'Coalesce repeated probes. Authentication remains an explicit operator handoff; no background SSH sign-in. Requires capability `host_probes: 1`.' parameters: - name: host in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmptyRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /auth: get: operationId: getAuth summary: Read login choices and redacted accounts tags: - auth responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/Auth' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: 'Requires capability `provider_auth: 1`.' /auth/logins/{login_id}: put: operationId: createLogin summary: Start or recover an identified provider login tags: - auth responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Login' examples: Login: value: id: 01a0fcea-2b00-7000-8000-000000000003 provider: example-provider url: https://provider.example/authorize?state=synthetic-state expires_at: '2026-10-02T14:15:00Z' state: waiting instructions: Paste the callback URL if the browser cannot reach the daemon. progress: Waiting for authorization. accounts: [] failure: null '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '409': $ref: '#/components/responses/Problem409' '410': $ref: '#/components/responses/Problem410' '429': $ref: '#/components/responses/Problem429' '200': description: Existing identified flow. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Login' description: 'UUIDv7 identity. Compare immutable private intent inside the daemon. Duplicate returns existing flow, never another browser/exchange. Restart turns unfinished flows into retained daemon_restarted failures; a new flow needs a new ID. Requires capability `provider_auth: 1`.' parameters: - name: login_id in: path required: true schema: $ref: '#/components/schemas/UUIDv7' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoginRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. get: operationId: getLogin summary: Inspect a provider login tags: - auth responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Login' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: 'No credential or submitted form echo. Terminal records remain fifteen minutes; unfinished flows expire at their provider deadline. Requires capability `provider_auth: 1`.' parameters: - name: login_id in: path required: true schema: $ref: '#/components/schemas/ID' patch: operationId: answerLogin summary: Supply manual callback or code tags: - auth responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Login' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '410': $ref: '#/components/responses/Problem410' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' parameters: - name: login_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/LoginPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. description: 'Requires capability `provider_auth: 1`.' delete: operationId: cancelLogin summary: Cancel a login idempotently tags: - auth responses: '204': description: Successful result. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '410': $ref: '#/components/responses/Problem410' description: 'Cancellation stops only this flow; completed accounts remain saved. No If-Match is needed for identity-scoped cancellation. Requires capability `provider_auth: 1`.' parameters: - name: login_id in: path required: true schema: $ref: '#/components/schemas/ID' /auth/accounts/{account_id}: delete: operationId: deleteAccount summary: Remove an unreferenced provider account tags: - auth responses: '204': description: Successful result. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: 'Reject if a saved provider profile references it. Does not interrupt captured credentials in an active request. Account IDs are never reused. Requires capability `provider_auth: 1`.' parameters: - name: account_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/work/items: get: operationId: listWork summary: List work resources tags: - work responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/WorkPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Requires enabled extension work. Lists may include bounded page descriptors and glances. parameters: - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: createWork summary: Create a work resource tags: - work responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/WorkChange' examples: WorkChange: value: resource: url: /extensions/work/items/work-1?workspace=%2Fworkspace%2Fproject etag: '"work-revision-1"' value: id: work-1 workspace: /workspace/project title: Fix the parser notes: '' parent_id: null session_id: null run_id: null status: open revision: work-revision-1 created_at: '2026-10-02T14:00:00Z' updated_at: '2026-10-02T14:00:00Z' notification: state: not_requested code: null detail: null '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: No automatic lost-response retry. Notification outcome does not undo a committed domain edit. parameters: - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkCreate' examples: WorkCreate: value: title: Fix the parser description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/work/items/{item_id}: get: operationId: getWork summary: Read one work resource tags: - work responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/WorkItem' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' patch: operationId: patchWork summary: Edit a work resource tags: - work responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/WorkChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Use the displayed item validator. Reject readonly/unknown fields. No automatic lost-response retry. parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/WorkPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteWork summary: Delete a work resource tags: - work responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ExtensionDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Committed deletion remains successful if notification fails. Work items with children cannot be deleted. parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - name: notify_session_id in: query required: false schema: $ref: '#/components/schemas/ID' description: Queue the deletion note for this session after the durable edit. - $ref: '#/components/parameters/IfMatch' /extensions/artifacts/items: get: operationId: listArtifacts summary: List artifacts, newest change first tags: - artifacts responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ArtifactPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Requires enabled extension artifacts. Artifacts outlive their session; `session_deleted` marks one whose session is gone. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' - name: session in: query required: false description: Only this session's artifacts. schema: $ref: '#/components/schemas/ID' /extensions/artifacts/items/{artifact_id}: get: operationId: getArtifact summary: Read one artifact with its versions tags: - artifacts responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ArtifactDetail' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: artifact_id in: path required: true schema: $ref: '#/components/schemas/ArtifactID' delete: operationId: deleteArtifact summary: Delete an artifact and every version of it tags: - artifacts responses: '204': description: Deleted. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: artifact_id in: path required: true schema: $ref: '#/components/schemas/ArtifactID' /extensions/artifacts/frame/{frame}/{version}/{path}: get: operationId: getArtifactFile summary: Serve one file of one artifact version tags: - artifacts responses: '200': description: The file, with its content type. An HTML file has the page bridge injected at the start of its head. content: '*/*': schema: type: string format: binary '302': description: The bare version path goes to its folder (`latest` to `latest/`), and an empty path to an entry inside a folder goes to that entry, so the page's relative paths resolve inside the version. headers: Location: description: Relative to the request. schema: type: string '304': description: The file named by `If-None-Match` is still the one served. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: '`albedo web` forwards `/frame/...` here; see robot-docs/artifacts.md. A wrong key answers 404. `path` may contain `/`; one ending in `/` serves its index.html, and an empty one the entry of that version. Under `latest` files are `no-cache` and the bridge is told to follow; the files of a numbered version are immutable.' parameters: - name: frame in: path required: true description: The artifact's id and capability key, joined by a dot. schema: type: string maxLength: 128 - name: version in: path required: true description: A version number, or `latest` for the newest. schema: type: string pattern: ^([1-9][0-9]*|latest)$ - name: path in: path required: true schema: type: string maxLength: 512 /extensions/artifacts/frame/{frame}/{version}/.albedo/state: post: operationId: saveArtifactState summary: Save the page's localStorage tags: - artifacts responses: '204': description: Saved. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '413': $ref: '#/components/responses/Problem413' parameters: - name: frame in: path required: true description: The artifact's id and capability key, joined by a dot. schema: type: string maxLength: 128 - name: version in: path required: true description: A version number, or `latest` for the newest. schema: type: string pattern: ^([1-9][0-9]*|latest)$ requestBody: required: true content: text/plain: schema: $ref: '#/components/schemas/ArtifactState' description: JSON sent as text/plain, so a sandboxed page can send it without a preflight. /extensions/artifacts/frame/{frame}/{version}/.albedo/errors: post: operationId: reportArtifactError summary: Record a failure in the page tags: - artifacts responses: '204': description: Recorded. '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '413': $ref: '#/components/responses/Problem413' parameters: - name: frame in: path required: true description: The artifact's id and capability key, joined by a dot. schema: type: string maxLength: 128 - name: version in: path required: true description: A version number, or `latest` for the newest. schema: type: string pattern: ^([1-9][0-9]*|latest)$ requestBody: required: true content: text/plain: schema: $ref: '#/components/schemas/ArtifactError' description: JSON sent as text/plain, so a sandboxed page can send it without a preflight. /extensions/artifacts/frame/{frame}/{version}/.albedo/version: get: operationId: getArtifactLatestVersion summary: Wait for a newer version of an artifact tags: - artifacts description: What a page open on `latest/` in a tab of its own asks to know when to reload. With `after`, the daemon holds the answer until the latest version passes it or about 25 seconds pass; without, it answers at once. The version in the path only has to exist. responses: '200': description: The artifact's latest version. headers: Cache-Control: schema: type: string const: no-store content: application/json: schema: type: object additionalProperties: false required: - version properties: version: type: integer minimum: 1 '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: frame in: path required: true description: The artifact's id and capability key, joined by a dot. schema: type: string maxLength: 128 - name: version in: path required: true description: A version number, or `latest` for the newest. schema: type: string pattern: ^([1-9][0-9]*|latest)$ - name: after in: query required: false description: The version the page shows; the answer waits for one past it. schema: type: integer minimum: 0 /extensions/paperclips/items: get: operationId: listPaperclips summary: List paperclips resources tags: - paperclips responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/PaperclipPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Requires enabled extension paperclips. Lists may include bounded page descriptors and glances. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: createPaperclips summary: Create a paperclips resource tags: - paperclips responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/PaperclipChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: No automatic lost-response retry. Notification outcome does not undo a committed domain edit. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PaperclipCreate' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/paperclips/items/{item_id}: get: operationId: getPaperclips summary: Read one paperclips resource tags: - paperclips responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/Paperclip' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' patch: operationId: patchPaperclips summary: Edit a paperclips resource tags: - paperclips responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/PaperclipChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Use the displayed item validator. Reject readonly/unknown fields. No automatic lost-response retry. parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/PaperclipPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deletePaperclips summary: Delete a paperclips resource tags: - paperclips responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ExtensionDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Committed deletion remains successful if notification fails. Work items with children cannot be deleted. parameters: - name: item_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' /extensions/web-search/providers: get: operationId: listWebSearchProviders summary: List web search providers in the order a search tries them tags: - web-search responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/WebSearchProviderPage' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '503': $ref: '#/components/responses/Problem503' description: Requires enabled extension web-search. The global order lives in extensions.json. /extensions/web-search/providers/{name}: post: operationId: changeWebSearchProvider summary: Move a web search provider up or down, or turn it on or off tags: - web-search responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/WebSearchProviderChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '503': $ref: '#/components/responses/Problem503' description: A move past either end leaves the order as it was. parameters: - name: name in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebSearchProviderChangeRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/schedule/jobs: get: operationId: listSchedule summary: List schedule resources tags: - schedule responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/SchedulePage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Requires enabled extension schedule. Lists may include bounded page descriptors and glances. parameters: - name: session_id in: query required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: createSchedule summary: Create a schedule resource tags: - schedule responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/ScheduleChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: No automatic lost-response retry. Notification outcome does not undo a committed domain edit. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ScheduleCreate' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/schedule/jobs/{job_id}: get: operationId: getSchedule summary: Read one schedule resource tags: - schedule responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/ScheduleJob' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: job_id in: path required: true schema: $ref: '#/components/schemas/ID' patch: operationId: patchSchedule summary: Edit a schedule resource tags: - schedule responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ScheduleChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Use the displayed item validator. Reject readonly/unknown fields. No automatic lost-response retry. parameters: - name: job_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/SchedulePatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteSchedule summary: Delete a schedule resource tags: - schedule responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ExtensionDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Committed deletion remains successful if notification fails. Work items with children cannot be deleted. parameters: - name: job_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' /extensions/links/groups: get: operationId: getLinkGroup summary: Read linked membership and presence tags: - links responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: oneOf: - $ref: '#/components/schemas/LinkGroup' - $ref: '#/components/schemas/LinkConfiguration' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' description: Only configuration view has the canonical membership ETag. Presence does not change that validator. parameters: - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - name: view in: query required: false schema: type: string enum: [configuration] - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: mergeLinkGroups summary: Merge two observed workspace groups tags: - links responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/LinkChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Check both observed validators in one owner commit. Human-only; domain commit and notifications are separate. No automatic lost-response retry. parameters: - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LinkMerge' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: unlinkWorkspace summary: Remove a member from the observed group tags: - links responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/LinkChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Check membership at commit. Creates a singleton group; deletes no work or memory. Human-only. parameters: - name: workspace in: query required: true schema: $ref: '#/components/schemas/Workspace' - name: member in: query required: true schema: $ref: '#/components/schemas/Workspace' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' /extensions/webhooks/hooks: get: operationId: listHooks summary: List hooks without secrets tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HookPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' parameters: - name: session_id in: query required: false schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: createHook summary: Create a hook and disclose its secret once tags: - webhooks responses: '201': description: Successful result. headers: Location: $ref: '#/components/headers/Location' content: application/json: schema: $ref: '#/components/schemas/HookChange' examples: HookChange: value: resource: url: /extensions/webhooks/hooks/hook-1?view=configuration etag: '"hook-revision-1"' value: id: hook-1 name: ci session_id: 01a0fcea-2b00-7000-8000-000000000001 enabled: true signature_header: X-Albedo-Signature signature_prefix: sha256= revision: hook-revision-1 notification: state: not_requested code: null detail: null secret: synthetic-example-hook-secret '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: Default enabled=true, signature_header=X-Albedo-Signature and signature_prefix=sha256=. Missing secret generates one. Lost secret requires explicit rotation; never retry creation automatically. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/HookCreate' examples: HookCreate: value: session_id: 01a0fcea-2b00-7000-8000-000000000001 name: ci description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/webhooks/hooks/{hook_id}: get: operationId: getHook summary: Read hook state or canonical configuration tags: - webhooks responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: oneOf: - $ref: '#/components/schemas/Hook' - $ref: '#/components/schemas/HookConfiguration' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: ETag is present only on configuration view. Ordinary read exposes the configuration resource and validator plus runtime observations. parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: false schema: type: string enum: [configuration] patch: operationId: patchHook summary: Edit the observed hook configuration tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HookChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Target session and secret are not writable. Agent callers need that session permission; HTTP bearer clients are operators. parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/HookPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteHook summary: Delete a hook while retaining accepted deliveries tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ExtensionDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: view in: query required: true schema: const: configuration - $ref: '#/components/parameters/IfMatch' /extensions/webhooks/hooks/{hook_id}/secret: post: operationId: rotateHookSecret summary: Rotate and disclose the hook secret once tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HookChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: If-Match is the observed hook configuration validator. Missing secret generates one. No automatic retry after a lost response. parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/HookSecretRequest' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/webhooks/hooks/{hook_id}/deliveries: get: operationId: listHookDeliveries summary: Read accepted hook delivery metadata tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DeliveryPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Historical reads remain available after hook deletion while retained deliveries exist. parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: state in: query required: false schema: type: string enum: [pending, delivered, all] default: all - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Next' post: operationId: deliverWebhook summary: Accept signed external data durably tags: - webhooks responses: '202': description: Successful result. content: application/json: schema: type: object properties: delivery_id: $ref: '#/components/schemas/ID' required: [delivery_id] additionalProperties: false '400': $ref: '#/components/responses/Problem400' '403': description: Missing or invalid hook signature. content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' '429': $ref: '#/components/responses/Problem429' description: Authenticate configured HMAC-SHA256 over the exact raw body. A daemon bearer is not a substitute. Signature header name and prefix come from hook configuration. Same event ID and body returns original admission; changed body conflicts. Pending inbox limit 1000. Raw body maximum 65536 bytes. parameters: - name: hook_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: X-Albedo-Event-Id in: header required: false schema: type: string pattern: ^[^\r\n]+$ maxLength: 128 description: Optional sender identity scoped to hook and exact body hash. security: - WebhookSignature: [] requestBody: required: true content: '*/*': schema: type: string format: binary maxLength: 65536 description: Raw bytes, not a parsed JSON requirement. Verify signature before admission. /extensions/webhooks/deliveries/{delivery_id}: get: operationId: getDelivery summary: Read an accepted delivery payload tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DeliveryDetail' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: delivery_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/webhooks/permissions/{session_id}: get: operationId: getHookPermission summary: Read agent hook-management permission tags: - webhooks responses: '200': description: Successful result. headers: ETag: $ref: '#/components/headers/ETag' content: application/json: schema: $ref: '#/components/schemas/HookPermission' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Absent stored permission reads false with its initial canonical validator. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' patch: operationId: patchHookPermission summary: Set agent hook-management permission tags: - webhooks responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/HookPermissionChange' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '412': $ref: '#/components/responses/Problem412' '428': $ref: '#/components/responses/Problem428' description: Only operator callers can grant permission. Omission retains it; turning off management keeps existing hooks enabled. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - $ref: '#/components/parameters/IfMatch' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/HookPermissionPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/discord/bots: get: operationId: listDiscordBots summary: List Discord bots of every session without tokens tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordBotPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' post: operationId: createDiscordBot summary: Create the Discord bot of a session tags: - discord responses: '201': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordBot' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '409': $ref: '#/components/responses/Problem409' description: One bot per session (409 bot_exists). The token must have three dot-separated parts and is never returned. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DiscordBotCreate' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/discord/bots/{bot_id}: get: operationId: getDiscordBot summary: Read a Discord bot and its live state tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordBot' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' patch: operationId: patchDiscordBot summary: Edit a Discord bot at an observed revision tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordBot' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' '412': $ref: '#/components/responses/Problem412' description: A token or enabled change restarts or stops the bot process. A stale revision is 412 precondition_failed. parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/merge-patch+json: schema: $ref: '#/components/schemas/DiscordBotPatch' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteDiscordBot summary: Delete a Discord bot and its channel and DM settings tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' '412': $ref: '#/components/responses/Problem412' parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: revision in: query required: true schema: type: integer minimum: 1 /extensions/discord/bots/{bot_id}/guilds: get: operationId: listDiscordGuilds summary: List the servers and channels the bot can see, with their delivery tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordGuildList' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: Read live from the bot process; 503 bot_offline when the bot is not online. parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/discord/bots/{bot_id}/channels/{channel_id}: put: operationId: putDiscordChannel summary: Set how a channel reaches the session tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordChannelState' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' description: Delivery off removes the channel; threads follow their parent channel. parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: channel_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DiscordChannelSetting' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/discord/bots/{bot_id}/dms: get: operationId: getDiscordDMs summary: Read the DM allow list and pending requests tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordDMs' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/discord/bots/{bot_id}/dms/{user_id}: put: operationId: putDiscordDM summary: Allow a person to DM the session tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordAllowed' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '404': $ref: '#/components/responses/Problem404' description: A null name is resolved from Discord when the bot is online. Allowing removes a pending request. parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: user_id in: path required: true schema: $ref: '#/components/schemas/ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DiscordAllow' description: UTF-8 JSON; duplicate keys and unknown fields are rejected. delete: operationId: deleteDiscordDM summary: Remove a person from the DM allow list tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordUserDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' description: The owner cannot be removed (400). parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: user_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/discord/bots/{bot_id}/requests/{user_id}: delete: operationId: deleteDiscordRequest summary: Dismiss a pending DM request tags: - discord responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/DiscordUserDeletion' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '403': $ref: '#/components/responses/Problem403' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' '404': $ref: '#/components/responses/Problem404' parameters: - name: bot_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: user_id in: path required: true schema: $ref: '#/components/schemas/ID' /extensions/proxy/v1/models: get: operationId: listProxyModels summary: List saved-profile OpenAI model IDs tags: - proxy responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ProxyModels' '400': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '401': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '403': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '405': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '406': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '503': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' description: External OpenAI envelope. Bearer required unless operator explicitly configured anonymous loopback access. /extensions/proxy/v1/chat/completions: post: operationId: createProxyCompletion summary: Run a stateless OpenAI chat completion tags: - proxy responses: '200': description: Successful result. content: application/json: schema: $ref: '#/components/schemas/ProxyCompletion' examples: ProxyCompletion: value: id: completion-1 object: chat.completion created: 1790949600 model: personal/example-model choices: - index: 0 message: role: assistant content: Hello finish_reason: stop usage: prompt_tokens: 1 completion_tokens: 1 total_tokens: 2 text/event-stream: itemSchema: $ref: '#/components/schemas/ProxySSE' '400': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '401': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '403': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '405': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '406': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '503': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '413': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' '415': description: OpenAI proxy error. content: application/json: schema: $ref: '#/components/schemas/ProxyError' description: Caller supplies full history. Tool IDs carry opaque provider state and must be echoed exactly. Bearer required unless anonymous loopback policy explicitly enabled. Providers apply only representable generation options; proxy transport documentation defines these differences. No automatic replay after request admission. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProxyCompletionRequest' examples: ProxyCompletionRequest: value: model: personal/example-model messages: - role: user content: Hello stream: true description: UTF-8 JSON; duplicate keys and unknown fields are rejected. /extensions/run/sessions/{session_id}/jobs: get: operationId: listJobs summary: Read bounded live job observations and the jobs page parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' responses: '200': description: Known live jobs, with up to 100 summaries ordered by ID. content: application/json: schema: $ref: '#/components/schemas/JobCollection' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' /extensions/run/sessions/{session_id}/jobs/recent: get: operationId: listRecentJobs summary: Read the kernel's jobs, running and finished description: What the session's kernel still knows of the jobs its run tool started, newest first, with up to 100 rows. Finished jobs stay for as long as the kernel keeps their output (its 64 newest). A session with no kernel has none. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' responses: '200': description: The kernel's job book. content: application/json: schema: $ref: '#/components/schemas/JobRecordCollection' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '503': $ref: '#/components/responses/Problem503' /extensions/run/sessions/{session_id}/jobs/{job_id}/output: get: operationId: readJobOutput summary: Read a page of one job's output description: Pages are byte ranges cut on character boundaries, so a reader that continues from `next_offset` loses none of what the job wrote; a running job's last character waits for the page after it. Without `offset` the page is the end of the output. Reading never counts as the model reading the job's result. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: job_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: offset in: query required: false description: Byte to start from. Omitted, the page ends at the end of the output. schema: type: integer minimum: 0 - name: limit in: query required: false description: Most bytes in the page; four hold any character. schema: type: integer minimum: 4 maximum: 65536 default: 16384 responses: '200': description: One page of output and the job it belongs to. content: application/json: schema: $ref: '#/components/schemas/JobOutputPage' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '409': description: The page lies in output the kernel no longer keeps; read the end of the output instead. content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '503': $ref: '#/components/responses/Problem503' /extensions/run/sessions/{session_id}/jobs/{job_id}/stop: post: operationId: stopJob summary: Explicitly stop one observed process group description: No automatic retry after response loss. Read the job collection before confirming another attempt. A successful response confirms the supervisor verdict, not just signal delivery. parameters: - name: session_id in: path required: true schema: $ref: '#/components/schemas/ID' - name: job_id in: path required: true schema: $ref: '#/components/schemas/ID' responses: '200': description: The observed job's process group was stopped. content: application/json: schema: $ref: '#/components/schemas/JobStop' '400': $ref: '#/components/responses/Problem400' '401': $ref: '#/components/responses/Problem401' '404': $ref: '#/components/responses/Problem404' '405': $ref: '#/components/responses/Problem405' '406': $ref: '#/components/responses/Problem406' '413': $ref: '#/components/responses/Problem413' '415': $ref: '#/components/responses/Problem415' '503': $ref: '#/components/responses/Problem503' requestBody: required: false content: application/json: schema: type: object additionalProperties: falsecomponents: securitySchemes: DaemonBearer: type: http scheme: bearer description: Daemon operator token, supplied out of band. Browser clients use fetch for authenticated JSON and SSE. No query tokens or authentication cookies. WebhookSignature: type: apiKey in: header name: X-Albedo-Signature description: Default header only. Each hook may configure another header and prefix. HMAC-SHA256 over exact raw bytes; bearer is not an alternative. parameters: IfMatch: name: If-Match in: header required: true schema: $ref: '#/components/schemas/ETag' description: Observed canonical representation validator. Wildcards and weak validators are not accepted. IfNoneMatch: name: If-None-Match in: header required: true schema: const: '*' description: Conditional creation only. Limit: name: limit in: query required: false schema: type: integer minimum: 1 maximum: 200 default: 50 Next: name: next in: query required: false schema: $ref: '#/components/schemas/PageToken' headers: ETag: description: Opaque strong validator for the complete canonical JSON representation. Mutation envelopes carry their resource validator inside the body. schema: $ref: '#/components/schemas/ETag' Location: description: URL of the created resource. schema: $ref: '#/components/schemas/ResourceURL' required: true Vary: description: Includes Accept; browser responses also include Origin. schema: type: string RetryAfter: description: Seconds until a later new admission may succeed. Never retries an already rejected identified input. schema: type: integer minimum: 0 maximum: 3600 WWWAuthenticate: description: Bearer challenge. schema: type: string pattern: ^Bearer Allow: description: Allowed methods for a known path. schema: type: string responses: Problem400: description: Invalid request content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem401: description: Missing or invalid daemon token headers: WWWAuthenticate: $ref: '#/components/headers/WWWAuthenticate' content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem403: description: Disallowed origin or caller content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem404: description: Unknown resource or disabled service content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem405: description: Method not allowed headers: Allow: $ref: '#/components/headers/Allow' content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem406: description: Unsupported response media type content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem409: description: Conflicting intent, busy state or stale catalog content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem410: description: Expired identity, deletion tombstone or obsolete context content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem412: description: Stale representation or failed creation condition content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem413: description: Body too large content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem415: description: Unsupported request media type content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem428: description: Required precondition missing content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem429: description: Admission limit headers: RetryAfter: $ref: '#/components/headers/RetryAfter' content: application/problem+json: schema: $ref: '#/components/schemas/Problem' Problem503: description: Unavailable owner, storage or upstream preparation content: application/problem+json: schema: $ref: '#/components/schemas/Problem' schemas: ID: type: string minLength: 1 description: Opaque identity. Never infer a resource type or route from its contents. maxLength: 512 UUIDv7: type: string pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ format: uuid description: Client-generated lowercase UUIDv7. Retained decisions are checked before timestamp expiry. Generation: type: string pattern: ^[A-Za-z0-9_-]{21}[AQgw]$ description: 128 random bits encoded as unpadded base64url; new for each session actor lifetime. Counter: type: integer minimum: 0 maximum: 9007199254740991 Timestamp: type: string format: date-time pattern: Z$ description: UTC RFC 3339. PageToken: type: string minLength: 1 description: Opaque continuation, tied to the query and representation; never authority. maxLength: 4096 ETag: type: string pattern: ^"[^"\r\n]+"$ description: Strong opaque validator for the complete canonical representation. maxLength: 512 ResourceURL: type: string pattern: ^/([^/#][^#]*)?$ description: Daemon-relative URL, including any representation query. No foreign origin or fragment. maxLength: 16384 Workspace: type: string minLength: 1 description: Canonical daemon-host location, local or SSH. Clients do not resolve this path locally. maxLength: 4096 SafeReason: type: object properties: code: type: string minLength: 1 maxLength: 100 detail: type: string maxLength: 4096 required: [code, detail] additionalProperties: false Warnings: type: array items: $ref: '#/components/schemas/SafeReason' maxItems: 100 DynamicJSON: description: 'Explicit domain payload: tool arguments, tool results, provider-private state, or extension data. JSON values of any type are allowed; no core resource uses this as its envelope.' Problem: type: object properties: type: const: about:blank title: type: string maxLength: 256 status: type: integer minimum: 400 maximum: 599 detail: type: string maxLength: 4096 code: type: string minLength: 1 maxLength: 100 fields: type: array items: type: object properties: pointer: type: string maxLength: 4096 detail: type: string maxLength: 4096 required: [pointer, detail] additionalProperties: false maxItems: 100 decision: oneOf: - $ref: '#/components/schemas/CreationDecision' - $ref: '#/components/schemas/InputDecision' required: [type, title, status, detail, code] additionalProperties: false examples: - type: about:blank title: Queue full status: 429 detail: This session already has 32 waiting inputs. code: queue_full decision: kind: input input: id: 01a0fcea-2b00-7000-8000-000000000002 session_id: 01a0fcea-2b00-7000-8000-000000000001 kind: message admission: rejected http_status: 429 problem: type: about:blank title: Queue full status: 429 detail: This session already has 32 waiting inputs. code: queue_full accepted_at: null acceptance_order: null delivery: null blocking_reason: null transcript_position: null turn: null client_id: draft-1 EmptyRequest: type: object properties: {} additionalProperties: false Cursor: type: object properties: generation: $ref: '#/components/schemas/Generation' sequence: $ref: '#/components/schemas/Counter' required: [generation, sequence] additionalProperties: false ResourceValidator: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' required: [url, etag] additionalProperties: false Notification: type: object properties: state: type: string enum: [not_requested, queued, failed] code: anyOf: - type: string maxLength: 100 - type: 'null' detail: anyOf: - type: string maxLength: 4096 - type: 'null' required: [state, code, detail] additionalProperties: false TargetNotification: type: object properties: session_id: $ref: '#/components/schemas/ID' notification: $ref: '#/components/schemas/Notification' required: [session_id, notification] additionalProperties: false QuotaObservation: type: object properties: sequence: $ref: '#/components/schemas/Counter' provider: $ref: '#/components/schemas/ID' account_id: $ref: '#/components/schemas/ID' limit_id: type: string maxLength: 256 label: type: string maxLength: 4096 plan: anyOf: - type: string maxLength: 256 - type: 'null' used_percent: anyOf: - type: number - type: 'null' window_label: anyOf: - type: string maxLength: 4096 - type: 'null' window_seconds: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' resets_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' scope: anyOf: - type: string maxLength: 256 - type: 'null' status: type: string maxLength: 256 source: type: string maxLength: 256 error: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' observed_at: $ref: '#/components/schemas/Timestamp' required: - sequence - provider - account_id - limit_id - label - plan - used_percent - window_label - window_seconds - resets_at - scope - status - source - error - observed_at additionalProperties: false QuotaPage: type: object properties: items: type: array items: $ref: '#/components/schemas/QuotaObservation' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false Server: type: object properties: instance_id: $ref: '#/components/schemas/ID' protocol: const: 3 state: type: string enum: [ready, draining] capabilities: type: object additionalProperties: type: integer minimum: 1 maximum: 9007199254740991 build: anyOf: - type: string maxLength: 512 - type: 'null' digest: type: [string, 'null'] pattern: ^[0-9a-f]{64}$ description: Content digest of the running code tree; update information, not attachment compatibility. extensions: type: array items: type: object properties: name: $ref: '#/components/schemas/ID' version: type: integer minimum: 1 maximum: 9007199254740991 required: [name, version] additionalProperties: false maxItems: 200 quota: anyOf: - type: array items: $ref: '#/components/schemas/QuotaObservation' maxItems: 200 - type: 'null' notices: type: array items: type: object properties: id: $ref: '#/components/schemas/ID' kind: type: string enum: [info, warning, migration] message: type: string maxLength: 4096 required: [id, kind, message] additionalProperties: false maxItems: 100 quota_history: $ref: '#/components/schemas/QuotaPage' required: [instance_id, protocol, state, capabilities, build, digest, extensions, quota, notices] additionalProperties: false examples: - instance_id: instance-1 protocol: 3 state: ready capabilities: durable_inputs: 1 session_replay: 1 collection_invalidation: 1 tool_progress: 1 storage_report: 1 build: example-build digest: null extensions: - name: work version: 1 quota: null notices: [] ShutdownRequest: type: object properties: instance_id: $ref: '#/components/schemas/ID' timeout_ms: type: integer minimum: 1 maximum: 30000 default: 5000 required: [instance_id] additionalProperties: false Shutdown: type: object properties: instance_id: $ref: '#/components/schemas/ID' state: const: draining required: [instance_id, state] additionalProperties: false ProviderProfile: type: object properties: extension: $ref: '#/components/schemas/ID' endpoint: anyOf: - type: string format: uri maxLength: 4096 - type: 'null' protocol: type: string enum: [responses, chat_completions] model: $ref: '#/components/schemas/ID' effort: anyOf: - type: string maxLength: 100 - type: 'null' image_edge: anyOf: - type: integer minimum: 1 maximum: 65536 - type: 'null' account_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' project: anyOf: - type: string maxLength: 256 - type: 'null' location: anyOf: - type: string maxLength: 256 - type: 'null' has_key: type: boolean required: [extension, endpoint, protocol, model, effort, image_edge, account_id, project, location, has_key] additionalProperties: false ProviderProfilePatch: type: object properties: extension: $ref: '#/components/schemas/ID' endpoint: anyOf: - type: string format: uri maxLength: 4096 - type: 'null' protocol: type: string enum: [responses, chat_completions] model: $ref: '#/components/schemas/ID' effort: anyOf: - type: string maxLength: 100 - type: 'null' image_edge: anyOf: - type: integer minimum: 1 maximum: 65536 - type: 'null' account_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' project: anyOf: - type: string maxLength: 256 - type: 'null' location: anyOf: - type: string maxLength: 256 - type: 'null' api_key: anyOf: - type: string minLength: 1 writeOnly: true maxLength: 16384 - type: 'null' description: Partial existing profile; extension and model required when creating a new map entry. additionalProperties: false ProviderSettings: type: object properties: default_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' profiles: type: object additionalProperties: $ref: '#/components/schemas/ProviderProfile' required: [default_profile, profiles] additionalProperties: false ProviderSettingsPatch: type: object properties: default_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' profiles: type: object additionalProperties: anyOf: - $ref: '#/components/schemas/ProviderProfilePatch' - type: 'null' renames: type: object additionalProperties: $ref: '#/components/schemas/ID' description: Existing profile names mapped to new ones, applied before profiles, which then use the new names. The saved key, default_profile and every session on the old name follow. An unknown old name is 409 unknown_profile; a new name another profile already has is 409 profile_exists. description: Removing the selected profile requires replacing or clearing default_profile in this same patch. additionalProperties: false examples: - default_profile: personal profiles: personal: extension: openai endpoint: https://provider.example/v1 protocol: responses model: example-model effort: null image_edge: null account_id: null project: null location: null api_key: synthetic-example-key ValueSource: type: object properties: source: type: string enum: [literal, env] value: type: string maxLength: 16384 description: For env, value is a daemon-host environment variable name. required: [source, value] additionalProperties: false SecretPresence: type: object properties: bearer_token: type: boolean environment: type: array items: type: string maxLength: 256 maxItems: 200 headers: type: array items: type: string maxLength: 256 maxItems: 200 required: [bearer_token, environment, headers] additionalProperties: false MCPDefinition: type: object properties: enabled: type: boolean transport: type: string enum: [stdio, http] command: anyOf: - type: string maxLength: 4096 - type: 'null' arguments: type: array items: type: string maxLength: 4096 maxItems: 200 cwd: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' url: anyOf: - type: string format: uri maxLength: 4096 - type: 'null' environment: type: object additionalProperties: $ref: '#/components/schemas/ValueSource' headers: type: object additionalProperties: $ref: '#/components/schemas/ValueSource' bearer_token_env_var: anyOf: - type: string maxLength: 256 - type: 'null' enabled_tools: anyOf: - type: array items: type: string maxLength: 256 maxItems: 1000 - type: 'null' disabled_tools: type: array items: type: string maxLength: 256 maxItems: 1000 startup_timeout_ms: type: integer minimum: 1 maximum: 300000 call_timeout_ms: type: integer minimum: 1 maximum: 3600000 secret_presence: $ref: '#/components/schemas/SecretPresence' required: [enabled, transport, command, arguments, cwd, url, environment, headers, bearer_token_env_var, enabled_tools, disabled_tools, startup_timeout_ms, call_timeout_ms, secret_presence] additionalProperties: false MCPSecretsPatch: type: object properties: bearer_token: anyOf: - type: string minLength: 1 writeOnly: true maxLength: 16384 - type: 'null' environment: type: object additionalProperties: anyOf: - type: string writeOnly: true maxLength: 16384 - type: 'null' headers: type: object additionalProperties: anyOf: - type: string writeOnly: true maxLength: 16384 - type: 'null' writeOnly: true additionalProperties: false MCPDefinitionPatch: type: object properties: enabled: type: boolean transport: type: string enum: [stdio, http] command: anyOf: - type: string maxLength: 4096 - type: 'null' arguments: type: array items: type: string maxLength: 4096 maxItems: 200 cwd: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' url: anyOf: - type: string format: uri maxLength: 4096 - type: 'null' environment: anyOf: - type: object additionalProperties: anyOf: - $ref: '#/components/schemas/ValueSource' - type: 'null' - type: 'null' headers: anyOf: - type: object additionalProperties: anyOf: - $ref: '#/components/schemas/ValueSource' - type: 'null' - type: 'null' bearer_token_env_var: anyOf: - type: string maxLength: 256 - type: 'null' enabled_tools: anyOf: - type: array items: type: string maxLength: 256 maxItems: 1000 - type: 'null' disabled_tools: type: array items: type: string maxLength: 256 maxItems: 1000 startup_timeout_ms: type: integer minimum: 1 maximum: 300000 call_timeout_ms: type: integer minimum: 1 maximum: 3600000 secrets: $ref: '#/components/schemas/MCPSecretsPatch' description: Partial merge patch. Public and secret sources cannot overlap. HTTP and stdio fields are validated against transport on the complete candidate. Public environment/header entries accept null removal; a null whole map clears it. Switching credential sources removes the former source in the same patch. additionalProperties: false MCPSettings: type: object properties: definitions: type: object additionalProperties: $ref: '#/components/schemas/MCPDefinition' required: [definitions] additionalProperties: false MCPSettingsPatch: type: object properties: definitions: type: object additionalProperties: anyOf: - $ref: '#/components/schemas/MCPDefinitionPatch' - type: 'null' validate_connection: type: boolean default: true writeOnly: true description: Validate candidate connections before atomic commit unless explicitly disabled. additionalProperties: false examples: - validate_connection: true definitions: example: enabled: true transport: http url: https://tools.example/mcp secrets: bearer_token: synthetic-example-token ExtensionSettings: type: object properties: defaults: type: object additionalProperties: type: boolean required: [defaults] additionalProperties: false ExtensionSettingsPatch: type: object properties: defaults: type: object additionalProperties: anyOf: - type: boolean - type: 'null' additionalProperties: false CapabilitySettings: type: object properties: preferences: type: object additionalProperties: type: boolean required: [preferences] additionalProperties: false CapabilitySettingsPatch: type: object properties: catalog_session_id: $ref: '#/components/schemas/ID' catalog_revision: $ref: '#/components/schemas/ID' choices: type: object additionalProperties: anyOf: - type: boolean - type: 'null' description: Resolve candidate IDs to stable preference keys under the observed catalog revision. required: [catalog_session_id, catalog_revision, choices] additionalProperties: false CachePrior: type: object properties: provider: $ref: '#/components/schemas/ID' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' ttl_seconds: anyOf: - type: integer minimum: 0 maximum: 9007199254740991 - type: 'null' source: type: string maxLength: 256 required: [provider, model, ttl_seconds, source] additionalProperties: false ModelSettings: type: object properties: raised_caps: type: object additionalProperties: type: boolean compact_at: type: object additionalProperties: type: integer minimum: 1 maximum: 100000000 cache_ttl_priors: type: array items: $ref: '#/components/schemas/CachePrior' maxItems: 200 required: [raised_caps, cache_ttl_priors] additionalProperties: false ModelSettingsPatch: type: object properties: raised_caps: type: object additionalProperties: anyOf: - type: boolean - type: 'null' compact_at: type: object additionalProperties: anyOf: - type: integer minimum: 1 maximum: 100000000 - type: 'null' description: Keys are cap_key values from model metadata. For raised_caps, true raises to the advertised maximum; false uses the ordinary limit; null clears the choice. A missing choice defaults to false. For compact_at, a token count is the window every session on that model compacts against, as long as it is below the model's window; null clears it. Only raised_caps and compact_at are writable. additionalProperties: false UISettings: type: object properties: thinking: type: boolean tools: type: boolean dismissed_notices: type: array items: $ref: '#/components/schemas/ID' maxItems: 1000 web_allow: description: Networks `albedo web` serves to besides this machine, as CIDR or an address whose trailing zero octets stand for any (10.0.0.0 is 10.0.0.0/8). type: array items: type: string minLength: 1 maxLength: 64 maxItems: 64 required: [thinking, tools, dismissed_notices] additionalProperties: false UISettingsPatch: type: object properties: thinking: type: boolean tools: type: boolean dismissed_notices: type: array items: $ref: '#/components/schemas/ID' maxItems: 1000 web_allow: description: Networks `albedo web` serves to besides this machine, as CIDR or an address whose trailing zero octets stand for any (10.0.0.0 is 10.0.0.0/8). type: array items: type: string minLength: 1 maxLength: 64 maxItems: 64 additionalProperties: false DeclaredSetting: type: object properties: key: type: string minLength: 1 maxLength: 128 description: The key in the section of extensions.json. label: type: string maxLength: 128 description: type: string maxLength: 1024 kind: type: string enum: [integer, text, limit] description: integer takes a whole number from minimum to maximum; text takes a non-empty string of at most 4096 bytes; limit takes a whole number from minimum to maximum, or -1 for no limit. default: anyOf: - type: integer - type: string - type: 'null' description: What the section's owner uses while nothing is saved. Null when leaving the setting unset has a meaning of its own, which the description gives. minimum: anyOf: - type: integer - type: 'null' description: The smallest integer accepted; null for text. maximum: anyOf: - type: integer - type: 'null' description: The largest integer accepted; null for text. value: anyOf: - type: integer - type: string - type: 'null' description: The saved value, or null when nothing is saved and the default applies. A saved value of the wrong kind reads as null, and the section's problem names it. required: [key, label, description, kind, default, minimum, maximum, value] additionalProperties: false DeclaredSettingsSection: type: object properties: name: $ref: '#/components/schemas/ID' description: The section's key in extensions.json. The daemon's own sections take names no extension may have; every other section is named after the extension that declares it. label: type: string maxLength: 128 description: What the section configures, for a reader who does not know who declares it. category: type: string enum: [web_search, context, agents, models_and_caching, tools] description: The part of /config the section belongs to. web_search is what web_search asks and where; context is how a session's context is kept within its window; agents is how many agents a session may spawn and how deep; models_and_caching is the model catalog and prompt cache warming; tools is what the agent drives or reaches, such as MCP servers, remote kernels and the desktop. description: type: string maxLength: 1024 fields: type: array items: $ref: '#/components/schemas/DeclaredSetting' maxItems: 64 problem: anyOf: - type: string maxLength: 1024 - type: 'null' description: Why the section's owner cannot use its saved section, when it cannot. required: [name, label, category, description, fields, problem] additionalProperties: false DeclaredSettings: type: object properties: sections: type: array items: $ref: '#/components/schemas/DeclaredSettingsSection' maxItems: 512 description: The daemon's own sections, then the sections installed extensions declare, in registry order. required: [sections] additionalProperties: false DeclaredSettingsPatch: type: object properties: values: type: object description: Section name to declared key to value. A value replaces the saved one; null removes it so the default applies. Unknown sections, undeclared keys, values outside the declaration, and a section its owner's own check rejects are refused, and nothing is saved. additionalProperties: type: object additionalProperties: anyOf: - type: integer - type: string - type: 'null' required: [values] additionalProperties: false ProviderSettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/ProviderSettings' required: [url, etag, value] additionalProperties: false MCPSettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/MCPSettings' required: [url, etag, value] additionalProperties: false ExtensionSettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/ExtensionSettings' required: [url, etag, value] additionalProperties: false DeclaredSettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/DeclaredSettings' required: [url, etag, value] additionalProperties: false CapabilitySettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/CapabilitySettings' required: [url, etag, value] additionalProperties: false ModelSettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/ModelSettings' required: [url, etag, value] additionalProperties: false UISettingsResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/UISettings' required: [url, etag, value] additionalProperties: false Settings: type: object properties: providers: $ref: '#/components/schemas/ProviderSettings' mcp: $ref: '#/components/schemas/MCPSettings' extensions: $ref: '#/components/schemas/ExtensionSettings' extension_settings: $ref: '#/components/schemas/DeclaredSettings' capabilities: $ref: '#/components/schemas/CapabilitySettings' models: $ref: '#/components/schemas/ModelSettings' ui: $ref: '#/components/schemas/UISettings' group_resources: type: object properties: providers: $ref: '#/components/schemas/ResourceValidator' mcp: $ref: '#/components/schemas/ResourceValidator' extensions: $ref: '#/components/schemas/ResourceValidator' extension_settings: $ref: '#/components/schemas/ResourceValidator' capabilities: $ref: '#/components/schemas/ResourceValidator' models: $ref: '#/components/schemas/ResourceValidator' ui: $ref: '#/components/schemas/ResourceValidator' required: [providers, mcp, extensions, extension_settings, capabilities, models, ui] additionalProperties: false required: [providers, mcp, extensions, extension_settings, capabilities, models, ui, group_resources] additionalProperties: false SettingsRead: oneOf: - $ref: '#/components/schemas/Settings' - $ref: '#/components/schemas/ProviderSettings' - $ref: '#/components/schemas/MCPSettings' - $ref: '#/components/schemas/ExtensionSettings' - $ref: '#/components/schemas/DeclaredSettings' - $ref: '#/components/schemas/CapabilitySettings' - $ref: '#/components/schemas/ModelSettings' - $ref: '#/components/schemas/UISettings' SettingsPatch: anyOf: - $ref: '#/components/schemas/ProviderSettingsPatch' - $ref: '#/components/schemas/MCPSettingsPatch' - $ref: '#/components/schemas/ExtensionSettingsPatch' - $ref: '#/components/schemas/DeclaredSettingsPatch' - $ref: '#/components/schemas/CapabilitySettingsPatch' - $ref: '#/components/schemas/ModelSettingsPatch' - $ref: '#/components/schemas/UISettingsPatch' description: The group query selects the one applicable patch schema. It is an error to send fields for another group. SettingsApplication: type: object properties: desired_revision: $ref: '#/components/schemas/ID' active_service_revision: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' composition_changed: type: boolean description: Whether this save changed the desired composition, so loaded sessions need a reload to apply it. Always false for providers, extension_settings, models and ui. A concurrent save to another composition group can make it true. GET /sessions?needs_reload=true lists the sessions. validation: type: string enum: [passed, skipped, not_applicable] warnings: $ref: '#/components/schemas/Warnings' required: [desired_revision, active_service_revision, composition_changed, validation, warnings] additionalProperties: false ProviderSettingsChange: type: object properties: group: const: providers resource: $ref: '#/components/schemas/ProviderSettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false MCPSettingsChange: type: object properties: group: const: mcp resource: $ref: '#/components/schemas/MCPSettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false ExtensionSettingsChange: type: object properties: group: const: extensions resource: $ref: '#/components/schemas/ExtensionSettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false DeclaredSettingsChange: type: object properties: group: const: extension_settings resource: $ref: '#/components/schemas/DeclaredSettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false CapabilitySettingsChange: type: object properties: group: const: capabilities resource: $ref: '#/components/schemas/CapabilitySettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false ModelSettingsChange: type: object properties: group: const: models resource: $ref: '#/components/schemas/ModelSettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false UISettingsChange: type: object properties: group: const: ui resource: $ref: '#/components/schemas/UISettingsResource' application: $ref: '#/components/schemas/SettingsApplication' required: [group, resource, application] additionalProperties: false SettingsChange: oneOf: - $ref: '#/components/schemas/ProviderSettingsChange' - $ref: '#/components/schemas/MCPSettingsChange' - $ref: '#/components/schemas/ExtensionSettingsChange' - $ref: '#/components/schemas/DeclaredSettingsChange' - $ref: '#/components/schemas/CapabilitySettingsChange' - $ref: '#/components/schemas/ModelSettingsChange' - $ref: '#/components/schemas/UISettingsChange' StorageSession: type: object properties: id: $ref: '#/components/schemas/ID' title: type: string maxLength: 4096 workspace: $ref: '#/components/schemas/Workspace' created_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' activity_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' estimated_content_bytes: $ref: '#/components/schemas/Counter' required: [id, title, workspace, created_at, activity_at, estimated_content_bytes] additionalProperties: false StorageFile: type: object properties: path: type: string maxLength: 4096 category: type: string enum: [kernel, backup, other] bytes: $ref: '#/components/schemas/Counter' modified_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' cleanup_candidate: type: boolean cleanup_reason: anyOf: - type: string maxLength: 100 - type: 'null' required: [path, category, bytes, modified_at, cleanup_candidate, cleanup_reason] additionalProperties: false StorageSessionPage: type: object properties: items: type: array items: $ref: '#/components/schemas/StorageSession' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' total_count: $ref: '#/components/schemas/Counter' total_estimated_content_bytes: $ref: '#/components/schemas/Counter' required: [items, next, total_count, total_estimated_content_bytes] additionalProperties: false StorageFilePage: type: object properties: items: type: array items: $ref: '#/components/schemas/StorageFile' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' totals: type: object properties: kernel_bytes: $ref: '#/components/schemas/Counter' backup_bytes: $ref: '#/components/schemas/Counter' other_bytes: $ref: '#/components/schemas/Counter' recent_backup_bytes: $ref: '#/components/schemas/Counter' recent_backup_count: $ref: '#/components/schemas/Counter' required: [kernel_bytes, backup_bytes, other_bytes, recent_backup_bytes, recent_backup_count] additionalProperties: false required: [items, next, totals] additionalProperties: false StorageReport: type: object properties: database: type: object properties: main_file_bytes: $ref: '#/components/schemas/Counter' wal_bytes: $ref: '#/components/schemas/Counter' page_size_bytes: $ref: '#/components/schemas/Counter' page_count: $ref: '#/components/schemas/Counter' free_page_count: $ref: '#/components/schemas/Counter' used_bytes: $ref: '#/components/schemas/Counter' required: [main_file_bytes, wal_bytes, page_size_bytes, page_count, free_page_count, used_bytes] additionalProperties: false sessions: $ref: '#/components/schemas/StorageSessionPage' images: type: object properties: count: $ref: '#/components/schemas/Counter' bytes: $ref: '#/components/schemas/Counter' required: [count, bytes] additionalProperties: false files: $ref: '#/components/schemas/StorageFilePage' measured_at: $ref: '#/components/schemas/Timestamp' required: [database, sessions, images, files, measured_at] additionalProperties: false examples: - database: main_file_bytes: 8192 wal_bytes: 0 page_size_bytes: 4096 page_count: 2 free_page_count: 0 used_bytes: 8192 sessions: items: [] next: null total_count: 0 total_estimated_content_bytes: 0 images: count: 0 bytes: 0 files: items: [] next: null totals: kernel_bytes: 0 backup_bytes: 0 other_bytes: 0 recent_backup_bytes: 0 recent_backup_count: 0 measured_at: '2026-10-02T14:00:00Z' SessionStatus: type: object properties: phase: type: string enum: [idle, preparing, generating, running, interrupting, compacting] run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' interrupt_requested: type: boolean blocking_reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [phase, run_id, interrupt_requested, blocking_reason] additionalProperties: false Preview: type: object properties: text: type: string x-max-utf8-bytes: 1024 maxLength: 256 transcript_count: $ref: '#/components/schemas/Counter' truncated: type: boolean required: [text, transcript_count, truncated] additionalProperties: false SessionPreferences: type: object properties: pinned: type: boolean pin_order: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' archived: type: boolean opens: $ref: '#/components/schemas/Counter' required: [pinned, pin_order, archived, opens] additionalProperties: false PreferencePatch: type: object properties: pinned: type: boolean archived: type: boolean additionalProperties: false ProgressPreview: type: object properties: offset_scalars: $ref: '#/components/schemas/Counter' text: type: string x-max-utf8-bytes: 2048 maxLength: 512 required: [offset_scalars, text] additionalProperties: false ToolProgress: type: object properties: call_id: $ref: '#/components/schemas/ID' tool_call_id: anyOf: - type: string minLength: 1 x-max-utf8-bytes: 200 maxLength: 200 - type: 'null' name: type: string minLength: 1 x-max-utf8-bytes: 100 maxLength: 100 phase: type: string enum: [generating, running] intent: type: string enum: [read, search, list, run, unknown] title: anyOf: - type: string minLength: 1 x-max-utf8-bytes: 400 maxLength: 160 - type: 'null' preview: $ref: '#/components/schemas/ProgressPreview' x-max-encoded-bytes: 8192 required: [call_id, tool_call_id, name, phase, intent] additionalProperties: false examples: - call_id: progress-1 tool_call_id: null name: python phase: generating intent: unknown title: "find which go files label python cells" preview: offset_scalars: 0 text: print("hello") AgentRequest: type: object properties: input_id: $ref: '#/components/schemas/ID' text: type: string maxLength: 512 required: [input_id, text] additionalProperties: false Activity: type: object properties: lines: type: array items: type: object properties: kind: type: string enum: [assistant, thinking, tool, input, note, error] text: type: string x-max-utf8-bytes: 1024 maxLength: 256 required: [kind, text] additionalProperties: false maxItems: 12 output_scalars: $ref: '#/components/schemas/Counter' output_utf8_bytes: $ref: '#/components/schemas/Counter' observed_at: $ref: '#/components/schemas/Timestamp' latest_input: anyOf: - type: object properties: input_id: $ref: '#/components/schemas/ID' source: type: string enum: [chat, agent, system] bytes: $ref: '#/components/schemas/Counter' required: [input_id, source, bytes] additionalProperties: false - type: 'null' current_request: anyOf: - $ref: '#/components/schemas/AgentRequest' - type: 'null' latest_progress: anyOf: - type: string maxLength: 512 - type: 'null' latest_answer: anyOf: - type: object properties: message_id: $ref: '#/components/schemas/ID' bytes: $ref: '#/components/schemas/Counter' required: [message_id, bytes] additionalProperties: false - type: 'null' x-max-encoded-bytes: 16384 required: [lines, output_scalars, output_utf8_bytes, observed_at, latest_input, latest_answer] additionalProperties: false SessionLocation: type: object description: Parsed workspace and daemon-resolved display label. Reading this metadata does not connect to the remote host. properties: host: anyOf: - type: string maxLength: 4096 - type: 'null' user: anyOf: - type: string maxLength: 4096 - type: 'null' path: type: string maxLength: 16384 label: anyOf: - type: string maxLength: 8192 - type: 'null' required: [host, user, path, label] additionalProperties: false SessionSummary: type: object properties: id: $ref: '#/components/schemas/ID' name: type: string maxLength: 4096 automatic_name: type: string maxLength: 4096 location: $ref: '#/components/schemas/SessionLocation' workspace: $ref: '#/components/schemas/Workspace' parent_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' root_id: $ref: '#/components/schemas/ID' role: type: string maxLength: 512 started_by: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' address: anyOf: - type: string maxLength: 512 - type: 'null' depth: type: integer minimum: 0 maximum: 1000 closed: type: boolean created_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' activity_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' provider_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' status: $ref: '#/components/schemas/SessionStatus' preview: $ref: '#/components/schemas/Preview' preferences: $ref: '#/components/schemas/SessionPreferences' current_progress: type: array items: $ref: '#/components/schemas/ToolProgress' maxItems: 32 activity: $ref: '#/components/schemas/Activity' cursor: anyOf: - $ref: '#/components/schemas/Cursor' - type: 'null' description: Live fields and cursor are captured together. Extra response fields may be ignored. required: [id, name, automatic_name, workspace, location, parent_id, root_id, address, depth, closed, created_at, activity_at, role, started_by, provider_profile, model, effort, status, preview, preferences, current_progress, activity, cursor] SessionPage: type: object properties: items: type: array items: $ref: '#/components/schemas/SessionSummary' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' family: type: object properties: root_id: $ref: '#/components/schemas/ID' revision: $ref: '#/components/schemas/ID' required: [root_id, revision] additionalProperties: false required: [items, next] additionalProperties: false examples: - items: - id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 next: null SelectionOverrides: type: object properties: extensions: type: object additionalProperties: anyOf: - type: boolean - type: 'null' skills: type: object additionalProperties: anyOf: - type: boolean - type: 'null' instructions: type: object additionalProperties: anyOf: - type: boolean - type: 'null' mcp: type: object additionalProperties: anyOf: - type: boolean - type: 'null' required: [extensions, skills, instructions, mcp] additionalProperties: false SelectionPatch: type: object properties: extensions: anyOf: - type: object additionalProperties: anyOf: - type: boolean - type: 'null' - type: 'null' skills: anyOf: - type: object additionalProperties: anyOf: - type: boolean - type: 'null' - type: 'null' instructions: anyOf: - type: object additionalProperties: anyOf: - type: boolean - type: 'null' - type: 'null' mcp: anyOf: - type: object additionalProperties: anyOf: - type: boolean - type: 'null' - type: 'null' description: Null map entry clears that override. Null entire map clears all overrides of that kind. additionalProperties: false SessionSelection: type: object properties: overrides: $ref: '#/components/schemas/SelectionOverrides' effective: type: object properties: extensions: type: object additionalProperties: type: boolean skills: type: object additionalProperties: type: boolean instructions: type: object additionalProperties: type: boolean mcp: type: object additionalProperties: type: boolean required: [extensions, skills, instructions, mcp] additionalProperties: false required: [overrides, effective] additionalProperties: false SessionConfiguration: type: object properties: id: $ref: '#/components/schemas/ID' name: description: Explicit name. Null shows the automatic title for a root, or the family name for a child; the session representation carries the displayed name. anyOf: - type: string maxLength: 4096 - type: 'null' workspace: $ref: '#/components/schemas/Workspace' provider_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' context_window: description: Tokens this session compacts against instead of the model's catalogued window. Null uses the model's window. anyOf: - type: integer minimum: 1 maximum: 100000000 - type: 'null' preferences: type: object properties: pinned: type: boolean pin_order: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' archived: type: boolean required: [pinned, pin_order, archived] additionalProperties: false selection: $ref: '#/components/schemas/SelectionOverrides' revision: $ref: '#/components/schemas/ID' required: [id, name, workspace, provider_profile, model, effort, preferences, selection, revision] additionalProperties: false examples: - id: 01a0fcea-2b00-7000-8000-000000000001 name: null workspace: /workspace/project provider_profile: personal model: example-model effort: null preferences: pinned: false pin_order: null archived: false selection: extensions: {} skills: {} instructions: {} mcp: {} revision: config-1 SessionConfigurationResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/SessionConfiguration' required: [url, etag, value] additionalProperties: false SessionPatch: type: object properties: name: anyOf: - type: string maxLength: 4096 - type: 'null' provider_profile: $ref: '#/components/schemas/ID' model: $ref: '#/components/schemas/ID' effort: anyOf: - type: string maxLength: 100 - type: 'null' context_window: description: Tokens this session compacts against instead of the model's catalogued window. Null uses the model's window. anyOf: - type: integer minimum: 1 maximum: 100000000 - type: 'null' preferences: $ref: '#/components/schemas/PreferencePatch' selection: $ref: '#/components/schemas/SelectionPatch' catalog_revision: $ref: '#/components/schemas/ID' description: Skill and instruction changes require catalog_revision. All fields validate and commit together. additionalProperties: false examples: - selection: extensions: browser: null skills: candidate-1: false catalog_revision: discovery-1 WorkspaceMoveRequest: type: object properties: workspace: $ref: '#/components/schemas/Workspace' family_revision: $ref: '#/components/schemas/ID' required: [workspace, family_revision] additionalProperties: false examples: - workspace: /workspace/other-project family_revision: family-1 SessionChangeRequest: oneOf: - $ref: '#/components/schemas/SessionPatch' - $ref: '#/components/schemas/WorkspaceMoveRequest' NewSessionRequest: type: object properties: kind: const: new workspace: $ref: '#/components/schemas/Workspace' name: anyOf: - type: string maxLength: 4096 - type: 'null' provider_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' context_window: description: Tokens this session compacts against instead of the model's catalogued window. Null uses the model's window. anyOf: - type: integer minimum: 1 maximum: 100000000 - type: 'null' required: [kind, workspace] additionalProperties: false examples: - kind: new workspace: /workspace/project NewSessionIntent: type: object properties: kind: const: new workspace: $ref: '#/components/schemas/Workspace' name: anyOf: - type: string maxLength: 4096 - type: 'null' provider_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' context_window: description: Tokens this session compacts against instead of the model's catalogued window. Null uses the model's window. anyOf: - type: integer minimum: 1 maximum: 100000000 - type: 'null' required: [kind, workspace, name, provider_profile, model, effort] additionalProperties: false ForkSessionRequest: type: object properties: kind: const: fork source_session_id: $ref: '#/components/schemas/ID' checkpoint_id: $ref: '#/components/schemas/ID' name: anyOf: - type: string maxLength: 4096 - type: 'null' required: [kind, source_session_id, checkpoint_id] additionalProperties: false ForkSessionIntent: type: object properties: kind: const: fork source_session_id: $ref: '#/components/schemas/ID' checkpoint_id: $ref: '#/components/schemas/ID' name: anyOf: - type: string maxLength: 4096 - type: 'null' required: [kind, source_session_id, checkpoint_id, name] additionalProperties: false ChildSessionRequest: type: object properties: kind: const: child parent_id: $ref: '#/components/schemas/ID' address: type: string minLength: 1 maxLength: 512 name: type: string minLength: 1 maxLength: 4096 initial_input_id: $ref: '#/components/schemas/UUIDv7' task: type: string minLength: 1 maxLength: 32768 model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' required: [kind, parent_id, address, name, initial_input_id, task] additionalProperties: false ChildSessionIntent: type: object properties: kind: const: child parent_id: $ref: '#/components/schemas/ID' address: type: string minLength: 1 maxLength: 512 name: type: string minLength: 1 maxLength: 4096 initial_input_id: $ref: '#/components/schemas/UUIDv7' task: type: string minLength: 1 maxLength: 32768 model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' required: [kind, parent_id, address, name, initial_input_id, task, model, effort] additionalProperties: false SessionCreationRequest: oneOf: - $ref: '#/components/schemas/NewSessionRequest' - $ref: '#/components/schemas/ForkSessionRequest' - $ref: '#/components/schemas/ChildSessionRequest' Creation: type: object properties: submitted: oneOf: - $ref: '#/components/schemas/NewSessionIntent' - $ref: '#/components/schemas/ForkSessionIntent' - $ref: '#/components/schemas/ChildSessionIntent' resolved: type: object properties: workspace: $ref: '#/components/schemas/Workspace' provider_profile: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 100 - type: 'null' required: [workspace, provider_profile, model, effort] additionalProperties: false required: [submitted, resolved] additionalProperties: false CreationDecision: type: object properties: kind: const: creation session_id: $ref: '#/components/schemas/ID' admission: type: string enum: [accepted, rejected] http_status: type: integer minimum: 200 maximum: 599 creation: anyOf: - $ref: '#/components/schemas/Creation' - type: 'null' decided_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' deleted_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: [kind, session_id, admission, http_status, creation, decided_at, deleted_at] additionalProperties: false WorkspaceChange: type: object properties: desired: $ref: '#/components/schemas/Workspace' active: $ref: '#/components/schemas/Workspace' state: type: string enum: [deferred, applying] revision: $ref: '#/components/schemas/ID' required: [desired, active, state, revision] additionalProperties: false QuarantineDiagnostic: type: object properties: id: $ref: '#/components/schemas/ID' reason: $ref: '#/components/schemas/SafeReason' required: [id, reason] additionalProperties: false Composition: type: object properties: desired_revision: $ref: '#/components/schemas/ID' loaded_revision: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' needs_reload: type: boolean dependencies: type: object additionalProperties: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 quarantine: type: array items: $ref: '#/components/schemas/QuarantineDiagnostic' maxItems: 200 availability: type: object additionalProperties: type: boolean required: [desired_revision, loaded_revision, needs_reload, dependencies, quarantine, availability] additionalProperties: false JobCollection: type: object properties: items: type: array items: $ref: '#/components/schemas/KernelJob' maxItems: 100 live_job_count: $ref: '#/components/schemas/Counter' page: $ref: '#/components/schemas/PageDescriptor' required: [items, live_job_count, page] additionalProperties: false examples: - items: [] live_job_count: 0 page: title: jobs empty_state: no background jobs running rows: [] glance: null actions: [] summary: 0 background jobs running JobRecord: type: object properties: id: $ref: '#/components/schemas/ID' command: type: string maxLength: 4096 state: type: string enum: [running, exited] exit_code: anyOf: - type: integer - type: 'null' timed_out: type: boolean service: type: boolean description: Started to keep running, so nothing waits on its end. started_at: $ref: '#/components/schemas/Counter' description: Wall-clock milliseconds since the epoch. ended_at: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' bytes: $ref: '#/components/schemas/Counter' description: Everything the job has written, kept or not. required: [id, command, state, exit_code, timed_out, service, started_at, ended_at, bytes] additionalProperties: false JobRecordCollection: type: object properties: items: type: array items: $ref: '#/components/schemas/JobRecord' maxItems: 100 required: [items] additionalProperties: false JobOutputPage: type: object properties: job: $ref: '#/components/schemas/JobRecord' offset: $ref: '#/components/schemas/Counter' description: Byte the page starts at. next_offset: $ref: '#/components/schemas/Counter' description: Byte to continue from; equal to `offset` when there is nothing more yet. text: type: string maxLength: 65536 required: [job, offset, next_offset, text] additionalProperties: false JobStop: type: object properties: stopped: $ref: '#/components/schemas/ID' required: [stopped] additionalProperties: false examples: - stopped: job-1 KernelJob: type: object properties: id: $ref: '#/components/schemas/ID' pid: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' command: type: string maxLength: 4096 started_at: $ref: '#/components/schemas/Counter' description: Wall-clock milliseconds since the epoch when the owner recorded the job. Zero when unknown, which clients treat as settled work. required: [id, pid, command, started_at] additionalProperties: false Kernel: type: object properties: state: type: string enum: [none, booting, attached, reattaching, lost] stage: anyOf: - type: string enum: [staging, starting] - type: 'null' build: anyOf: - type: string maxLength: 512 - type: 'null' stale: type: boolean staleness_reasons: type: array items: $ref: '#/components/schemas/SafeReason' maxItems: 100 running_jobs: description: Up to 100 observed live jobs, ordered by ID. Null when the kernel owner is unavailable. The count may exceed this list. anyOf: - type: array items: $ref: '#/components/schemas/KernelJob' maxItems: 100 - type: 'null' live_job_count: description: Observed owned jobs. Null while booting or when the kernel owner is lost. anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' instance_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' required: [state, stage, build, stale, staleness_reasons, live_job_count, running_jobs, instance_id] additionalProperties: false Usage: type: object properties: model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' observed_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' prompt_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cached_prompt_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cache_write_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' completion_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' total_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' elapsed_ms: anyOf: - type: number minimum: 0 - type: 'null' tokens_per_second: anyOf: - type: number minimum: 0 - type: 'null' context_window_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cache_ttl_seconds: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cache_miss_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cache_drift_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' cache_fade: type: array items: type: object properties: at: $ref: '#/components/schemas/Timestamp' cached_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' required: [at, cached_tokens] additionalProperties: false maxItems: 200 required: [model, observed_at, prompt_tokens, cached_prompt_tokens, cache_write_tokens, completion_tokens, total_tokens, elapsed_ms, tokens_per_second, context_window_tokens, cache_ttl_seconds, cache_fade] additionalProperties: false PendingInput: type: object properties: id: $ref: '#/components/schemas/ID' kind: type: string enum: [message, continue, skill, command] preview: $ref: '#/components/schemas/Preview' accepted_at: $ref: '#/components/schemas/Timestamp' acceptance_order: $ref: '#/components/schemas/Counter' delivery: const: pending blocking_reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [id, kind, preview, accepted_at, acceptance_order, delivery, blocking_reason] additionalProperties: false Glance: type: object properties: extension: $ref: '#/components/schemas/ID' title: type: string maxLength: 256 rows: type: array items: $ref: '#/components/schemas/PageRow' maxItems: 12 url: $ref: '#/components/schemas/ResourceURL' data: $ref: '#/components/schemas/DynamicJSON' x-max-encoded-bytes: 8192 required: [extension, title, rows, url] additionalProperties: false Session: allOf: - $ref: '#/components/schemas/SessionSummary' - type: object properties: creation: description: Null only for stored sessions that predate immutable creation provenance. All newly admitted creations have provenance. anyOf: - $ref: '#/components/schemas/Creation' - type: 'null' revision: $ref: '#/components/schemas/ID' family_revision: $ref: '#/components/schemas/ID' configuration_resource: $ref: '#/components/schemas/SessionConfigurationResource' workspace_change: anyOf: - $ref: '#/components/schemas/WorkspaceChange' - type: 'null' selection: $ref: '#/components/schemas/SessionSelection' composition: $ref: '#/components/schemas/Composition' kernel: $ref: '#/components/schemas/Kernel' pending_inputs: type: array items: $ref: '#/components/schemas/PendingInput' maxItems: 32 input_order: $ref: '#/components/schemas/Counter' usage: $ref: '#/components/schemas/Usage' active_output: type: array items: $ref: '#/components/schemas/ActiveOutput' maxItems: 256 history: $ref: '#/components/schemas/HistoryPage' glances: type: array items: $ref: '#/components/schemas/Glance' maxItems: 16 required: [creation, revision, family_revision, configuration_resource, workspace_change, selection, composition, kernel, pending_inputs, input_order, usage, history, glances, active_output] unevaluatedProperties: false x-max-encoded-bytes: 1048576 examples: - id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 creation: submitted: kind: new workspace: /workspace/project name: null provider_profile: null model: null effort: null resolved: workspace: /workspace/project provider_profile: personal model: example-model effort: null revision: config-1 family_revision: family-1 configuration_resource: url: /sessions/01a0fcea-2b00-7000-8000-000000000001?view=configuration etag: '"session-config-1"' value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session workspace: /workspace/project provider_profile: personal model: example-model effort: null preferences: pinned: false pin_order: null archived: false selection: extensions: {} skills: {} instructions: {} mcp: {} revision: config-1 workspace_change: null selection: overrides: extensions: {} skills: {} instructions: {} mcp: {} effective: extensions: {} skills: {} instructions: {} mcp: {} composition: desired_revision: composition-1 loaded_revision: null needs_reload: true dependencies: {} quarantine: [] availability: {} kernel: instance_id: null state: none stage: null build: null stale: false staleness_reasons: [] live_job_count: 0 running_jobs: [] pending_inputs: [] input_order: 0 usage: model: null observed_at: null prompt_tokens: null cached_prompt_tokens: null cache_write_tokens: null completion_tokens: null total_tokens: null elapsed_ms: null tokens_per_second: null context_window_tokens: null cache_ttl_seconds: null cache_fade: [] history: items: [] older: null newer: null high_water: 0 glances: [] SessionRead: oneOf: - $ref: '#/components/schemas/Session' - $ref: '#/components/schemas/SessionConfiguration' - $ref: '#/components/schemas/SessionStatusRead' SessionStatusRead: type: object properties: id: $ref: '#/components/schemas/ID' cursor: $ref: '#/components/schemas/Cursor' status: $ref: '#/components/schemas/SessionStatus' kernel: $ref: '#/components/schemas/Kernel' usage: $ref: '#/components/schemas/Usage' glances: type: array items: $ref: '#/components/schemas/Glance' maxItems: 16 description: The live facts a watching client keeps current, read from the session's own memory and its kernel, with no configuration, history, or composition read. Kernel job changes and glance changes also arrive on the session stream, so this is a safety read rather than the cadence. required: [id, cursor, status, kernel, usage, glances] additionalProperties: false SessionChange: type: object properties: resource: $ref: '#/components/schemas/SessionConfigurationResource' session: $ref: '#/components/schemas/Session' move: anyOf: - type: object properties: applied_count: $ref: '#/components/schemas/Counter' deferred_count: $ref: '#/components/schemas/Counter' applied_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 deferred_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 truncated: type: boolean warnings: $ref: '#/components/schemas/Warnings' required: [applied_count, deferred_count, applied_ids, deferred_ids, truncated, warnings] additionalProperties: false - type: 'null' required: [resource, session, move] additionalProperties: false Visit: type: object properties: visit_id: $ref: '#/components/schemas/ID' session_id: $ref: '#/components/schemas/ID' opens: $ref: '#/components/schemas/Counter' required: [visit_id, session_id, opens] additionalProperties: false SessionDeletion: type: object properties: state: type: string enum: [complete, partial] deleted_count: $ref: '#/components/schemas/Counter' remaining_count: $ref: '#/components/schemas/Counter' deleted_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 remaining: type: array items: type: object properties: id: $ref: '#/components/schemas/ID' reason: $ref: '#/components/schemas/SafeReason' required: [id, reason] additionalProperties: false maxItems: 200 truncated: type: boolean description: Counts cover the complete captured operation. ID lists are bounded summaries, never false completion. Refresh the authoritative family or known tombstones if truncated; deletion is never repeated to page a result. required: [state, deleted_count, remaining_count, deleted_ids, remaining, truncated] additionalProperties: false ImageUpload: type: object properties: mime_type: type: string enum: [image/png, image/jpeg, image/gif, image/webp] data: type: string contentEncoding: base64 description: Strict base64; decoded dimensions and provider constraints are validated before admission. required: [mime_type, data] additionalProperties: false MessageInputRequest: type: object properties: kind: const: message text: type: string maxLength: 1048576 images: type: array description: Attached in order; the text's numbered image markers say where each was attached. items: $ref: '#/components/schemas/ImageUpload' maxItems: 10 pastes: type: array description: Pasted text the text marks by number; a long one is saved to a file the model reads. items: type: string maxItems: 20 client_id: type: string maxLength: 512 required: [kind, text] additionalProperties: false anyOf: - properties: text: pattern: \S - required: [images] properties: images: minItems: 1 examples: - kind: message text: Fix the parser. client_id: draft-1 ContinueInputRequest: type: object properties: kind: const: continue client_id: type: string maxLength: 512 required: [kind] additionalProperties: false SkillInputRequest: type: object properties: kind: const: skill candidate_id: $ref: '#/components/schemas/ID' catalog_revision: $ref: '#/components/schemas/ID' arguments: type: string maxLength: 1048576 client_id: type: string maxLength: 512 required: [kind, candidate_id, catalog_revision, arguments] additionalProperties: false CommandInputRequest: type: object properties: kind: const: command command_id: $ref: '#/components/schemas/ID' arguments: $ref: '#/components/schemas/DynamicJSON' client_id: type: string maxLength: 512 required: [kind, command_id, arguments] additionalProperties: false InputRequest: oneOf: - $ref: '#/components/schemas/MessageInputRequest' - $ref: '#/components/schemas/ContinueInputRequest' - $ref: '#/components/schemas/SkillInputRequest' - $ref: '#/components/schemas/CommandInputRequest' x-max-encoded-bytes: 72200000 Turn: type: object properties: id: $ref: '#/components/schemas/ID' state: type: string enum: [running, completed, interrupted, failed, abandoned] started_at: $ref: '#/components/schemas/Timestamp' ended_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' outcome: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [id, state, started_at, ended_at, outcome] additionalProperties: false Input: type: object properties: id: $ref: '#/components/schemas/ID' session_id: $ref: '#/components/schemas/ID' kind: type: string enum: [message, continue, skill, command] admission: type: string enum: [accepted, rejected] http_status: type: integer minimum: 200 maximum: 599 problem: anyOf: - $ref: '#/components/schemas/AdmissionProblem' - type: 'null' accepted_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' acceptance_order: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' delivery: anyOf: - type: string enum: [pending, committed, cancelled] - type: 'null' blocking_reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' transcript_position: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' turn: anyOf: - $ref: '#/components/schemas/Turn' - type: 'null' client_id: anyOf: - type: string maxLength: 512 - type: 'null' required: [id, session_id, kind, admission, http_status, problem, accepted_at, acceptance_order, delivery, blocking_reason, transcript_position, turn, client_id] additionalProperties: false allOf: - if: properties: admission: const: rejected then: properties: delivery: type: 'null' accepted_at: type: 'null' acceptance_order: type: 'null' turn: type: 'null' http_status: type: integer minimum: 400 maximum: 599 problem: $ref: '#/components/schemas/AdmissionProblem' else: properties: delivery: type: string enum: [pending, committed, cancelled] accepted_at: $ref: '#/components/schemas/Timestamp' acceptance_order: type: integer minimum: 1 maximum: 9007199254740991 http_status: const: 202 problem: type: 'null' examples: - id: 01a0fcea-2b00-7000-8000-000000000002 session_id: 01a0fcea-2b00-7000-8000-000000000001 kind: message admission: accepted http_status: 202 problem: null accepted_at: '2026-10-02T14:00:00Z' acceptance_order: 1 delivery: pending blocking_reason: null transcript_position: null turn: null client_id: draft-1 InputDecision: type: object properties: kind: const: input input: $ref: '#/components/schemas/Input' required: [kind, input] additionalProperties: false InputCancellation: type: object properties: input: $ref: '#/components/schemas/Input' result: type: string enum: [cancelled, interrupt_requested, shared_running, not_pending] required: [input, result] additionalProperties: false InterruptRequest: type: object properties: run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' through_input_order: $ref: '#/components/schemas/Counter' required: [run_id, through_input_order] additionalProperties: false Interruption: type: object properties: run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' state: type: string enum: [requested, already_ended] cancelled_input_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 32 warnings: $ref: '#/components/schemas/Warnings' required: [run_id, state, cancelled_input_ids, warnings] additionalProperties: false ArtifactID: type: string pattern: ^[a-z0-9]{12}$ Artifact: type: object properties: id: $ref: '#/components/schemas/ArtifactID' key: type: string pattern: ^[0-9a-f]{32}$ description: The capability that serves its pages, `/frame/{id}.{key}/{version}/{path}`. title: type: string maxLength: 1000 version: type: integer minimum: 1 versions: type: integer minimum: 1 entry: type: string maxLength: 512 session_id: $ref: '#/components/schemas/ID' session_name: type: [string, 'null'] maxLength: 1000 session_deleted: type: boolean workspace: type: string maxLength: 4096 created_at: $ref: '#/components/schemas/Counter' updated_at: $ref: '#/components/schemas/Counter' bytes: $ref: '#/components/schemas/Counter' required: [id, key, title, version, versions, entry, session_id, session_name, session_deleted, workspace, created_at, updated_at, bytes] additionalProperties: false ArtifactPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Artifact' maxItems: 200 next: type: [string, 'null'] maxLength: 4096 required: [items, next] additionalProperties: false ArtifactFile: type: object properties: path: type: string maxLength: 512 size: $ref: '#/components/schemas/Counter' required: [path, size] additionalProperties: false ArtifactVersion: type: object properties: version: type: integer minimum: 1 entry: type: string maxLength: 512 created_at: $ref: '#/components/schemas/Counter' cell_id: type: [string, 'null'] maxLength: 1000 files: type: array items: $ref: '#/components/schemas/ArtifactFile' maxItems: 2000 bytes: $ref: '#/components/schemas/Counter' required: [version, entry, created_at, cell_id, files, bytes] additionalProperties: false ArtifactDetail: allOf: - $ref: '#/components/schemas/Artifact' - type: object properties: history: type: array description: Every version, newest first. items: $ref: '#/components/schemas/ArtifactVersion' required: [history] ArtifactState: type: object description: The page's localStorage. additionalProperties: type: string ArtifactError: type: object properties: message: type: string maxLength: 4000 source: type: string maxLength: 2000 line: type: integer minimum: 0 column: type: integer minimum: 0 stack: type: string maxLength: 8000 required: [message] additionalProperties: false ToolActivity: type: object properties: kind: type: string enum: [read, search, list, run, web, display, mcp, cua, artifact] target: type: string maxLength: 1000 detail: type: string maxLength: 16000 description: What the person watching sees of the result, as markdown; a web search's answer and sources, or displayed content. ms: type: integer minimum: 0 description: How long the call took, when it ended while its cell's trace was open. ok: type: boolean description: Whether the call worked, when it ended while its cell's trace was open. artifact: type: object description: The artifact version an `artifact` activity made; its title is the target. properties: id: $ref: '#/components/schemas/ArtifactID' version: type: integer minimum: 1 required: [id, version] additionalProperties: false required: [kind, target] additionalProperties: false FileDiff: type: object properties: path: type: string maxLength: 1000 kind: const: diff diff: type: string maxLength: 16000 added: $ref: '#/components/schemas/Counter' removed: $ref: '#/components/schemas/Counter' required: [path, kind, diff, added, removed] additionalProperties: false FileUnavailable: type: object properties: path: type: string maxLength: 1000 kind: const: unavailable reason: type: string maxLength: 1000 required: [path, kind, reason] additionalProperties: false ToolTrace: type: object properties: activities: type: array items: $ref: '#/components/schemas/ToolActivity' maxItems: 64 changes: type: array items: oneOf: - $ref: '#/components/schemas/FileDiff' - $ref: '#/components/schemas/FileUnavailable' maxItems: 16 truncated: type: boolean required: [activities, changes, truncated] additionalProperties: false ActiveOutput: type: object properties: message_id: $ref: '#/components/schemas/ID' run_id: $ref: '#/components/schemas/ID' kind: type: string enum: [text, thinking] bytes: $ref: '#/components/schemas/Counter' elapsed_ms: type: [integer, 'null'] minimum: 0 text: type: [string, 'null'] reference: anyOf: - $ref: '#/components/schemas/ContentReference' - type: 'null' required: [message_id, run_id, kind, bytes, elapsed_ms, text, reference] additionalProperties: false description: Ordered unfinished output captured with the session cursor. Exactly one of text or reference is non-null. References retain a fixed byte cutoff through their short snapshot lease. A run retains at most 64 MiB of unfinished output across at most 256 descriptors. Inline output is limited to 64 KiB encoded; larger content uses references. ContentReference: type: object properties: url: $ref: '#/components/schemas/ResourceURL' field: type: string minLength: 1 maxLength: 256 bytes: $ref: '#/components/schemas/Counter' required: [url, field, bytes] additionalProperties: false ImageMetadata: type: object properties: mime_type: type: string maxLength: 100 width: type: integer minimum: 1 maximum: 9007199254740991 height: type: integer minimum: 1 maximum: 9007199254740991 original_bytes: $ref: '#/components/schemas/Counter' reference: $ref: '#/components/schemas/ContentReference' description: Its url is the image resource, which serves the decoded bytes. required: [mime_type, width, height, original_bytes, reference] additionalProperties: false TextContent: type: object properties: kind: const: text text: type: string maxLength: 262144 required: [kind, text] additionalProperties: false JSONContent: type: object properties: kind: const: json field: type: string maxLength: 256 value: $ref: '#/components/schemas/DynamicJSON' required: [kind, field, value] additionalProperties: false ImageContent: type: object properties: kind: const: image image: $ref: '#/components/schemas/ImageMetadata' required: [kind, image] additionalProperties: false TraceContent: type: object properties: kind: const: trace trace: $ref: '#/components/schemas/ToolTrace' required: [kind, trace] additionalProperties: false ReferenceContent: type: object properties: kind: const: reference reference: $ref: '#/components/schemas/ContentReference' required: [kind, reference] additionalProperties: false HistoryMail: type: object properties: mail_id: $ref: '#/components/schemas/ID' sender_session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' sender_label: type: string kind: type: string enum: [task, message, result, unreviewed, webhook, event_tool, event_turn] required: [mail_id, sender_session_id, sender_label, kind] additionalProperties: false HistoryEntry: type: object properties: id: $ref: '#/components/schemas/ID' position: $ref: '#/components/schemas/Counter' kind: type: string enum: [user, assistant, thinking, tool_call, tool_result, note, continuation, compaction, image_fit] turn_type: type: string enum: [user, agent, webhook, event, scheduled, continue] mail: anyOf: - $ref: '#/components/schemas/HistoryMail' - type: 'null' turn_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' input_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' created_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' content: type: array items: oneOf: - $ref: '#/components/schemas/TextContent' - $ref: '#/components/schemas/JSONContent' - $ref: '#/components/schemas/ImageContent' - $ref: '#/components/schemas/TraceContent' - $ref: '#/components/schemas/ReferenceContent' maxItems: 200 checkpoint_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' content_complete: type: boolean tool: anyOf: - type: object properties: name: type: string maxLength: 100 tool_call_id: $ref: '#/components/schemas/ID' progress_call_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' title: anyOf: - type: string maxLength: 160 - type: 'null' required: [name, tool_call_id, progress_call_id] additionalProperties: false - type: 'null' thinking_duration_ms: description: Observed thinking duration, when recorded. anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' required: [id, position, kind, turn_id, input_id, created_at, content, checkpoint_id, content_complete, tool] additionalProperties: false HistoryPage: type: object properties: items: type: array items: $ref: '#/components/schemas/HistoryEntry' maxItems: 200 older: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' newer: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' high_water: $ref: '#/components/schemas/Counter' x-max-content-bytes: 262144 required: [items, older, newer, high_water] additionalProperties: false examples: - items: [] older: null newer: null high_water: 0 Checkpoint: type: object properties: position: $ref: '#/components/schemas/Counter' checkpoint_id: $ref: '#/components/schemas/ID' title: type: string maxLength: 4096 turn_type: type: string enum: [user, continue, agent, scheduled, webhook, event] preview: $ref: '#/components/schemas/Preview' required: [position, checkpoint_id, title, turn_type, preview] additionalProperties: false CheckpointPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Checkpoint' maxItems: 200 older: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' newer: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' high_water: $ref: '#/components/schemas/Counter' required: [items, older, newer, high_water] additionalProperties: false HistoryRead: anyOf: - $ref: '#/components/schemas/HistoryPage' - $ref: '#/components/schemas/CheckpointPage' description: The requested view determines the item type. Empty pages are valid for either view. ContentPart: type: object properties: field: type: string maxLength: 256 offset_bytes: $ref: '#/components/schemas/Counter' encoding: type: string enum: [utf8] text: type: string maxLength: 1048576 complete: type: boolean description: Offsets count exact stored UTF-8 bytes. required: [field, offset_bytes, encoding, text, complete] additionalProperties: false EntryContentPage: type: object properties: entry_id: $ref: '#/components/schemas/ID' parts: type: array items: $ref: '#/components/schemas/ContentPart' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' x-max-decoded-content-bytes: 262144 required: [entry_id, parts, next] additionalProperties: false EntryContentBatchPart: type: object properties: entry_id: $ref: '#/components/schemas/ID' field: type: string maxLength: 256 offset_bytes: $ref: '#/components/schemas/Counter' encoding: type: string enum: [utf8] text: type: string maxLength: 1048576 complete: type: boolean description: One field piece of one named entry; offsets count exact stored UTF-8 bytes. required: [entry_id, field, offset_bytes, encoding, text, complete] additionalProperties: false EntryContentBatch: type: object properties: parts: type: array items: $ref: '#/components/schemas/EntryContentBatchPart' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' x-max-decoded-content-bytes: 524288 required: [parts, next] additionalProperties: false ContextSection: type: object properties: id: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 kind: type: string enum: [instructions, extension_context, history, tools, other] source: anyOf: - type: string maxLength: 4096 - type: 'null' item_count: $ref: '#/components/schemas/Counter' utf8_bytes: $ref: '#/components/schemas/Counter' page_count: $ref: '#/components/schemas/Counter' preview: $ref: '#/components/schemas/Preview' required: [id, label, kind, source, item_count, utf8_bytes, page_count, preview] additionalProperties: false ContextSummary: type: object properties: state: type: string enum: [pending, ready] snapshot_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' captured_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' provider: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' model: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' protocol: anyOf: - type: string enum: [responses, chat_completions] - type: 'null' context_window_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' compaction: $ref: '#/components/schemas/ContextCompaction' sections: type: array items: $ref: '#/components/schemas/ContextSection' maxItems: 1000 reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [state, snapshot_id, captured_at, provider, model, protocol, context_window_tokens, compaction, sections, reason] additionalProperties: false allOf: - if: properties: state: const: ready then: properties: snapshot_id: $ref: '#/components/schemas/ID' captured_at: $ref: '#/components/schemas/Timestamp' reason: type: 'null' else: properties: snapshot_id: type: 'null' reason: $ref: '#/components/schemas/SafeReason' ContextSectionPage: type: object properties: snapshot_id: $ref: '#/components/schemas/ID' section_id: $ref: '#/components/schemas/ID' text: type: string x-max-utf8-bytes: 32768 maxLength: 32768 omitted: anyOf: - type: string maxLength: 4096 - type: 'null' page: $ref: '#/components/schemas/Counter' page_count: $ref: '#/components/schemas/Counter' required: [snapshot_id, section_id, text, omitted, page, page_count] additionalProperties: false TokenObservation: type: object properties: estimated: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' observed: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' source: anyOf: - type: string maxLength: 100 - type: 'null' required: [estimated, observed, source] additionalProperties: false ProviderRequestRecord: type: object properties: sequence: $ref: '#/components/schemas/Counter' provider: $ref: '#/components/schemas/ID' model: $ref: '#/components/schemas/ID' run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' started_at: $ref: '#/components/schemas/Timestamp' ended_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' prompt_tokens: $ref: '#/components/schemas/TokenObservation' completion_tokens: $ref: '#/components/schemas/TokenObservation' cached_tokens: $ref: '#/components/schemas/TokenObservation' failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' kind: type: string enum: [turn, summarizer, background] provider_profile: $ref: '#/components/schemas/ID' account_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' effort: anyOf: - type: string maxLength: 256 - type: 'null' outcome: type: string enum: [completed, failed] http_status: anyOf: - type: integer minimum: 100 maximum: 599 - type: 'null' cache_creation_tokens: $ref: '#/components/schemas/TokenObservation' cache_write_5m_tokens: $ref: '#/components/schemas/TokenObservation' cache_write_1h_tokens: $ref: '#/components/schemas/TokenObservation' reasoning_tokens: $ref: '#/components/schemas/TokenObservation' head_hash: type: string maxLength: 128 input_count: $ref: '#/components/schemas/Counter' replaced_input_count: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' projection_hash: anyOf: - type: string maxLength: 128 - type: 'null' strategy: anyOf: - type: string maxLength: 256 - type: 'null' cache_marks: type: array maxItems: 200 items: type: object properties: through: type: string enum: [tools, system, input] index: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' ttl_seconds: $ref: '#/components/schemas/Counter' required: [through, index, ttl_seconds] additionalProperties: false input_chain: anyOf: - type: string maxLength: 65536 - type: 'null' stream: anyOf: - type: object properties: first_event_ms: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' events: $ref: '#/components/schemas/Counter' thinking_bytes: $ref: '#/components/schemas/Counter' output_bytes: $ref: '#/components/schemas/Counter' required: [first_event_ms, events, thinking_bytes, output_bytes] additionalProperties: false - type: 'null' first_byte_ms: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' total_tokens: $ref: '#/components/schemas/TokenObservation' response_id: anyOf: - type: string maxLength: 1024 - type: 'null' model_version: anyOf: - type: string maxLength: 1024 - type: 'null' trace_id: anyOf: - type: string maxLength: 1024 - type: 'null' transcript_positions: type: array items: $ref: '#/components/schemas/Counter' maxItems: 200 required: [sequence, provider, model, run_id, started_at, ended_at, prompt_tokens, completion_tokens, cached_tokens, failure, transcript_positions, kind, provider_profile, account_id, effort, outcome, http_status, cache_creation_tokens, cache_write_5m_tokens, cache_write_1h_tokens, reasoning_tokens, head_hash, input_count, replaced_input_count, projection_hash, strategy, cache_marks, input_chain, stream, first_byte_ms, total_tokens, response_id, model_version, trace_id] additionalProperties: false RequestRecordPage: type: object properties: items: type: array items: $ref: '#/components/schemas/ProviderRequestRecord' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false ContextWindow: type: object properties: context_window: description: The window set for this session. Null when it uses the model's. anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' model_context_tokens: description: The model's own window, with any raised cap or context limit applied. Null when the catalog does not know the model. anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' effective_context_tokens: description: The window compaction measures against. anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' source: type: string enum: [session, model, unknown] message: type: string description: One sentence a client can show as it is. required: [context_window, model_context_tokens, effective_context_tokens, source, message] additionalProperties: false SessionFile: type: object properties: path: type: string description: Absolute location as the daemon spells it, `host:/path` for a remote workspace. size: $ref: '#/components/schemas/Counter' modified_at: $ref: '#/components/schemas/Timestamp' text: type: string description: The file's contents. At most 1 MiB of UTF-8 without NUL. required: [path, size, modified_at, text] additionalProperties: false ContextRead: oneOf: - $ref: '#/components/schemas/ContextSummary' - $ref: '#/components/schemas/ContextSectionPage' - $ref: '#/components/schemas/RequestRecordPage' FormField: type: object properties: name: type: string minLength: 1 maxLength: 256 label: type: string maxLength: 256 type: type: string enum: [text, secret, boolean, choice, integer, hidden] required: type: boolean default: $ref: '#/components/schemas/DynamicJSON' default_binding: description: Prefill from the selected row or installed session, before showing the form. type: object properties: source: type: string enum: [row, session] pointer: type: string pattern: ^(|/.*)$ maxLength: 4096 required: [source, pointer] additionalProperties: false choices: type: array items: type: object properties: value: $ref: '#/components/schemas/DynamicJSON' label: type: string maxLength: 256 required: [value, label] additionalProperties: false maxItems: 200 minimum: anyOf: - type: number - type: 'null' maximum: anyOf: - type: number - type: 'null' description: type: string maxLength: 4096 required: [name, label, type, required, default, choices, minimum, maximum, description] additionalProperties: false Binding: oneOf: - type: object properties: source: const: literal value: $ref: '#/components/schemas/DynamicJSON' required: [source, value] additionalProperties: false - type: object properties: source: type: string enum: [row, form, session] pointer: type: string pattern: ^(|/.*)$ maxLength: 4096 required: [source, pointer] additionalProperties: false description: JSON pointer resolves against the selected row, submitted form, or installed session snapshot. No expression language. ActionOperation: type: object properties: operation_id: type: string minLength: 1 maxLength: 256 method: type: string enum: [GET, PUT, POST, PATCH, DELETE] path_template: $ref: '#/components/schemas/ResourceURL' path: type: object additionalProperties: $ref: '#/components/schemas/Binding' query: type: object additionalProperties: $ref: '#/components/schemas/Binding' headers: type: object additionalProperties: $ref: '#/components/schemas/Binding' body: type: object additionalProperties: $ref: '#/components/schemas/Binding' propertyNames: type: string format: json-pointer pattern: ^/ success_status: type: integer enum: [200, 201] description: Expected synchronous JSON success status. Omitted operations accept 200 or 201 for mutations and 200 for reads. result_schema: $ref: '#/components/schemas/DynamicJSON' description: Operation must be declared in this contract, or the installed extension contract version. Bind If-Match from the displayed resource, never from a fresh read. Path, query and header map keys name declared parameters; body map keys are JSON pointers into the request object. Missing optional form values omit their bindings. result_schema is a JSON Schema 2020-12 fragment, with no remote schema retrieval. required: [operation_id, method, path_template, path, query, headers, body, result_schema] additionalProperties: false PageAction: type: object properties: id: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 keyboard_hint: anyOf: - type: string maxLength: 100 - type: 'null' confirmation: anyOf: - type: string maxLength: 4096 - type: 'null' fields: type: array items: $ref: '#/components/schemas/FormField' maxItems: 100 operation: $ref: '#/components/schemas/ActionOperation' required: [id, label, keyboard_hint, confirmation, fields, operation] additionalProperties: false PageRow: type: object properties: id: $ref: '#/components/schemas/ID' text: type: string maxLength: 4096 badge: anyOf: - type: string maxLength: 256 - type: 'null' tone: type: string enum: [plain, active, muted, success, warning, error] detail: anyOf: - type: string maxLength: 16384 - type: 'null' resource: anyOf: - type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/DynamicJSON' required: [url, etag, value] additionalProperties: false - type: 'null' required: [id, text, badge, tone, detail, resource] additionalProperties: false PageDescriptor: type: object properties: title: type: string maxLength: 256 empty_state: type: string maxLength: 4096 rows: type: array items: $ref: '#/components/schemas/PageRow' maxItems: 200 glance: anyOf: - $ref: '#/components/schemas/Glance' - type: 'null' actions: type: array items: $ref: '#/components/schemas/PageAction' maxItems: 100 summary: type: string maxLength: 4096 required: [title, empty_state, rows, glance, actions, summary] additionalProperties: false CatalogCandidate: type: object properties: id: $ref: '#/components/schemas/ID' kind: type: string enum: [extension, skill, instruction, mcp] title: type: string maxLength: 256 description: type: string maxLength: 4096 source: type: string maxLength: 4096 resolved_source: anyOf: - type: string maxLength: 4096 - type: 'null' preference_key: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' valid: type: boolean eligible: type: boolean effective_enabled: type: boolean global_preference: anyOf: - type: boolean - type: 'null' session_override: anyOf: - type: boolean - type: 'null' shadowed_by: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' dependencies: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 quarantined: type: boolean diagnostic: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' extension: description: Installed extension metadata for the inspector. Null for other candidate kinds. anyOf: - $ref: '#/components/schemas/ExtensionMetadata' - type: 'null' x-max-encoded-bytes: 65536 required: [id, kind, title, description, source, resolved_source, preference_key, valid, eligible, effective_enabled, global_preference, session_override, shadowed_by, dependencies, quarantined, diagnostic, extension] additionalProperties: false ExtensionMetadata: type: object properties: context: type: boolean tools: type: array maxItems: 200 items: $ref: '#/components/schemas/ID' python_modules: type: array maxItems: 200 items: $ref: '#/components/schemas/ID' plugins: type: array maxItems: 200 items: $ref: '#/components/schemas/ID' required: [context, tools, python_modules, plugins] additionalProperties: false HTTPCommand: type: object properties: id: $ref: '#/components/schemas/ID' slash_name: type: string maxLength: 256 description: type: string maxLength: 4096 arguments: type: array items: $ref: '#/components/schemas/FormField' maxItems: 100 caller_permissions: type: array items: type: string enum: [human, model] maxItems: 2 delivery: type: string enum: [read, mutation] operation: $ref: '#/components/schemas/ActionOperation' required: [id, slash_name, description, arguments, caller_permissions, delivery, operation] additionalProperties: false InputCommand: type: object properties: id: $ref: '#/components/schemas/ID' slash_name: type: string maxLength: 256 description: type: string maxLength: 4096 arguments: type: array items: $ref: '#/components/schemas/FormField' maxItems: 100 caller_permissions: type: array items: type: string enum: [human, model] maxItems: 2 delivery: const: input command_id: $ref: '#/components/schemas/ID' required: [id, slash_name, description, arguments, caller_permissions, delivery, command_id] additionalProperties: false Catalog: type: object properties: native_commands: type: array items: $ref: '#/components/schemas/HTTPCommand' maxItems: 200 description: Static HTTP declarations for selected extensions when no composition has been loaded. Reading these declarations does not prepare extensions or start a kernel. discovery: type: [object, 'null'] properties: revision: $ref: '#/components/schemas/ID' workspace: $ref: '#/components/schemas/Workspace' candidates: type: array items: $ref: '#/components/schemas/CatalogCandidate' maxItems: 200 diagnostics: type: array items: $ref: '#/components/schemas/SafeReason' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [revision, workspace, candidates, diagnostics, next] additionalProperties: false discovery_failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' loaded: type: object properties: revision: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' commands: type: array items: oneOf: - $ref: '#/components/schemas/HTTPCommand' - $ref: '#/components/schemas/InputCommand' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [revision, commands, next] additionalProperties: false pages: type: array items: $ref: '#/components/schemas/PageDescriptor' maxItems: 16 description: Pagination is independent for discovered candidates and loaded commands; next tokens identify their section. required: [discovery, discovery_failure, loaded] additionalProperties: false SessionReloadOutcome: type: object properties: state: type: string enum: [applied, failed, skipped] loaded_revision: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' restart_required: type: boolean warnings: $ref: '#/components/schemas/Warnings' failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [state, loaded_revision, restart_required, warnings, failure] additionalProperties: false ModelReloadOutcome: type: object properties: provider: $ref: '#/components/schemas/ID' state: type: string enum: [refreshed, failed, skipped] observed_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [provider, state, observed_at, failure] additionalProperties: false CachePolicyReloadOutcome: type: object properties: state: type: string enum: [refreshed, failed] failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [state, failure] additionalProperties: false ReloadRequest: type: object properties: target: type: string enum: [session, models, both] default: both additionalProperties: false ReloadResult: type: object properties: cache_policy: anyOf: - $ref: '#/components/schemas/CachePolicyReloadOutcome' - type: 'null' session: anyOf: - $ref: '#/components/schemas/SessionReloadOutcome' - type: 'null' models: type: array items: $ref: '#/components/schemas/ModelReloadOutcome' maxItems: 200 required: [session, models, cache_policy] additionalProperties: false KernelUpgradeResult: type: object properties: old_build: anyOf: - type: string maxLength: 512 - type: 'null' new_build: anyOf: - type: string maxLength: 512 - type: 'null' state: type: string enum: [upgraded, unchanged, failed] stopped_jobs: type: array items: type: object properties: id: $ref: '#/components/schemas/ID' reason: $ref: '#/components/schemas/SafeReason' required: [id, reason] additionalProperties: false maxItems: 200 warnings: $ref: '#/components/schemas/Warnings' failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' old_kernel_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' new_kernel_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' required: [old_build, new_build, state, stopped_jobs, warnings, failure, old_kernel_id, new_kernel_id] additionalProperties: false RewindRequest: type: object properties: checkpoint_id: $ref: '#/components/schemas/ID' summary: anyOf: - type: object properties: instructions: anyOf: - type: string maxLength: 4096 - type: 'null' additionalProperties: false - type: 'null' description: Ask for a summary of the removed tail, added to the session as a note. required: [checkpoint_id] additionalProperties: false RewindResult: type: object properties: archive_session_id: $ref: '#/components/schemas/ID' input: anyOf: - type: string - type: 'null' description: The text of the removed user message, when a person wrote it. summary: anyOf: - type: string maxLength: 32768 - type: 'null' description: The summary note added after the cut, when one was requested. required: [archive_session_id, input, summary] additionalProperties: false CompactionRequest: type: object properties: strategy: $ref: '#/components/schemas/ID' additionalProperties: false CompactionObservation: type: object properties: strategy: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' before_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' after_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' evicted_entries: $ref: '#/components/schemas/Counter' summary: type: string maxLength: 32768 required: [strategy, before_tokens, after_tokens, evicted_entries, summary] additionalProperties: false CompactionResult: type: object properties: selection_applied: type: boolean effective_strategy: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' state: type: string enum: [compacted, unchanged, failed] observation: anyOf: - $ref: '#/components/schemas/CompactionObservation' - type: 'null' failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [selection_applied, effective_strategy, state, observation, failure] additionalProperties: false Model: type: object properties: id: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 efforts: type: array items: type: object properties: id: type: string maxLength: 100 label: type: string maxLength: 256 required: [id, label] additionalProperties: false maxItems: 100 default_context_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' effective_context_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' max_context_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' max_output_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' input_modalities: type: array items: type: string minLength: 1 maxLength: 100 maxItems: 32 image_edge: anyOf: - type: integer minimum: 1 maximum: 65536 - type: 'null' raised: type: boolean compact_at: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' description: The window the user saved for this model, below its own; null or absent follows the model. cap_key: $ref: '#/components/schemas/ID' cache_policy: type: object properties: ttl_seconds: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' source: anyOf: - type: string maxLength: 256 - type: 'null' required: [ttl_seconds, source] additionalProperties: false source: type: string maxLength: 256 observed_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: [id, label, efforts, default_context_tokens, effective_context_tokens, max_context_tokens, max_output_tokens, input_modalities, image_edge, raised, cap_key, cache_policy, source, observed_at] additionalProperties: false CachePolicyEntry: type: object properties: id: $ref: '#/components/schemas/ID' layer: type: string enum: - default - remote - local match: type: object properties: extension: anyOf: - type: array items: type: string maxLength: 4096 maxItems: 100 - type: 'null' host: anyOf: - type: array items: type: string maxLength: 4096 maxItems: 100 - type: 'null' model: anyOf: - type: array items: type: string maxLength: 4096 maxItems: 100 - type: 'null' required: - extension - host - model additionalProperties: false policy: type: string enum: - refresh - fixed - evict - unknown clock: type: string enum: - request - response tiers: anyOf: - type: array maxItems: 32 items: type: object properties: seconds: $ref: '#/components/schemas/Counter' write: anyOf: - type: number minimum: 0 - type: 'null' required: - seconds - write additionalProperties: false - type: 'null' read: anyOf: - type: number minimum: 0 - type: 'null' survival: anyOf: - type: object properties: typical: $ref: '#/components/schemas/Counter' max: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' required: - typical - max additionalProperties: false - type: 'null' evidence: type: string enum: - documented - measured - implemented - folklore - unknown source: type: string maxLength: 4096 checked: type: string maxLength: 100 note: type: string maxLength: 16384 required: - id - layer - match - policy - clock - tiers - read - survival - evidence - source - checked - note additionalProperties: false CachePolicyLayer: type: object properties: name: type: string enum: - default - remote - local path: type: string maxLength: 16384 loaded: type: boolean error: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: - name - path - loaded - error additionalProperties: false CachePolicyPage: type: object properties: entries: type: array items: $ref: '#/components/schemas/CachePolicyEntry' maxItems: 200 layers: type: array items: $ref: '#/components/schemas/CachePolicyLayer' maxItems: 3 matched: anyOf: - $ref: '#/components/schemas/CachePolicyEntry' - type: 'null' next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: - entries - layers - matched - next additionalProperties: false ModelRead: oneOf: - $ref: '#/components/schemas/ModelPage' - $ref: '#/components/schemas/CachePolicyPage' ModelPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Model' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false Host: type: object properties: step: description: Current probe progress. Null when connecting or when no probe is running. anyOf: - type: string enum: [staging] - type: 'null' target: $ref: '#/components/schemas/ID' state: type: string enum: [unknown, probing, ready, needs_auth, unreachable, unsupported] detail: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' observed_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' os: anyOf: - type: string maxLength: 256 - type: 'null' architecture: anyOf: - type: string maxLength: 256 - type: 'null' home: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' authentication: anyOf: - type: object properties: instructions: type: string maxLength: 4096 ssh_target: type: string maxLength: 4096 control_path: anyOf: - type: string maxLength: 4096 - type: 'null' required: [instructions, ssh_target, control_path] additionalProperties: false - type: 'null' required: [target, state, detail, observed_at, os, architecture, home, authentication] additionalProperties: false HostPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Host' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false RecentWorkspace: type: object properties: location: $ref: '#/components/schemas/Workspace' use_count: $ref: '#/components/schemas/Counter' activity_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: [location, use_count, activity_at] additionalProperties: false RecentWorkspacePage: type: object properties: items: type: array items: $ref: '#/components/schemas/RecentWorkspace' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false TreeChild: type: object properties: name: type: string maxLength: 4096 kind: type: string enum: [file, directory, symlink] location: $ref: '#/components/schemas/Workspace' language: anyOf: - type: string maxLength: 256 - type: 'null' changed: $ref: '#/components/schemas/Counter' required: [name, kind, location, language, changed] additionalProperties: false TreeEntry: type: object properties: name: type: string maxLength: 4096 kind: type: string enum: [file, directory, symlink] location: $ref: '#/components/schemas/Workspace' children: type: array items: $ref: '#/components/schemas/TreeChild' maxItems: 4 more: $ref: '#/components/schemas/Counter' language: anyOf: - type: string maxLength: 256 - type: 'null' changed: $ref: '#/components/schemas/Counter' required: [name, kind, location, children, more, language, changed] additionalProperties: false GitFacts: type: object properties: kind: const: git branch: anyOf: - type: string maxLength: 4096 - type: 'null' revision: anyOf: - type: string maxLength: 256 - type: 'null' dirty: anyOf: - type: boolean - type: 'null' added: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' modified: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' removed: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' root: $ref: '#/components/schemas/Workspace' changed: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' touched_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: [kind, branch, revision, dirty, added, modified, removed, root, changed, touched_at] additionalProperties: false JJFacts: type: object properties: kind: const: jj change_id: anyOf: - type: string maxLength: 256 - type: 'null' revision: anyOf: - type: string maxLength: 256 - type: 'null' description: anyOf: - type: string maxLength: 4096 - type: 'null' dirty: anyOf: - type: boolean - type: 'null' conflicts: anyOf: - type: boolean - type: 'null' root: $ref: '#/components/schemas/Workspace' changed: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' touched_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' bookmark: anyOf: - type: object properties: name: type: string maxLength: 4096 ahead: $ref: '#/components/schemas/Counter' required: [name, ahead] additionalProperties: false - type: 'null' required: [kind, change_id, revision, description, dirty, conflicts, root, changed, touched_at, bookmark] additionalProperties: false WorkspacePreview: type: object properties: repository: anyOf: - oneOf: - $ref: '#/components/schemas/GitFacts' - $ref: '#/components/schemas/JJFacts' - type: 'null' repository_diagnostic: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' languages: type: array items: type: object properties: name: type: string maxLength: 256 bytes: $ref: '#/components/schemas/Counter' share: type: number minimum: 0 maximum: 1 color: anyOf: - type: string pattern: ^#[0-9a-fA-F]{6}$ - type: 'null' required: [name, bytes, share, color] additionalProperties: false maxItems: 100 tree: type: array items: $ref: '#/components/schemas/TreeEntry' maxItems: 12 more: $ref: '#/components/schemas/Counter' required: [repository, repository_diagnostic, languages, tree, more] additionalProperties: false WorkspaceDirectory: type: object properties: directory: $ref: '#/components/schemas/Workspace' parent: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' home: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' host: anyOf: - $ref: '#/components/schemas/Host' - type: 'null' items: type: array items: type: object properties: name: type: string maxLength: 4096 location: $ref: '#/components/schemas/Workspace' vcs: anyOf: - type: string enum: [git, jj] - type: 'null' modified_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' hidden: type: boolean required: [name, location, vcs, modified_at, hidden] additionalProperties: false maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' preview: $ref: '#/components/schemas/WorkspacePreview' required: [directory, parent, home, host, items, next] additionalProperties: false WorkspaceRead: oneOf: - $ref: '#/components/schemas/RecentWorkspacePage' - $ref: '#/components/schemas/WorkspaceDirectory' Account: type: object properties: id: $ref: '#/components/schemas/ID' provider: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 detail: type: string maxLength: 4096 kind: type: string enum: [model, service] default: model selected_by_profiles: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 required: [id, provider, label, detail, kind, selected_by_profiles] additionalProperties: false LoginProvider: type: object properties: id: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 detail: type: string maxLength: 4096 kind: type: string enum: [model, service] default: model flows: type: array items: type: string enum: [browser, manual, device, form] maxItems: 4 fields: type: array items: $ref: '#/components/schemas/FormField' maxItems: 100 required: [id, label, detail, kind, flows, fields] additionalProperties: false Auth: type: object properties: providers: type: array items: $ref: '#/components/schemas/LoginProvider' maxItems: 200 accounts: type: array items: $ref: '#/components/schemas/Account' maxItems: 200 required: [providers, accounts] additionalProperties: false LoginRequest: type: object properties: provider: $ref: '#/components/schemas/ID' flow: type: string enum: [browser, manual, device, form] values: type: object additionalProperties: type: [string, boolean, integer] description: Flow defaults to the provider preferred flow. Form names, types and required values are checked against that provider declaration. Values are write-only. required: [provider, values] additionalProperties: false LoginPatch: type: object properties: response: type: string minLength: 1 writeOnly: true maxLength: 16384 required: [response] additionalProperties: false Login: type: object properties: id: $ref: '#/components/schemas/ID' provider: $ref: '#/components/schemas/ID' url: anyOf: - type: string format: uri maxLength: 4096 - type: 'null' expires_at: $ref: '#/components/schemas/Timestamp' state: type: string enum: [waiting, exchanging, complete, failed, cancelled, expired] instructions: anyOf: - type: string maxLength: 4096 - type: 'null' progress: type: string maxLength: 4096 accounts: type: array items: $ref: '#/components/schemas/Account' maxItems: 200 failure: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [id, provider, url, expires_at, state, instructions, progress, accounts, failure] additionalProperties: false examples: - id: 01a0fcea-2b00-7000-8000-000000000003 provider: example-provider url: https://provider.example/authorize?state=synthetic-state expires_at: '2026-10-02T14:15:00Z' state: waiting instructions: Paste the callback URL if the browser cannot reach the daemon. progress: Waiting for authorization. accounts: [] failure: null MailMetadata: type: object properties: mail_id: $ref: '#/components/schemas/ID' sender_session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' receiver_session_id: $ref: '#/components/schemas/ID' kind: type: string enum: [task, message, result, unreviewed, webhook, event_tool, event_turn] bytes: $ref: '#/components/schemas/Counter' sender_label: anyOf: - type: string x-max-utf8-bytes: 400 maxLength: 100 - type: 'null' required: [mail_id, sender_session_id, receiver_session_id, kind, bytes, sender_label] additionalProperties: false SessionKernelEvent: type: object properties: type: const: kernel sequence: $ref: '#/components/schemas/Counter' data: type: object properties: kernel: $ref: '#/components/schemas/Kernel' required: [kernel] additionalProperties: false description: The kernel's job facts changed. Published only when they differ from what the stream last carried, so a client that keeps them needs no status poll. required: [type, sequence, data] additionalProperties: false SessionGlancesEvent: type: object properties: type: const: glances sequence: $ref: '#/components/schemas/Counter' data: type: object properties: glances: type: array items: $ref: '#/components/schemas/Glance' maxItems: 16 required: [glances] additionalProperties: false description: The loaded extensions' sidebar values changed, observed at a low rate while a client watches the stream. required: [type, sequence, data] additionalProperties: false SessionStatusEvent: type: object properties: type: const: status sequence: $ref: '#/components/schemas/Counter' data: $ref: '#/components/schemas/SessionStatus' required: [type, sequence, data] additionalProperties: false SessionInputEvent: type: object properties: type: const: input sequence: $ref: '#/components/schemas/Counter' data: type: object properties: input: $ref: '#/components/schemas/Input' required: [input] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionTextEvent: type: object properties: type: const: text sequence: $ref: '#/components/schemas/Counter' data: type: object properties: run_id: $ref: '#/components/schemas/ID' message_id: $ref: '#/components/schemas/ID' text: type: string maxLength: 262144 required: [run_id, message_id, text] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionThinkingEvent: type: object properties: type: const: thinking sequence: $ref: '#/components/schemas/Counter' data: type: object properties: run_id: $ref: '#/components/schemas/ID' message_id: $ref: '#/components/schemas/ID' text: type: string maxLength: 262144 elapsed_ms: description: Completed thinking duration, when observed. $ref: '#/components/schemas/Counter' required: [run_id, message_id, text] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionMessageEvent: type: object properties: type: const: message sequence: $ref: '#/components/schemas/Counter' data: type: object properties: entry: $ref: '#/components/schemas/HistoryEntry' required: [entry] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionToolProgressEvent: type: object properties: type: const: tool_progress sequence: $ref: '#/components/schemas/Counter' data: type: object properties: progress: anyOf: - $ref: '#/components/schemas/ToolProgress' - type: 'null' required: [progress] additionalProperties: false x-max-encoded-bytes: 8192 required: [type, sequence, data] additionalProperties: false SessionToolEvent: type: object properties: type: const: tool sequence: $ref: '#/components/schemas/Counter' data: type: object properties: tool_call_id: $ref: '#/components/schemas/ID' progress_call_id: $ref: '#/components/schemas/ID' name: type: string maxLength: 100 title: anyOf: - type: string maxLength: 160 - type: 'null' arguments: $ref: '#/components/schemas/DynamicJSON' result: $ref: '#/components/schemas/DynamicJSON' trace: anyOf: - $ref: '#/components/schemas/ToolTrace' - type: 'null' content_complete: type: boolean reference: anyOf: - $ref: '#/components/schemas/ContentReference' - type: 'null' required: [tool_call_id, progress_call_id, name, arguments, result, trace, content_complete, reference] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionNoteEvent: type: object properties: type: const: note sequence: $ref: '#/components/schemas/Counter' data: type: object properties: entry_id: $ref: '#/components/schemas/ID' origin: type: string maxLength: 256 text: type: string maxLength: 262144 mail: anyOf: - $ref: '#/components/schemas/MailMetadata' - type: 'null' required: [entry_id, origin, text, mail] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionRetryEvent: type: object properties: type: const: retry sequence: $ref: '#/components/schemas/Counter' data: type: object properties: run_id: $ref: '#/components/schemas/ID' attempt: type: integer minimum: 1 maximum: 9007199254740991 reason: $ref: '#/components/schemas/SafeReason' delay_ms: $ref: '#/components/schemas/Counter' required: [run_id, attempt, reason, delay_ms] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionUsageEvent: type: object properties: type: const: usage sequence: $ref: '#/components/schemas/Counter' data: $ref: '#/components/schemas/Usage' required: [type, sequence, data] additionalProperties: false SessionCommittedEvent: type: object properties: type: const: committed sequence: $ref: '#/components/schemas/Counter' data: type: object properties: high_water: $ref: '#/components/schemas/Counter' replaces_all_live: type: boolean description: Retire all provisional output for a model commit. replaces_live_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 256 required: [high_water, replaces_live_ids, replaces_all_live] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionTurnCompletedEvent: type: object properties: type: const: turn_completed sequence: $ref: '#/components/schemas/Counter' data: type: object properties: run_id: $ref: '#/components/schemas/ID' state: type: string enum: [completed, interrupted, failed, abandoned] input_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 input_count: $ref: '#/components/schemas/Counter' truncated: type: boolean required: [run_id, state, input_ids, input_count, truncated] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionCompactedEvent: type: object properties: type: const: compacted sequence: $ref: '#/components/schemas/Counter' data: $ref: '#/components/schemas/CompactionObservation' required: [type, sequence, data] additionalProperties: false SessionErrorEvent: type: object properties: type: const: error sequence: $ref: '#/components/schemas/Counter' data: type: object properties: run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' code: type: string maxLength: 100 message: type: string maxLength: 4096 required: [run_id, code, message] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionInvalidateEvent: type: object properties: type: const: invalidate sequence: $ref: '#/components/schemas/Counter' data: type: object properties: kind: type: string enum: [session, settings, catalog, context, extension] url: $ref: '#/components/schemas/ResourceURL' required: [kind, url] additionalProperties: false required: [type, sequence, data] additionalProperties: false SessionEvent: oneOf: - $ref: '#/components/schemas/SessionStatusEvent' - $ref: '#/components/schemas/SessionInputEvent' - $ref: '#/components/schemas/SessionTextEvent' - $ref: '#/components/schemas/SessionThinkingEvent' - $ref: '#/components/schemas/SessionMessageEvent' - $ref: '#/components/schemas/SessionToolProgressEvent' - $ref: '#/components/schemas/SessionToolEvent' - $ref: '#/components/schemas/SessionNoteEvent' - $ref: '#/components/schemas/SessionRetryEvent' - $ref: '#/components/schemas/SessionUsageEvent' - $ref: '#/components/schemas/SessionCommittedEvent' - $ref: '#/components/schemas/SessionTurnCompletedEvent' - $ref: '#/components/schemas/SessionCompactedEvent' - $ref: '#/components/schemas/SessionErrorEvent' - $ref: '#/components/schemas/SessionInvalidateEvent' - $ref: '#/components/schemas/SessionKernelEvent' - $ref: '#/components/schemas/SessionGlancesEvent' ResetEvent: type: object properties: type: const: reset data: type: object properties: reason: type: string enum: [initial, generation_changed, replay_unavailable, recovery] required: [reason] additionalProperties: false required: [type, data] additionalProperties: false FailureEvent: type: object properties: type: const: failure data: $ref: '#/components/schemas/SafeReason' required: [type, data] additionalProperties: false ReplayBatch: type: object properties: generation: $ref: '#/components/schemas/Generation' cursor: $ref: '#/components/schemas/Counter' events: type: array items: $ref: '#/components/schemas/SessionEvent' maxItems: 256 description: Empty keepalive keeps the last sequence. Nonempty event sequences are contiguous from the requested cursor. required: [generation, cursor, events] additionalProperties: false examples: - generation: J6kYj6IGcXyP3eMIp-WL3A cursor: 1 events: - type: input sequence: 1 data: input: id: 01a0fcea-2b00-7000-8000-000000000002 session_id: 01a0fcea-2b00-7000-8000-000000000001 kind: message admission: accepted http_status: 202 problem: null accepted_at: '2026-10-02T14:00:00Z' acceptance_order: 1 delivery: pending blocking_reason: null transcript_position: null turn: null client_id: draft-1 ResetBatch: type: object properties: generation: $ref: '#/components/schemas/Generation' cursor: $ref: '#/components/schemas/Counter' events: type: array prefixItems: - $ref: '#/components/schemas/ResetEvent' items: $ref: '#/components/schemas/SessionEvent' minItems: 1 maxItems: 256 snapshot: $ref: '#/components/schemas/Session' description: Leading reset and complete snapshot. Later events, if any, follow the snapshot cursor. Envelope cursor advances through every delivered event. required: [generation, cursor, events, snapshot] additionalProperties: false examples: - generation: J6kYj6IGcXyP3eMIp-WL3A cursor: 0 events: - type: reset data: reason: initial snapshot: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session automatic_name: New session workspace: /workspace/project location: host: null user: null path: /workspace/project label: null parent_id: null root_id: 01a0fcea-2b00-7000-8000-000000000001 address: null depth: 0 closed: false created_at: '2026-10-02T14:00:00Z' activity_at: '2026-10-02T14:00:00Z' provider_profile: personal model: example-model effort: null status: phase: idle run_id: null interrupt_requested: false blocking_reason: null preview: text: '' transcript_count: 0 truncated: false preferences: pinned: false pin_order: null archived: false opens: 0 current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 creation: submitted: kind: new workspace: /workspace/project name: null provider_profile: null model: null effort: null resolved: workspace: /workspace/project provider_profile: personal model: example-model effort: null revision: config-1 family_revision: family-1 configuration_resource: url: /sessions/01a0fcea-2b00-7000-8000-000000000001?view=configuration etag: '"session-config-1"' value: id: 01a0fcea-2b00-7000-8000-000000000001 name: New session workspace: /workspace/project provider_profile: personal model: example-model effort: null preferences: pinned: false pin_order: null archived: false selection: extensions: {} skills: {} instructions: {} mcp: {} revision: config-1 workspace_change: null selection: overrides: extensions: {} skills: {} instructions: {} mcp: {} effective: extensions: {} skills: {} instructions: {} mcp: {} composition: desired_revision: composition-1 loaded_revision: null needs_reload: true dependencies: {} quarantine: [] availability: {} kernel: instance_id: null state: none stage: null build: null stale: false staleness_reasons: [] live_job_count: 0 running_jobs: [] pending_inputs: [] input_order: 0 usage: model: null observed_at: null prompt_tokens: null cached_prompt_tokens: null cache_write_tokens: null completion_tokens: null total_tokens: null elapsed_ms: null tokens_per_second: null context_window_tokens: null cache_ttl_seconds: null cache_fade: [] history: items: [] older: null newer: null high_water: 0 glances: [] FailureBatch: type: object properties: generation: $ref: '#/components/schemas/Generation' cursor: $ref: '#/components/schemas/Counter' events: type: array items: $ref: '#/components/schemas/FailureEvent' minItems: 1 maxItems: 1 description: Terminal failure, alone with no snapshot. It does not commit a replacement cursor. required: [generation, cursor, events] additionalProperties: false examples: - generation: J6kYj6IGcXyP3eMIp-WL3A cursor: 0 events: - type: failure data: code: history_unavailable detail: Durable history could not be loaded. SessionBatch: oneOf: - $ref: '#/components/schemas/ReplayBatch' - $ref: '#/components/schemas/ResetBatch' - $ref: '#/components/schemas/FailureBatch' x-max-encoded-bytes: 1048576 ActivityEvent: type: object properties: type: const: activity data: type: object properties: session_id: $ref: '#/components/schemas/ID' cursor: $ref: '#/components/schemas/Cursor' status: $ref: '#/components/schemas/SessionStatus' current_progress: type: array items: $ref: '#/components/schemas/ToolProgress' maxItems: 32 activity: $ref: '#/components/schemas/Activity' required: [session_id, cursor, status, current_progress, activity] additionalProperties: false required: [type, data] additionalProperties: false CollectionInvalidateEvent: type: object properties: type: const: invalidate data: type: object properties: urls: type: array items: $ref: '#/components/schemas/ResourceURL' maxItems: 200 session_ids: type: array items: $ref: '#/components/schemas/ID' maxItems: 200 scope_dirty: type: boolean required: [urls, session_ids, scope_dirty] additionalProperties: false required: [type, data] additionalProperties: false CollectionMailEvent: type: object properties: type: const: mail data: $ref: '#/components/schemas/MailMetadata' required: [type, data] additionalProperties: false CollectionReadyEvent: type: object properties: type: const: ready data: $ref: '#/components/schemas/EmptyRequest' required: [type, data] additionalProperties: false CollectionResetEvent: type: object properties: type: const: reset data: type: object properties: reason: const: initial required: [reason] additionalProperties: false required: [type, data] additionalProperties: false CollectionOverflowEvent: type: object properties: type: const: overflow data: $ref: '#/components/schemas/EmptyRequest' required: [type, data] additionalProperties: false CollectionReadyBatch: type: object properties: events: type: array prefixItems: - $ref: '#/components/schemas/CollectionReadyEvent' - $ref: '#/components/schemas/CollectionResetEvent' items: false minItems: 2 maxItems: 2 required: [events] additionalProperties: false examples: - events: - type: ready data: {} - type: reset data: reason: initial CollectionBatch: oneOf: - $ref: '#/components/schemas/CollectionReadyBatch' - type: object properties: events: type: array items: oneOf: - $ref: '#/components/schemas/ActivityEvent' - $ref: '#/components/schemas/CollectionInvalidateEvent' - $ref: '#/components/schemas/CollectionMailEvent' maxItems: 256 required: [events] additionalProperties: false - type: object properties: events: type: array items: $ref: '#/components/schemas/CollectionOverflowEvent' minItems: 1 maxItems: 1 required: [events] additionalProperties: false x-max-encoded-bytes: 1048576 examples: - events: - type: activity data: session_id: 01a0fcea-2b00-7000-8000-000000000001 cursor: generation: J6kYj6IGcXyP3eMIp-WL3A sequence: 0 status: phase: idle run_id: null interrupt_requested: false blocking_reason: null current_progress: [] active_output: [] activity: lines: [] output_scalars: 0 output_utf8_bytes: 0 observed_at: '2026-10-02T14:00:00Z' latest_input: null latest_answer: null SessionSSE: type: object properties: data: type: string contentMediaType: application/json contentSchema: $ref: '#/components/schemas/SessionBatch' description: One parsed SSE event. Decode data as JSON and validate SessionBatch separately; contentSchema is not asserted by ordinary JSON Schema validation. No event, id or retry fields are emitted. required: [data] additionalProperties: false examples: - data: '{"generation":"J6kYj6IGcXyP3eMIp-WL3A","cursor":0,"events":[{"type":"reset","data":{"reason":"initial"}}],"snapshot":{"id":"01a0fcea-2b00-7000-8000-000000000001","name":"New session","automatic_name":"New session","workspace":"/workspace/project","location":{"host":null,"user":null,"path":"/workspace/project","label":null},"parent_id":null,"root_id":"01a0fcea-2b00-7000-8000-000000000001","address":null,"depth":0,"closed":false,"created_at":"2026-10-02T14:00:00Z","activity_at":"2026-10-02T14:00:00Z","provider_profile":"personal","model":"example-model","effort":null,"status":{"phase":"idle","run_id":null,"interrupt_requested":false,"blocking_reason":null},"preview":{"text":"","transcript_count":0,"truncated":false},"preferences":{"pinned":false,"pin_order":null,"archived":false,"opens":0},"current_progress":[],"activity":{"lines":[],"output_scalars":0,"output_utf8_bytes":0,"observed_at":"2026-10-02T14:00:00Z","latest_input":null,"latest_answer":null},"cursor":{"generation":"J6kYj6IGcXyP3eMIp-WL3A","sequence":0},"creation":{"submitted":{"kind":"new","workspace":"/workspace/project","name":null,"provider_profile":null,"model":null,"effort":null},"resolved":{"workspace":"/workspace/project","provider_profile":"personal","model":"example-model","effort":null}},"revision":"config-1","family_revision":"family-1","configuration_resource":{"url":"/sessions/01a0fcea-2b00-7000-8000-000000000001?view=configuration","etag":"\"session-config-1\"","value":{"id":"01a0fcea-2b00-7000-8000-000000000001","name":"New session","workspace":"/workspace/project","provider_profile":"personal","model":"example-model","effort":null,"preferences":{"pinned":false,"pin_order":null,"archived":false},"selection":{"extensions":{},"skills":{},"instructions":{},"mcp":{}},"revision":"config-1"}},"workspace_change":null,"selection":{"overrides":{"extensions":{},"skills":{},"instructions":{},"mcp":{}},"effective":{"extensions":{},"skills":{},"instructions":{},"mcp":{}}},"composition":{"desired_revision":"composition-1","loaded_revision":null,"needs_reload":true,"dependencies":{},"quarantine":[],"availability":{}},"kernel":{"instance_id":null,"state":"none","stage":null,"build":null,"stale":false,"staleness_reasons":[],"live_job_count":0,"running_jobs":[]},"pending_inputs":[],"input_order":0,"usage":{"model":null,"observed_at":null,"prompt_tokens":null,"cached_prompt_tokens":null,"cache_write_tokens":null,"completion_tokens":null,"total_tokens":null,"elapsed_ms":null,"tokens_per_second":null,"context_window_tokens":null,"cache_ttl_seconds":null,"cache_fade":[]},"history":{"items":[],"older":null,"newer":null,"high_water":0},"glances":[]}}' - data: '{"generation":"J6kYj6IGcXyP3eMIp-WL3A","cursor":1,"events":[{"type":"input","sequence":1,"data":{"input":{"id":"01a0fcea-2b00-7000-8000-000000000002","session_id":"01a0fcea-2b00-7000-8000-000000000001","kind":"message","admission":"accepted","http_status":202,"problem":null,"accepted_at":"2026-10-02T14:00:00Z","acceptance_order":1,"delivery":"pending","blocking_reason":null,"transcript_position":null,"turn":null,"client_id":"draft-1"}}}]}' CollectionSSE: type: object properties: data: type: string contentMediaType: application/json contentSchema: $ref: '#/components/schemas/CollectionBatch' description: One parsed SSE event. Decode data as JSON and validate CollectionBatch separately; contentSchema is not asserted by ordinary JSON Schema validation. No event, id or retry fields are emitted. required: [data] additionalProperties: false examples: - data: '{"events":[{"type":"ready","data":{}},{"type":"reset","data":{"reason":"initial"}}]}' - data: '{"events":[{"type":"activity","data":{"session_id":"01a0fcea-2b00-7000-8000-000000000001","cursor":{"generation":"J6kYj6IGcXyP3eMIp-WL3A","sequence":0},"status":{"phase":"idle","run_id":null,"interrupt_requested":false,"blocking_reason":null},"current_progress":[],"activity":{"lines":[],"output_scalars":0,"output_utf8_bytes":0,"observed_at":"2026-10-02T14:00:00Z","latest_input":null,"latest_answer":null}}}]}' WorkItem: type: object properties: id: $ref: '#/components/schemas/ID' workspace: $ref: '#/components/schemas/Workspace' title: type: string x-max-utf8-bytes: 4096 maxLength: 4096 notes: type: string x-max-utf8-bytes: 32768 maxLength: 32768 parent_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' status: type: string enum: [open, active, blocked, done, cancelled] revision: $ref: '#/components/schemas/ID' created_at: $ref: '#/components/schemas/Timestamp' updated_at: $ref: '#/components/schemas/Timestamp' required: [id, workspace, title, notes, parent_id, session_id, run_id, status, revision, created_at, updated_at] additionalProperties: false WorkCreate: type: object properties: title: type: string x-max-utf8-bytes: 4096 maxLength: 4096 notes: type: string x-max-utf8-bytes: 32768 maxLength: 32768 parent_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' notify_session_id: $ref: '#/components/schemas/ID' required: [title] additionalProperties: false examples: - title: Fix the parser WorkPatch: type: object properties: title: type: string x-max-utf8-bytes: 4096 maxLength: 4096 notes: type: string x-max-utf8-bytes: 32768 maxLength: 32768 session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' run_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' status: type: string enum: [open, active, blocked, done, cancelled] notify_session_id: $ref: '#/components/schemas/ID' additionalProperties: false Paperclip: type: object properties: id: $ref: '#/components/schemas/ID' topic: type: string enum: [harness, workflow, bug, user, other] title: type: string x-max-utf8-bytes: 4096 maxLength: 4096 message: type: string minLength: 1 pattern: \S x-max-utf8-bytes: 32768 maxLength: 32768 suggestion: type: string x-max-utf8-bytes: 16384 maxLength: 16384 reply: type: string x-max-utf8-bytes: 16384 maxLength: 16384 status: type: string enum: [open, acknowledged, resolved, dismissed] session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' workspace: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' created_at: $ref: '#/components/schemas/Timestamp' updated_at: $ref: '#/components/schemas/Timestamp' resolution: type: string x-max-utf8-bytes: 16384 maxLength: 16384 resolving_session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' revision: $ref: '#/components/schemas/ID' required: [id, topic, title, message, suggestion, reply, status, session_id, workspace, created_at, updated_at, resolution, resolving_session_id, revision] additionalProperties: false PaperclipCreate: type: object properties: topic: type: string enum: [harness, workflow, bug, user, other] title: type: string x-max-utf8-bytes: 4096 maxLength: 4096 message: type: string minLength: 1 pattern: \S x-max-utf8-bytes: 32768 maxLength: 32768 suggestion: type: string x-max-utf8-bytes: 16384 maxLength: 16384 session_id: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' workspace: anyOf: - $ref: '#/components/schemas/Workspace' - type: 'null' required: [message] additionalProperties: false PaperclipPatch: type: object properties: status: type: string enum: [acknowledged, resolved, dismissed] reply: type: string x-max-utf8-bytes: 16384 maxLength: 16384 resolution: type: string x-max-utf8-bytes: 16384 maxLength: 16384 description: Reply cannot accompany resolved or dismissed status. It acknowledges the item. additionalProperties: false ScheduleJob: type: object properties: id: $ref: '#/components/schemas/ID' session_id: $ref: '#/components/schemas/ID' kind: type: string enum: [once, recurring, heartbeat] prompt: type: string minLength: 1 x-max-utf8-bytes: 4096 maxLength: 4096 next_at: $ref: '#/components/schemas/Timestamp' every_seconds: anyOf: - type: integer minimum: 60 maximum: 31536000 - type: 'null' revision: $ref: '#/components/schemas/ID' created_at: description: Null for historical schedules that did not record creation time. anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' updated_at: description: Null until a historical schedule records a new update. anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' required: [id, session_id, kind, prompt, next_at, every_seconds, revision, created_at, updated_at] additionalProperties: false ScheduleCreate: type: object properties: session_id: $ref: '#/components/schemas/ID' kind: type: string enum: [once, recurring, heartbeat] prompt: type: string minLength: 1 x-max-utf8-bytes: 4096 maxLength: 4096 delay_seconds: type: integer minimum: 0 maximum: 31536000 default: 0 every_seconds: type: integer minimum: 60 maximum: 31536000 required: [session_id, kind, prompt] additionalProperties: false allOf: - if: properties: kind: const: once then: not: required: [every_seconds] else: required: [every_seconds] SchedulePatch: type: object properties: kind: type: string enum: [once, recurring, heartbeat] prompt: type: string minLength: 1 x-max-utf8-bytes: 4096 maxLength: 4096 delay_seconds: type: integer minimum: 0 maximum: 31536000 every_seconds: anyOf: - type: integer minimum: 60 maximum: 31536000 - type: 'null' description: 'Validate complete candidate: once has null repetition; recurring and heartbeat require every_seconds.' additionalProperties: false LinkConfiguration: type: object properties: workspace: $ref: '#/components/schemas/Workspace' group_id: $ref: '#/components/schemas/ID' members: type: array items: $ref: '#/components/schemas/Workspace' maxItems: 200 revision: $ref: '#/components/schemas/ID' next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [workspace, group_id, members, revision, next] additionalProperties: false LinkConfigurationResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/LinkConfiguration' required: [url, etag, value] additionalProperties: false LinkGroup: type: object properties: page: $ref: '#/components/schemas/PageDescriptor' configuration_resource: $ref: '#/components/schemas/LinkConfigurationResource' presence: type: array items: type: object properties: workspace: $ref: '#/components/schemas/Workspace' exists: description: Observed directory presence. Null for an uninspected or unreachable location. anyOf: - type: boolean - type: 'null' session_count: $ref: '#/components/schemas/Counter' host: anyOf: - $ref: '#/components/schemas/Host' - type: 'null' required: [workspace, session_count, host, exists] additionalProperties: false maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [configuration_resource, presence, next] additionalProperties: false LinkMerge: type: object properties: other_workspace: $ref: '#/components/schemas/Workspace' other_etag: $ref: '#/components/schemas/ETag' required: [other_workspace, other_etag] additionalProperties: false LinkChange: type: object properties: resource: $ref: '#/components/schemas/LinkConfigurationResource' notifications: type: array items: $ref: '#/components/schemas/TargetNotification' maxItems: 200 notification_count: $ref: '#/components/schemas/Counter' truncated: type: boolean required: [resource, notifications, notification_count, truncated] additionalProperties: false HookConfiguration: type: object properties: id: $ref: '#/components/schemas/ID' name: type: string pattern: ^[A-Za-z0-9_-]{1,64}$ maxLength: 64 session_id: $ref: '#/components/schemas/ID' enabled: type: boolean signature_header: type: string pattern: ^[A-Za-z0-9-]{1,64}$ maxLength: 64 signature_prefix: type: string pattern: ^[^\r\n]*$ x-max-utf8-bytes: 32 maxLength: 32 revision: $ref: '#/components/schemas/ID' required: [id, name, session_id, enabled, signature_header, signature_prefix, revision] additionalProperties: false HookConfigurationResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/HookConfiguration' required: [url, etag, value] additionalProperties: false Hook: type: object properties: configuration_resource: $ref: '#/components/schemas/HookConfigurationResource' delivery_url: description: Where a sender posts this hook's deliveries; null while no webhook intake listener runs. anyOf: - type: string format: uri maxLength: 4096 - type: 'null' pending_count: $ref: '#/components/schemas/Counter' deferral_reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [configuration_resource, delivery_url, pending_count, deferral_reason] additionalProperties: false HookCreate: type: object properties: name: type: string pattern: ^[A-Za-z0-9_-]{1,64}$ maxLength: 64 session_id: $ref: '#/components/schemas/ID' enabled: type: boolean signature_header: type: string pattern: ^[A-Za-z0-9-]{1,64}$ maxLength: 64 signature_prefix: type: string pattern: ^[^\r\n]*$ x-max-utf8-bytes: 32 maxLength: 32 secret: type: string minLength: 1 writeOnly: true x-min-utf8-bytes: 16 x-max-utf8-bytes: 4096 maxLength: 4096 required: [name, session_id] additionalProperties: false examples: - session_id: 01a0fcea-2b00-7000-8000-000000000001 name: ci HookPatch: type: object properties: name: type: string pattern: ^[A-Za-z0-9_-]{1,64}$ maxLength: 64 enabled: type: boolean signature_header: type: string pattern: ^[A-Za-z0-9-]{1,64}$ maxLength: 64 signature_prefix: type: string pattern: ^[^\r\n]*$ x-max-utf8-bytes: 32 maxLength: 32 additionalProperties: false HookSecretRequest: type: object properties: secret: type: string minLength: 1 writeOnly: true x-min-utf8-bytes: 16 x-max-utf8-bytes: 4096 maxLength: 4096 additionalProperties: false HookChange: type: object properties: resource: $ref: '#/components/schemas/HookConfigurationResource' notification: $ref: '#/components/schemas/Notification' secret: type: string minLength: 1 x-min-utf8-bytes: 16 x-max-utf8-bytes: 4096 maxLength: 4096 description: Secret appears only on creation and explicit rotation, including a generated secret. Never present on PATCH or reads. required: [resource, notification] additionalProperties: false examples: - resource: url: /extensions/webhooks/hooks/hook-1?view=configuration etag: '"hook-revision-1"' value: id: hook-1 name: ci session_id: 01a0fcea-2b00-7000-8000-000000000001 enabled: true signature_header: X-Albedo-Signature signature_prefix: sha256= revision: hook-revision-1 notification: state: not_requested code: null detail: null secret: synthetic-example-hook-secret HookPermission: type: object properties: session_id: $ref: '#/components/schemas/ID' agent_manage: type: boolean revision: $ref: '#/components/schemas/ID' required: [session_id, agent_manage, revision] additionalProperties: false HookPermissionPatch: type: object properties: agent_manage: type: boolean additionalProperties: false HookPermissionResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/HookPermission' required: [url, etag, value] additionalProperties: false HookPermissionChange: type: object properties: resource: $ref: '#/components/schemas/HookPermissionResource' notification: $ref: '#/components/schemas/Notification' required: [resource, notification] additionalProperties: false DiscordID: type: string minLength: 1 maxLength: 64 description: Discord snowflake as decimal text. DiscordBot: type: object properties: id: $ref: '#/components/schemas/ID' session_id: $ref: '#/components/schemas/ID' name: type: string minLength: 1 maxLength: 64 owner_id: $ref: '#/components/schemas/DiscordID' enabled: type: boolean revision: type: integer minimum: 1 state: type: string enum: [disabled, connecting, online, reconnecting, failed] detail: anyOf: - type: string maxLength: 4096 - type: 'null' user: anyOf: - $ref: '#/components/schemas/DiscordBotUser' - type: 'null' application_id: anyOf: - $ref: '#/components/schemas/DiscordID' - type: 'null' invite_url: anyOf: - type: string maxLength: 4096 - type: 'null' channels: $ref: '#/components/schemas/Counter' allowed: $ref: '#/components/schemas/Counter' requests: $ref: '#/components/schemas/Counter' required: [id, session_id, name, owner_id, enabled, revision, state, detail, user, application_id, invite_url, channels, allowed, requests] additionalProperties: false description: A session's Discord bot. The token never leaves the daemon. DiscordBotUser: type: object properties: id: $ref: '#/components/schemas/DiscordID' username: type: string maxLength: 256 required: [id, username] additionalProperties: false DiscordBotPage: type: object properties: items: type: array items: $ref: '#/components/schemas/DiscordBot' required: [items] additionalProperties: false DiscordBotCreate: type: object properties: session_id: $ref: '#/components/schemas/ID' name: type: string minLength: 1 maxLength: 64 token: type: string minLength: 1 maxLength: 4096 owner_id: type: string pattern: ^[0-9]{17,20}$ required: [session_id, name, token, owner_id] additionalProperties: false DiscordBotPatch: type: object properties: revision: type: integer minimum: 1 name: type: string minLength: 1 maxLength: 64 token: type: string minLength: 1 maxLength: 4096 owner_id: type: string pattern: ^[0-9]{17,20}$ enabled: type: boolean required: [revision] additionalProperties: false DiscordDeletion: type: object properties: deleted: $ref: '#/components/schemas/ID' required: [deleted] additionalProperties: false DiscordUserDeletion: type: object properties: deleted: $ref: '#/components/schemas/DiscordID' required: [deleted] additionalProperties: false DiscordDelivery: type: string enum: ['off', turn, tool] description: off ignores the channel; turn queues messages until the running turn ends; tool steers the running turn after its current tool call. DiscordGuildList: type: object properties: guilds: type: array items: $ref: '#/components/schemas/DiscordGuild' required: [guilds] additionalProperties: false DiscordGuild: type: object properties: id: $ref: '#/components/schemas/DiscordID' name: type: string maxLength: 256 channels: type: array items: $ref: '#/components/schemas/DiscordChannel' required: [id, name, channels] additionalProperties: false DiscordChannel: type: object properties: id: $ref: '#/components/schemas/DiscordID' name: type: string maxLength: 256 type: type: integer description: Discord channel type; 0 text, 2 voice, 4 category, 5 announcement, 15 forum. parent_id: anyOf: - $ref: '#/components/schemas/DiscordID' - type: 'null' position: type: integer delivery: $ref: '#/components/schemas/DiscordDelivery' mentions_only: type: boolean required: [id, name, type, parent_id, position, delivery, mentions_only] additionalProperties: false DiscordChannelSetting: type: object properties: delivery: $ref: '#/components/schemas/DiscordDelivery' mentions_only: type: boolean guild_id: $ref: '#/components/schemas/DiscordID' guild_name: type: string maxLength: 256 channel_name: type: string maxLength: 256 required: [delivery, mentions_only] additionalProperties: false DiscordChannelState: type: object properties: channel_id: $ref: '#/components/schemas/DiscordID' delivery: $ref: '#/components/schemas/DiscordDelivery' mentions_only: type: boolean required: [channel_id, delivery, mentions_only] additionalProperties: false DiscordDMs: type: object properties: owner: $ref: '#/components/schemas/DiscordOwner' allowed: type: array items: $ref: '#/components/schemas/DiscordAllowed' requests: type: array items: $ref: '#/components/schemas/DiscordRequest' maxItems: 50 required: [owner, allowed, requests] additionalProperties: false DiscordOwner: type: object properties: user_id: $ref: '#/components/schemas/DiscordID' name: anyOf: - type: string maxLength: 256 - type: 'null' required: [user_id, name] additionalProperties: false DiscordAllowed: type: object properties: user_id: $ref: '#/components/schemas/DiscordID' name: anyOf: - type: string maxLength: 256 - type: 'null' added_at: type: integer minimum: 0 description: Unix milliseconds. required: [user_id, name, added_at] additionalProperties: false DiscordRequest: type: object properties: user_id: $ref: '#/components/schemas/DiscordID' username: type: string maxLength: 256 preview: type: string maxLength: 200 last_at: type: integer minimum: 0 description: Unix milliseconds. count: type: integer minimum: 1 required: [user_id, username, preview, last_at, count] additionalProperties: false description: Someone whose DMs were refused because they are not on the allow list. DiscordAllow: type: object properties: name: anyOf: - type: string maxLength: 256 - type: 'null' required: [name] additionalProperties: false Delivery: type: object properties: id: $ref: '#/components/schemas/ID' hook_id: $ref: '#/components/schemas/ID' session_id: $ref: '#/components/schemas/ID' received_at: $ref: '#/components/schemas/Timestamp' delivered_at: anyOf: - $ref: '#/components/schemas/Timestamp' - type: 'null' attempts: $ref: '#/components/schemas/Counter' deferral_reason: anyOf: - $ref: '#/components/schemas/SafeReason' - type: 'null' required: [id, hook_id, session_id, received_at, delivered_at, attempts, deferral_reason] DeliveryDetail: allOf: - $ref: '#/components/schemas/Delivery' - type: object properties: payload: type: object properties: encoding: type: string enum: [utf8, base64] data: type: string maxLength: 90000 required: [encoding, data] additionalProperties: false required: [payload] WorkResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/WorkItem' required: [url, etag, value] additionalProperties: false WorkChange: type: object properties: resource: $ref: '#/components/schemas/WorkResource' notification: $ref: '#/components/schemas/Notification' required: [resource, notification] additionalProperties: false examples: - resource: url: /extensions/work/items/work-1?workspace=%2Fworkspace%2Fproject etag: '"work-revision-1"' value: id: work-1 workspace: /workspace/project title: Fix the parser notes: '' parent_id: null session_id: null run_id: null status: open revision: work-revision-1 created_at: '2026-10-02T14:00:00Z' updated_at: '2026-10-02T14:00:00Z' notification: state: not_requested code: null detail: null WorkPage: type: object properties: items: type: array items: $ref: '#/components/schemas/WorkResource' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' page: $ref: '#/components/schemas/PageDescriptor' glance: $ref: '#/components/schemas/Glance' required: [items, next] additionalProperties: false PaperclipResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/Paperclip' required: [url, etag, value] additionalProperties: false PaperclipChange: type: object properties: resource: $ref: '#/components/schemas/PaperclipResource' notification: $ref: '#/components/schemas/Notification' required: [resource, notification] additionalProperties: false PaperclipPage: type: object properties: items: type: array items: $ref: '#/components/schemas/PaperclipResource' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' page: $ref: '#/components/schemas/PageDescriptor' glance: $ref: '#/components/schemas/Glance' required: [items, next] additionalProperties: false WebSearchProvider: type: object properties: name: $ref: '#/components/schemas/ID' label: type: string maxLength: 256 position: type: integer minimum: 1 enabled: type: boolean required: [name, label, position, enabled] additionalProperties: false WebSearchProviderResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/WebSearchProvider' required: [url, etag, value] additionalProperties: false WebSearchProviderPage: type: object properties: items: type: array items: $ref: '#/components/schemas/WebSearchProviderResource' maxItems: 200 next: type: 'null' page: $ref: '#/components/schemas/PageDescriptor' required: [items, next, page] additionalProperties: false WebSearchProviderChangeRequest: type: object properties: change: type: string enum: [up, down, toggle] required: [change] additionalProperties: false WebSearchProviderChange: type: object properties: resource: $ref: '#/components/schemas/WebSearchProviderResource' required: [resource] additionalProperties: false ScheduleResource: type: object properties: url: $ref: '#/components/schemas/ResourceURL' etag: $ref: '#/components/schemas/ETag' value: $ref: '#/components/schemas/ScheduleJob' required: [url, etag, value] additionalProperties: false ScheduleChange: type: object properties: resource: $ref: '#/components/schemas/ScheduleResource' notification: $ref: '#/components/schemas/Notification' required: [resource, notification] additionalProperties: false SchedulePage: type: object properties: items: type: array items: $ref: '#/components/schemas/ScheduleResource' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' page: $ref: '#/components/schemas/PageDescriptor' glance: $ref: '#/components/schemas/Glance' required: [items, next] additionalProperties: false HookPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Hook' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false DeliveryPage: type: object properties: items: type: array items: $ref: '#/components/schemas/Delivery' maxItems: 200 next: anyOf: - $ref: '#/components/schemas/PageToken' - type: 'null' required: [items, next] additionalProperties: false ExtensionDeletion: type: object properties: id: $ref: '#/components/schemas/ID' notification: $ref: '#/components/schemas/Notification' required: [id, notification] additionalProperties: false ProxyTextPart: type: object properties: type: const: text text: type: string required: [type, text] additionalProperties: false ProxyImagePart: type: object properties: type: const: image_url image_url: type: object properties: url: type: string pattern: ^data:image/(png|jpeg|gif|webp);base64, detail: type: string enum: [auto, low, high] required: [url] additionalProperties: false required: [type, image_url] additionalProperties: false ProxyToolCall: type: object properties: id: type: string minLength: 1 maxLength: 270000 type: const: function function: type: object properties: name: type: string minLength: 1 maxLength: 256 arguments: type: string required: [name, arguments] additionalProperties: false required: [id, type, function] additionalProperties: false ProxyMessage: type: object properties: role: type: string enum: [system, developer, user, assistant, tool] content: anyOf: - oneOf: - type: string - type: array items: oneOf: - $ref: '#/components/schemas/ProxyTextPart' - $ref: '#/components/schemas/ProxyImagePart' - type: 'null' name: type: string maxLength: 256 tool_call_id: type: string minLength: 1 maxLength: 270000 tool_calls: type: array items: $ref: '#/components/schemas/ProxyToolCall' maxItems: 200 reasoning_content: anyOf: - type: string - type: 'null' description: Tool messages require tool_call_id. Only assistant messages carry tool_calls. Images are accepted only as user data URLs. required: [role] additionalProperties: false ProxyToolDefinition: type: object properties: type: const: function function: type: object properties: name: type: string minLength: 1 maxLength: 256 description: type: string parameters: $ref: '#/components/schemas/DynamicJSON' strict: type: boolean required: [name] additionalProperties: false required: [type, function] additionalProperties: false ProxyCompletionRequest: type: object properties: model: type: string minLength: 1 maxLength: 577 messages: type: array items: $ref: '#/components/schemas/ProxyMessage' tools: type: array items: $ref: '#/components/schemas/ProxyToolDefinition' maxItems: 200 max_tokens: type: integer minimum: 1 maximum: 9007199254740991 max_completion_tokens: type: integer minimum: 1 maximum: 9007199254740991 temperature: type: number minimum: 0 maximum: 2 top_p: type: number minimum: 0 maximum: 1 stop: oneOf: - type: string - type: array items: type: string maxItems: 4 tool_choice: oneOf: - type: string enum: [none, auto, required] - type: object properties: type: const: function function: type: object properties: name: type: string minLength: 1 maxLength: 256 required: [name] additionalProperties: false required: [type, function] additionalProperties: false parallel_tool_calls: type: boolean reasoning_effort: type: string maxLength: 100 reasoning: type: object properties: effort: type: string maxLength: 100 required: [effort] additionalProperties: false response_format: oneOf: - type: object properties: type: const: json_object required: [type] additionalProperties: false - type: object properties: type: const: json_schema json_schema: type: object properties: name: type: string maxLength: 256 description: type: string schema: $ref: '#/components/schemas/DynamicJSON' strict: type: boolean required: [name, schema] additionalProperties: false required: [type, json_schema] additionalProperties: false stream: type: boolean default: false stream_options: type: object properties: include_usage: type: boolean additionalProperties: false x-max-encoded-bytes: 32000000 required: [model, messages] additionalProperties: false examples: - model: personal/example-model messages: - role: user content: Hello stream: true ProxyUsage: type: object properties: prompt_tokens_details: type: object properties: cached_tokens: $ref: '#/components/schemas/Counter' required: [cached_tokens] additionalProperties: false completion_tokens_details: type: object properties: reasoning_tokens: $ref: '#/components/schemas/Counter' required: [reasoning_tokens] additionalProperties: false prompt_tokens: $ref: '#/components/schemas/Counter' completion_tokens: $ref: '#/components/schemas/Counter' total_tokens: $ref: '#/components/schemas/Counter' required: [prompt_tokens, completion_tokens, total_tokens] additionalProperties: false ProxyError: type: object properties: error: type: object properties: message: type: string maxLength: 4096 type: type: string maxLength: 100 code: anyOf: - type: string maxLength: 100 - type: 'null' param: anyOf: - type: string maxLength: 256 - type: 'null' required: [message, type, code, param] additionalProperties: false required: [error] additionalProperties: false ProxyCompletion: type: object properties: id: $ref: '#/components/schemas/ID' object: const: chat.completion created: $ref: '#/components/schemas/Counter' model: type: string maxLength: 577 choices: type: array items: type: object properties: index: $ref: '#/components/schemas/Counter' message: type: object properties: role: const: assistant content: anyOf: - type: string - type: 'null' reasoning_content: anyOf: - type: string - type: 'null' tool_calls: type: array items: $ref: '#/components/schemas/ProxyToolCall' maxItems: 200 required: [role, content] additionalProperties: false finish_reason: type: string enum: [stop, length, tool_calls, content_filter] required: [index, message, finish_reason] additionalProperties: false minItems: 1 maxItems: 1 usage: anyOf: - $ref: '#/components/schemas/ProxyUsage' - type: 'null' required: [id, object, created, model, choices, usage] additionalProperties: false examples: - id: completion-1 object: chat.completion created: 1790949600 model: personal/example-model choices: - index: 0 message: role: assistant content: Hello finish_reason: stop usage: prompt_tokens: 1 completion_tokens: 1 total_tokens: 2 ProxyToolDelta: type: object properties: index: $ref: '#/components/schemas/Counter' id: type: string minLength: 1 maxLength: 270000 type: const: function function: type: object properties: name: type: string maxLength: 256 arguments: type: string required: [name, arguments] additionalProperties: false required: [index] additionalProperties: false ProxyChunk: type: object properties: id: $ref: '#/components/schemas/ID' object: const: chat.completion.chunk created: $ref: '#/components/schemas/Counter' model: type: string maxLength: 577 choices: type: array items: type: object properties: index: $ref: '#/components/schemas/Counter' delta: type: object properties: role: const: assistant content: type: string reasoning_content: type: string tool_calls: type: array items: $ref: '#/components/schemas/ProxyToolDelta' maxItems: 200 additionalProperties: false finish_reason: anyOf: - type: string enum: [stop, length, tool_calls, content_filter] - type: 'null' required: [index, delta, finish_reason] additionalProperties: false maxItems: 1 usage: anyOf: - $ref: '#/components/schemas/ProxyUsage' - type: 'null' required: [id, object, created, model, choices] additionalProperties: false ProxySSE: type: object properties: data: anyOf: - const: '[DONE]' - type: string contentMediaType: application/json contentSchema: oneOf: - $ref: '#/components/schemas/ProxyChunk' - $ref: '#/components/schemas/ProxyError' description: Data is a JSON chunk or error, followed by literal [DONE]. Validate decoded JSON explicitly. required: [data] additionalProperties: false ProxyModels: type: object properties: object: const: list data: type: array items: type: object properties: id: type: string minLength: 1 maxLength: 577 object: const: model created: $ref: '#/components/schemas/Counter' owned_by: type: string maxLength: 256 required: [id, object, created, owned_by] additionalProperties: false errors: type: array items: type: object properties: profile: $ref: '#/components/schemas/ID' message: type: string maxLength: 4096 required: [profile, message] additionalProperties: false maxItems: 200 required: [object, data] additionalProperties: false AdmissionProblem: type: object properties: type: const: about:blank title: type: string maxLength: 256 status: type: integer minimum: 400 maximum: 599 detail: type: string maxLength: 4096 code: type: string minLength: 1 maxLength: 100 fields: type: array items: type: object properties: pointer: type: string maxLength: 4096 detail: type: string maxLength: 4096 required: [pointer, detail] additionalProperties: false maxItems: 100 required: [type, title, status, detail, code] additionalProperties: false ContextCompaction: type: object properties: status: type: string enum: [not_configured, not_needed, compacted, unknown] strategy: anyOf: - $ref: '#/components/schemas/ID' - type: 'null' trigger_free_percent: anyOf: - type: number minimum: 0 maximum: 100 - type: 'null' input_limit_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' estimated_input_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' provider_input_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' provider_cached_input_tokens: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' before_items: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' after_items: anyOf: - $ref: '#/components/schemas/Counter' - type: 'null' source: anyOf: - type: string maxLength: 512 - type: 'null' estimate_method: anyOf: - type: string maxLength: 512 - type: 'null' required: [status, strategy, trigger_free_percent, input_limit_tokens, estimated_input_tokens, provider_input_tokens, provider_cached_input_tokens, before_items, after_items, source, estimate_method] additionalProperties: false