PageSourceSearch

https://ethosagent.ai/assets/js/5c3b48cc.230b9de5.js

js ethosagent.ai collected 2026-10-05 15:00:15 UTC 23,866 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([["5135"],{154(e,n,s){s.r(n),s.d(n,{metadata:()=>d,default:()=>a,frontMatter:()=>t,contentTitle:()=>c,toc:()=>h,assets:()=>l});var d=JSON.parse('{"id":"building/reference/sdk-client","title":"SDK client reference","description":"Constructor options, RPC namespaces, and authentication modes for EthosClient.","source":"@site/content/building/reference/sdk-client.md","sourceDirName":"building/reference","slug":"/building/reference/sdk-client","permalink":"/docs/building/reference/sdk-client","draft":false,"unlisted":false,"editUrl":"https://github.com/ethosagent/ethos/tree/main/docs/content/building/reference/sdk-client.md","tags":[],"version":"current","frontMatter":{"title":"SDK client reference","description":"Constructor options, RPC namespaces, and authentication modes for EthosClient.","kind":"reference","audience":"developer","slug":"sdk-client","updated":"2026-09-13T00:00:00.000Z"},"sidebar":"docsSidebar","previous":{"title":"Watcher tools","permalink":"/docs/building/reference/watcher-tools"},"next":{"title":"EventStream reference","permalink":"/docs/building/reference/sdk-event-stream"}}'),i=s(8265),r=s(7214);let t={title:"SDK client reference",description:"Constructor options, RPC namespaces, and authentication modes for EthosClient.",kind:"reference",audience:"developer",slug:"sdk-client",updated:new Date("2026-09-13T00:00:00.000Z")},c,l={},h=[{value:"Source",id:"source",level:2},{value:"Installation",id:"install",level:2},{value:"Constructor",id:"constructor",level:2},{value:"EthosClientOptions",id:"options",level:3},{value:"RPC property",id:"rpc",level:2},{value:"Stable namespaces",id:"stable",level:2},{value:"sessions",id:"sessions",level:3},{value:"Paged history",id:"paged-history",level:3},{value:"chat",id:"chat",level:3},{value:"personalities",id:"personalities",level:3},{value:"memory",id:"memory",level:3},{value:"meta",id:"meta",level:3},{value:"Experimental namespaces",id:"experimental",level:2},{value:"Cookie-auth mode",id:"cookie-auth",level:2},{value:"Types re-exported from the SDK",id:"types",level:2}];function o(e){let n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"EthosClient"})," is the typed RPC client for the Ethos control-plane API. It wraps an ",(0,i.jsx)(n.a,{href:"https://orpc.unnoq.com/",children:"oRPC"})," link so every call is validated against the shared contract at compile time and at runtime."]}),"\n",(0,i.jsx)(n.h2,{id:"source",children:"Source"}),"\n",(0,i.jsxs)(n.p,{children:["Defined in ",(0,i.jsx)(n.a,{href:"https://github.com/ethosagent/ethos/blob/main/packages/sdk/src/client.ts",children:(0,i.jsx)(n.code,{children:"packages/sdk/src/client.ts"})}),". Re-exported from ",(0,i.jsx)(n.code,{children:"@ethosagent/sdk"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"install",children:"Installation"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"pnpm add @ethosagent/sdk\n"})}),"\n",(0,i.jsx)(n.h2,{id:"constructor",children:"Constructor"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"import { EthosClient } from '@ethosagent/sdk';\n\nconst client = new EthosClient({\n  baseUrl: 'http://localhost:2400',\n  apiKey: 'esk_...',\n});\n"})}),"\n",(0,i.jsx)(n.h3,{id:"options",children:"EthosClientOptions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"baseUrl"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"string"})}),(0,i.jsx)(n.td,{children:"yes"}
1),(0,i.jsx)(n.td,{children:"Origin of the Ethos web-api server. Trailing slashes are stripped automatically."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"apiKey"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"string"})}),(0,i.jsx)(n.td,{children:"no"}),(0,i.jsxs)(n.td,{children:["Bearer token created via the ",(0,i.jsx)(n.code,{children:"apiKeys"})," admin namespace. When set, every request includes an ",(0,i.jsx)(n.code,{children:"Authorization: Bearer <apiKey>"})," header."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"fetch"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"typeof globalThis.fetch"})}),(0,i.jsx)(n.td,{children:"no"}),(0,i.jsxs)(n.td,{children:["Custom fetch implementation. Useful for testing or environments without a global ",(0,i.jsx)(n.code,{children:"fetch"}),". Defaults to ",(0,i.jsx)(n.code,{children:"globalThis.fetch"}),"."]})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["When ",(0,i.jsx)(n.code,{children:"apiKey"})," is omitted the client falls into ",(0,i.jsx)(n.strong,{children:"cookie-auth mode"})," -- requests are sent with ",(0,i.jsx)(n.code,{children:"credentials: 'include'"})," so the browser's session cookie authenticates instead. See ",(0,i.jsx)(n.a,{href:"#cookie-auth",children:"Cookie-auth mode"})," below."]}),"\n",(0,i.jsx)(n.h2,{id:"rpc",children:"RPC property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"client.rpc.sessions.list({ limit: 10 });\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"client.rpc"})," is a ",(0,i.jsx)(n.code,{children:"ContractRouterClient<Contract>"})," -- a fully typed proxy where each namespace and method maps one-to-one to the contract defined in ",(0,i.jsx)(n.code,{children:"@ethosagent/web-contracts"}),". Calls are sent as HTTP POST requests to ",(0,i.jsx)(n.code,{children:"<baseUrl>/rpc"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"stable",children:"Stable namespaces"}),"\n",(0,i.jsx)(n.p,{children:"These namespaces are committed to semver stability. Breaking changes require a major version bump."}),"\n",(0,i.jsx)(n.h3,{id:"sessions",children:"sessions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Input"}),(0,i.jsx)(n.th,{children:"Output"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"list"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ q?, limit?, cursor?, personalityId? }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ sessions, nextCursor }"})}),(0,i.jsx)(n.td,{children:"Paginated session list with optional FTS5 search."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"get"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, withMessages? }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ session, messages, cards }"})}),(0,i.jsxs)(n.td,{children:["Single session with full message history. ",(0,i.jsx)(n.code,{children:"withMessages: false"})," skips the history: ",(0,i.jsx)(n.code,{children:"messages"})," and ",(0,i.jsx)(n.code,{children:"cards"})," are then ",(0,i.jsx)(n.code,{children:"[]"}),', meaning "not requested".']})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"messages"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, before?, turns? }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ messages, cards, nextCursor }"})}),(0,i.jsxs)(n.td,{children:["One page of history, newest turns first. See ",(0,i.jsx)(n.a,{href:"#paged-history",children:"Paged history"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"fork"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, personalityId? }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ session }"})}),(0,i.jsx)(n.td,{children:"Fork an existing session into a new one."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"delete"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ ok: true }"})}),(0,i.jsx)(n.td,{children:"Delete a session."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"update"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, title }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ session }"})}),(0,i.jsxs)(n.td,{children:["Rename a session. Pass ",(0,i.jsx)(n.code,{children:"null"})," to clear."]})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"paged-history",children:"Paged history"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"sessions.messages"})," returns up to ",(0,i.jsx)(n.code,{children:"turns"})," (1\u2013100, default 20) whole turns. A turn starts at a ",(0,i.jsx)(n.code,{children:"user"})," message and is never split across pages; rows before the first user message come with the page that reaches the start of the session. A page also stops adding older turns at about 500 KB of message content, but always carries at least one turn. ",(0,i.jsx)(n.code,{children:"cards"})," holds only the cards whose tool call is in the page."]}),"\n",(0,i.jsxs)(n.p,{children:["Pass ",(0,i.jsx)(n.code,{children:"nextCursor"})," back as ",(0,i.jsx)(n.code,{children:"before"})," to get the next-older page. It is ",(0,i.jsx)(n.code,{children:"null"})," once the page reaches the start. The cursor is opaque and stays valid while new messages arrive. A cursor that does not decode, or that belongs to another session, fails with ",(0,i.jsx)(n.code,{children:"INVALID_INPUT"}),"; an unknown session fails with ",(0,i.jsx)(n.code,{children:"SESSION_NOT_FOUND"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"let page = await client.rpc.sessions.messages({ id: sessionId, turns: 20 });\nwhile (page.nextCursor) {\n  page = await client.rpc.sessions.messages({ id: sessionId, before: page.nextCursor });\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"chat",children:"chat"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Input"}),(0,i.jsx)(n.th,{children:"Output"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"send"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ sessionId?, clientId, text, personalityId? }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ sessionId, turnId }"})}),(0,i.jsxs)(n.td,{children:["Start a turn. The response streams over ",(0,i.jsx)(n.a,{href:"/docs/building/reference/sdk-event-stream",children:"SSE"}),", not this RPC."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"abort"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ sessionId }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ ok: true }"})}),(0,i.jsx)(n.td,{children:"Cancel the running turn for a session."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"personalities",children:"personalities"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Input"}),(0,i.jsx)(n.th,{children:"Output"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"list"})}),(0,i.jsx)(n.td,{children:"--"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalities, defaultId }"})}),(0,i.jsx)(n.td,{children:"All loaded personalities."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"get"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personality, soulMd }"})}),(0,i.jsx)(n.td,{children:"Single personality with its SOUL.md body."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"characterSheet"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ markdown }"})}),(0,i.jsx)(n.td,{children:"Rendered character sheet."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"create"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, name, ... }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personality }"})}),(0,i.jsx)(n.td,{children:"Create a new personality."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"update"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, name?, ... }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personality }"})}),(0,i.jsx)(n.td,{children:"Patch an existing personality."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"delete"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ ok: true }"})}),(0,i.jsx)(n.td,{children:"Delete a user-created personality."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"duplicate"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ id, newId }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personality }"})}),(0,i.jsx)(n.td,{children:"Clone a personality under a new id."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsList"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ skills }"})}),(0,i.jsx)(n.td,{children:"List per-personality skills."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsGet"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId, skillId }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ skill }"})}),(0,i.jsx)(n.td,{children:"Get a single personality skill."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsCreate"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId, skillId, body }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ skill }"})}),(0,i.jsx)(n.td,{children:"Create a personality skill."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsUpdate"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId, skillId, body }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ skill }"})}),(0,i.jsx)(n.td,{children:"Update a personality skill body."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsDelete"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId, skillId }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ ok: true }"})}),(0,i.jsx)(n.td,{children:"Delete a personality skill."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"skillsImportGlobal"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ personalityId, skillIds }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ imported }"})}),(0,i.jsx)(n.td,{children:"Copy global skills into a personality."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"memory",children:"memory"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Input"}),(0,i.jsx)(n.th,{children:"Output"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"list"})}),(0,i.jsx)(n.td,{children:"--"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ files }"})}),(0,i.jsx)(n.td,{children:"Both MEMORY.md and USER.md entries."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"get"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ store }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ file }"})}),(0,i.jsxs)(n.td,{children:["One store: ",(0,i.jsx)(n.code,{children:"'memory'"})," or ",(0,i.jsx)(n.code,{children:"'user'"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"write"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ store, content }"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ file }"})}),(0,i.jsx)(n.td,{children:"Overwrite a memory store."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"meta",children:"meta"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Method"}),(0,i.jsx)(n.th,{children:"Input"}),(0,i.jsx)(n.th,{children:"Output"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"capabilities"})}),(0,i.jsx)(n.td,{children:"--"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"{ capabilities }"})}),(0,i.jsxs)(n.td,{children:["Server capability flags (",(0,i.jsx)(n.code,{children:"Record<string, boolean>"}),")."]})]})})]}),"\n",(0,i.jsx)(n.h2,{id:"experimental",children:"Experimental namespaces"}),"\n",(0,i.jsxs)(n.p,{children:["These namespaces may change without a major version bump. See the ",(0,i.jsx)(n.a,{href:"/docs/building/reference/stability-tier-table",children:"stability tier table"})," for the full list."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"tools"})," -- ",(0,i.jsx)(n.code,{children:"approve"}),", ",(0,i.jsx)(n.code,{children:"deny"})," (tool approval workflow)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"clarify"})," -- ",(0,i.jsx)(n.code,{children:"respond"})," (answer a mid-turn clarification)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"onboarding"})," -- ",(0,i.jsx)(n.code,{children:"state"}
1),", ",(0,i.jsx)(n.code,{children:"validateProvider"}),", ",(0,i.jsx)(n.code,{children:"complete"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"config"})," -- ",(0,i.jsx)(n.code,{children:"get"}),", ",(0,i.jsx)(n.code,{children:"update"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"cron"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"get"}),", ",(0,i.jsx)(n.code,{children:"create"}),", ",(0,i.jsx)(n.code,{children:"delete"}),", ",(0,i.jsx)(n.code,{children:"pause"}),", ",(0,i.jsx)(n.code,{children:"resume"}),", ",(0,i.jsx)(n.code,{children:"runNow"}),", ",(0,i.jsx)(n.code,{children:"history"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"skills"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"get"}),", ",(0,i.jsx)(n.code,{children:"create"}),", ",(0,i.jsx)(n.code,{children:"update"}),", ",(0,i.jsx)(n.code,{children:"delete"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"evolver"})," -- ",(0,i.jsx)(n.code,{children:"configGet"}),", ",(0,i.jsx)(n.code,{children:"configUpdate"}),", ",(0,i.jsx)(n.code,{children:"pendingList"}),", ",(0,i.jsx)(n.code,{children:"pendingApprove"}),", ",(0,i.jsx)(n.code,{children:"pendingReject"}),", ",(0,i.jsx)(n.code,{children:"history"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"mesh"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"routeTest"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"plugins"})," -- ",(0,i.jsx)(n.code,{children:"list"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"platforms"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"set"}),", ",(0,i.jsx)(n.code,{children:"clear"}),", plus multi-bot CRUD for Telegram and Slack"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"batch"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"start"}),", ",(0,i.jsx)(n.code,{children:"get"}),", ",(0,i.jsx)(n.code,{children:"output"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"eval"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"start"}),", ",(0,i.jsx)(n.code,{children:"get"}),", ",(0,i.jsx)(n.code,{children:"output"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"kanban"})," -- ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"getBoard"}),", ",(0,i.jsx)(n.code,{children:"updateStatus"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"apiKeys"})," -- ",(0,i.jsx)(n.code,{children:"create"}),", ",(0,i.jsx)(n.code,{children:"list"}),", ",(0,i.jsx)(n.code,{children:"revoke"})," (cookie-auth only)"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"cookie-auth",children:"Cookie-auth mode"}),"\n",(0,i.jsxs)(n.p,{children:["When no ",(0,i.jsx)(n.code,{children:"apiKey"})," is provided, ",(0,i.jsx)(n.code,{children:"EthosClient"})," sends every request with ",(0,i.jsx)(n.code,{children:"credentials: 'include'"}),". This lets browser-based Mission Controls authenticate via the same session cookie the Ethos web UI uses -- no API key required."]}),"\n",(0,i.jsxs)(n.p,{children:["Cookie-auth is the only mode that can access the ",(0,i.jsx)(n.code,{children:"apiKeys"})," admin namespace. Bearer-token auth is rejected there to prevent privilege escalation."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"// Browser-side -- cookie handles auth\nconst client = new EthosClient({\n  baseUrl: 'http://localhost:2400',\n});\n"})}),"\n",(0,i.jsx)(n.h2,{id:"types",children:"Types re-exported from the SDK"}),"\n",(0,i.jsxs)(n.p,{children:["The package re-exports key types so consumers do not need to depend on ",(0,i.jsx)(n.code,{children:"@ethosagent/web-contracts"})," directly:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"EthosClient"}),", ",(0,i.jsx)(n.code,{children:"EthosClientOptions"})," -- client class and constructor options"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"EventStream"}),", ",(0,i.jsx)(n.code,{children:"EventStreamOptions"}),", ",(0,i.jsx)(n.code,{children:"EventStreamSubscription"})," -- SSE streaming"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Contract"}),", ",(0,i.jsx)(n.code,{children:"SseEvent"}),", ",(0,i.jsx)(n.code,{children:"ApiKeyScope"}),", ",(0,i.jsx)(n.code,{children:"ApiKeyMetadata"})," -- shared contract types"]}),"\n"]})]})}function a(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},7214(e,n,s){s.d(n,{R:()=>t,x:()=>c});var d=s(141);let i={},r=d.createContext(i);function t(e){let n=d.useContext(r);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),d.createElement(r.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.