From cac467a2df312bed1d6f44daffc9bb9e57362152 Mon Sep 17 00:00:00 2001 From: Jake Date: Fri, 9 Jan 2026 13:28:18 +1300 Subject: [PATCH 1/2] Hooks: default agent delivery to true --- docs/automation/webhook.md | 4 ++-- src/gateway/hooks.ts | 2 +- src/gateway/server-http.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/automation/webhook.md b/docs/automation/webhook.md index 1535bae4c..17e47432a 100644 --- a/docs/automation/webhook.md +++ b/docs/automation/webhook.md @@ -57,7 +57,7 @@ Payload: "name": "Email", "sessionKey": "hook:email:msg-123", "wakeMode": "now", - "deliver": false, + "deliver": true, "provider": "last", "to": "+15551234567", "model": "openai/gpt-5.2-mini", @@ -70,7 +70,7 @@ Payload: - `name` optional (string): Human-readable name for the hook (e.g., "GitHub"), used as a prefix in session summaries. - `sessionKey` optional (string): The key used to identify the agent's session. Defaults to a random `hook:`. Using a consistent key allows for a multi-turn conversation within the hook context. - `wakeMode` optional (`now` | `next-heartbeat`): Whether to trigger an immediate heartbeat (default `now`) or wait for the next periodic check. -- `deliver` optional (boolean): If `true`, the agent's response will be sent to the messaging provider. Defaults to `false`. Responses that are only heartbeat acknowledgments are automatically skipped. +- `deliver` optional (boolean): If `true`, the agent's response will be sent to the messaging provider. Defaults to `true`. Responses that are only heartbeat acknowledgments are automatically skipped. - `provider` optional (string): The messaging service for delivery. One of: `last`, `whatsapp`, `telegram`, `discord`, `slack`, `signal`, `imessage`. Defaults to `last`. - `to` optional (string): The recipient identifier for the provider (e.g., phone number for WhatsApp/Signal, chat ID for Telegram, channel ID for Discord/Slack). Defaults to the last recipient in the main session. - `model` optional (string): Model override (e.g., `anthropic/claude-3-5-sonnet` or an alias). Must be in the allowed model list if restricted. diff --git a/src/gateway/hooks.ts b/src/gateway/hooks.ts index b0cd50708..7f8d23045 100644 --- a/src/gateway/hooks.ts +++ b/src/gateway/hooks.ts @@ -210,7 +210,7 @@ export function normalizeAgentPayload( if (modelRaw !== undefined && !model) { return { ok: false, error: "model required" }; } - const deliver = payload.deliver === true; + const deliver = payload.deliver !== false; const thinkingRaw = payload.thinking; const thinking = typeof thinkingRaw === "string" && thinkingRaw.trim() diff --git a/src/gateway/server-http.ts b/src/gateway/server-http.ts index 4b81261cd..7a7212368 100644 --- a/src/gateway/server-http.ts +++ b/src/gateway/server-http.ts @@ -176,7 +176,7 @@ export function createHooksRequestHandler( name: mapped.action.name ?? "Hook", wakeMode: mapped.action.wakeMode, sessionKey: mapped.action.sessionKey ?? "", - deliver: mapped.action.deliver === true, + deliver: mapped.action.deliver !== false, provider: mapped.action.provider ?? "last", to: mapped.action.to, model: mapped.action.model, From 40fcfc947981de4731fc91d6efd47fc3d3f55963 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 9 Jan 2026 17:34:22 +0100 Subject: [PATCH 2/2] test: cover hook deliver default (#533) (thanks @mcinteerj) --- CHANGELOG.md | 1 + src/gateway/hooks.test.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 569a3f1ee..cb5789ec3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - Agent: add claude-cli/opus-4.5 runner via Claude CLI with resume support (tools disabled). - CLI: move `clawdbot message` to subcommands (`message send|poll|…`), fold Discord/Slack/Telegram/WhatsApp tools into `message`, and require `--provider` unless only one provider is configured. - CLI: improve `logs` output (pretty/plain/JSONL), add gateway unreachable hint, and document logging. +- Hooks: default hook agent delivery to true. (#533) — thanks @mcinteerj - WhatsApp: route queued replies to the original sender instead of the bot's own number. (#534) — thanks @mcinteerj - Models: add OAuth expiry checks in doctor, expanded `models status` auth output (missing auth + `--check` exit codes). (#538) — thanks @latitudeki5223 - Deps: bump Pi to 0.40.0 and drop pi-ai patch (upstream 429 fix). (#543) — thanks @mcinteerj diff --git a/src/gateway/hooks.test.ts b/src/gateway/hooks.test.ts index 09f9e66a3..c54606184 100644 --- a/src/gateway/hooks.test.ts +++ b/src/gateway/hooks.test.ts @@ -66,6 +66,16 @@ describe("gateway hooks helpers", () => { expect(ok.value.sessionKey).toBe("hook:fixed"); expect(ok.value.provider).toBe("last"); expect(ok.value.name).toBe("Hook"); + expect(ok.value.deliver).toBe(true); + } + + const explicitNoDeliver = normalizeAgentPayload( + { message: "hello", deliver: false }, + { idFactory: () => "fixed" }, + ); + expect(explicitNoDeliver.ok).toBe(true); + if (explicitNoDeliver.ok) { + expect(explicitNoDeliver.value.deliver).toBe(false); } const imsg = normalizeAgentPayload(