Repository: PipedreamHQ/pipedream
Pull request #16552: Gmail updates for email replies
Author: login: michelle0927
Created: 2025-05-03T17:55:40Z | Merged: 2025-05-06T15:03:40Z

- For "New Email Recieved" trigger, I added `cc` and `bcc` recipients (if available) to to the `parsedHeaders` field in the event.
- For "Send Email" action, I added an optional `replyAll` prop which replaces the `to`, `cc`, and `bcc` fields with the `from`, `to`, `cc`, and `bcc` recipients (if available) from the original message.


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added support for "Reply All" when replying to emails, allowing users to reply to all original recipients (From, To, CC, BCC) in the Send Email action.
  - When "Reply All" is selected, recipient fields (To, CC, BCC) are automatically managed and hidden for convenience.
  - Enhanced email processing to include CC and BCC fields in structured email data.

- **Chores**
  - Updated version numbers for multiple Gmail actions and sources to reflect recent changes and improvements.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/components/gmail/actions/add-label-to-email/add-label-to-email.mjs b/components/gmail/actions/add-label-to-email/add-label-to-email.mjs
index 774105970de27..a53aa8b49f7f7 100644
--- a/components/gmail/actions/add-label-to-email/add-label-to-email.mjs
+++ b/components/gmail/actions/add-label-to-email/add-label-to-email.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-add-label-to-email",
   name: "Add Label to Email",
   description: "Add label(s) to an email message. [See the docs](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/modify)",
-  version: "0.0.7",
+  version: "0.0.8",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/approve-workflow/approve-workflow.mjs b/components/gmail/actions/approve-workflow/approve-workflow.mjs
index caaf2062b2a45..319d7e2830fa6 100644
--- a/components/gmail/actions/approve-workflow/approve-workflow.mjs
+++ b/components/gmail/actions/approve-workflow/approve-workflow.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-approve-workflow",
   name: "Approve Workflow",
   description: "Suspend the workflow until approved by email. [See the documentation](https://pipedream.com/docs/code/nodejs/rerun#flowsuspend)",
