mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-07 02:51:50 +00:00
fix(skills/email/himalaya): document v1.2.0 folder.aliases syntax
The bundled himalaya skill documented folder aliases using a stale
TOML schema (`[accounts.NAME.folder.alias]`, singular) that himalaya
v1.2.0 silently ignores. The TOML parses without error, but the
alias resolver never reads the sub-section — every lookup then falls
through to the canonical folder name.
Source: in `pimalaya/core` (the `email-lib` crate himalaya v1.2.0
depends on, currently v0.27.0), `email/src/folder/config.rs` defines
`FolderConfig { aliases: Option<HashMap<String, String>>, ... }`
(plural, no `#[serde(rename)]`/`alias` aliases, no
`deny_unknown_fields`), and `account/config/mod.rs::get_folder_alias`
returns the input verbatim when no alias is found. So the singular
`alias` key deserializes to nothing and lookups silently fall
through.
On Gmail (where `sent` resolves to `[Gmail]/Sent Mail`, not `Sent`)
this means save-to-Sent fails *after* SMTP delivery already
succeeded, and `himalaya message send` exits non-zero. Any caller
(agent, script, user) that retries on that exit code will re-run
the entire send — including SMTP — producing duplicate emails to
recipients. Silent ignore + caller-level retry is significantly
worse than a config that just doesn't work.
This commit updates SKILL.md and references/configuration.md to the
v1.2.0 `folder.aliases.X` syntax (plural, dotted keys, directly
under the account section), adds a Gmail-specific block with the
`[Gmail]/Sent Mail`-style mapping, and adds notes on the failure
mode so future readers don't hit the same trap. SKILL.md version
bumped 1.0.0 → 1.1.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9cda237bb1
commit
a919269eb5
2 changed files with 66 additions and 3 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
name: himalaya
|
name: himalaya
|
||||||
description: "Himalaya CLI: IMAP/SMTP email from terminal."
|
description: "Himalaya CLI: IMAP/SMTP email from terminal."
|
||||||
version: 1.0.0
|
version: 1.1.0
|
||||||
author: community
|
author: community
|
||||||
license: MIT
|
license: MIT
|
||||||
metadata:
|
metadata:
|
||||||
|
|
@ -71,8 +71,28 @@ message.send.backend.encryption.type = "start-tls"
|
||||||
message.send.backend.login = "you@example.com"
|
message.send.backend.login = "you@example.com"
|
||||||
message.send.backend.auth.type = "password"
|
message.send.backend.auth.type = "password"
|
||||||
message.send.backend.auth.cmd = "pass show email/smtp"
|
message.send.backend.auth.cmd = "pass show email/smtp"
|
||||||
|
|
||||||
|
# Folder aliases (himalaya v1.2.0+ syntax). Required whenever the
|
||||||
|
# server's folder names don't match himalaya's canonical names
|
||||||
|
# (inbox/sent/drafts/trash). Gmail is the common case — see
|
||||||
|
# `references/configuration.md` for the `[Gmail]/Sent Mail` mapping.
|
||||||
|
folder.aliases.inbox = "INBOX"
|
||||||
|
folder.aliases.sent = "Sent"
|
||||||
|
folder.aliases.drafts = "Drafts"
|
||||||
|
folder.aliases.trash = "Trash"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **Heads up on the alias syntax.** Pre-v1.2.0 docs used a
|
||||||
|
> `[accounts.NAME.folder.alias]` sub-section (singular `alias`).
|
||||||
|
> v1.2.0 silently ignores that form — TOML parses fine, but the
|
||||||
|
> alias resolver never reads it, so every lookup falls through to
|
||||||
|
> the canonical name. On Gmail this means save-to-Sent fails *after*
|
||||||
|
> SMTP delivery succeeds, and `himalaya message send` exits non-zero.
|
||||||
|
> Any caller (agent, script, user) that retries on that exit code
|
||||||
|
> will re-run the entire send — including SMTP — producing duplicate
|
||||||
|
> emails to recipients. Always use `folder.aliases.X` (plural, dotted
|
||||||
|
> keys, directly under `[accounts.NAME]`).
|
||||||
|
|
||||||
## Hermes Integration Notes
|
## Hermes Integration Notes
|
||||||
|
|
||||||
- **Reading, listing, searching, moving, deleting** all work directly through the terminal tool
|
- **Reading, listing, searching, moving, deleting** all work directly through the terminal tool
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,13 @@ message.send.backend.encryption.type = "start-tls"
|
||||||
message.send.backend.login = "user@example.com"
|
message.send.backend.login = "user@example.com"
|
||||||
message.send.backend.auth.type = "password"
|
message.send.backend.auth.type = "password"
|
||||||
message.send.backend.auth.raw = "your-password"
|
message.send.backend.auth.raw = "your-password"
|
||||||
|
|
||||||
|
# Folder aliases — required whenever server folder names differ
|
||||||
|
# from himalaya's canonical names. See "Folder Aliases" below.
|
||||||
|
folder.aliases.inbox = "INBOX"
|
||||||
|
folder.aliases.sent = "Sent"
|
||||||
|
folder.aliases.drafts = "Drafts"
|
||||||
|
folder.aliases.trash = "Trash"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Password Options
|
## Password Options
|
||||||
|
|
@ -75,6 +82,16 @@ message.send.backend.encryption.type = "start-tls"
|
||||||
message.send.backend.login = "you@gmail.com"
|
message.send.backend.login = "you@gmail.com"
|
||||||
message.send.backend.auth.type = "password"
|
message.send.backend.auth.type = "password"
|
||||||
message.send.backend.auth.cmd = "pass show google/app-password"
|
message.send.backend.auth.cmd = "pass show google/app-password"
|
||||||
|
|
||||||
|
# Gmail folder mapping. Without these, save-to-Sent fails after
|
||||||
|
# SMTP delivery succeeds (Gmail's Sent folder is `[Gmail]/Sent Mail`,
|
||||||
|
# not `Sent`), and `himalaya message send` exits non-zero. Any
|
||||||
|
# caller that retries on that error will re-run SMTP — duplicate
|
||||||
|
# emails to recipients. Always include this block for Gmail.
|
||||||
|
folder.aliases.inbox = "INBOX"
|
||||||
|
folder.aliases.sent = "[Gmail]/Sent Mail"
|
||||||
|
folder.aliases.drafts = "[Gmail]/Drafts"
|
||||||
|
folder.aliases.trash = "[Gmail]/Trash"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note:** Gmail requires an App Password if 2FA is enabled.
|
**Note:** Gmail requires an App Password if 2FA is enabled.
|
||||||
|
|
@ -107,16 +124,42 @@ message.send.backend.auth.cmd = "pass show icloud/app-password"
|
||||||
|
|
||||||
## Folder Aliases
|
## Folder Aliases
|
||||||
|
|
||||||
Map custom folder names:
|
Map himalaya's canonical folder names (`inbox`, `sent`, `drafts`,
|
||||||
|
`trash`) to whatever the server actually calls them. Use the
|
||||||
|
v1.2.0 `folder.aliases.X` syntax (plural, dotted keys, directly
|
||||||
|
under `[accounts.NAME]`):
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[accounts.default.folder.alias]
|
[accounts.default]
|
||||||
|
# ... other account config ...
|
||||||
|
|
||||||
|
folder.aliases.inbox = "INBOX"
|
||||||
|
folder.aliases.sent = "Sent"
|
||||||
|
folder.aliases.drafts = "Drafts"
|
||||||
|
folder.aliases.trash = "Trash"
|
||||||
|
```
|
||||||
|
|
||||||
|
The equivalent TOML sub-section form also works in v1.2.0:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[accounts.default.folder.aliases]
|
||||||
inbox = "INBOX"
|
inbox = "INBOX"
|
||||||
sent = "Sent"
|
sent = "Sent"
|
||||||
drafts = "Drafts"
|
drafts = "Drafts"
|
||||||
trash = "Trash"
|
trash = "Trash"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **Don't use the singular `alias` form.** Pre-v1.2.0 docs showed
|
||||||
|
> `[accounts.NAME.folder.alias]` (singular). v1.2.0 silently
|
||||||
|
> ignores that sub-section — TOML parses without error, but the
|
||||||
|
> alias resolver never reads it. Every lookup then falls through
|
||||||
|
> to the canonical name. On Gmail (where `sent` is actually
|
||||||
|
> `[Gmail]/Sent Mail`) this means save-to-Sent fails *after* SMTP
|
||||||
|
> delivery succeeds, and `himalaya message send` exits non-zero.
|
||||||
|
> Any caller (agent, script, user) that retries on that error
|
||||||
|
> code will re-run the send — including SMTP — producing duplicate
|
||||||
|
> emails to recipients. Always use `folder.aliases.X` (plural).
|
||||||
|
|
||||||
## Multiple Accounts
|
## Multiple Accounts
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue