47dfd110a0
The box's existing service-account domain-wide-delegation grant already includes gmail.compose, which authorizes users.messages.send — verified 2026-06-15 by a token-mint probe and a live messages.send to grant. So CRM-originated mail can send through the account that already powers email capture: no SMTP account, no app password, no admin change. - backend/email_integration/gmail_send.py: send_via_gmail() impersonates a domain user and POSTs users.messages.send (reuses credentials.py + the compose scope; mirrors compose.py's REST pattern). - backend/digest_mailer.py: send_digest() prefers Gmail DWD when enabled, falls back to smtp_send otherwise. Sender = CRM_DIGEST_SENDER else first active admin. - server.py: the admin test endpoint now routes through digest_mailer (so the Settings button sends via DWD on the box with zero SMTP config). Recipient restriction to the admin set and no-leak error handling preserved. - test_gmail_send.py: build/send + transport routing (provider + urlopen faked). 19/19 backend green; s9pk typechecks. SMTP (v75) stays as the fallback transport. Send-path decision + scope finding recorded in ROADMAP.md and AGENTS.md.
40 lines
1.6 KiB
Bash
40 lines
1.6 KiB
Bash
# Ten31 agentic system — environment template.
|
|
# Copy to .env (gitignored) and fill in. Secret values NEVER go in .env.example.
|
|
|
|
# ── Claude (frontier reasoning; Agent SDK uses an API key, not claude.ai login) ──
|
|
ANTHROPIC_API_KEY=
|
|
|
|
# ── Spark Control gateway (local model services; reads + dense embeds) ──
|
|
# HTTPS with the Start9 self-signed cert -> clients must skip TLS verification.
|
|
SPARK_CONTROL_URL=https://<spark-control-host>:<port>
|
|
SPARK_CONTROL_VERIFY_TLS=false
|
|
|
|
# ── Qdrant (direct, for ingest: create collection + upsert points) ──
|
|
# Plain HTTP on the trusted LAN, no auth currently.
|
|
QDRANT_URL=http://<spark2-host>:6333
|
|
|
|
# ── X (Twitter) API for Scout/Analyst enrichment (NOT a CRM key) ──
|
|
X_API_KEY=
|
|
|
|
# ── CRM (ingest opens the SQLite file directly, read-only) ──
|
|
CRM_DB_PATH=./data/crm.db
|
|
CRM_DEV_DB_PATH=./data/crm_dev.db
|
|
|
|
# ── Daily-digest sender ──
|
|
# The digest mailer prefers Gmail domain-wide delegation (the service account that
|
|
# already powers email capture; its grant includes gmail.compose, which can send) and
|
|
# falls back to SMTP below. For the Gmail/DWD path it sends impersonating this domain
|
|
# user; if unset, it uses the first active admin's email.
|
|
CRM_DIGEST_SENDER=
|
|
|
|
# ── Daily-digest outbound SMTP fallback (dev override of the per-package mailbox) ──
|
|
# On the Start9 box these are set by the "Configure Digest SMTP" action (written
|
|
# to /data/secrets/smtp/* and exported by docker_entrypoint.sh). For dev, set them
|
|
# here. SMTP_SECURITY is one of: starttls (587) | tls (465) | none.
|
|
SMTP_HOST=
|
|
SMTP_PORT=587
|
|
SMTP_SECURITY=starttls
|
|
SMTP_FROM=
|
|
SMTP_USERNAME=
|
|
SMTP_PASSWORD=
|