-  version: "0.0.3",
+  version: "0.0.4",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/archive-email/archive-email.mjs b/components/gmail/actions/archive-email/archive-email.mjs
index a1bca2ae6aa00..34c90f35a2256 100644
--- a/components/gmail/actions/archive-email/archive-email.mjs
+++ b/components/gmail/actions/archive-email/archive-email.mjs
@@ -5,7 +5,7 @@ export default {
   key: "gmail-archive-email",
   name: "Archive Email",
   description: "Archive an email message. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/modify)",
-  version: "0.0.1",
+  version: "0.0.2",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/create-draft/create-draft.mjs b/components/gmail/actions/create-draft/create-draft.mjs
index 7b1d4c0f41407..18e9b717a3c55 100644
--- a/components/gmail/actions/create-draft/create-draft.mjs
+++ b/components/gmail/actions/create-draft/create-draft.mjs
@@ -6,7 +6,7 @@ export default {
   key: "gmail-create-draft",
   name: "Create Draft",
   description: "Create a draft from your Google Workspace email account. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.drafts/create)",
-  version: "0.1.0",
+  version: "0.1.1",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/download-attachment/download-attachment.mjs b/components/gmail/actions/download-attachment/download-attachment.mjs
index bdb1ae995b04e..8361bf420a008 100644
--- a/components/gmail/actions/download-attachment/download-attachment.mjs
+++ b/components/gmail/actions/download-attachment/download-attachment.mjs
@@ -7,7 +7,7 @@ export default {
   key: "gmail-download-attachment",
   name: "Download Attachment",
   description: "Download an attachment by attachmentId to the /tmp directory. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.messages.attachments/get)",
-  version: "0.0.5",
+  version: "0.0.6",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/find-email/find-email.mjs b/components/gmail/actions/find-email/find-email.mjs
index 99198585f9e3b..b414a3ee858da 100644
--- a/components/gmail/actions/find-email/find-email.mjs
+++ b/components/gmail/actions/find-email/find-email.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-find-email",
   name: "Find Email",
   description: "Find an email using Google's Search Engine. [See the docs](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/list)",
-  version: "0.0.10",
+  version: "0.0.11",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/list-labels/list-labels.mjs b/components/gmail/actions/list-labels/list-labels.mjs
index 4d2ba114eb0bc..51db38f79d42f 100644
--- a/components/gmail/actions/list-labels/list-labels.mjs
+++ b/components/gmail/actions/list-labels/list-labels.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-list-labels",
   name: "List Labels",
   description: "List all the existing labels in the connected account. [See the docs](https://developers.google.com/gmail/api/reference/rest/v1/users.labels/list)",
-  version: "0.0.2",
+  version: "0.0.3",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs b/components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs
index 54db833a26298..00ac1b92c50c5 100644
--- a/components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs
+++ b/components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-remove-label-from-email",
   name: "Remove Label from Email",
   description: "Remove label(s) from an email message. [See the docs](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/modify)",
-  version: "0.0.4",
+  version: "0.0.5",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/send-email/send-email.mjs b/components/gmail/actions/send-email/send-email.mjs
index df92f2bbc8c0e..d12a016fbf665 100644
--- a/components/gmail/actions/send-email/send-email.mjs
+++ b/components/gmail/actions/send-email/send-email.mjs
@@ -6,7 +6,7 @@ export default {
   key: "gmail-send-email",
   name: "Send Email",
   description: "Send an email from your Google Workspace email account. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/send)",
-  version: "0.1.8",
+  version: "0.1.9",
   type: "action",
   props: {
     gmail,
@@ -84,6 +84,7 @@ export default {
       label: "In Reply To",
       description: "Specify the `message-id` this email is replying to.",
       optional: true,
+      reloadProps: true,
     },
     mimeType: {
       propDefinition: [
@@ -92,6 +93,22 @@ export default {
       ],
     },
   },
+  additionalProps(existingProps) {
+    const props = {};
+    if (this.inReplyTo) {
+      props.replyAll = {
+        type: "boolean",
+        label: "Reply All",
+        description: "Set to `true` to send reply to emails in the \"From\", \"To\", \"CC\", and \"BCC\" (if available) of the original email",
+        optional: true,
+        reloadProps: true,
+      };
+    }
+    existingProps.to.hidden = !!this.replyAll;
+    existingProps.cc.hidden = !!this.replyAll;
+    existingProps.bcc.hidden = !!this.replyAll;
+    return props;
+  },
   async run({ $ }) {
     this.attachmentFilenames = utils.parseArray(this.attachmentFilenames);
     this.attachmentUrlsOrPaths = utils.parseArray(this.attachmentUrlsOrPaths);
@@ -100,7 +117,7 @@ export default {
     }
     const opts = await this.gmail.getOptionsToSendEmail($, this);
     const response = await this.gmail.sendEmail(opts);
-    $.export("$summary", `Successfully sent email to ${this.to}`);
+    $.export("$summary", "Successfully sent the email");
     return response;
   },
 };
diff --git a/components/gmail/actions/update-org-signature/update-org-signature.mjs b/components/gmail/actions/update-org-signature/update-org-signature.mjs
index 4b3a87d8949c9..210ad56e87c68 100644
--- a/components/gmail/actions/update-org-signature/update-org-signature.mjs
+++ b/components/gmail/actions/update-org-signature/update-org-signature.mjs
@@ -8,7 +8,7 @@ export default {
   name: "Update Signature for Email in Organization",
   description: `Update the signature for a specific email address in an organization.
     A Google Cloud service account with delegated domain-wide authority is required for this action. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.settings.sendAs/update)`,
-  version: "0.0.5",
+  version: "0.0.6",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/actions/update-primary-signature/update-primary-signature.mjs b/components/gmail/actions/update-primary-signature/update-primary-signature.mjs
index 256c6dab14371..80913f2810fa2 100644
--- a/components/gmail/actions/update-primary-signature/update-primary-signature.mjs
+++ b/components/gmail/actions/update-primary-signature/update-primary-signature.mjs
@@ -4,7 +4,7 @@ export default {
   key: "gmail-update-primary-signature",
   name: "Update Signature for Primary Email Address",
   description: "Update the signature for the primary email address. [See the documentation](https://developers.google.com/gmail/api/reference/rest/v1/users.settings.sendAs/update)",
-  version: "0.0.5",
+  version: "0.0.6",
   type: "action",
   props: {
     gmail,
diff --git a/components/gmail/gmail.app.mjs b/components/gmail/gmail.app.mjs
index 73b3e7baee7e7..6a4747dbdea60 100644
--- a/components/gmail/gmail.app.mjs
+++ b/components/gmail/gmail.app.mjs
@@ -303,6 +303,35 @@ export default {
           opts.inReplyTo = inReplyTo;
           opts.references = inReplyTo;
           opts.threadId = repliedMessage.threadId;
+          if (props.replyAll) {
+            const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
+            const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
+            const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
+            const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
+            opts.to = from.value.split(",");
+            opts.to.push(...to.value.split(","));
+
+            // Filter out the current user's email address
+            const currentUserEmail = email.toLowerCase().trim();
+            opts.to = opts.to.filter((addr) => {
+              // Extract email from possible format like "Name <email@example.com>"
+              const match = addr.match(/<(.+?)>/) || [
+                null,
+                addr.trim(),
+              ];
+              return match[1].toLowerCase() !== currentUserEmail;
+            });
+
+            opts.to = [
+              ...new Set(opts.to),
+            ];
+            if (cc) {
+              opts.cc = cc.value;
+            }
+            if (bcc) {
+              opts.bcc = bcc.value;
+            }
+          }
         } catch (err) {
           opts.threadId = props.inReplyTo;
         }
diff --git a/components/gmail/package.json b/components/gmail/package.json
index f2507ae772f5e..03b95c7532611 100644
--- a/components/gmail/package.json
+++ b/components/gmail/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@pipedream/gmail",
-  "version": "0.3.1",
+  "version": "0.3.2",
   "description": "Pipedream Gmail Components",
   "main": "gmail.app.mjs",
   "keywords": [
diff --git a/components/gmail/sources/common/base.mjs b/components/gmail/sources/common/base.mjs
index fcd3d7714119b..6054c37c7d3dd 100644
--- a/components/gmail/sources/common/base.mjs
+++ b/components/gmail/sources/common/base.mjs
@@ -75,6 +75,8 @@ export default {
         "subject": this.getHeaderValue(headers, "subject"),
         "from": this.parseEmail(this.getHeaderValue(headers, "from")),
         "to": this.parseEmail(this.getHeaderValue(headers, "to")),
+        "cc": this.parseEmail(this.getHeaderValue(headers, "cc")),
+        "bcc": this.parseEmail(this.getHeaderValue(headers, "bcc")),
         "reply-to": this.parseEmail(this.getHeaderValue(headers, "reply-to")),
         "date": this.getHeaderValue(headers, "date"),
         "snippet": msg.snippet,
diff --git a/components/gmail/sources/new-attachment-received/new-attachment-received.mjs b/components/gmail/sources/new-attachment-received/new-attachment-received.mjs
index 3c38a79281c37..7000221bd2a91 100644
--- a/components/gmail/sources/new-attachment-received/new-attachment-received.mjs
+++ b/components/gmail/sources/new-attachment-received/new-attachment-received.mjs
@@ -6,7 +6,7 @@ export default {
   key: "gmail-new-attachment-received",
   name: "New Attachment Received",
   description: "Emit new event for each attachment in a message received. This source is capped at 100 max new messages per run.",
-  version: "0.0.10",
+  version: "0.0.11",
   type: "source",
   dedupe: "unique",
   props: {
diff --git a/components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs b/components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs
index 24075d0246749..933b22fd3f122 100644
--- a/components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs
+++ b/components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs
@@ -6,7 +6,7 @@ export default {
   key: "gmail-new-email-matching-search",
   name: "New Email Matching Search",
   description: "Emit new event when an email matching the search criteria is received. This source is capped at 100 max new messages per run.",
-  version: "0.0.8",
+  version: "0.0.9",
   type: "source",
   dedupe: "unique",
   props: {
diff --git a/components/gmail/sources/new-email-received/new-email-received.mjs b/components/gmail/sources/new-email-received/new-email-received.mjs
index a1d845deaf65f..55b554f72604b 100644
--- a/components/gmail/sources/new-email-received/new-email-received.mjs
+++ b/components/gmail/sources/new-email-received/new-email-received.mjs
@@ -15,7 +15,7 @@ export default {
   name: "New Email Received",
   description: "Emit new event when a new email is received.",
   type: "source",
-  version: "0.2.3",
+  version: "0.2.4",
   dedupe: "unique",
   props: {
     gmail,
diff --git a/components/gmail/sources/new-labeled-email/new-labeled-email.mjs b/components/gmail/sources/new-labeled-email/new-labeled-email.mjs
index e1aeb6616f517..7c4d6d07c23d3 100644
--- a/components/gmail/sources/new-labeled-email/new-labeled-email.mjs
+++ b/components/gmail/sources/new-labeled-email/new-labeled-email.mjs
@@ -8,7 +8,7 @@ export default {
   name: "New Labeled Email",
   description: "Emit new event when a new email is labeled.",
   type: "source",
-  version: "0.0.10",
+  version: "0.0.11",
   dedupe: "unique",
   props: {
     gmail,
diff --git a/components/gmail/sources/new-sent-email/new-sent-email.mjs b/components/gmail/sources/new-sent-email/new-sent-email.mjs
index 7670870d567d4..6ee834f3a9642 100644
--- a/components/gmail/sources/new-sent-email/new-sent-email.mjs
+++ b/components/gmail/sources/new-sent-email/new-sent-email.mjs
@@ -6,7 +6,7 @@ export default {
   key: "gmail-new-sent-email",
   name: "New Sent Email",
   description: "Emit new event for each new email sent. (Maximum of 100 events emited per execution)",
-  version: "0.0.9",
+  version: "0.0.10",
   type: "source",
   dedupe: "unique",
   props: {
diff --git a/components/oto/oto.app.mjs b/components/oto/oto.app.mjs
index 609c687ba4622..41dbdb91de0be 100644
--- a/components/oto/oto.app.mjs
+++ b/components/oto/oto.app.mjs
@@ -8,4 +8,4 @@ export default {
       console.log(Object.keys(this.$auth));
     },
   },
-};
\ No newline at end of file
+};
diff --git a/components/test_apps_for_checking_something_005/test_apps_for_checking_something_005.app.mjs b/components/test_apps_for_checking_something_005/test_apps_for_checking_something_005.app.mjs
index 163d41602fd02..9915885b78593 100644
--- a/components/test_apps_for_checking_something_005/test_apps_for_checking_something_005.app.mjs
+++ b/components/test_apps_for_checking_something_005/test_apps_for_checking_something_005.app.mjs
@@ -8,4 +8,4 @@ export default {
       console.log(Object.keys(this.$auth));
     },
   },
-};
\ No newline at end of file
+};
diff --git a/components/test_apps_for_checking_something_006/test_apps_for_checking_something_006.app.mjs b/components/test_apps_for_checking_something_006/test_apps_for_checking_something_006.app.mjs
index c913df140c4f6..3df0f21d225fd 100644
--- a/components/test_apps_for_checking_something_006/test_apps_for_checking_something_006.app.mjs
+++ b/components/test_apps_for_checking_something_006/test_apps_for_checking_something_006.app.mjs
@@ -8,4 +8,4 @@ export default {
       console.log(Object.keys(this.$auth));
     },
   },
-};
\ No newline at end of file
+};
diff --git a/components/transloadit/transloadit.app.mjs b/components/transloadit/transloadit.app.mjs
index 11044c01ae4ab..da1748d53899e 100644
--- a/components/transloadit/transloadit.app.mjs
+++ b/components/transloadit/transloadit.app.mjs
@@ -8,4 +8,4 @@ export default {
       console.log(Object.keys(this.$auth));
     },
   },
-};
\ No newline at end of file
+};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0248a3592dd6a..b74ba3c50a08c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9221,8 +9221,7 @@ importers:
 
   components/osu: {}
 
-  components/oto:
-    specifiers: {}
+  components/oto: {}
 
   components/otter_waiver:
     dependencies:
@@ -13062,11 +13061,9 @@ importers:
 
   components/test_apps_for_checking_something_001: {}
 
-  components/test_apps_for_checking_something_005:
-    specifiers: {}
+  components/test_apps_for_checking_something_005: {}
 
-  components/test_apps_for_checking_something_006:
-    specifiers: {}
+  components/test_apps_for_checking_something_006: {}
 
   components/test_apps_for_switching_appslug_009: {}
 
@@ -13440,8 +13437,7 @@ importers:
 
   components/translate_com: {}
 
-  components/transloadit:
-    specifiers: {}
+  components/transloadit: {}
 
   components/travis_ci:
     dependencies:


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>components/gmail/gmail.app.mjs (1)</summary><blockquote>

`306-322`: **Consider removing the current user from recipients list**

The current implementation adds all recipients to the reply, but doesn't filter out the current user's email address. This could result in the user receiving their own email.


```diff
if (props.replyAll) {
  const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
  const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
  const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
  const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
  opts.to = from.value.split(",");
  opts.to.push(...to.value.split(","));
+  // Filter out the current user's email address
+  const currentUserEmail = email.toLowerCase().trim();
+  opts.to = opts.to.filter(addr => {
+    // Extract email from possible format like "Name <email@example.com>"
+    const match = addr.match(/<(.+?)>/) || [null, addr.trim()];
+    return match[1].toLowerCase() !== currentUserEmail;
+  });
  opts.to = [
    ...new Set(opts.to),
  ];
  if (cc) {
    opts.cc = cc.value;
  }
  if (bcc) {
    opts.bcc = bcc.value;
  }
}
```

This ensures the sender doesn't receive their own email when using the "reply all" feature.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 1f574084d6ab2fc9a0570a5c4a568183abf5faf6 and 3b11f0381a0115a14bc3b898d3b3ac24d23fed35.

</details>

<details>
<summary>📒 Files selected for processing (19)</summary>

* `components/gmail/actions/add-label-to-email/add-label-to-email.mjs` (1 hunks)
* `components/gmail/actions/approve-workflow/approve-workflow.mjs` (1 hunks)
* `components/gmail/actions/archive-email/archive-email.mjs` (1 hunks)
* `components/gmail/actions/create-draft/create-draft.mjs` (1 hunks)
* `components/gmail/actions/download-attachment/download-attachment.mjs` (1 hunks)
* `components/gmail/actions/find-email/find-email.mjs` (1 hunks)
* `components/gmail/actions/list-labels/list-labels.mjs` (1 hunks)
* `components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs` (1 hunks)
* `components/gmail/actions/send-email/send-email.mjs` (4 hunks)
* `components/gmail/actions/update-org-signature/update-org-signature.mjs` (1 hunks)
* `components/gmail/actions/update-primary-signature/update-primary-signature.mjs` (1 hunks)
* `components/gmail/gmail.app.mjs` (1 hunks)
* `components/gmail/package.json` (1 hunks)
* `components/gmail/sources/common/base.mjs` (1 hunks)
* `components/gmail/sources/new-attachment-received/new-attachment-received.mjs` (1 hunks)
* `components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs` (1 hunks)
* `components/gmail/sources/new-email-received/new-email-received.mjs` (1 hunks)
* `components/gmail/sources/new-labeled-email/new-labeled-email.mjs` (1 hunks)
* `components/gmail/sources/new-sent-email/new-sent-email.mjs` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (21)</summary><blockquote>

<details>
<summary>components/gmail/actions/list-labels/list-labels.mjs (1)</summary>

`7-7`: **Bump action version**  
Version updated to "0.0.3" to align with the coordinated version increments across Gmail actions and sources in this PR. No functional changes.

</details>
<details>
<summary>components/gmail/actions/download-attachment/download-attachment.mjs (1)</summary>

`10-10`: **Version Bump Consistency**  
The version number has been correctly incremented from `0.0.5` to `0.0.6` to reflect this non-functional update. This matches the version bumps applied across the other Gmail action components in this PR.

</details>
<details>
<summary>components/gmail/actions/update-primary-signature/update-primary-signature.mjs (1)</summary>

`7-7`: **Consistent version bump to 0.0.6**  
The version has been incremented from 0.0.5 to 0.0.6 to align with the coordinated updates across Gmail action modules. No functional changes detected.

</details>
<details>
<summary>components/gmail/actions/create-draft/create-draft.mjs (1)</summary>

`9-9`: **Approve version bump**  
The action’s version has been updated from `0.0.5` to `0.0.6`, aligning with the coordinated version increments across other Gmail action modules in this PR.

</details>
<details>
<summary>components/gmail/sources/new-attachment-received/new-attachment-received.mjs (1)</summary>

`9-9`: **Version bump is consistent**  
The version string has been updated from "0.0.10" to "0.0.11" to align with coordinated releases across Gmail components in this PR. No functional changes were introduced.

</details>
<details>
<summary>components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs (1)</summary>

`9-9`: **Version bump is appropriate**  
The source’s `version` has been correctly updated from `0.0.8` to `0.0.9`, keeping it in sync with the other Gmail components in this release. No other changes are present in this file.

</details>
<details>
<summary>components/gmail/actions/update-org-signature/update-org-signature.mjs (1)</summary>

`11-11`: **Version bump is consistent**  
The version has been updated from "0.0.5" to "0.0.6", matching the coordinated increments across other Gmail action components in this PR.

</details>
<details>
<summary>components/gmail/actions/find-email/find-email.mjs (1)</summary>

`7-7`: **Version bump for Find Email action.**  
The component version has been updated from "0.0.10" to "0.0.11" to reflect this release’s coordinated updates.

</details>
<details>
<summary>components/gmail/actions/archive-email/archive-email.mjs (1)</summary>

`8-8`: **Version bump for Archive Email action.**  
The component version has been updated from "0.0.1" to "0.0.2" in line with the overall Gmail actions package update.

</details>
<details>
<summary>components/gmail/actions/add-label-to-email/add-label-to-email.mjs (1)</summary>

`7-7`: **Version bump for Add Label to Email action.**  
The component version has been updated from "0.0.7" to "0.0.8" to align with the other Gmail action updates.

</details>
<details>
<summary>components/gmail/sources/new-email-received/new-email-received.mjs (1)</summary>

`18-18`: **Version bump for New Email Received source.**  
The source version has been updated from "0.2.3" to "0.2.4" to coincide with related Gmail component enhancements in this release.

</details>
<details>
<summary>components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs (1)</summary>

`7-7`: **Version bump for Remove Label from Email action.**  
The component version has been updated from "0.0.4" to "0.0.5" as part of the coordinated Gmail actions package version increment.

</details>
<details>
<summary>components/gmail/package.json (1)</summary>

`3-3`: **Version bump reflects new features and improvements.**

This version increment from 0.3.0 to 0.3.1 properly reflects the minor enhancements made across Gmail components, particularly the addition of cc/bcc header parsing and reply-all functionality.

</details>
<details>
<summary>components/gmail/actions/approve-workflow/approve-workflow.mjs (1)</summary>

`7-7`: **Version increment is appropriate.**

The version bump from 0.0.3 to 0.0.4 aligns with the coordinated updates across Gmail components, maintaining version consistency across the package.

</details>
<details>
<summary>components/gmail/sources/new-labeled-email/new-labeled-email.mjs (1)</summary>

`11-11`: **Version increment is appropriate.**

The version bump from 0.0.10 to 0.0.11 maintains consistency with other Gmail component updates in this PR.

</details>
<details>
<summary>components/gmail/sources/new-sent-email/new-sent-email.mjs (1)</summary>

`9-9`: **Version increment is appropriate.**

The version bump from 0.0.9 to 0.0.10 aligns with other Gmail component updates in this PR, maintaining version consistency.

</details>
<details>
<summary>components/gmail/sources/common/base.mjs (1)</summary>

`78-79`: **Enhancement for cc/bcc recipients handling.**

Good addition of cc and bcc email header parsing to complete the recipient information in the processed email object. This change properly implements the PR objective of adding cc/bcc recipients to the parsedHeaders field.


The implementation correctly uses the existing parseEmail method pattern and maintains consistency with how other email headers are processed.

</details>
<details>
<summary>components/gmail/actions/send-email/send-email.mjs (4)</summary>

`9-9`: **LGTM - Version increment**

Appropriately incremented version number for tracking changes.

---

`87-87`: **LGTM - Props reload configuration**

Adding `reloadProps: true` to the `inReplyTo` property is appropriate to ensure UI updates when this value changes.

---

`96-111`: **LGTM - Well-structured dynamic properties handling**

The `additionalProps` method implementation is well-structured:
1. It adds the `replyAll` property only when needed (when `inReplyTo` is set)
2. It properly hides the redundant fields when reply all is enabled
3. It ensures the UI is updated when `replyAll` value changes via `reloadProps: true`

---

`120-120`: **LGTM - Improved export summary**

Good update to use `opts.to` instead of `this.to` in the summary message, ensuring the proper recipients are displayed when using "reply all" functionality.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T18:37:51Z
user: login: jlil
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-04T13:35:03Z
user: login: dannyroosevelt
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-04T13:52:50Z
user: login: jcortes
body: Hi @michelle0927 lgtm! Ready for QA!
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T17:00:15Z
user: login: vunguyenhung
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T02:02:30Z
user: login: jcortes
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T14:50:07Z

Review comments:
diff_hunk: @@ -303,6 +303,23 @@ export default {
           opts.inReplyTo = inReplyTo;
           opts.references = inReplyTo;
           opts.threadId = repliedMessage.threadId;
+          if (props.replyAll) {
+            const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
+            const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
+            const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
+            const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
+            opts.to = from.value.split(",");
+            opts.to.push(...to.value.split(","));
+            opts.to = [
+              ...new Set(opts.to),
+            ];
+            if (cc) {
+              opts.cc = cc.value;
+            }
+            if (bcc) {
+              opts.bcc = bcc.value;
+            }
+          }
path: components/gmail/gmail.app.mjs
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add defensive checks for header existence and consistent email address handling**

The implemented "reply all" feature is a valuable addition, but there are a few potential issues in the current implementation:

1. The code assumes that `from` and `to` headers always exist but doesn't check their existence before accessing the `value` property.
2. The email handling is inconsistent - `to` addresses are split into an array, but `cc` and `bcc` are assigned directly as strings.


```diff
if (props.replyAll) {
  const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
  const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
  const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
  const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
-  opts.to = from.value.split(",");
-  opts.to.push(...to.value.split(","));
+  opts.to = [];
+  if (from?.value) opts.to.push(...from.value.split(","));
+  if (to?.value) opts.to.push(...to.value.split(","));
  opts.to = [
    ...new Set(opts.to),
  ];
  if (cc) {
-    opts.cc = cc.value;
+    opts.cc = cc.value.split(",");
  }
  if (bcc) {
-    opts.bcc = bcc.value;
+    opts.bcc = bcc.value.split(",");
  }
}
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
          if (props.replyAll) {
            const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
            const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
            const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
            const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
            opts.to = [];
            if (from?.value) opts.to.push(...from.value.split(","));
            if (to?.value) opts.to.push(...to.value.split(","));
            opts.to = [
              ...new Set(opts.to),
            ];
            if (cc) {
              opts.cc = cc.value.split(",");
            }
            if (bcc) {
              opts.bcc = bcc.value.split(",");
            }
          }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-03T18:37:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -303,6 +303,23 @@ export default {
           opts.inReplyTo = inReplyTo;
           opts.references = inReplyTo;
           opts.threadId = repliedMessage.threadId;
+          if (props.replyAll) {
+            const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
+            const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
+            const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
+            const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
+            opts.to = from.value.split(",");
+            opts.to.push(...to.value.split(","));
+            opts.to = [
+              ...new Set(opts.to),
+            ];
+            if (cc) {
+              opts.cc = cc.value;
+            }
+            if (bcc) {
+              opts.bcc = bcc.value;
+            }
path: components/gmail/gmail.app.mjs
user: login: jlil
body: It'd be nice to set the `inReplyTo` and `reference` props to `messageId` automatically here
created_at: 2025-05-04T13:35:02Z
author_association: NONE
diff_hunk: @@ -303,6 +303,23 @@ export default {
           opts.inReplyTo = inReplyTo;
           opts.references = inReplyTo;
           opts.threadId = repliedMessage.threadId;
+          if (props.replyAll) {
+            const from = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "from");
+            const to = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "to");
+            const cc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "cc");
+            const bcc = repliedMessage.payload.headers.find(({ name }) => name.toLowerCase() === "bcc");
+            opts.to = from.value.split(",");
+            opts.to.push(...to.value.split(","));
+            opts.to = [
+              ...new Set(opts.to),
+            ];
+            if (cc) {
+              opts.cc = cc.value;
+            }
+            if (bcc) {
+              opts.bcc = bcc.value;
+            }
path: components/gmail/gmail.app.mjs
user: login: dannyroosevelt
body: I agree that'd be nice but Wwe don't want to set props references automatically from the component code because step references can change and it also doesn't work in the context of Pipedream Connect
created_at: 2025-05-04T13:52:50Z
author_association: COLLABORATOR
diff_hunk: @@ -100,7 +117,7 @@ export default {
     }
     const opts = await this.gmail.getOptionsToSendEmail($, this);
     const response = await this.gmail.sendEmail(opts);
-    $.export("$summary", `Successfully sent email to ${this.to}`);
+    $.export("$summary", `Successfully sent email to ${opts.to}`);
path: components/gmail/actions/send-email/send-email.mjs
user: login: vunguyenhung
body: ```suggestion
    $.export("$summary", "Successfully sent the email");
```
created_at: 2025-05-06T02:02:30Z
author_association: CONTRIBUTOR

PR comments:
user: login: vercel[bot]
created_at: 2025-05-03T17:55:44Z
body: [vc]: #UdPt56EJ4OREDouccaOgRoERxUi08Oj313/SXF14LrA=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJwaXBlZHJlYW0tZG9jcy1yZWRpcmVjdC1kby1ub3QtZWRpdCIsInJvb3REaXJlY3RvcnkiOiJkb2NzIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IiJ9LCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vcGlwZWRyZWFtZXJzL3BpcGVkcmVhbS1kb2NzLXJlZGlyZWN0LWRvLW5vdC1lZGl0L0ZIV2YyTkZ2NEhnYzh4cXM0V3Q4SHhqcjdwcHIiLCJuZXh0Q29tbWl0U3RhdHVzIjoiSUdOT1JFRCJ9LHsibmFtZSI6InBpcGVkcmVhbS1kb2NzIiwicm9vdERpcmVjdG9yeSI6ImRvY3MiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn0sImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9waXBlZHJlYW1lcnMvcGlwZWRyZWFtLWRvY3MvOTROR3FiZHZzbjdTVEcxMUJoQm41Z05LeGVKRCIsIm5leHRDb21taXRTdGF0dXMiOiJJR05PUkVEIn0seyJuYW1lIjoiZG9jcy12MiIsInJvb3REaXJlY3RvcnkiOiJkb2NzLXYyIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IiJ9LCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vcGlwZWRyZWFtZXJzL2RvY3MtdjIvaXozRVFMM3BSNENwOFpjeUU1dU1COXlOeFVlUiIsIm5leHRDb21taXRTdGF0dXMiOiJJR05PUkVEIiwicHJldmlld1VybCI6ImRvY3MtdjItZ2l0LWdtYWlsLXVwZGF0ZXMtcGlwZWRyZWFtZXJzLnZlcmNlbC5hcHAifV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)


<details><summary>3 Skipped Deployments</summary>

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **docs-v2** | ⬜️ Ignored ([Inspect](https://vercel.com/pipedreamers/docs-v2/iz3EQL3pR4Cp8ZcyE5uMB9yNxUeR)) | [Visit Preview](https://docs-v2-git-gmail-updates-pipedreamers.vercel.app) |  | May 6, 2025 2:03am |
| **pipedream-docs** | ⬜️ Ignored ([Inspect](https://vercel.com/pipedreamers/pipedream-docs/94NGqbdvsn7STG11BhBn5gNKxeJD)) |  |  | May 6, 2025 2:03am |
| **pipedream-docs-redirect-do-not-edit** | ⬜️ Ignored ([Inspect](https://vercel.com/pipedreamers/pipedream-docs-redirect-do-not-edit/FHWf2NFv4Hgc8xqs4Wt8Hxjr7ppr)) |  |  | May 6, 2025 2:03am |
</details>




author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-03T17:55:47Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This update primarily increments version numbers across multiple Gmail action and source modules, reflecting minor updates or maintenance. Notably, the "Send Email" action and supporting logic in `gmail.app.mjs` are enhanced to support a "reply all" feature: when replying to an email, users can now choose to reply to all original recipients. The code for parsing and handling "cc" and "bcc" headers is also improved in the email processing logic. No breaking changes or removals are present.

## Changes

| File(s)                                                                                                         | Change Summary                                                                                                                                                                                                                                 |
|-----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| components/gmail/actions/add-label-to-email/add-label-to-email.mjs<br>components/gmail/actions/approve-workflow/approve-workflow.mjs<br>components/gmail/actions/archive-email/archive-email.mjs<br>components/gmail/actions/create-draft/create-draft.mjs<br>components/gmail/actions/download-attachment/download-attachment.mjs<br>components/gmail/actions/find-email/find-email.mjs<br>components/gmail/actions/list-labels/list-labels.mjs<br>components/gmail/actions/remove-label-from-email/remove-label-from-email.mjs<br>components/gmail/actions/update-org-signature/update-org-signature.mjs<br>components/gmail/actions/update-primary-signature/update-primary-signature.mjs<br>components/gmail/sources/new-attachment-received/new-attachment-received.mjs<br>components/gmail/sources/new-email-matching-search/new-email-matching-search.mjs<br>components/gmail/sources/new-email-received/new-email-received.mjs<br>components/gmail/sources/new-labeled-email/new-labeled-email.mjs<br>components/gmail/sources/new-sent-email/new-sent-email.mjs | Incremented version numbers in metadata for multiple Gmail actions and sources; no code or logic changes.                                                                                               |
| components/gmail/actions/send-email/send-email.mjs                                                              | Added support for "reply all" via new `replyAll` property and logic; updated `inReplyTo` to trigger UI reloads; summary message now uses a generic success message. Version incremented.                      |
| components/gmail/gmail.app.mjs                                                                                  | Enhanced `getOptionsToSendEmail` to handle "reply all" by extracting and combining "From", "To", "Cc", and "Bcc" headers for recipient lists when replying to all, excluding the current user.                                      |
| components/gmail/sources/common/base.mjs                                                                        | Modified `processEmail` to extract and parse "cc" and "bcc" headers, adding them to the structured email object.                                                                                       |
| components/gmail/package.json                                                                                   | Incremented package version from 0.3.0 to 0.3.2.                                                                                                                                                       |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant SendEmailAction
    participant GmailApp

    User->>SendEmailAction: Initiate send email (with inReplyTo)
    SendEmailAction->>GmailApp: getOptionsToSendEmail(props)
    alt replyAll is true
        GmailApp->>GmailApp: Extract From, To, Cc, Bcc from original message
        GmailApp->>SendEmailAction: Return all recipients as to/cc/bcc
    else replyAll is false
        GmailApp->>SendEmailAction: Return standard recipients
    end
    SendEmailAction->>User: Email sent summary (generic success message)
```

## Possibly related PRs

- [PipedreamHQ/pipedream#16276](https://github.com/PipedreamHQ/pipedream/pull/16276): Introduces the archive-email action, which is related to this PR where only the version for that action is incremented.  
- [PipedreamHQ/pipedream#16536](https://github.com/PipedreamHQ/pipedream/pull/16536): Adds new props and logic to the create-draft action, preceding the version bump in this PR.

## Suggested labels

`action`, `User submitted`

## Suggested reviewers

- michelle0927

## Poem

> A rabbit hops through code so bright,  
> Version bumps left and right!  
> Now when you reply, reply to all—  
> No friend or CC left in the hall.  
> Headers parsed, recipients found,  
> In Gmail’s warren, updates abound!  
> 🐇✉️

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>components/gmail/actions/send-email/send-email.mjs</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs
>     at packageResolve (node:internal/modules/esm/resolve:839:9)
>     at moduleResolve (node:internal/modules/esm/resolve:908:18)
>     at defaultResolve (node:internal/modules/esm/resolve:1038:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:525:25)
>     at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:246:38)
>     at ModuleJob._link (node:internal/modules/esm/module_job:126:49)
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b516059d1721f8cbc397ec32be0eb640b51766f5 and 461b753c82b6954de595250b0af3861fbc50ff34.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `components/gmail/actions/send-email/send-email.mjs` (4 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* components/gmail/actions/send-email/send-email.mjs

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: Verify TypeScript components
* GitHub Check: pnpm publish
* GitHub Check: Publish TypeScript components

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=PipedreamHQ/pipedream&utm_content=16552):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: jlil
created_at: 2025-05-04T13:31:17Z
body: @michelle0927 this is great start, thank you so much! 
Since the `replyAll` now includes the original `to` value, we should try to remove the user's calendar email from the list that matches the address in `/gmail/v1/users/me/profile`. Thoughts?
author_association: NONE
user: login: dannyroosevelt
created_at: 2025-05-04T13:53:29Z
body: > @michelle0927 this is great start, thank you so much! 
> 
> Since the `replyAll` now includes the original `to` value, we should try to remove the user's calendar email from the list that matches the address in `/gmail/v1/users/me/profile`. Thoughts?

I don't totally understand the ask, can you clarify?
author_association: COLLABORATOR
user: login: jlil
created_at: 2025-05-04T14:04:17Z
body: @dannyroosevelt since the `to` field we're setting uses the original `to` header value, this will also include the email of the user replying.

Headers:
```
from: user1@example.com
to: user2@example.com, user3@example.com
```

ReplyAll should set this:
```
from: user2@example.com
to:  user1@example.com, user3@example.com
```
not this:
```
from: user2@example.com
to:  user1@example.com, user2@example.com, user3@example.com
```


author_association: NONE
user: login: vunguyenhung
created_at: 2025-05-06T02:09:00Z
body: Hi everyone, all test cases are passed! Ready for release! 

Test report
https://vunguyenhung.notion.site/Gmail-updates-for-email-replies-1eabf548bb5e81bcad48cf79612b48e2
author_association: CONTRIBUTOR
user: login: michelle0927
created_at: 2025-05-06T14:13:21Z
body: /approve
author_association: COLLABORATOR