diff --git a/CHANGELOG.md b/CHANGELOG.md index 8157436..27e4af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,45 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [1.9.2] - 2026-05-08 + +### Added + +- **Google Workspace Gateway** — Full OAuth 2.0 integration with automatic token refresh. Connect once, unlock 4 Google output destinations: + - **Google Sheets** — Append task results as rows to any spreadsheet + - **Gmail** — Send results from your connected Gmail account with subject templates + - **Google Docs** — Auto-create documents with full agent output, optional folder targeting + - **Google Calendar** — Create review events scheduled 1 hour after task completion + - **OAuth Edge Functions** — `google-oauth-start` and `google-oauth-callback` for secure token exchange + - **GoogleConnectionBanner** — Inline connect/disconnect UI with status indicator inside config forms +- **Notion Output Route** — Create pages in a Notion database with structured task results +- **GitHub Issues Output Route** — Create GitHub issues with label and assignee support +- **Email (Resend) Output Route** — Managed email delivery with HTML templates +- **SMTP Email Output Route** — Self-hosted email via nodemailer with full SMTP configuration +- **Linear Output Route** — Create issues via GraphQL with automatic team label resolution +- **Serverless Cron Evaluation** — `cron-evaluate` Edge Function replaces always-on task runner for trigger evaluation: + - pg_cron schedules evaluation every 30 minutes via pg_net + - Full catch-up logic (48h lookback) for missed triggers + - Optional task runner wake ping via `TASK_RUNNER_URL` webhook + - Railway no longer needs to run 24/7 for cron triggers +- **Canvas Logic Nodes** — Conditional (If-Else) and HTTP Request nodes on the visual workflow canvas with editable forms and conditional branching edges +- **Cron Trigger Catch-Up** — Missed cron firings (up to 48h) are retroactively evaluated on runner startup +- **Human-Readable Cron Labels** — All trigger UIs display friendly labels (e.g. "Every weekday at 9:00 AM") +- **Stale Model Validation** — Agent UI flags deprecated or removed model IDs with a warning badge +- **Docker Research Crew** — Docker Compose edition for research-focused agent workflows + +### Fixed + +- **Dependency Vulnerabilities** — Resolved HIGH and moderate severity npm audit findings +- **Canvas Logic Connections** — Logic nodes can now be connected, persisted, and edited in the flow +- **Canvas Bypass Edges** — Suppressed duplicate bypass edges when logic nodes are connected +- **ESLint Compliance** — Resolved `no-unnecessary-condition`, `no-non-null-assertion`, and `no-floating-promises` lint errors + +### Documentation + +- **Output Routes** updated with Notion, GitHub Issues, Email, SMTP, Linear, and all 4 Google destinations +- Changelog updated with 1.9.2 release + ## [1.9.1] - 2026-04-23 ### Added diff --git a/README.md b/README.md index de195d1..7874ccb 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,7 @@ Each client gets their own workspace. Custom agents built around their tools and - ⚡ **Zapier** — Connect CrewForm to 7,000+ apps. Trigger agents from Gmail, Slack, forms, or schedules - 📡 **Messaging Channels** — Trigger agents from Discord, Slack, Telegram, and Email -- 📤 **Output Routes** — Deliver results to Discord channels, Slack, webhooks, MS Teams, and more +- 📤 **Output Routes** — 16 destinations: Slack, Discord, Telegram, Teams, Asana, Trello, Notion, GitHub, Email, SMTP, Linear, Google Sheets, Gmail, Google Docs, Google Calendar, and HTTP webhooks - 📈 **Advanced Analytics** — Charts, CSV export, prompt history with diffs *(Pro)* - 💬 **Chat Widget** — Embed agents on any website *(Pro)* - 📋 **Audit Logs** — Full audit trail with Datadog/Splunk streaming *(Enterprise)* @@ -423,8 +423,8 @@ CrewForm uses an **open-core** model: a free Community Edition under AGPL-3.0 an │ └──────────────┘ └──────────────┘ └───────────────────────┘ │ ├──────────────────────────────────────────────────────────────────┤ │ Integrations │ -│ Channels (Discord · Slack · Telegram · Email) · Output Routes │ -│ Zapier (7,000+ apps) · Webhooks · Chat Widget · REST API │ +│ Channels (Discord · Slack · Telegram · Email) · Output Routes (16)│ +│ Zapier (7,000+ apps) · Google Workspace · Webhooks · REST API │ ├──────────────────────────────────────────────────────────────────┤ │ Observability │ │ OpenTelemetry · Langfuse · Datadog · Jaeger │ diff --git a/docs/changelog.mdx b/docs/changelog.mdx index 9a6b36a..5b043cc 100644 --- a/docs/changelog.mdx +++ b/docs/changelog.mdx @@ -9,6 +9,44 @@ All notable changes to CrewForm will be documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [1.9.2] — 2026-05-08 + +### Added + +- **Google Workspace Gateway** — OAuth 2.0 integration with 4 output destinations: Google Sheets (row append), Gmail (send from your account), Google Docs (auto-create documents), Google Calendar (create review events) +- **Notion Output Route** — Create pages in a Notion database with task results +- **GitHub Issues Output Route** — Create issues with labels and assignees +- **Email (Resend) Output Route** — Managed email delivery with HTML templates +- **SMTP Email Output Route** — Self-hosted email via nodemailer +- **Linear Output Route** — Create issues via GraphQL with team label resolution +- **Serverless Cron Evaluation** — Edge Function + pg_cron replaces always-on task runner for trigger scheduling (runs every 30 min) +- **Canvas Logic Nodes** — Conditional (If-Else) and HTTP Request nodes with branching edges +- **Human-Readable Cron Labels** — Friendly labels like "Every weekday at 9:00 AM" across all UIs +- **Stale Model Validation** — Warning badge on deprecated model IDs +- **Docker Research Crew** — Compose edition for research workflows + +### Fixed + +- Dependency vulnerabilities, canvas logic connections, bypass edge suppression, ESLint compliance + +### Documentation + +- Output Routes docs updated with 9 new destination types +- Total output destinations: **16** (HTTP, Slack, Discord, Telegram, Teams, Asana, Trello, Notion, GitHub, Email, SMTP, Linear, Google Sheets, Gmail, Google Docs, Google Calendar) + +## [1.9.1] — 2026-04-23 + +### Added + +- **7-Day Team Trial** — Every new signup gets full Team-tier access for 7 days with dashboard trial banner +- **Coolify Deployment Guide** — Step-by-step docs for Coolify v4 deployment +- **Cloudflare Turnstile** — Bot protection on login and signup forms + +### Fixed + +- Trial feature gating with `useEELicense` hook fallback +- Auth callback PKCE timeout handling + ## [1.9.0] — 2026-04-22 ### Added diff --git a/docs/output-routes.md b/docs/output-routes.md index a0d1909..4dab1ce 100644 --- a/docs/output-routes.md +++ b/docs/output-routes.md @@ -13,6 +13,15 @@ Supported destinations: | [Microsoft Teams](#microsoft-teams) | Incoming Webhook — Adaptive Card | | [Asana](#asana) | Creates a task in a project via Personal Access Token | | [Trello](#trello) | Creates or updates a card on a board via API Key + Token | +| [Notion](#notion) | Creates a page in a database via Integration Token | +| [GitHub Issues](#github-issues) | Creates an issue in a repository via Personal Access Token | +| [Email (Resend)](#email-resend) | Sends HTML email via Resend API | +| [SMTP Email](#smtp-email) | Sends email via custom SMTP server (nodemailer) | +| [Linear](#linear) | Creates an issue via GraphQL API with team label resolution | +| [Google Sheets](#google-sheets) | Appends rows to a spreadsheet via OAuth 2.0 | +| [Gmail](#gmail) | Sends email from your connected Google account via OAuth 2.0 | +| [Google Docs](#google-docs) | Creates a document in Google Drive via OAuth 2.0 | +| [Google Calendar](#google-calendar) | Creates a review event via OAuth 2.0 | --- @@ -376,3 +385,178 @@ Logs are retained for 30 days. If you self-host CrewForm, no extra environment variables are needed for output routes — all credentials are stored in the database per-route. The task runner reads them at delivery time. See the [Self-Hosting Guide](./self-hosting.md) for general environment setup. + +--- + +## Notion + +Creates a new page in a Notion database when a CrewForm task or team run completes or fails. + +### Setup + +1. Go to [notion.so/my-integrations](https://www.notion.so/my-integrations) → **New Integration** +2. Give it a name (e.g. "CrewForm") and select your workspace +3. Copy the **Internal Integration Token** (starts with `ntn_...`) +4. In Notion, open the target database → **⋯ → Connections → Add connection** → select your integration + +### Configuration + +| Field | Required | Description | +|-------|----------|-------------| +| **Integration Token** | ✅ | Notion Internal Integration Token | +| **Database ID** | ✅ | ID from the database URL: `notion.so/?v=...` | + +### Page Format + +Each delivery creates a Notion page with: +- **Title:** `[CrewForm] ` +- **Content:** Event type, agent details, timestamp, and full result as text blocks + +--- + +## GitHub Issues + +Creates an issue in a GitHub repository when a CrewForm task or team run completes or fails. + +### Setup + +1. Go to [github.com/settings/tokens](https://github.com/settings/tokens) → **Generate new token (classic)** +2. Select the `repo` scope +3. Copy the **Personal Access Token** + +### Configuration + +| Field | Required | Description | +|-------|----------|-------------| +| **Personal Access Token** | ✅ | GitHub PAT with `repo` scope | +| **Repository** | ✅ | Format: `owner/repo` (e.g. `CrewForm/crewform`) | +| **Labels** | Optional | Comma-separated labels to apply (e.g. `ai-output, review`) | +| **Assignees** | Optional | Comma-separated GitHub usernames to assign | + +### Issue Format + +- **Title:** `[CrewForm] ` +- **Body:** Event type, agent details, timestamp, and full result in Markdown + +--- + +## Email (Resend) + +Sends a styled HTML email via the [Resend](https://resend.com) API. Ideal for managed email delivery without configuring an SMTP server. + +### Setup + +1. Sign up at [resend.com](https://resend.com) and verify a sending domain +2. Go to **API Keys** → create a new key +3. Copy the **API Key** + +### Configuration + +| Field | Required | Description | +|-------|----------|-------------| +| **API Key** | ✅ | Resend API key | +| **From Email** | ✅ | Verified sender address (e.g. `alerts@yourdomain.com`) | +| **To Email(s)** | ✅ | Comma-separated recipient addresses | +| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders | + +--- + +## SMTP Email + +Sends email via any SMTP server using [nodemailer](https://nodemailer.com). Use this for self-hosted email or providers like Gmail SMTP, SendGrid, Mailgun, etc. + +### Configuration + +| Field | Required | Description | +|-------|----------|-------------| +| **SMTP Host** | ✅ | SMTP server hostname (e.g. `smtp.gmail.com`) | +| **SMTP Port** | ✅ | Port number (typically `587` for TLS, `465` for SSL) | +| **Username** | ✅ | SMTP authentication username | +| **Password** | ✅ | SMTP authentication password or app password | +| **From Email** | ✅ | Sender email address | +| **To Email(s)** | ✅ | Comma-separated recipient addresses | +| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders | + +> **Gmail SMTP:** Use an App Password (not your regular password). Go to Google Account → Security → 2-Step Verification → App passwords. + +--- + +## Linear + +Creates an issue in Linear when a CrewForm task or team run completes or fails. Uses the Linear GraphQL API. + +### Setup + +1. Go to [linear.app/settings/api](https://linear.app/settings/api) → **Personal API keys** → create a key +2. Copy the **API Key** +3. Find your **Team Key** (the short prefix like `ENG`, `OPS` visible in issue IDs) + +### Configuration + +| Field | Required | Description | +|-------|----------|-------------| +| **API Key** | ✅ | Linear Personal API key | +| **Team Key** | ✅ | Team identifier (e.g. `ENG`) | +| **Labels** | Optional | Comma-separated label names (matched against existing team labels) | + +### Issue Format + +- **Title:** `[CrewForm] ` +- **Description:** Full result in Markdown with agent and event metadata + +--- + +## Google Workspace + +Google destinations use **OAuth 2.0** — you connect your Google account once per workspace, and CrewForm handles token refresh automatically. + +### Setup (One-Time) + +1. When creating a Google output route, click **Connect Google** in the configuration form +2. Sign in with your Google account and grant the requested permissions +3. CrewForm stores encrypted OAuth tokens — no API keys needed + +> **Self-Hosted:** You must configure a Google Cloud project with OAuth credentials. Set `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` on both Supabase Edge Functions and the task runner. See the [Self-Hosting Guide](./self-hosting.md) for details. + +### Google Sheets + +Appends task results as new rows in a Google Spreadsheet. + +| Field | Required | Description | +|-------|----------|-------------| +| **Spreadsheet ID** | ✅ | ID from the spreadsheet URL: `docs.google.com/spreadsheets/d//edit` | +| **Sheet Name** | Optional | Target sheet tab (defaults to first sheet) | + +Each delivery appends a row with: Timestamp, Event, Task Title, Agent, Status, Result. + +### Gmail + +Sends an email from your connected Google account. + +| Field | Required | Description | +|-------|----------|-------------| +| **To Email(s)** | ✅ | Comma-separated recipient addresses | +| **Subject Template** | Optional | Supports `{{title}}`, `{{status}}`, `{{agent}}` placeholders | + +Emails are sent as the authenticated Google user with a styled HTML template. + +### Google Docs + +Creates a new Google Document with the full agent output. + +| Field | Required | Description | +|-------|----------|-------------| +| **Drive Folder ID** | Optional | Target folder from URL: `drive.google.com/drive/folders/`. Defaults to root. | + +Each delivery creates a document named `[CrewForm] ` with the full result. + +### Google Calendar + +Creates a review event on your Google Calendar. + +| Field | Required | Description | +|-------|----------|-------------| +| **Calendar ID** | Optional | Defaults to `primary`. Use a specific calendar ID for custom calendars. | +| **Duration (minutes)** | Optional | Event duration in minutes (default: 30) | + +Events are scheduled 1 hour after task completion with the task title and result in the description. diff --git a/package.json b/package.json index 9cc8993..5e4ca55 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "crewform", "private": true, - "version": "1.9.1", + "version": "1.9.2", "type": "module", "scripts": { "dev": "vite", diff --git a/task-runner/package.json b/task-runner/package.json index 88a2118..4e6d05e 100644 --- a/task-runner/package.json +++ b/task-runner/package.json @@ -1,6 +1,6 @@ { "name": "task-runner", - "version": "1.6.0", + "version": "1.7.0", "description": "", "main": "index.js", "scripts": {