mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-19 09:38:39 +00:00
Docs: cover heartbeat, cron, and plugin route updates
This commit is contained in:
@@ -176,6 +176,7 @@ Common `agentTurn` fields:
|
|||||||
- `message`: required text prompt.
|
- `message`: required text prompt.
|
||||||
- `model` / `thinking`: optional overrides (see below).
|
- `model` / `thinking`: optional overrides (see below).
|
||||||
- `timeoutSeconds`: optional timeout override.
|
- `timeoutSeconds`: optional timeout override.
|
||||||
|
- `lightContext`: optional lightweight bootstrap mode for jobs that do not need workspace bootstrap file injection.
|
||||||
|
|
||||||
Delivery config:
|
Delivery config:
|
||||||
|
|
||||||
@@ -235,6 +236,14 @@ Resolution priority:
|
|||||||
2. Hook-specific defaults (e.g., `hooks.gmail.model`)
|
2. Hook-specific defaults (e.g., `hooks.gmail.model`)
|
||||||
3. Agent config default
|
3. Agent config default
|
||||||
|
|
||||||
|
### Lightweight bootstrap context
|
||||||
|
|
||||||
|
Isolated jobs (`agentTurn`) can set `lightContext: true` to run with lightweight bootstrap context.
|
||||||
|
|
||||||
|
- Use this for scheduled chores that do not need workspace bootstrap file injection.
|
||||||
|
- In practice, the embedded runtime runs with `bootstrapContextMode: "lightweight"`, which keeps cron bootstrap context empty on purpose.
|
||||||
|
- CLI equivalents: `openclaw cron add --light-context ...` and `openclaw cron edit --light-context`.
|
||||||
|
|
||||||
### Delivery (channel + target)
|
### Delivery (channel + target)
|
||||||
|
|
||||||
Isolated jobs can deliver output to a channel via the top-level `delivery` config:
|
Isolated jobs can deliver output to a channel via the top-level `delivery` config:
|
||||||
@@ -298,7 +307,8 @@ Recurring, isolated job with delivery:
|
|||||||
"wakeMode": "next-heartbeat",
|
"wakeMode": "next-heartbeat",
|
||||||
"payload": {
|
"payload": {
|
||||||
"kind": "agentTurn",
|
"kind": "agentTurn",
|
||||||
"message": "Summarize overnight updates."
|
"message": "Summarize overnight updates.",
|
||||||
|
"lightContext": true
|
||||||
},
|
},
|
||||||
"delivery": {
|
"delivery": {
|
||||||
"mode": "announce",
|
"mode": "announce",
|
||||||
|
|||||||
@@ -42,8 +42,28 @@ Disable delivery for an isolated job:
|
|||||||
openclaw cron edit <job-id> --no-deliver
|
openclaw cron edit <job-id> --no-deliver
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Enable lightweight bootstrap context for an isolated job:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw cron edit <job-id> --light-context
|
||||||
|
```
|
||||||
|
|
||||||
Announce to a specific channel:
|
Announce to a specific channel:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
|
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Create an isolated job with lightweight bootstrap context:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw cron add \
|
||||||
|
--name "Lightweight morning brief" \
|
||||||
|
--cron "0 7 * * *" \
|
||||||
|
--session isolated \
|
||||||
|
--message "Summarize overnight updates." \
|
||||||
|
--light-context \
|
||||||
|
--no-deliver
|
||||||
|
```
|
||||||
|
|
||||||
|
`--light-context` applies to isolated agent-turn jobs only. For cron runs, lightweight mode keeps bootstrap context empty instead of injecting the full workspace bootstrap set.
|
||||||
|
|||||||
@@ -971,6 +971,7 @@ Periodic heartbeat runs.
|
|||||||
every: "30m", // 0m disables
|
every: "30m", // 0m disables
|
||||||
model: "openai/gpt-5.2-mini",
|
model: "openai/gpt-5.2-mini",
|
||||||
includeReasoning: false,
|
includeReasoning: false,
|
||||||
|
lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files
|
||||||
session: "main",
|
session: "main",
|
||||||
to: "+15555550123",
|
to: "+15555550123",
|
||||||
directPolicy: "allow", // allow (default) | block
|
directPolicy: "allow", // allow (default) | block
|
||||||
@@ -987,6 +988,7 @@ Periodic heartbeat runs.
|
|||||||
- `every`: duration string (ms/s/m/h). Default: `30m`.
|
- `every`: duration string (ms/s/m/h). Default: `30m`.
|
||||||
- `suppressToolErrorWarnings`: when true, suppresses tool error warning payloads during heartbeat runs.
|
- `suppressToolErrorWarnings`: when true, suppresses tool error warning payloads during heartbeat runs.
|
||||||
- `directPolicy`: direct/DM delivery policy. `allow` (default) permits direct-target delivery. `block` suppresses direct-target delivery and emits `reason=dm-blocked`.
|
- `directPolicy`: direct/DM delivery policy. `allow` (default) permits direct-target delivery. `block` suppresses direct-target delivery and emits `reason=dm-blocked`.
|
||||||
|
- `lightContext`: when true, heartbeat runs use lightweight bootstrap context and keep only `HEARTBEAT.md` from workspace bootstrap files.
|
||||||
- Per-agent: set `agents.list[].heartbeat`. When any agent defines `heartbeat`, **only those agents** run heartbeats.
|
- Per-agent: set `agents.list[].heartbeat`. When any agent defines `heartbeat`, **only those agents** run heartbeats.
|
||||||
- Heartbeats run full agent turns — shorter intervals burn more tokens.
|
- Heartbeats run full agent turns — shorter intervals burn more tokens.
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ Troubleshooting: [/automation/troubleshooting](/automation/troubleshooting)
|
|||||||
2. Create a tiny `HEARTBEAT.md` checklist in the agent workspace (optional but recommended).
|
2. Create a tiny `HEARTBEAT.md` checklist in the agent workspace (optional but recommended).
|
||||||
3. Decide where heartbeat messages should go (`target: "none"` is the default; set `target: "last"` to route to the last contact).
|
3. Decide where heartbeat messages should go (`target: "none"` is the default; set `target: "last"` to route to the last contact).
|
||||||
4. Optional: enable heartbeat reasoning delivery for transparency.
|
4. Optional: enable heartbeat reasoning delivery for transparency.
|
||||||
5. Optional: restrict heartbeats to active hours (local time).
|
5. Optional: use lightweight bootstrap context if heartbeat runs only need `HEARTBEAT.md`.
|
||||||
|
6. Optional: restrict heartbeats to active hours (local time).
|
||||||
|
|
||||||
Example config:
|
Example config:
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ Example config:
|
|||||||
every: "30m",
|
every: "30m",
|
||||||
target: "last", // explicit delivery to last contact (default is "none")
|
target: "last", // explicit delivery to last contact (default is "none")
|
||||||
directPolicy: "allow", // default: allow direct/DM targets; set "block" to suppress
|
directPolicy: "allow", // default: allow direct/DM targets; set "block" to suppress
|
||||||
|
lightContext: true, // optional: only inject HEARTBEAT.md from bootstrap files
|
||||||
// activeHours: { start: "08:00", end: "24:00" },
|
// activeHours: { start: "08:00", end: "24:00" },
|
||||||
// includeReasoning: true, // optional: send separate `Reasoning:` message too
|
// includeReasoning: true, // optional: send separate `Reasoning:` message too
|
||||||
},
|
},
|
||||||
@@ -88,6 +90,7 @@ and logged; a message that is only `HEARTBEAT_OK` is dropped.
|
|||||||
every: "30m", // default: 30m (0m disables)
|
every: "30m", // default: 30m (0m disables)
|
||||||
model: "anthropic/claude-opus-4-6",
|
model: "anthropic/claude-opus-4-6",
|
||||||
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
|
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
|
||||||
|
lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files
|
||||||
target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "bluebubbles")
|
target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "bluebubbles")
|
||||||
to: "+15551234567", // optional channel-specific override
|
to: "+15551234567", // optional channel-specific override
|
||||||
accountId: "ops-bot", // optional multi-account channel id
|
accountId: "ops-bot", // optional multi-account channel id
|
||||||
@@ -208,6 +211,7 @@ Use `accountId` to target a specific account on multi-account channels like Tele
|
|||||||
- `every`: heartbeat interval (duration string; default unit = minutes).
|
- `every`: heartbeat interval (duration string; default unit = minutes).
|
||||||
- `model`: optional model override for heartbeat runs (`provider/model`).
|
- `model`: optional model override for heartbeat runs (`provider/model`).
|
||||||
- `includeReasoning`: when enabled, also deliver the separate `Reasoning:` message when available (same shape as `/reasoning on`).
|
- `includeReasoning`: when enabled, also deliver the separate `Reasoning:` message when available (same shape as `/reasoning on`).
|
||||||
|
- `lightContext`: when true, heartbeat runs use lightweight bootstrap context and keep only `HEARTBEAT.md` from workspace bootstrap files.
|
||||||
- `session`: optional session key for heartbeat runs.
|
- `session`: optional session key for heartbeat runs.
|
||||||
- `main` (default): agent main session.
|
- `main` (default): agent main session.
|
||||||
- Explicit session key (copy from `openclaw sessions --json` or the [sessions CLI](/cli/sessions)).
|
- Explicit session key (copy from `openclaw sessions --json` or the [sessions CLI](/cli/sessions)).
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Schema instead. See [Plugin manifest](/plugins/manifest).
|
|||||||
Plugins can register:
|
Plugins can register:
|
||||||
|
|
||||||
- Gateway RPC methods
|
- Gateway RPC methods
|
||||||
- Gateway HTTP handlers
|
- Gateway HTTP routes
|
||||||
- Agent tools
|
- Agent tools
|
||||||
- CLI commands
|
- CLI commands
|
||||||
- Background services
|
- Background services
|
||||||
@@ -106,6 +106,37 @@ Notes:
|
|||||||
- Uses core media-understanding audio configuration (`tools.media.audio`) and provider fallback order.
|
- Uses core media-understanding audio configuration (`tools.media.audio`) and provider fallback order.
|
||||||
- Returns `{ text: undefined }` when no transcription output is produced (for example skipped/unsupported input).
|
- Returns `{ text: undefined }` when no transcription output is produced (for example skipped/unsupported input).
|
||||||
|
|
||||||
|
## Gateway HTTP routes
|
||||||
|
|
||||||
|
Plugins can expose HTTP endpoints with `api.registerHttpRoute(...)`.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
api.registerHttpRoute({
|
||||||
|
path: "/acme/webhook",
|
||||||
|
auth: "plugin",
|
||||||
|
match: "exact",
|
||||||
|
handler: async (_req, res) => {
|
||||||
|
res.statusCode = 200;
|
||||||
|
res.end("ok");
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Route fields:
|
||||||
|
|
||||||
|
- `path`: route path under the gateway HTTP server.
|
||||||
|
- `auth`: required. Use `"gateway"` to require normal gateway auth, or `"plugin"` for plugin-managed auth/webhook verification.
|
||||||
|
- `match`: optional. `"exact"` (default) or `"prefix"`.
|
||||||
|
- `replaceExisting`: optional. Allows the same plugin to replace its own existing route registration.
|
||||||
|
- `handler`: return `true` when the route handled the request.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- `api.registerHttpHandler(...)` is obsolete. Use `api.registerHttpRoute(...)`.
|
||||||
|
- Plugin routes must declare `auth` explicitly.
|
||||||
|
- Exact `path + match` conflicts are rejected unless `replaceExisting: true`, and one plugin cannot replace another plugin's route.
|
||||||
|
|
||||||
## Plugin SDK import paths
|
## Plugin SDK import paths
|
||||||
|
|
||||||
Use SDK subpaths instead of the monolithic `openclaw/plugin-sdk` import when
|
Use SDK subpaths instead of the monolithic `openclaw/plugin-sdk` import when
|
||||||
|
|||||||
Reference in New Issue
Block a user