Files
LLeMbas-CLI/schema/config.schema.json
T
HomerandClaude Opus 5.5 f9bad01ed7
ci / check (push) Waiting to run
LLeMbas CLI 1.0.0
The first public release of LLeMbas CLI: a terminal coding agent and project manager for any LLM
API, with permission modes, git snapshots, memory and skills, knowledge bases, MCP, voice, and a
link to a LLeMbas instance whose web UI can work its sessions too. Signed Linux binaries for x64
and arm64.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:59:03 +00:00

1044 lines
33 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"model": {
"description": "The model a session starts with: `connection/model`, a connection from connections.yaml and one of its models.",
"type": "string"
},
"small_model": {
"description": "`connection/model` for small jobs — session titles, commit messages. Default: the session's model. On a server that holds one model at a time (llama-swap), another model here swaps.",
"type": "string"
},
"titles": {
"description": "Session titles: model (default) — named from the first prompt, then by the model after its first reply; prompt — only from the first prompt, no extra request.",
"type": "string",
"enum": [
"model",
"prompt"
]
},
"mode": {
"description": "The permission mode a session starts in (default manual).",
"type": "string",
"enum": [
"manual",
"edit",
"auto",
"plan"
]
},
"theme": {
"description": "Colours: lembas (default), lembas-light, moria, shire, hermes, mono, or a themes/<name>.yaml of your own.",
"type": "string"
},
"theme_background": {
"description": "theme (default): the theme paints the whole screen; terminal: the terminal's own background shows, and the theme colours only text, panels and accents.",
"type": "string",
"enum": [
"theme",
"terminal"
]
},
"skin": {
"description": "The old name of `theme`; still read when `theme` is not set.",
"type": "string"
},
"busy_input": {
"description": "A message sent while the agent works: steer (default) — it goes in at the next step, after the running tools finish, and the agent carries on with it; queue — it is sent as the next prompt once the task is done.",
"type": "string",
"enum": [
"steer",
"queue"
]
},
"mouse": {
"description": "false: leave the mouse to the terminal — its own selection and Ctrl+Shift+C work without Shift, and the wheel no longer scrolls the transcript (pgup/pgdn do). Default true.",
"type": "boolean"
},
"icons": {
"description": "emoji (default), or plain: one-column symbols for a terminal font that has no emoji.",
"type": "string",
"enum": [
"emoji",
"plain"
]
},
"personality": {
"description": "How the agent talks: concise, pragmatic, optimistic, funny, formal, socratic, custom (personality_custom's text), or empty for none (the default). The same presets as the LLeMbas web UI; appended last to the system prompt, under \"## Personality\".",
"anyOf": [
{
"type": "string",
"enum": [
"concise",
"pragmatic",
"optimistic",
"funny",
"formal",
"socratic",
"custom"
]
},
{
"type": "string",
"const": ""
}
]
},
"personality_custom": {
"description": "The personality, in your own words: used when personality is custom (at most 1500 characters).",
"type": "string",
"maxLength": 1500
},
"memory": {
"description": "Persistent memory (MEMORY.md, USER.md in ~/.config/lembas/memory/).",
"type": "object",
"properties": {
"enabled": {
"description": "false: no memory tool and nothing remembered in the prompt.",
"type": "boolean"
},
"memory_chars": {
"description": "Size limits in characters: memory 2200, user 1375 by default.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"user_chars": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"skills": {
"type": "object",
"properties": {
"external_dirs": {
"description": "More directories of skills, read-only; a skill of the same name elsewhere wins.",
"type": "array",
"items": {
"type": "string"
}
},
"disabled": {
"description": "Skill names not to offer.",
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"permission": {
"description": "Rules per tool: `tool: allow|ask|deny` or `tool: { pattern: action }`; the last match wins.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"enum": [
"allow",
"ask",
"deny"
]
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"allow",
"ask",
"deny"
]
}
}
]
}
},
"hardline_extra": {
"description": "Global config only: extra never-allowed bash regexes.",
"type": "array",
"items": {
"type": "string"
}
},
"hardline_disable": {
"description": "Global config only: ids of built-in hardline rules to switch off.",
"type": "array",
"items": {
"type": "string"
}
},
"limits": {
"type": "object",
"properties": {
"steps": {
"description": "Most model steps in one prompt (default 200) — a runaway backstop, not a budget.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"bash_timeout": {
"description": "Seconds a bash command may run (default 120).",
"type": "number",
"exclusiveMinimum": 0
},
"wall_seconds": {
"description": "Budget for one prompt: seconds of work, not counting time spent waiting for you. Past it the model answers from what it has. Unset: none.",
"type": "number",
"exclusiveMinimum": 0
},
"output_bytes": {
"description": "Budget for one prompt: bytes of tool output read. Unset: none.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"completion_tokens": {
"description": "Budget for one prompt: tokens the model writes. Unset: none.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"question": {
"type": "object",
"properties": {
"unattended": {
"description": "With nobody to answer (headless): take the recommended option, the first, or fail.",
"type": "string",
"enum": [
"recommended",
"first",
"fail"
]
}
},
"additionalProperties": false
},
"compaction": {
"description": "Automatic context management: past auto_at of the window, old tool outputs are pruned, then the conversation is compacted. auto_at: 1 turns it off.",
"type": "object",
"properties": {
"auto_at": {
"type": "number",
"minimum": 0.1,
"maximum": 1
},
"prune": {
"type": "boolean"
}
},
"additionalProperties": false
},
"instructions": {
"description": "Custom instructions: how you want to be helped, in your own words (at most 4000 characters). Appended near the end of the system prompt, under \"## How the person you are talking to wants to be helped\" — as in the LLeMbas web UI. (A list of files here, from an older config, is read as instruction_files.)",
"type": "string",
"maxLength": 4000
},
"instruction_files": {
"description": "More instruction files for the system prompt, besides AGENTS.md / CLAUDE.md.",
"type": "array",
"items": {
"type": "string"
}
},
"search": {
"type": "object",
"properties": {
"order": {
"description": "Providers to try, in order; the first that answers wins. Default: those configured (webui first), then ddg. webui: the LLeMbas instance's own search.",
"type": "array",
"items": {
"type": "string",
"enum": [
"webui",
"searxng",
"firecrawl",
"ddg"
]
}
},
"max_results": {
"description": "Results per search (default 8).",
"type": "integer",
"minimum": 1,
"maximum": 30
},
"searxng": {
"type": "object",
"properties": {
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"categories": {
"type": "string"
},
"language": {
"type": "string"
}
},
"required": [
"base_url"
],
"additionalProperties": false
},
"firecrawl": {
"description": "API (api.firecrawl.dev, with a key) or self-hosted (its own URL, no key needed).",
"type": "object",
"properties": {
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"ddg": {
"type": "object",
"properties": {
"region": {
"type": "string"
},
"safe": {
"type": "string",
"enum": [
"strict",
"moderate",
"off"
]
}
},
"additionalProperties": false
},
"webui": {
"description": "Search through a LLeMbas instance: its provider, its settings, its keys.",
"type": "object",
"properties": {
"connection": {
"description": "Which webui connection (default: the only one there is).",
"type": "string"
}
},
"additionalProperties": false
},
"fetch": {
"description": "How web_fetch reads a page: here, through Firecrawl's scrape, or through the LLeMbas instance.",
"type": "string",
"enum": [
"local",
"firecrawl",
"webui"
]
}
},
"additionalProperties": false
},
"voice": {
"description": "Voice in and out. Global only — it carries endpoints and keys, like a connection.",
"type": "object",
"properties": {
"stt": {
"type": "object",
"properties": {
"provider": {
"description": "openai: POST {base_url}/audio/transcriptions (OpenAI, whisper.cpp's server with its OpenAI path, faster-whisper servers). whispercpp: POST {base_url}/inference (whisper.cpp's own). webui: the LLeMbas instance's.",
"type": "string",
"enum": [
"openai",
"whispercpp",
"webui"
]
},
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"key_cmd": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"timeout": {
"type": "number",
"exclusiveMinimum": 0
},
"connection": {
"description": "webui: which webui connection (default: the only one there is).",
"type": "string"
},
"model": {
"type": "string"
},
"language": {
"type": "string"
},
"prompt": {
"description": "Words it should expect: names, jargon.",
"type": "string"
},
"fallback": {
"description": "Used when the provider above cannot be reached — for webui, when the instance is down. Same fields.",
"type": "object",
"properties": {
"provider": {
"description": "openai: POST {base_url}/audio/transcriptions (OpenAI, whisper.cpp's server with its OpenAI path, faster-whisper servers). whispercpp: POST {base_url}/inference (whisper.cpp's own). webui: the LLeMbas instance's.",
"type": "string",
"enum": [
"openai",
"whispercpp",
"webui"
]
},
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"key_cmd": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"timeout": {
"type": "number",
"exclusiveMinimum": 0
},
"connection": {
"description": "webui: which webui connection (default: the only one there is).",
"type": "string"
},
"model": {
"type": "string"
},
"language": {
"type": "string"
},
"prompt": {
"description": "Words it should expect: names, jargon.",
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"tts": {
"type": "object",
"properties": {
"provider": {
"description": "openai: POST {base_url}/audio/speech (OpenAI, Kokoro-FastAPI). piper-http: POST {base_url} with {text} (piper's http_server). piper-cli: the piper program. webui: the LLeMbas instance's, in the account's voice.",
"type": "string",
"enum": [
"openai",
"piper-http",
"piper-cli",
"webui"
]
},
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"key_cmd": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"timeout": {
"type": "number",
"exclusiveMinimum": 0
},
"connection": {
"description": "webui: which webui connection (default: the only one there is).",
"type": "string"
},
"model": {
"type": "string"
},
"voice": {
"type": "string"
},
"speed": {
"type": "number",
"minimum": 0.25,
"maximum": 4
},
"command": {
"description": "piper-cli: the program (default piper) and the voice model file (.onnx).",
"type": "string"
},
"model_path": {
"type": "string"
},
"fallback": {
"description": "Used when the provider above cannot be reached — for webui, when the instance is down. Same fields.",
"type": "object",
"properties": {
"provider": {
"description": "openai: POST {base_url}/audio/speech (OpenAI, Kokoro-FastAPI). piper-http: POST {base_url} with {text} (piper's http_server). piper-cli: the piper program. webui: the LLeMbas instance's, in the account's voice.",
"type": "string",
"enum": [
"openai",
"piper-http",
"piper-cli",
"webui"
]
},
"base_url": {
"type": "string"
},
"api_key": {
"type": "string"
},
"key_cmd": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"timeout": {
"type": "number",
"exclusiveMinimum": 0
},
"connection": {
"description": "webui: which webui connection (default: the only one there is).",
"type": "string"
},
"model": {
"type": "string"
},
"voice": {
"type": "string"
},
"speed": {
"type": "number",
"minimum": 0.25,
"maximum": 4
},
"command": {
"description": "piper-cli: the program (default piper) and the voice model file (.onnx).",
"type": "string"
},
"model_path": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"record_key": {
"description": "The key that starts and stops recording (default ctrl+t).",
"type": "string"
},
"record_mode": {
"description": "toggle (default): press to start, press again (or silence) to stop. hold: also stops when the key is let go, in terminals that report it (the kitty keyboard protocol).",
"type": "string",
"enum": [
"toggle",
"hold"
]
},
"submit": {
"description": "What happens to what you said: draft (default) puts it in the prompt to check; send sends it.",
"type": "string",
"enum": [
"draft",
"send"
]
},
"speak": {
"description": "Speak every reply (default false; /speak toggles it).",
"type": "boolean"
},
"silence_seconds": {
"description": "Seconds of silence after speech that end a recording (default 3), and the longest one (120).",
"type": "number",
"exclusiveMinimum": 0
},
"max_seconds": {
"type": "number",
"exclusiveMinimum": 0
},
"silence_threshold": {
"description": "Loudness (RMS of 16-bit samples) below which it counts as silence (default 200).",
"type": "number",
"exclusiveMinimum": 0
},
"recorder": {
"description": "auto, or a program: arecord, pw-record, parec, sox, ffmpeg. `recorder_command` instead: any command printing raw 16 kHz mono signed 16-bit little-endian audio to stdout.",
"type": "string",
"enum": [
"auto",
"arecord",
"pw-record",
"parec",
"sox",
"ffmpeg"
]
},
"recorder_command": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"player": {
"description": "auto, or a program: pw-play, paplay, aplay, ffplay, mpv, afplay. `player_command` instead: any command; the WAV file's path is added at the end.",
"type": "string",
"enum": [
"auto",
"pw-play",
"paplay",
"aplay",
"ffplay",
"mpv",
"afplay"
]
},
"player_command": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"mcp": {
"description": "MCP servers by name. `{env:}`/`{file:}` are filled in per server (a missing one disables that server only). A project's servers count only once the project is trusted.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"command": {
"description": "A local server: the program (and its arguments, as a list). Either this or url.",
"anyOf": [
{
"type": "string"
},
{
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
}
]
},
"args": {
"type": "array",
"items": {
"type": "string"
}
},
"env": {
"description": "Environment for the local server; {env:}/{file:} work here.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"cwd": {
"type": "string"
},
"url": {
"description": "A remote server: its streamable HTTP (or SSE) address. Either this or command.",
"type": "string"
},
"headers": {
"description": "Extra HTTP headers, e.g. Authorization: Bearer {env:TOKEN}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"transport": {
"description": "http (default: streamable HTTP, falling back to SSE) or sse.",
"type": "string",
"enum": [
"http",
"sse"
]
},
"oauth": {
"description": "OAuth for a remote server: on by default when the server asks for it; false turns it off.",
"anyOf": [
{
"type": "boolean",
"const": false
},
{
"type": "object",
"properties": {
"client_id": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"scope": {
"type": "string"
},
"callback_port": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"additionalProperties": false
}
]
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"enabled": {
"description": "false: configured but not started (/mcp on starts it).",
"type": "boolean"
},
"timeout": {
"description": "Seconds: one tool call (default 120), connecting (default 30).",
"type": "number",
"exclusiveMinimum": 0
},
"connect_timeout": {
"type": "number",
"exclusiveMinimum": 0
},
"tools": {
"description": "Which of its tools to offer: include wins; names or globs (`create_*`).",
"type": "object",
"properties": {
"include": {
"type": "array",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"prompts": {
"description": "Offer its prompts as /server:prompt commands (default true).",
"type": "boolean"
},
"resources": {
"description": "Offer list/read tools for its resources, if it has any (default true).",
"type": "boolean"
},
"instructions": {
"description": "Put the server's own instructions into the system prompt (default true).",
"type": "boolean"
}
},
"additionalProperties": false
}
},
"knowledge": {
"description": "The knowledge bases searched (lembas kb); absent: all of them. A project's own config narrows it to what that project needs.",
"type": "array",
"items": {
"type": "string"
}
},
"embedding": {
"description": "Global config only. connection/model of an embedding model (OpenAI-shaped /embeddings, or Ollama): knowledge bases are then searched by meaning as well as by words. lembas kb reindex after changing it.",
"type": "string"
},
"effort": {
"description": "The effort a session starts with, when the model takes it; otherwise the model's own default.",
"anyOf": [
{
"type": "string",
"enum": [
"minimal",
"low",
"medium",
"high",
"xhigh",
"max"
]
},
{
"type": "string",
"const": "off"
}
]
},
"settings_tool": {
"description": "Global config only. The agent's settings tool: ask (default) — each change is approved like any tool call; allow — changes go through without asking (a less strict mode still asks); off — no settings tool.",
"type": "string",
"enum": [
"ask",
"allow",
"off"
]
},
"update": {
"description": "Global config only. Updating LLeMbas CLI itself.",
"type": "object",
"properties": {
"channel": {
"description": "stable (default): releases vX.Y.Z only. beta: also vX.Y.Z-beta.N — whichever is newest.",
"type": "string",
"enum": [
"stable",
"beta"
]
},
"auto": {
"description": "On start: install (default) — fetch, verify and install a newer release, then say so; notify — only say one is out; off — never look.",
"type": "string",
"enum": [
"install",
"notify",
"off"
]
},
"source": {
"description": "Default: the public LLeMbas CLI releases on GitHub.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"github",
"gitea",
"static"
],
"description": "github or gitea (Forgejo too): their releases API. static: any web directory with files `stable` and `beta` naming a tag, and the assets under <tag>/."
},
"url": {
"description": "gitea: the forge (https://git.example.org). github: the API (default https://api.github.com). static: the directory.",
"type": "string"
},
"repo": {
"description": "owner/name, for github and gitea.",
"type": "string",
"pattern": "^(?!\\.\\.?\\/)[\\w.-]+\\/(?!\\.\\.?$)[\\w.-]+$"
},
"token": {
"description": "For a private repository: {env:NAME} or {file:~/path}, never pasted. Or key_cmd.",
"type": "string"
},
"key_cmd": {
"type": "string"
},
"tls": {
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"required": [
"type"
],
"additionalProperties": false
},
"public_key": {
"description": "The ssh-ed25519 key(s) a release's SHA256SUMS.sig must be signed with — instead of LLeMbas CLI's own. For your own builds.",
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
},
"verify": {
"description": "signature (default): SHA256SUMS must carry a valid signature. checksum: checksums only — for a source of your own that does not sign.",
"type": "string",
"enum": [
"signature",
"checksum"
]
}
},
"additionalProperties": false
},
"library": {
"description": "Global config only. local (default): memory, notes, skills and knowledge on this machine. lembas: the account's on the LLeMbas instance you are logged in to, through its /mcp — the same tools its chats have (needs a login with the library scope).",
"type": "string",
"enum": [
"local",
"lembas"
]
},
"remote": {
"description": "Global config only. What a LLeMbas instance may ask of this machine over the link: the device decides, never the server.",
"type": "object",
"properties": {
"enabled": {
"description": "Accept work from a LLeMbas instance this machine is logged in to (lembas service). Default false.",
"type": "boolean"
},
"roots": {
"description": "The directories a remote session may be opened in, and anything under them. Empty: none.",
"type": "array",
"items": {
"type": "string"
}
},
"max_mode": {
"description": "The most permissive mode a remote session may run in (default edit). auto only when set here.",
"type": "string",
"enum": [
"manual",
"edit",
"auto",
"plan"
]
},
"approval_timeout": {
"description": "Seconds an approval waits for an answer from the web before it counts as a denial (default 600).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"require_trust": {
"description": "Only projects trusted on this machine (default true).",
"type": "boolean"
},
"terminal": {
"description": "Let the web UI open a terminal here (LLeMbas's terminal panel on a chat on this device): a login shell as this user, in a directory remote sessions may use. Default false.",
"type": "boolean"
},
"terminal_integration": {
"description": "Shell integration in those terminals (bash, zsh, fish): after your own startup files, the shell marks each prompt, command and exit status (OSC 133) and its directory (OSC 7), so the web UI shows the directory, a mark beside each finished command, and can jump between commands. false: the shell starts as it is. Default true.",
"type": "boolean"
}
},
"additionalProperties": false
}
},
"additionalProperties": false,
"title": "LLeMbas CLI config.yaml",
"description": "~/.config/lembas/config.yaml, or a project's .agent/config.yaml. Strings may be {env:NAME} or {file:path}."
}