Skip to content

The Agent Settings API exposes three groups of operations: the merged settings document (read and shallow-merge patch), the persisted model-fusion composites (list, upsert, delete), and the BYOA ACP backend (status report and per-agent secret storage). Settings and fusion are process-wide config with no realm dimension, so a per-request X-Hoody-Realm header is rejected with realm_scope_unsupported. Secret values are written to a 0600 store and never returned.

Returns the effective merged settings (home → project → settings.local.json, top-level merge) plus the home-layer object that settings.patch mutates. This is the new daemon RPC settings.get.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1): the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1) selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
{
"merged": {
"theme": "dark",
"autoCompact": true,
"model": "sonnet"
},
"home": {
"theme": "dark",
"autoCompact": true
}
}
const { data } = await client.agent.settings.getSettings();

Applies a SHALLOW top-level merge into the home ~/.hoody/settings.json. A null value deletes a key. Top-level only: sending {"features":{...}} REPLACES the whole features object. Returns the resulting home object.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1): the .hoody project layer / record cwd / tool+workflow cwd.
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1) selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
FieldTypeRequiredDescription
patchobjectYesTop-level keys to merge into the home settings.json (a null value deletes the key).
{
"patch": {
"theme": "dark",
"autoCompact": true,
"legacyKey": null
}
}
{
"theme": "dark",
"autoCompact": true,
"model": "sonnet"
}
const { data } = await client.agent.settings.patchSettings({
body: { patch: { theme: "dark", autoCompact: true, legacyKey: null } }
});

Lists the persisted model-fusion composites (fusion.list). Pass ?include_invalid=true to also receive entries that failed validation (with a reason) so a broken composite is editable/deletable. This is a paginated list envelope.

NameInTypeRequiredDescription
include_invalidquerybooleanNoWhen true, also return composites that failed validation (each with a reason) so a broken composite is editable/deletable.
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1). Rejected (400 realm_scope_unsupported).
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
{
"items": [
{
"slug": "ensemble-fast",
"name": "Ensemble Fast",
"method": "majority",
"members": ["haiku", "haiku-2"],
"contextWindow": 8192
}
],
"meta": {
"total": 1,
"page": 1,
"limit": 50
}
}
for await (const composite of client.agent.settings.listFusionIterator({ include_invalid: true })) {
console.log(composite.slug);
}

Creates or updates a model-fusion composite keyed by slug (fusion.upsert). The body is the daemon FusionSpec under spec. Structural invariants (name/method/members, cycle guard, non-zero context window) are validated server-side.

NameInTypeRequiredDescription
slugpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1). Rejected (400 realm_scope_unsupported).
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
FieldTypeRequiredDescription
specobjectYesThe FusionSpec object (name, method, members, …).
{
"spec": {
"name": "Ensemble Fast",
"method": "majority",
"members": ["haiku", "haiku-2"],
"contextWindow": 8192
}
}
{
"slug": "ensemble-fast",
"saved": true
}
await client.agent.settings.upsertFusion({
path: { slug: "ensemble-fast" },
body: {
spec: {
name: "Ensemble Fast",
method: "majority",
members: ["haiku", "haiku-2"],
contextWindow: 8192
}
}
});

DELETE /api/v1/agent/settings/fusion/{slug}

Section titled “DELETE /api/v1/agent/settings/fusion/{slug}”

Removes a model-fusion composite by slug (fusion.delete).

NameInTypeRequiredDescription
slugpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1). Rejected (400 realm_scope_unsupported).
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
{
"removed": true
}
await client.agent.settings.deleteFusion({ path: { slug: "ensemble-fast" } });

Reports the BYOA delegated-session backend availability (codex / claude / gemini / opencode) — enabled flag, on-PATH status, trust posture (acp.status). A fixed status object, NOT a paginated collection.

NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
{
"codex": { "enabled": true, "onPath": true, "trusted": true },
"claude": { "enabled": true, "onPath": true, "trusted": true },
"gemini": { "enabled": false, "onPath": false, "trusted": false },
"opencode": { "enabled": true, "onPath": false, "trusted": false }
}
const { data } = await client.agent.settings.getACPStatus();

PUT /api/v1/agent/acp/agents/{agent}/secrets/{key}

Section titled “PUT /api/v1/agent/acp/agents/{agent}/secrets/{key}”

Stores (or clears) one per-backend env VALUE for a BYOA ACP agent (acp.set_secret) in the dedicated 0600 ~/.hoody/acp-secrets.env store under acp/<agent>/ (atomic temp+rename, flock). settings.json holds only the env KEY NAMES; the VALUE lives ONLY in the 0600 store. An empty value DELETES (unsets) the reference.

NameInTypeRequiredDescription
agentpathstringYesPath identifier.
keypathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1). Rejected (400 realm_scope_unsupported).
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header.
FieldTypeRequiredDescription
valuestringNoThe env secret value. Empty string clears (unsets) the reference. Stored only in the 0600 acp-secrets.env store.
{
"value": "sk-live-EXAMPLE-1234567890abcdef"
}
{
"agent": "codex",
"key": "OPENAI_API_KEY",
"stored": true,
"cleared": false
}
await client.agent.settings.setACPSecret({
path: { agent: "codex", key: "OPENAI_API_KEY" },
body: { value: "sk-live-EXAMPLE-1234567890abcdef" }
});