Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
c1bb07b
fix(slack): route system events to bound agent sessions (#34045)
vincentkoc Mar 4, 2026
88ee571
Delete changelog/fragments directory
vincentkoc Mar 4, 2026
dc8253a
fix(memory): serialize local embedding initialization to avoid duplic…
SubtleSpark Mar 4, 2026
3fa43ec
fix(model): propagate custom provider headers to model objects (#27490)
Sid-Qin Mar 4, 2026
4fb4049
fix(daemon): handle systemctl is-enabled exit 4 (not-found) on Ubuntu…
Yuandiaodiaodiao Mar 4, 2026
c8ebd48
fix(node-host): sync rawCommand with hardened argv after executable p…
Sid-Qin Mar 4, 2026
76bfd9b
Agents: add generic poll-vote action support
gumadeiras Mar 4, 2026
7597fc5
fix(ollama): pass provider headers to Ollama stream function (#24285)
Feb 23, 2026
7531a3e
test(ollama): add default header precedence coverage
shakkernerd Mar 4, 2026
e6f0203
chore(changelog): add PR entry openclaw#24337 thanks @echoVic
shakkernerd Mar 4, 2026
efdf2ca
Outbound: allow text-only plugin adapters
liuxiaopai-ai Mar 3, 2026
bb07b2b
Outbound: avoid empty multi-media fallback sends
liuxiaopai-ai Mar 3, 2026
a970cae
chore(changelog): align outbound adapter entry openclaw#32788 thanks …
shakkernerd Mar 4, 2026
698c200
fix(outbound): fail media-only text-only adapter fallback
shakkernerd Mar 4, 2026
2123265
chore(changelog): clarify outbound media-only fallback openclaw#32788…
shakkernerd Mar 4, 2026
4cc293d
fix(review): enforce behavioral sweep validation
shakkernerd Mar 4, 2026
2b98cb6
Fix gateway restart false timeouts on Debian/systemd (#34874)
vincentkoc Mar 4, 2026
df0f2e3
Compaction/Safeguard: require structured summary headings (#25555)
rodrigouroz Mar 4, 2026
53b2479
Fix Linux daemon install checks when systemd user bus env is missing …
vincentkoc Mar 4, 2026
4242c51
agents: preserve totalTokens on request failure instead of using cont…
RealKai42 Mar 4, 2026
96021a2
fix: align AGENTS.md template section names with post-compaction extr…
echoVic Mar 4, 2026
8c5692a
Changelog: add daemon systemd user-bus fallback entry (#34884)
vincentkoc Mar 4, 2026
9c68470
Changelog: add gateway restart health entry (#34874)
vincentkoc Mar 4, 2026
b3fb881
fix: finalize spanish locale support
dvrshil Mar 4, 2026
ed05810
fix: add spanish locale support (#35038) (thanks @DaoPromociones)
dvrshil Mar 4, 2026
809f951
fix(deps): patch hono transitive audit vulnerabilities
shakkernerd Mar 4, 2026
da0e245
fix(security): avoid prototype-chain account path checks (#34982)
HOYALIM Mar 5, 2026
4d06c90
fix(deps): bump tar to 7.5.10
shakkernerd Mar 5, 2026
4989485
docs(changelog): document dependency security fixes
shakkernerd Mar 5, 2026
432e022
fix: restore auto-reply system events timeline (#34794) (thanks @anis…
anisoptera Mar 5, 2026
63ce7c7
fix(feishu): comprehensive reply mechanism — outbound replyToId forwa…
guoqunabc Mar 5, 2026
68e68bf
fix(feishu): use msg_type media for mp4 video (fixes #33674) (#33720)
polooooo Mar 5, 2026
8b8167d
fix(agents): bypass pendingDescendantRuns guard for cron announce del…
Sid-Qin Mar 5, 2026
3bf6ed1
Feishu: harden streaming merge semantics and final reply dedupe (#33245)
rexl2018 Mar 5, 2026
1059b40
fix: cron backup should preserve pre-edit snapshot (#35195) (#35234)
0xsline Mar 5, 2026
79d00ae
fix(cron): stabilize restart catch-up replay semantics (#35351)
Takhoffman Mar 5, 2026
28dc2e8
cron: narrow startup replay backoff guard (#35391)
Takhoffman Mar 5, 2026
cc5dad8
cron: unify stale-run recovery and preserve manual-run every anchors …
Takhoffman Mar 5, 2026
4bd3469
refactor(telegram): remove unused webhook callback helper (#27816)
huntharo Mar 5, 2026
5d5fa0d
fix(pr): make review claim step required
shakkernerd Mar 5, 2026
48decef
fix(skills): deduplicate slash commands by skillName across all inter…
Feb 26, 2026
fb4f52b
style: fix formatting in skill-commands.test.ts and provider.ts
Feb 26, 2026
b5a94d2
style(skills): align formatting cleanup for dedupe changes
shakkernerd Mar 5, 2026
1805735
chore(changelog): add dedupe note openclaw#27521 thanks @shivama205
shakkernerd Mar 5, 2026
987e473
fix(agents): detect Venice provider proxying xAI/Grok models for sche…
Sid-Qin Mar 5, 2026
ce0c131
fix(agents): decode HTML entities in xAI/Grok tool call arguments (#3…
Sid-Qin Mar 5, 2026
d9b69a6
fix(agents): guard promoteThinkingTagsToBlocks against malformed cont…
Sid-Qin Mar 5, 2026
8891e1e
fix(web-ui): render Accounts schema node properly (#35380)
stakeswky Mar 5, 2026
463fd47
fix(agents): guard context pruning against malformed thinking blocks …
Sid-Qin Mar 5, 2026
c4dab17
fix(gateway): prevent internal route leakage in chat.send
alexyyyander Mar 5, 2026
3a6b412
fix(gateway): pass actual version to Control UI client instead of dev…
Sid-Qin Mar 5, 2026
60849f3
chore(pr): enforce changelog placement and reduce merge sync churn
shakkernerd Mar 5, 2026
2c8ee59
TTS: add baseUrl support to OpenAI TTS config (#34321)
RealKai42 Mar 5, 2026
6a705a3
ACP: add persistent Discord channel and Telegram topic bindings (#34873)
dutifulbob Mar 5, 2026
c522154
docs(telegram): recommend allowlist for single-user DM policy (#34841)
echoVic Mar 5, 2026
06ff25c
fix(feishu): check response.ok before calling response.json() in stre…
Sid-Qin Mar 5, 2026
e5b6a4e
Mattermost: honor onmessage mention override and add gating diagnosti…
turian Mar 5, 2026
4dc0c66
fix(subagents): strip leaked [[reply_to]] tags from completion announ…
vincentkoc Mar 5, 2026
544abc9
fix(cron): restore direct fallback after announce failure in best-eff…
Takhoffman Mar 5, 2026
9741e91
test(cron): add cross-channel announce fallback regression coverage (…
Takhoffman Mar 5, 2026
136ca87
feat(mattermost): add interactive buttons support (#19957)
tonydehnke Mar 5, 2026
8d48235
fix(browser): remove deprecated --disable-blink-features=AutomationCo…
Sid-Qin Mar 5, 2026
ba223c7
fix(feishu): add HTTP timeout to prevent per-chat queue deadlocks (#3…
ayanesakura Mar 5, 2026
b9f3f8d
fix(feishu): use probed botName for mention checks (#36391)
liuxiaopai-ai Mar 5, 2026
627b37e
Feishu: honor bot mentions by ID despite aliases (Fixes #36317) (#36333)
NaturalTensor Mar 5, 2026
89b303c
Mattermost: switch plugin-sdk imports to scoped subpaths (openclaw#36…
Takhoffman Mar 5, 2026
2972d6f
fix(feishu): accept groupPolicy "allowall" as alias for "open" (#36358)
Sid-Qin Mar 5, 2026
995ae73
synthesis: fix Feishu group mention slash parsing
Sid-Qin Mar 5, 2026
174eeea
Feishu: normalize group slash command probing
liuxiaopai-ai Mar 5, 2026
09c68f8
add prependSystemContext and appendSystemContext to before_prompt_bui…
maweibin Mar 5, 2026
bc66a8f
fix(feishu): avoid media regressions from global HTTP timeout (#36500)
Takhoffman Mar 5, 2026
72cf925
Gateway: add SecretRef support for gateway.auth.token with auth-mode …
joshavant Mar 5, 2026
60a6d11
fix(embedded): classify model_context_window_exceeded as context over…
RealKai42 Mar 5, 2026
6c03761
fix(agents): skip compaction API call when session has no real messag…
Sid-Qin Mar 5, 2026
edc386e
fix(ui): catch marked.js parse errors to prevent Control UI crash (#3…
BinHPdev Mar 5, 2026
709dc67
fix(session): archive old transcript on daily/scheduled reset to prev…
byungsker Mar 5, 2026
591264e
fix(agents): set preserveSignatures to isAnthropic in resolveTranscri…
Sid-Qin Mar 5, 2026
8ac7ce7
fix: avoid false global rate-limit classification from generic cooldo…
stakeswky Mar 5, 2026
4f7bf89
Fix: queue embedded runs with global-first order for group lanes
Mar 8, 2026
d93b2a0
Fix: unblock interrupted Telegram session lanes
Mar 8, 2026
5d761bc
Fix: recover session orphan branches without losing context
Mar 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/actions/setup-node-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ runs:
if: inputs.install-bun == 'true'
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.9+cf6cdbbba"
bun-version: "1.3.9"

- name: Runtime versions
shell: bash
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@
- Live tests (real keys): `CLAWDBOT_LIVE_TEST=1 pnpm test:live` (OpenClaw-only) or `LIVE=1 pnpm test:live` (includes provider live tests). Docker: `pnpm test:docker:live-models`, `pnpm test:docker:live-gateway`. Onboarding Docker E2E: `pnpm test:docker:onboard`.
- Full kit + what’s covered: `docs/testing.md`.
- Changelog: user-facing changes only; no internal/meta notes (version alignment, appcast reminders, release process).
- Changelog placement: in the active version block, append new entries to the end of the target section (`### Changes` or `### Fixes`); do not insert new entries at the top of a section.
- Pure test additions/fixes generally do **not** need a changelog entry unless they alter user-facing behavior or the user asks for one.
- Mobile: before using a simulator, check for connected real devices (iOS + Android) and prefer them when available.

Expand Down
57 changes: 57 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion changelog/fragments/ios-live-activity-status-cleanup.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog/fragments/pr-30356.md

This file was deleted.

1 change: 1 addition & 0 deletions changelog/fragments/pr-feishu-reply-mechanism.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Feishu reply routing now uses one canonical reply-target path across inbound and outbound flows: normal groups reply to the triggering message while topic-mode groups stay on topic roots, outbound sends preserve `replyToId`/`threadId`, withdrawn reply targets fall back to direct sends, and cron duplicate suppression normalizes Feishu/Lark target IDs consistently (#32980, #32958, #33572, #33526; #33789, #33575, #33515, #33161). Thanks @guoqunabc, @bmendonca3, @MunemHashmi, and @Jimmy-xuzimo.
67 changes: 66 additions & 1 deletion docs/channels/discord.md
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,71 @@ Default slash command settings:

</Accordion>

<Accordion title="Persistent ACP channel bindings">
For stable "always-on" ACP workspaces, configure top-level typed ACP bindings targeting Discord conversations.

Config path:

- `bindings[]` with `type: "acp"` and `match.channel: "discord"`

Example:

```json5
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "discord",
accountId: "default",
peer: { kind: "channel", id: "222222222222222222" },
},
acp: { label: "codex-main" },
},
],
channels: {
discord: {
guilds: {
"111111111111111111": {
channels: {
"222222222222222222": {
requireMention: false,
},
},
},
},
},
},
}
```

Notes:

- Thread messages can inherit the parent channel ACP binding.
- In a bound channel or thread, `/new` and `/reset` reset the same ACP session in place.
- Temporary thread bindings still work and can override target resolution while active.

See [ACP Agents](/tools/acp-agents) for binding behavior details.

</Accordion>

<Accordion title="Reaction notifications">
Per-guild reaction notification mode:

Expand Down Expand Up @@ -1120,7 +1185,7 @@ High-signal Discord fields:
- actions: `actions.*`
- presence: `activity`, `status`, `activityType`, `activityUrl`
- UI: `ui.components.accentColor`
- features: `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix`
- features: `threadBindings`, top-level `bindings[]` (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix`

## Safety and operations

Expand Down
152 changes: 152 additions & 0 deletions docs/channels/mattermost.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,151 @@ Config:
- `channels.mattermost.actions.reactions`: enable/disable reaction actions (default true).
- Per-account override: `channels.mattermost.accounts.<id>.actions.reactions`.

## Interactive buttons (message tool)

Send messages with clickable buttons. When a user clicks a button, the agent receives the
selection and can respond.

Enable buttons by adding `inlineButtons` to the channel capabilities:

```json5
{
channels: {
mattermost: {
capabilities: ["inlineButtons"],
},
},
}
```

Use `message action=send` with a `buttons` parameter. Buttons are a 2D array (rows of buttons):

```
message action=send channel=mattermost target=channel:<channelId> buttons=[[{"text":"Yes","callback_data":"yes"},{"text":"No","callback_data":"no"}]]
```

Button fields:

- `text` (required): display label.
- `callback_data` (required): value sent back on click (used as the action ID).
- `style` (optional): `"default"`, `"primary"`, or `"danger"`.

When a user clicks a button:

1. All buttons are replaced with a confirmation line (e.g., "✓ **Yes** selected by @user").
2. The agent receives the selection as an inbound message and responds.

Notes:

- Button callbacks use HMAC-SHA256 verification (automatic, no config needed).
- Mattermost strips callback data from its API responses (security feature), so all buttons
are removed on click — partial removal is not possible.
- Action IDs containing hyphens or underscores are sanitized automatically
(Mattermost routing limitation).

Config:

- `channels.mattermost.capabilities`: array of capability strings. Add `"inlineButtons"` to
enable the buttons tool description in the agent system prompt.

### Direct API integration (external scripts)

External scripts and webhooks can post buttons directly via the Mattermost REST API
instead of going through the agent's `message` tool. Use `buildButtonAttachments()` from
the extension when possible; if posting raw JSON, follow these rules:

**Payload structure:**

```json5
{
channel_id: "<channelId>",
message: "Choose an option:",
props: {
attachments: [
{
actions: [
{
id: "mybutton01", // alphanumeric only — see below
type: "button", // required, or clicks are silently ignored
name: "Approve", // display label
style: "primary", // optional: "default", "primary", "danger"
integration: {
url: "http://localhost:18789/mattermost/interactions/default",
context: {
action_id: "mybutton01", // must match button id (for name lookup)
action: "approve",
// ... any custom fields ...
_token: "<hmac>", // see HMAC section below
},
},
},
],
},
],
},
}
```

**Critical rules:**

1. Attachments go in `props.attachments`, not top-level `attachments` (silently ignored).
2. Every action needs `type: "button"` — without it, clicks are swallowed silently.
3. Every action needs an `id` field — Mattermost ignores actions without IDs.
4. Action `id` must be **alphanumeric only** (`[a-zA-Z0-9]`). Hyphens and underscores break
Mattermost's server-side action routing (returns 404). Strip them before use.
5. `context.action_id` must match the button's `id` so the confirmation message shows the
button name (e.g., "Approve") instead of a raw ID.
6. `context.action_id` is required — the interaction handler returns 400 without it.

**HMAC token generation:**

The gateway verifies button clicks with HMAC-SHA256. External scripts must generate tokens
that match the gateway's verification logic:

1. Derive the secret from the bot token:
`HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)`
2. Build the context object with all fields **except** `_token`.
3. Serialize with **sorted keys** and **no spaces** (the gateway uses `JSON.stringify`
with sorted keys, which produces compact output).
4. Sign: `HMAC-SHA256(key=secret, data=serializedContext)`
5. Add the resulting hex digest as `_token` in the context.

Python example:

```python
import hmac, hashlib, json

secret = hmac.new(
b"openclaw-mattermost-interactions",
bot_token.encode(), hashlib.sha256
).hexdigest()

ctx = {"action_id": "mybutton01", "action": "approve"}
payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))
token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()

context = {**ctx, "_token": token}
```

Common HMAC pitfalls:

- Python's `json.dumps` adds spaces by default (`{"key": "val"}`). Use
`separators=(",", ":")` to match JavaScript's compact output (`{"key":"val"}`).
- Always sign **all** context fields (minus `_token`). The gateway strips `_token` then
signs everything remaining. Signing a subset causes silent verification failure.
- Use `sort_keys=True` — the gateway sorts keys before signing, and Mattermost may
reorder context fields when storing the payload.
- Derive the secret from the bot token (deterministic), not random bytes. The secret
must be the same across the process that creates buttons and the gateway that verifies.

## Directory adapter

The Mattermost plugin includes a directory adapter that resolves channel and user names
via the Mattermost API. This enables `#channel-name` and `@username` targets in
`openclaw message send` and cron/webhook deliveries.

No configuration is needed — the adapter uses the bot token from the account config.

## Multi-account

Mattermost supports multiple accounts under `channels.mattermost.accounts`:
Expand All @@ -197,3 +342,10 @@ Mattermost supports multiple accounts under `channels.mattermost.accounts`:
- No replies in channels: ensure the bot is in the channel and mention it (oncall), use a trigger prefix (onchar), or set `chatmode: "onmessage"`.
- Auth errors: check the bot token, base URL, and whether the account is enabled.
- Multi-account issues: env vars only apply to the `default` account.
- Buttons appear as white boxes: the agent may be sending malformed button data. Check that each button has both `text` and `callback_data` fields.
- Buttons render but clicks do nothing: verify `AllowedUntrustedInternalConnections` in Mattermost server config includes `127.0.0.1 localhost`, and that `EnablePostActionIntegration` is `true` in ServiceSettings.
- Buttons return 404 on click: the button `id` likely contains hyphens or underscores. Mattermost's action router breaks on non-alphanumeric IDs. Use `[a-zA-Z0-9]` only.
- Gateway logs `invalid _token`: HMAC mismatch. Check that you sign all context fields (not a subset), use sorted keys, and use compact JSON (no spaces). See the HMAC section above.
- Gateway logs `missing _token in context`: the `_token` field is not in the button's context. Ensure it is included when building the integration payload.
- Confirmation shows raw ID instead of button name: `context.action_id` does not match the button's `id`. Set both to the same sanitized value.
- Agent doesn't know about buttons: add `capabilities: ["inlineButtons"]` to the Mattermost channel config.
58 changes: 57 additions & 1 deletion docs/channels/telegram.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ Token resolution order is account-aware. In practice, config values win over env
If you upgraded and your config contains `@username` allowlist entries, run `openclaw doctor --fix` to resolve them (best-effort; requires a Telegram bot token).
If you previously relied on pairing-store allowlist files, `openclaw doctor --fix` can recover entries into `channels.telegram.allowFrom` in allowlist flows (for example when `dmPolicy: "allowlist"` has no explicit IDs yet).

For one-owner bots, prefer `dmPolicy: "allowlist"` with explicit numeric `allowFrom` IDs to keep access policy durable in config (instead of depending on previous pairing approvals).

### Finding your Telegram user ID

Safer (no third-party bot):
Expand Down Expand Up @@ -469,6 +471,59 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"

Each topic then has its own session key: `agent:zu:telegram:group:-1001234567890:topic:3`

**Persistent ACP topic binding**: Forum topics can pin ACP harness sessions through top-level typed ACP bindings:

- `bindings[]` with `type: "acp"` and `match.channel: "telegram"`

Example:

```json5
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "telegram",
accountId: "default",
peer: { kind: "group", id: "-1001234567890:topic:42" },
},
},
],
channels: {
telegram: {
groups: {
"-1001234567890": {
topics: {
"42": {
requireMention: false,
},
},
},
},
},
},
}
```

This is currently scoped to forum topics in groups and supergroups.

Template context includes:

- `MessageThreadId`
Expand Down Expand Up @@ -778,6 +833,7 @@ Primary reference:
- `channels.telegram.groups.<id>.topics.<threadId>.agentId`: route this topic to a specific agent (overrides group-level and binding routing).
- `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: per-topic override for groupPolicy (`open | allowlist | disabled`).
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: per-topic mention gating override.
- top-level `bindings[]` with `type: "acp"` and canonical topic id `chatId:topic:topicId` in `match.peer.id`: persistent ACP topic binding fields (see [ACP Agents](/tools/acp-agents#channel-specific-settings)).
- `channels.telegram.direct.<id>.topics.<threadId>.agentId`: route DM topics to a specific agent (same behavior as forum topics).
- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist).
- `channels.telegram.accounts.<account>.capabilities.inlineButtons`: per-account override.
Expand Down Expand Up @@ -809,7 +865,7 @@ Primary reference:
Telegram-specific high-signal fields:

- startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*`
- access control: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`
- access control: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, top-level `bindings[]` (`type: "acp"`)
- command/menu: `commands.native`, `commands.nativeSkills`, `customCommands`
- threading/replies: `replyToMode`
- streaming: `streaming` (preview), `blockStreaming`
Expand Down
3 changes: 3 additions & 0 deletions docs/cli/configure.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ Notes:

- Choosing where the Gateway runs always updates `gateway.mode`. You can select "Continue" without other sections if that is all you need.
- Channel-oriented services (Slack/Discord/Matrix/Microsoft Teams) prompt for channel/room allowlists during setup. You can enter names or IDs; the wizard resolves names to IDs when possible.
- If you run the daemon install step, token auth requires a token, and `gateway.auth.token` is SecretRef-managed, configure validates the SecretRef but does not persist resolved plaintext token values into supervisor service environment metadata.
- If token auth requires a token and the configured token SecretRef is unresolved, configure blocks daemon install with actionable remediation guidance.
- If both `gateway.auth.token` and `gateway.auth.password` are configured and `gateway.auth.mode` is unset, configure blocks daemon install until mode is set explicitly.

## Examples

Expand Down
7 changes: 7 additions & 0 deletions docs/cli/daemon.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ openclaw daemon uninstall
- `install`: `--port`, `--runtime <node|bun>`, `--token`, `--force`, `--json`
- lifecycle (`uninstall|start|stop|restart`): `--json`

Notes:

- `status` resolves configured auth SecretRefs for probe auth when possible.
- When token auth requires a token and `gateway.auth.token` is SecretRef-managed, `install` validates that the SecretRef is resolvable but does not persist the resolved token into service environment metadata.
- If token auth requires a token and the configured token SecretRef is unresolved, install fails closed.
- If both `gateway.auth.token` and `gateway.auth.password` are configured and `gateway.auth.mode` is unset, install is blocked until mode is set explicitly.

## Prefer

Use [`openclaw gateway`](/cli/gateway) for current docs and examples.
6 changes: 6 additions & 0 deletions docs/cli/dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,9 @@ Open the Control UI using your current auth.
openclaw dashboard
openclaw dashboard --no-open
```

Notes:

- `dashboard` resolves configured `gateway.auth.token` SecretRefs when possible.
- For SecretRef-managed tokens (resolved or unresolved), `dashboard` prints/copies/opens a non-tokenized URL to avoid exposing external secrets in terminal output, clipboard history, or browser-launch arguments.
- If `gateway.auth.token` is SecretRef-managed but unresolved in this command path, the command prints a non-tokenized URL and explicit remediation guidance instead of embedding an invalid token placeholder.
Loading
Loading