Spaces:
Running
Running
Commit History
-
Fix sqlite database lock in ADK runner tests Running
Ashraf Al-Kassem +1: Claude Sonnet 4.6Mock LeadPilotSessionService in all run_for_contact tests to prevent a second DB connection from conflicting with the test session's open write transaction on SQLite (which only allows one writer at a time). Affected: test_run_for_contact_marks_completed, test_run_for_contact_marks_failed_on_error, test_run_for_contact_tool_call_produces_step_log_and_events, test_run_for_contact_exception_marks_instance_failed, test_wait_delay_instance_resumes_and_completes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>803e992 -
Fix CI: remove unused variable (ruff F841) + pin deps
Ashraf Al-Kassem +1: Claude Sonnet 4.6- orchestrator.py: remove unused `conversation` variable + `Conversation` import (ruff F841 was breaking lint step) - requirements.txt: add `ruff` explicitly + pin `google-adk==1.27.3` Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>579d421 -
Mission M-E — Observability & Tests
Ashraf Al-Kassem +1: Claude Sonnet 4.6- ADK callback handler (callbacks.py): logs all lifecycle events to RuntimeEventLog - agent.{name}.started/completed, agent.llm_request/response, agent.error - tool.{name}.started/completed, tool error events - _redact_sensitive() strips access_token, api_key, password, token fields - runner.py: attaches LeadPilotCallbackHandler to agent after build_orchestrator() - tracks turn duration + records agent.turns_processed / avg_turn_duration_ms metrics - metrics_service.py: adds gauge() method (overwrites, not additive) - admin.py: GET /executions/{instance_id}/trace — returns chronological event timeline - 8 new tests: test_callbacks.py (5 unit), test_e2e_agent_flow.py (3 E2E) - Frontend: execution trace timeline page at /admin/executions/[executionId] - Frontend: monitoring/page.tsx — Agent Metrics tab + View Trace links in Executions tab - docs/missions/event-types.md: full event taxonomy reference Total tests: 360 (all passing) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthr…87e5ad2 -
Mission M-D — Flow Builder Revamp
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Unlocks CONDITION and WAIT_DELAY nodes (no longer blocked from publish) - Adds PARALLEL, AGENT_HANDOFF, QUALIFICATION_GATE, INTENT_ROUTER node types - builder_translator.translate() now returns dual output: (definition_json, adk_pipeline_config) - New translate_to_adk_pipeline() function maps builder graph → ADK orchestrator config - FlowVersion.adk_pipeline_config column (JSON) populated on publish - ExecutionInstance.resume_at + resume_node_id columns for WAIT_DELAY resumption - Alembic migration s9t0u1v2w3x4 - build_orchestrator() accepts pipeline_config; applies builder tone/routing overrides - build_reply_agent() accepts tone + max_length params - Celery: resume_waiting_instances_task (every 60s) resumes WAITING instances - Frontend: ActionNode multi-handle (CONDITION: true/false, QUALIFICATION_GATE: qualified/unqualified) - Frontend: NodePalette groups (Triggers, Agent Nodes, Flow Control, Routing) - Frontend: full config forms for all new node types - 352 tests passing (8 new)…68e389f -
Mission M-C — Session & Memory
Ashraf Al-Kassem +1: Claude Sonnet 4.6Replace InMemorySessionService with LeadPilotSessionService backed by a new AgentSession DB table. ADK sessions now persist across webhook events and server restarts — agents resume mid-qualification without re-asking answered questions. - Add AgentSession model (state+events JSON, soft-delete) - Alembic migration r8s9t0u1v2w3 creates agent_session table - LeadPilotSessionService: in-memory cache + DB persistence, 50-event cap - runner.py: get-or-create pattern, one-time history seeding, update_session after turn - Admin endpoint: GET /api/v1/admin/contacts/{contact_id}/session - 6 new tests (344 total, all passing) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>98b27e0 -
Fix Alembic migrations to be idempotent against create_all race
Ashraf Al-Kassem +1: Claude Sonnet 4.6Root cause: SQLModel.metadata.create_all in startup scripts creates tables ahead of Alembic, causing subsequent migration runs to fail with "table already exists" or wrong table name errors. Fixes: - Mission 38: make user_identity CREATE TABLE idempotent, fix table name oauth_state → oauthstate (SQLModel uses lowercase class name), make purpose column addition idempotent - Mission M-B: make qualification_status/intent ADD COLUMN idempotent Both migrations now check column/table existence before creating, allowing alembic upgrade head to run safely on any DB state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>e3db935 -
debug: surface test-chat session error for HF diagnosis
Ashraf Al-Kassem +1: Claude Sonnet 4.6Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>73428ba -
Mission M-B — Multi-Agent Orchestration
Ashraf Al-Kassem +1: Claude Sonnet 4.6Replace single LlmAgent with a 5-agent hierarchy: - OrchestratorAgent routes based on lead state (qualification_status, CRM sync) - QualificationAgent: ask/mark_qualified/mark_disqualified tools - CRMAgent: upsert_zoho_lead + update_contact_field - ReplyAgent: send_reply + send_media_message (stub) - HandoverAgent: escalate_to_human + send_handover_summary (stub) tools.py refactored into named factory functions for reuse across agents. Contact model gains qualification_status + intent columns (migration q7r8s9t0u1v2). 338 tests passing (333 pre-existing + 5 new M-B tests). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>d5ba3bd -
Mission M-A — ADK Core Integration
Ashraf Al-Kassem +1: Claude Sonnet 4.6Replace sequential MVP runtime with Google ADK LlmAgent + tool system. The AI now autonomously decides which tools to call (send_reply, upsert_zoho_lead, escalate_to_human, tag_contact) instead of walking a fixed node graph. Changes: - Add google-adk>=1.0.0 to requirements.txt (installed: 1.27.3) - Make ExecutionStepLog.node_id nullable (Alembic migration p6q7r8s9t0u1) - Create app/core/adk/ package: tools.py, agent.py, runner.py - tasks.py: replace execute_instance() call with run_for_contact() - runtime.py: remove execute_instance + handle_ai_reply (ADK handles AI now) - 6 new tests in test_adk_runner.py — 333/333 passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>695c56b
-
Mission 38 — Social Login (Facebook + TikTok)
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Add UserIdentity model for multi-provider social identity storage - Add purpose field to OAuthState to separate auth vs integration flows - Add fetch_user_profile() to Facebook and TikTok OAuth adapters - New /api/v1/auth/oauth/{provider}/start + callback endpoints - Resolution logic: existing identity → email match → new user - Placeholder email for TikTok (no email scope available) - 8 new tests, all passing; fix 2 WhatsApp hardening tests (Redis mock) - Frontend: Facebook + TikTok buttons on login/signup + /auth/social/callback page Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>c324adc -
Mission 37 — Universal OAuth Provider Framework
Ashraf Al-Kassem +1: Claude Sonnet 4.6Builds a provider-agnostic OAuth foundation for Facebook, TikTok, HubSpot, and Salesforce. Establishes the reusable patterns that all future OAuth-based integrations will extend. - DB: oauthprovider (registry), oauthconnection (encrypted tokens), oauthstate (CSRF-safe state, 10-min TTL) — migration n4o5p6q7r8s9 - Provider adapters: base ABC + Facebook, TikTok, HubSpot, Salesforce - oauth_service: state creation, authorize URL, code exchange, save connection, refresh token, revoke — all tokens Fernet-encrypted - Routes: GET /oauth/{provider}/authorize, /callback, /connections, DELETE /connections/{id}, POST /connections/{id}/refresh - Admin routes: list providers+stats, list connections, toggle provider - Idempotent seed: 4 providers seeded at startup - Frontend: generic /integrations/callback page, oauth.ts utility, admin portal OAuth Providers and Connections pages - 8 tests, all pass (317/319 total suite) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>ad82999
-
Lock out dark mode to prioritize stability
Ashraf Al-Kassem3cbc63c -
Fix dark mode UI elements across dashboard
Ashraf Al-Kassemc0d36bc -
Add dark mode toggle to end-user dashboard
Ashraf Al-Kassem6c8c970 -
Refactor Template Details validation to use sonner toast
Ashraf Al-Kassem66154ca -
UI polish for Template Details and Canvas Editor
Ashraf Al-Kassem4bffb79 -
fix(admin): correct basePath-prefixed hrefs for logout and product login link
Ashraf Al-Kassem +1: Claude Sonnet 4.6Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>dffa8ae -
fix(ci): remove unused WorkspacePlan import to pass ruff F401
Ashraf Al-Kassem +1: Claude Sonnet 4.6Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>ea48905 -
fix(templates): redirect to detail page when list-page clone fails
Ashraf Al-Kassem +1: Claude Sonnet 4.6When a template has required variables and the user clicks "Use Template" from the list, the clone API returns an error which was silently swallowed — the button just reset to idle with zero feedback. On failure, now redirect to /templates/{slug} where the user can fill in required variables using the already-correct detail-page clone flow. Templates with no required variables (or all defaults set) still clone directly from the list and navigate to the new automation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>f425cfb -
fix(routing): fix broken sign-in/signup links, admin redirect, and Google OAuth
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Website CTAs (Header, Footer, CTASection, PlanCard, plans page) now use <a href="/app/..."> for cross-app navigation — Next.js <Link> was silently doing SPA navigation within the Website, which has no /login or /signup routes. - APP_URL changed from hardcoded localhost:3000 to /app (relative, works in any env). - nginx admin redirect changed from exact-match to regex so /admin/login, /admin/users, etc. are all covered. - Google OAuth redirect_uri now includes the /app basePath prefix to match the actual callback route at /app/auth/google/callback. NOTE: Google Cloud Console must also have /app/auth/google/callback added as an authorized redirect URI for Google OAuth to work end-to-end. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>e284c06
-
fix(website): commit missing Website source files needed for Docker build
Ashraf Al-Kassem +1: Claude Sonnet 4.6AnimateOnScroll, FloatingOrb, auth.ts, and catalog.ts were referenced by multiple Website pages but never added to git, causing the HuggingFace Docker build to fail with a TypeScript compile error. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>8274810 -
fix: backfill missing 'automations' entitlement to existing plans
Ashraf Al-Kassem +1: Claude Sonnet 4.6seed_plans() was skipping existing plans entirely, so the 'automations' module_key was never added as a PlanEntitlement when it was introduced in a later mission. Users with valid plans received 403 ENTITLEMENT_BLOCKED when accessing templates. Fixes: - seed_plans() now upserts missing entitlements into existing plans without removing or modifying any existing rows (idempotent) - Adds MODULE_AUTOMATIONS constant to modules.py and registers it in ALL_MODULES so seed_modules() creates the SystemModuleConfig row On first deploy, startup logs will show: [seed_plans] Seeded 0 plan(s) and 3 missing entitlement(s). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>552f31a
-
fix(website): Inject HTML shell and globals.css into root layout
Ashraf Al-Kassem7d627c0 -
chore(marketing): Finalize animations and docker architecture
Ashraf Al-Kassem49d2391 -
fix: correct HF dataset card task_categories (remove unofficial 'conversational')
Ashraf Al-Kassem +1: Claude Sonnet 4.6Replace 'conversational' (not in HF official list) with 'text-generation' to eliminate validation warnings on every export commit. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>afe106b -
feat: HuggingFace dataset export — ashrafkassem/leadpilot-data
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Add export_to_hf.py script: exports 12 automation templates + 3 plans (static) and all user-generated data (contacts, conversations, messages, flows, executions, audit logs) with PII pseudonymized via SHA-256 hashes - Add export_to_hf_task Celery Beat task (daily 02:00 UTC), no-ops silently if HF_TOKEN is not set so existing deployments are unaffected - Add HF_TOKEN and HF_DATASET_REPO settings to config.py - Link HF Space → dataset via datasets: YAML in README.md - Dry-run: python scripts/export_to_hf.py --dry-run Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>1648997 -
fix: normalize timezone-aware ends_at + enrich create response
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Strip tzinfo from ends_at/starts_at inputs to avoid offset-naive vs offset-aware comparison error when clients send ISO8601 with Z suffix - Change create override response from flat override_id to override object {id, plan_code, starts_at, ends_at, reason} for richer client feedback Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>5e4d359 -
feat: Mission 34 — Admin Plan Overrides + Expiry + Audit Trail
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Add PlanOverride model (time-bound workspace plan grants) - Update entitlement resolver: override > base plan precedence with self-heal - Expose plan_source + override_expires_at in GET /entitlements - Add admin_plans.py: 3 endpoints (plan-status, plan-override, revoke) - Celery beat job expire_plan_overrides_task every 5 min - Admin workspace detail UI: Plan Override card with apply/revoke form - 3 admin-api.ts methods for override CRUD - Alembic migration m3n4o5p6q7r8 for planoverride table - 6 passing tests: apply, self-heal, worker expiry, revoke, dedup, audit Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>a21ab3d -
fix: use temporary (307) redirects instead of permanent (301) to prevent browser caching
Ashraf Al-Kassem +1: Claude Sonnet 4.6Permanent 301 redirects are cached by browsers indefinitely, which means removing or changing them server-side has no effect on users who already loaded the page. Temporary 307 redirects are not cached, so routing changes take effect immediately on the next request. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>32692ae -
fix: remove /admin redirect that was blocking admin panel
Ashraf Al-Kassem +1: Claude Sonnet 4.6next.config.ts had a permanent (301) redirect from /admin → /login, which intercepted every request to the admin panel before Next.js routing could run. The admin layout already handles auth protection by redirecting unauthenticated users to /admin/login. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>1894f4f -
fix: production API base URL fallback — use relative paths on non-localhost browser
Ashraf Al-Kassem +1: Claude Sonnet 4.6NEXT_PUBLIC_API_BASE_URL is not baked into the Stage 1 build (set in Stage 2 after the frontend is already built), so process.env.NEXT_PUBLIC_API_BASE_URL is undefined in the client bundle on HuggingFace. The old fallback returned 'http://127.0.0.1:8000' for any non-localhost browser, which is the client's own loopback — inaccessible from HF — blocking all client-side API calls including Google OAuth. Fix: when running in the browser on a non-localhost host, return '' so fetch uses relative paths (/api/v1/...). nginx then proxies /api/* to the FastAPI backend. SSR (window === undefined) continues to use the direct Docker-internal address http://127.0.0.1:8000. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>3b7374c
-
feat(website): natively merge marketing website into frontend application; resolve HF deployment routing collisions
Ashraf Al-Kassem86e8e8d -
feat(website): replace static placeholders with animated SVGs; fix Waitlist select layout
Ashraf Al-Kassem3547a62 -
feat: futuristic UI redesign of LeadPilot homepage
Ashraf Al-Kassemd2c669e -
Redesign template card
Ashraf Al-Kassem0869d3f -
fix: Google OAuth redirect URI mismatch + template badge UI
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Fix get_google_redirect_uri() to use APP_BASE_URL/FRONTEND_URL instead of the backend request URL, resolving error 400 on Google sign in (local dev: was sending localhost:8000 instead of localhost:3000) - Remove unused request param from get_google_redirect_uri and both google_auth_start / google_auth_callback route handlers - Template cards: solid-filled category badges (teal-600) and platform badges (slate-700) to match design; industry tags rendered as plain uppercase text instead of pill badges Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>0ef8648 -
fix: add missing postcss config, redesign templates UI, link auth to product app
Ashraf Al-Kassem +1: Claude Opus 4.6- Add postcss.config.mjs (was missing, caused all Tailwind CSS to not render) - Redesign templates page: icon containers, stats strip, featured spotlight with gradient-border, "How it works" light section, cockpit-grid browse grid - Redesign TemplateCard: category-colored icons, hover arrows, dividers - Redesign CategoryFilter: count badges on tabs, better spacing - Link website to product app: Header login/signup → APP_URL/login|signup, CTASection defaults to APP_URL/signup, PlanCard CTA → APP_URL/signup, Footer adds Log in + Sign Up links, all pages updated - Add NEXT_PUBLIC_APP_URL env var (defaults to localhost:3000) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>778d373 -
feat: Mission 33 — Marketing Website Alignment + DB-Driven Content
Ashraf Al-Kassem +1: Claude Opus 4.6Convert all website pages from hardcoded static arrays to DB-driven content via public catalog API endpoints. Removes phantom "Pro" tier (website showed 4 plans, DB only has 3). Adds Templates and Integrations pages, parity audit script, and scroll-reveal design system classes. - Backend: public GET /catalog/templates endpoint (unauthenticated, 60s cache) - Website: api.ts client, moduleMap.ts for module-to-marketing mapping - Pages converted: home, plans (3 tiers), features (module-driven) - New pages: /templates (12 templates, category filters), /integrations (3 providers) - Components: FeatureCard gains iconName + comingSoon props - Nav: Header + Footer updated with Templates and Integrations links - Design: catalog-card, badge-platform, badge-category, scroll-reveal classes - Audit: scripts/parity-audit.ts verifies no fake feature claims (CI-friendly) - Tests: 3 new catalog tests (305 total passing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>6acfd72 -
feat: Mission 32 — Template Catalog Expansion + 12 Pre-Made Automation Templates
Ashraf Al-Kassem +1: Claude Opus 4.6Template Variables System: {{key}} placeholders in builder graphs replaced during clone with user-supplied values. Supports text, phone, url, number, textarea types with required/optional + defaults. Version Locking: Cloned flows track source_template_id and version_id. GET /automations/{id} returns latest_template_version info for "update available" badge. POST rebase-to-template endpoint re-applies stored variable values to newer template version. Analytics: TemplateUsageStat tracks clone_count, publish_count, active_flows_count. clone_count shown in catalog, sort=popular support. 12 Production Templates seeded at startup (idempotent by slug): - 6 WhatsApp: lead qualifier, appointment booking, FAQ responder, pricing gatekeeper, reactivation campaign, sales concierge - 4 Meta: Instagram DM responder, Messenger support intake, Lead Ads intake, Instagram appointment booking - 2 Omnichannel: lead qualifier, inbound-to-CRM pipeline Frontend: variable form on template detail, platf…740c3bd -
feat: Mission 31 — Meta Platform: Instagram DM, Messenger, and Lead Ads Full Lifecycle
Ashraf Al-Kassem +1: Claude Opus 4.6- OAuth 2.0 connect flow (start + callback with JWT state, token exchange chain) - Webhook subscription API (auto-subscribe after OAuth, manual trigger endpoint) - Message normalization: Instagram DM + Messenger channel discrimination, attachment parsing - Meta delivery/read status webhooks via watermark-based updates - Lead Ads ingestion: fetch lead data from Graph API, enrich contacts - MetaAdapter: send_media implementation + get_user_profile - Dispatch service: Meta media dispatch (mirrors WhatsApp pattern) - Channel-level observability metrics (instagram/messenger discrimination) - 21 new tests (288 total), all passing + 15/15 E2E checks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>eed40fb -
feat: Mission 30 — WhatsApp Cloud Production Hardening
Ashraf Al-Kassem +1: Claude Opus 4.6- Webhook signature enforcement (HMAC SHA-256) + payload size guard (1MB) - Delivery status lifecycle: DELIVERED/READ/DEAD_LETTER statuses with forward-only progression - Phone number normalization (digits-only) to prevent duplicate contacts - Media message handling: inbound image/audio/video/document parsing + local storage - Dead-letter queue: endpoints for listing and retrying permanently failed messages - Adapter abstraction: MessagingAdapter ABC for WhatsApp and Meta adapters - Observability: in-memory metrics service + admin metrics endpoint - Celery worker fix: expire_on_commit=False prevents MissingGreenlet errors - Catalog registry updated with new delivery statuses - 21 new tests (267 total), all passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>f187462 -
feat: Mission 29 — Prompt Studio Enhancements + Auth Fixes + User Seeding
Ashraf Al-Kassem +1: Claude Opus 4.6Mission 29: Knowledge chunking (DOCX/XLSX support, keyword retrieval), dynamic qualification criteria (relational CRUD), AI step output schema, and prompt compiler integration for all three. Auth fixes: seed demo + admin users on startup, fix Google OAuth email_verified_at bug, fix admin-api.ts 403 logout, comprehensive auth test suite (19 tests covering studio + admin flows). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>a5f93e1 -
feat: Mission 28 — Data Flow & Reference Tables End-to-End Wiring
Ashraf Al-Kassem +1: Claude Opus 4.6Backend: - New GET /entitlements endpoint (plan + modules + usage for active workspace) - New settings sub-endpoints: GET/PATCH /settings/profile, GET /settings/subscription, GET /settings/modules - Catalog additions: template-categories, template-platforms - required_module field on ZOHO_UPSERT_LEAD node type - WorkspaceEntitlementOverride.enabled nullable boolean for explicit module gating - Alembic migration for enabled column - Entitlements service updated: override.enabled=False blocks, True force-enables Frontend: - Settings page: Subscription tab (plan badge + usage bars) and Modules tab (enabled/source) - Templates page: catalog-driven filters replacing hardcoded labels + entitlement messaging - Node palette: locked badge for nodes requiring unavailable modules - Dashboard: Plan & Usage card with top-3 usage progress bars - Admin workspace detail: inline usage limit override editing with pencil icon Tests: 13 new tests (test_entitlements_api, test_settings_pages, test_referen…fc6fc7e
-
fix: use named ReactFlow import for @xyflow/react v12 compatibility
Ashraf Al-Kassem +1: Claude Opus 4.6ReactFlow is a named export (not default) in @xyflow/react v12, which caused the HuggingFace Docker build to fail during Next.js compilation. Also removed undefined OnDrop type annotation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>ae2871c -
fix: restore required env vars in Dockerfile for build-time validation
Ashraf Al-Kassem +1: Claude Opus 4.6The minimal .env introduced in ce7992e was missing DATABASE_URL, REDIS_URL, JWT_SECRET, and ENCRYPTION_KEY_FERNET. Pydantic Settings validates these at import time during pip install, causing the HF Space Docker build to fail with exit code 1. Restore all required fields as build-time placeholders. Real secrets are injected at runtime via HuggingFace Space Secrets. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>efc235a -
fix: resolve 149 ruff lint violations for CI pipeline
Ashraf Al-Kassem +1: Claude Opus 4.6- Auto-fix 104 unused imports (F401) across 40 files - Fix F821: add missing `wrap_error` import in diagnostics.py - Fix F841: remove unused `now` variables in auth.py - Fix E722: replace bare `except` with `except Exception` in dispatch - Fix re-exports: explicit `as` syntax for meta/whatsapp __init__.py - Update pyproject.toml ruff config: - Ignore E711/E712 (SQLAlchemy needs `== None`/`== False`) - Ignore E402/E701 (intentional patterns in workers/tests) - Add per-file ignores for alembic/ and tests/ All 197 tests pass. Ruff checks clean. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>b1aa633 -
fix: security hardening + stale docs + CI pipeline
Ashraf Al-Kassem +1: Claude Opus 4.6- Remove HF API token from git remote URL (was plaintext) - Harden Dockerfile: stop copying .env.example as production .env - Remove hardcoded Fernet key from .env.example (use placeholder) - Remove phantom ADMIN_JWT_SECRET (not used by any code) - Fix CLAUDE_CONTEXT.md: 11 factual errors (Python version, mission table, dual JWT claim, file references, docs path, CI reference) - Add GitHub Actions CI workflow (ruff + pytest) - Align pyproject.toml target-version to py311 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>ce7992e -
feat: Mission 27 — Automation Builder v2 + Template Catalog Foundation
Ashraf Al-Kassem +1: Claude Sonnet 4.6- Visual canvas editor (ReactFlow @xyflow/react v12) with TriggerNode, ActionNode, NodePalette, NodeConfigPanel - FlowDraft model: per-flow mutable builder graph, separate from immutable FlowVersion - Builder v2 endpoints: GET/PUT draft, validate, publish, simulate, rollback, versions - builder_translator.py: validate_graph, translate, simulate — 21 unit tests passing - AutomationTemplate + AutomationTemplateVersion with admin CRUD + workspace clone - GET/POST /templates/ workspace catalog; POST /templates/:slug/clone - Admin: GET/POST /admin/templates, versions, publish endpoints - Alembic migration g7h8i9j0k1l2 + merge migration 2163b9b16da8 (M20+M27) - Frontend: automations-api.ts, templates-api.ts; admin/templates pages - All 57 tests passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>d4d1956
-
feat: Mission 21 — Settings Center + Data-Driven Dropdowns
Ashraf Al-Kassem +1: Claude Opus 4.6- Add PATCH /auth/me for user profile updates with audit logging - Add 8 new catalog endpoints (timezones, languages, ai-models, dedupe-strategies, event-sources, event-outcomes, audit-actions, contact-fields) - Create LookupsProvider context + useLookups() hook for bulk catalog preload - Restructure Settings page with Profile section (name edit, email verification badge) - Replace 10 hardcoded dropdowns across 5 frontend pages with catalog data - Sidebar shows real user name + computed initials from /auth/me - 141 tests passing (+23 new), zero TS build errors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>c626151 -
chore: add backend/storage/ to gitignore
Ashraf Al-Kassem +1: Claude Opus 4.6Runtime user-uploaded knowledge files should not be tracked in git. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>6da3982