You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(email): expose durable webhook deliveries (DLQ + redrive) + list direction filter
Surfaces for the run402 durable mailbox-webhook delivery change. Webhook
delivery is now at-least-once with a dead-letter queue; consumers dedupe on the
canonical envelope's idempotency_key (also the Run402-Webhook-Id header).
- SDK: email.webhooks.listDeliveries / redriveDelivery; direction filter on
email.list (EmailSummary now carries direction). scoped.ts mirrors both.
- CLI: run402 email webhooks deliveries [--status] / redrive <id>;
run402 email list --direction <inbound|outbound>.
- MCP: new list_mailbox_webhook_deliveries + redrive_mailbox_webhook_delivery
tools; direction on list_emails. Registered in src/index.ts; sync.test SURFACE
+ SDK_BY_CAPABILITY updated.
- Docs: llms-mcp.txt, sdk/llms-sdk.txt, cli/llms-cli.txt, SKILL.md,
openclaw/SKILL.md document the at-least-once + idempotency contract, the
canonical envelope, the deliveries/redrive surface, and the inbound
reconciliation backstop.
Pairs with run402 commit (gateway + Lambdas). Lockstep publish pending.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-**`list_mailbox_webhook_deliveries`** / **`redrive_mailbox_webhook_delivery`** — durable-delivery visibility + replay. Delivery is at-least-once (bounded retries + exponential backoff); failures land in `failed_permanent`, the dead-letter queue. The delivered body is the canonical envelope `{ id, type, created_at, schema_version, idempotency_key, payload }` — consumers MUST dedupe on `idempotency_key`. `list_emails` accepts an optional `direction` (`inbound`|`outbound`); `inbound` lists received replies as the reconciliation backstop if a `reply_received` webhook is lost.
512
513
-**`register_sender_domain`** / **`sender_domain_status`** / **`remove_sender_domain`** — send from your own domain (DKIM verified).
513
514
-**`enable_sender_domain_inbound`** / **`disable_sender_domain_inbound`** — receive replies on your custom sender domain.
- `run402 email list [--mailbox <slug|id>] [--project <id>]`
1229
+
- `run402 email list [--direction <inbound|outbound>] [--mailbox <slug|id>] [--project <id>]` — lists BOTH sent + received by default; `--direction inbound` lists received replies (the reconciliation backstop if a reply_received webhook is lost)
1230
1230
- `run402 email get <message_id> [--mailbox <slug|id>] [--project <id>]`
1231
1231
- `run402 email reply <message_id> --html <html> [--text <text>] [--subject <subject>] [--from-name <name>] [--mailbox <slug|id>] [--project <id>]` — reply to an inbound message (threads via In-Reply-To)
1232
1232
- `run402 email get-raw <message_id> --output <file> [--mailbox <slug|id>] [--project <id>]` — fetch raw RFC-822 bytes of an inbound message (for DKIM/zk-email verification). `--output` is required: bytes are written to the file; stdout receives a JSON envelope `{ message_id, bytes, output }` so the CLI stays pipeable. Inbound only; outbound returns 404.
- `run402 email webhooks deliveries [--status <pending|in_flight|delivered|failed_permanent>] [--mailbox <slug|id>] [--project <id>]` — list durable delivery rows. Delivery is at-least-once with bounded retries + backoff; `failed_permanent` is the dead-letter queue. The delivered body is the canonical envelope `{ id, type, created_at, schema_version, idempotency_key, payload }` — consumers MUST dedupe on `idempotency_key`.
1240
+
- `run402 email webhooks redrive <delivery_id> [--mailbox <slug|id>] [--project <id>]` — re-queue a dead-lettered (failed_permanent) delivery for another attempt
1239
1241
1240
1242
Raw HTML: `--subject` (max 998 chars) + `--html` (max 1MB). Plaintext auto-generated from HTML if `--text` omitted. `--from-name` sets display name on From header (both modes): `"My App" <slug@mail.run402.com>`.
- `list_mailbox_webhook_deliveries` / `redrive_mailbox_webhook_delivery` — durable-delivery visibility + replay. Webhook delivery is **at-least-once** with bounded retries + exponential backoff; failures that exhaust the budget (or fail permanently) land in `failed_permanent` — the dead-letter queue. `list_mailbox_webhook_deliveries` (optional `status` filter) inspects pending/delivered/dead-lettered rows; `redrive_mailbox_webhook_delivery` re-queues a dead-lettered delivery after you fix the consumer. The delivered body is the canonical envelope `{ id, type, created_at, schema_version, idempotency_key, payload }` — **consumers MUST dedupe on `idempotency_key`** (also sent as the `Run402-Webhook-Id` header). Mailbox webhooks are unsigned.
395
+
- `list_emails` also takes an optional `direction` (`inbound` | `outbound`); omit for both. `direction: inbound` lists received replies — the reconciliation backstop if a `reply_received` webhook is ever lost.
394
396
- `register_sender_domain` / `sender_domain_status` / `remove_sender_domain` — send from your own DKIM-verified domain.
395
397
- `enable_sender_domain_inbound` / `disable_sender_domain_inbound` — receive replies on your custom sender domain. Returns the MX record to add.
0 commit comments