Metadata-Version: 2.4
Name: gmail-channel-molecule
Version: 0.1.1
Summary: Gmail inbound channel bridge for a Molecule workspace (poll-mode A2A relay, stdlib-only, per-workspace OAuth).
Author: Molecule AI
License: Proprietary
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: molecules-workspace-runtime>=0.3.70
Requires-Dist: qrcode>=7.4
Requires-Dist: Pillow>=10

# gmail-channel-molecule

First-party **Gmail inbound channel** for Molecule workspaces. Polls a Gmail
mailbox (stdlib only) and relays each new message into a workspace over A2A
`message/send`, deduped on the Gmail Message-ID. Credentials are **per-workspace**
— minted via a Google device grant (`gmail-connect` skill) and stored as the
workspace's own secrets; nothing mailbox-specific is baked in.

Modeled on `plugins/lark-channel`. Discoverable + install-on-demand via the
molecule-core `manifest.json` plugin catalog (NOT auto-installed).

## Layout

| Path | Purpose |
|---|---|
| `plugin.yaml` | Marketplace manifest — `kind: channel`, contributes the `gmail-bridge` daemon + `gmail-connect` skill. |
| `gmail_channel_molecule/bridge.py` | Pure decision helpers (`plan_message`/`to_envelope`) + Gmail REST + A2A relay + poll loop. |
| `gmail_channel_molecule/daemon.py` | Console entry — `poll`/`daemon` modes, env-wins credential loading, `connect` dispatch. |
| `gmail_channel_molecule/onboard.py` | Google device-grant onboarding → writes `GMAIL_*` workspace secrets + restart. |
| `skills/gmail-connect/SKILL.md` | Agent-driven connect flow (start → status → finalize). |
| `daemon-bootstrap.sh` | `contributes.daemons` entry — installs delivered source, execs the daemon. |

## Connect

See `skills/gmail-connect/SKILL.md`. In short: create a Google OAuth client of
type *"TV and Limited Input devices"*, export `GMAIL_CLIENT_ID`/`GMAIL_CLIENT_SECRET`,
then `gmail-channel-molecule connect start | status | finalize`.

## Scope (v0.1.0)

- **Inbound only** (`gmail.readonly`). Replies-to-email would be a v2 adding
  `gmail.send`.
- The daemon runs from **delivered source** (no published wheel required). The
  `connect` onboarding CLI is `pip install`ed on demand; the wheel is published to
  the org Gitea PyPI registry by `auto-release`→`publish` (a green merge to main
  cuts tag `v<version>`, which builds + uploads the wheel), so
  `pip install gmail-channel-molecule==0.1.0` resolves.
- Unit-tested (pure helpers + onboarding finalize contract); a live OAuth +
  relay verification against a real mailbox is recommended before fleet rollout.
