Initial commit: Howl M365 email management daemon
Full implementation of the Howl email triage system: - Microsoft Graph API integration with MSAL auth (client-credentials and delegated modes) - Claude LLM classification via tool use for structured output - PostgreSQL database with customers, vendors, whitelist, and email_log tables - Alembic migration for full schema - APScheduler daemon with graceful shutdown - Typer CLI (run, dry-run, status commands) - Business rule classifier with overrides (whitelist protection, low-confidence fallback) - Action executor (move to folders, flag, escalate with webhook) - 35 passing unit tests - README, SETUP, and NEXT_STEPS documentation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
3bfda9e585
39 changed files with 3656 additions and 0 deletions
57
pyproject.toml
Normal file
57
pyproject.toml
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "howl"
|
||||
version = "0.1.0"
|
||||
description = "M365 email management daemon with LLM-powered filtering"
|
||||
requires-python = ">=3.11"
|
||||
dependencies = [
|
||||
# Microsoft Graph + auth
|
||||
"msal>=1.31.0",
|
||||
"msgraph-sdk>=1.9.0",
|
||||
"httpx>=0.27.0",
|
||||
# Database
|
||||
"sqlalchemy>=2.0.0",
|
||||
"alembic>=1.13.0",
|
||||
"asyncpg>=0.30.0",
|
||||
"psycopg[binary]>=3.2.0",
|
||||
# LLM
|
||||
"anthropic>=0.40.0",
|
||||
# Config & validation
|
||||
"pydantic>=2.9.0",
|
||||
"pydantic-settings>=2.6.0",
|
||||
# CLI
|
||||
"typer>=0.13.0",
|
||||
"rich>=13.0.0",
|
||||
# Scheduling
|
||||
"apscheduler>=3.10.0",
|
||||
# Logging
|
||||
"structlog>=24.0.0",
|
||||
# Retry
|
||||
"tenacity>=9.0.0",
|
||||
# HTML stripping for email bodies
|
||||
"beautifulsoup4>=4.12.0",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
howl = "howl.main:app"
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
"pytest>=8.0.0",
|
||||
"pytest-asyncio>=0.24.0",
|
||||
"respx>=0.21.0",
|
||||
"pytest-cov>=5.0.0",
|
||||
]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
asyncio_mode = "auto"
|
||||
testpaths = ["tests"]
|
||||
markers = [
|
||||
"integration: marks tests that require real external services (deselect with '-m not integration')",
|
||||
]
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["howl"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue