docs/tools/lobster.md
Lobster is a workflow shell that lets OpenClaw run multi-step tool sequences as a single, deterministic operation with explicit approval checkpoints.
Lobster is one authoring layer above detached background work. For flow orchestration above individual tasks, see Task Flow (openclaw tasks flow). For the task activity ledger, see openclaw tasks.
Your assistant can build the tools that manage itself. Ask for a workflow, and 30 minutes later you have a CLI plus pipelines that run as one call. Lobster is the missing piece: deterministic pipelines, explicit approvals, and resumable state.
Today, complex workflows require many back-and-forth tool calls. Each call costs tokens, and the LLM has to orchestrate every step. Lobster moves that orchestration into a typed runtime:
Lobster is intentionally small. The goal is not "a new language," it's a predictable, AI-friendly pipeline spec with first-class approvals and resume tokens.
.lobster files from code.OpenClaw runs Lobster workflows in-process using an embedded runner. No external CLI subprocess is spawned; the workflow engine executes inside the gateway process and returns a JSON envelope directly.
If the pipeline pauses for approval, the tool returns a resumeToken so you can continue later.
Build tiny commands that speak JSON, then chain them into a single Lobster call. (Example command names below — swap in your own.)
inbox list --json
inbox categorize --json
inbox apply --json
{
"action": "run",
"pipeline": "exec --json --shell 'inbox list --json' | exec --stdin json --shell 'inbox categorize --json' | exec --stdin json --shell 'inbox apply --json' | approve --preview-from-stdin --limit 5 --prompt 'Apply changes?'",
"timeoutMs": 30000
}
If the pipeline requests approval, resume with the token:
{
"action": "resume",
"token": "<resumeToken>",
"approve": true
}
AI triggers the workflow; Lobster executes the steps. Approval gates keep side effects explicit and auditable.
Example: map input items into tool calls:
gog.gmail.search --query 'newer_than:1d' \
| openclaw.invoke --tool message --action send --each --item-key message --args-json '{"provider":"telegram","to":"..."}'
For workflows that need a structured LLM step, enable the optional
llm-task plugin tool and call it from Lobster. This keeps the workflow
deterministic while still letting you classify/summarize/draft with a model.
Enable the tool:
{
"plugins": {
"entries": {
"llm-task": { "enabled": true }
}
},
"agents": {
"list": [
{
"id": "main",
"tools": { "alsoAllow": ["llm-task"] }
}
]
}
}
Use it in a pipeline:
openclaw.invoke --tool llm-task --action json --args-json '{
"prompt": "Given the input email, return intent and draft.",
"thinking": "low",
"input": { "subject": "Hello", "body": "Can you help?" },
"schema": {
"type": "object",
"properties": {
"intent": { "type": "string" },
"draft": { "type": "string" }
},
"required": ["intent", "draft"],
"additionalProperties": false
}
}'
See LLM Task for details and configuration options.
Lobster can run YAML/JSON workflow files with name, args, steps, env, condition, and approval fields. In OpenClaw tool calls, set pipeline to the file path.
name: inbox-triage
args:
tag:
default: "family"
steps:
- id: collect
command: inbox list --json
- id: categorize
command: inbox categorize --json
stdin: $collect.stdout
- id: approve
command: inbox apply --approve
stdin: $categorize.stdout
approval: required
- id: execute
command: inbox apply --execute
stdin: $categorize.stdout
condition: $approve.approved
Notes:
stdin: $step.stdout and stdin: $step.json pass a prior step’s output.condition (or when) can gate steps on $step.approved.Bundled Lobster workflows run in-process; no separate lobster binary is required. The embedded runner ships with the Lobster plugin.
If you need the standalone Lobster CLI for development or external pipelines, install it from the Lobster repo and ensure lobster is on PATH.
Lobster is an optional plugin tool (not enabled by default).
Recommended (additive, safe):
{
"tools": {
"alsoAllow": ["lobster"]
}
}
Or per-agent:
{
"agents": {
"list": [
{
"id": "main",
"tools": {
"alsoAllow": ["lobster"]
}
}
]
}
}
Avoid using tools.allow: ["lobster"] unless you intend to run in restrictive allowlist mode.
Without Lobster:
User: "Check my email and draft replies"
→ openclaw calls gmail.list
→ LLM summarizes
→ User: "draft replies to #2 and #5"
→ LLM drafts
→ User: "send #2"
→ openclaw calls gmail.send
(repeat daily, no memory of what was triaged)
With Lobster:
{
"action": "run",
"pipeline": "email.triage --limit 20",
"timeoutMs": 30000
}
Returns a JSON envelope (truncated):
{
"ok": true,
"status": "needs_approval",
"output": [{ "summary": "5 need replies, 2 need action" }],
"requiresApproval": {
"type": "approval_request",
"prompt": "Send 2 draft replies?",
"items": [],
"resumeToken": "..."
}
}
User approves → resume:
{
"action": "resume",
"token": "<resumeToken>",
"approve": true
}
One workflow. Deterministic. Safe.
runRun a pipeline in tool mode.
{
"action": "run",
"pipeline": "gog.gmail.search --query 'newer_than:1d' | email.triage",
"cwd": "workspace",
"timeoutMs": 30000,
"maxStdoutBytes": 512000
}
Run a workflow file with args:
{
"action": "run",
"pipeline": "/path/to/inbox-triage.lobster",
"argsJson": "{\"tag\":\"family\"}"
}
resumeContinue a halted workflow after approval.
{
"action": "resume",
"token": "<resumeToken>",
"approve": true
}
cwd: Relative working directory for the pipeline (must stay within the gateway working directory).timeoutMs: Abort the workflow if it exceeds this duration (default: 20000).maxStdoutBytes: Abort the workflow if output exceeds this size (default: 512000).argsJson: JSON string passed to lobster run --args-json (workflow files only).Lobster returns a JSON envelope with one of three statuses:
ok → finished successfullyneeds_approval → paused; requiresApproval.resumeToken is required to resumecancelled → explicitly denied or cancelledThe tool surfaces the envelope in both content (pretty JSON) and details (raw object).
If requiresApproval is present, inspect the prompt and decide:
approve: true → resume and continue side effectsapprove: false → cancel and finalize the workflowUse approve --preview-from-stdin --limit N to attach a JSON preview to approval requests without custom jq/heredoc glue. Resume tokens are now compact: Lobster stores workflow resume state under its state dir and hands back a small token key.
OpenProse pairs well with Lobster: use /prose to orchestrate multi-agent prep, then run a Lobster pipeline for deterministic approvals. If a Prose program needs Lobster, allow the lobster tool for sub-agents via tools.subagents.tools. See OpenProse.
lobster timed out → increase timeoutMs, or split a long pipeline.lobster output exceeded maxStdoutBytes → raise maxStdoutBytes or reduce output size.lobster returned invalid JSON → ensure the pipeline runs in tool mode and prints only JSON.lobster failed → check gateway logs for the embedded runner error details.One public example: a “second brain” CLI + Lobster pipelines that manage three Markdown vaults (personal, partner, shared). The CLI emits JSON for stats, inbox listings, and stale scans; Lobster chains those commands into workflows like weekly-review, inbox-triage, memory-consolidation, and shared-task-sync, each with approval gates. AI handles judgment (categorization) when available and falls back to deterministic rules when not.