Skip to content

Trengo internal notes #17600

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from

Conversation

seynadio
Copy link

@seynadio seynadio commented Jul 14, 2025

WHY

  1. Enhanced Trengo app (trengo.app.mjs):
    - Added createInternalNote() method using /tickets/notes endpoint
  2. New create-internal-note action:
    - Dedicated action for creating internal notes on tickets
    - Uses ticket ID and note content parameters
  3. Enhanced send-a-message action (send-a-message.mjs):
    - Added createInternalNote boolean option
    - Conditional logic to create internal notes instead of sending messages
    - Version bumped to 0.0.3
  4. Updated package version to 0.1.1
  5. Leveraged existing webhook source:
    - The new-internal-note webhook source already exists and listens for "NOTE" events

Summary by CodeRabbit

  • New Features

    • Added the ability to create internal notes on Freshdesk and Trengo tickets, allowing private notes visible only to team members.
    • Introduced a new action for Trengo to create internal notes directly on tickets.
    • Enhanced Trengo messaging with an option to send a message as an internal note instead.
  • Improvements

    • Updated summary messages to clearly indicate whether an internal note was added or a ticket was updated.

seynadio added 2 commits July 14, 2025 10:42
- Add createInternalNote method to Trengo app
- Add dedicated create-internal-note action for adding notes to tickets
- Enhance send-a-message action with createInternalNote option
- Update package version to 0.1.1
- Leverage existing new-internal-note webhook source for notifications
Copy link
Contributor

coderabbitai bot commented Jul 14, 2025

Walkthrough

The changes introduce and enhance internal note functionality for Freshdesk and Trengo integrations. New properties and methods allow adding internal notes to tickets, either as standalone actions or as options within existing ticket update or message-sending actions. Supporting methods and version increments were added to ensure proper API interaction and version tracking.

Changes

File(s) Change Summary
components/freshdesk/actions/update-ticket/update-ticket.mjs Added internalNote and noteBody props; updated logic to allow adding internal notes to tickets.
components/trengo/actions/create-internal-note/create-internal-note.mjs New action for creating internal notes on Trengo tickets.
components/trengo/actions/send-a-message/send-a-message.mjs Added createInternalNote prop; updated logic to optionally create internal notes instead of sending messages.
components/trengo/trengo.app.mjs Added createInternalNote method to interact with Trengo's internal notes API.
components/trengo/package.json Incremented package version from 0.1.0 to 0.1.1.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant FreshdeskAction
    participant FreshdeskAPI

    User->>FreshdeskAction: Run update-ticket with internalNote and noteBody
    alt internalNote is true and noteBody provided
        FreshdeskAction->>FreshdeskAPI: POST /tickets/{ticketId}/notes (add internal note)
        FreshdeskAPI-->>FreshdeskAction: Response
        FreshdeskAction-->>User: Return note added summary
    else
        FreshdeskAction->>FreshdeskAPI: PUT /tickets/{ticketId} (update ticket)
        FreshdeskAPI-->>FreshdeskAction: Response
        FreshdeskAction-->>User: Return ticket updated summary
    end
Loading
sequenceDiagram
    participant User
    participant TrengoAction
    participant TrengoApp
    participant TrengoAPI

    User->>TrengoAction: Run create-internal-note with ticketId and note
    TrengoAction->>TrengoApp: createInternalNote({ticketId, note})
    TrengoApp->>TrengoAPI: POST /tickets/notes
    TrengoAPI-->>TrengoApp: Response
    TrengoApp-->>TrengoAction: Response
    TrengoAction-->>User: Return note created summary
Loading
sequenceDiagram
    participant User
    participant SendMessageAction
    participant TrengoApp
    participant TrengoAPI

    User->>SendMessageAction: Run send-a-message with createInternalNote flag
    alt createInternalNote is true
        SendMessageAction->>TrengoApp: createInternalNote({message, metadata})
        TrengoApp->>TrengoAPI: POST /tickets/notes
        TrengoAPI-->>TrengoApp: Response
        TrengoApp-->>SendMessageAction: Response
        SendMessageAction-->>User: Return internal note created summary
    else
        SendMessageAction->>TrengoApp: sendMessage({message, subject, ...})
        TrengoApp->>TrengoAPI: POST /messages
        TrengoAPI-->>TrengoApp: Response
        TrengoApp-->>SendMessageAction: Response
        SendMessageAction-->>User: Return message sent summary
    end
Loading

Poem

🐇
Notes in the tickets, quietly hop,
Freshdesk and Trengo, now both on top!
Internal whispers, private and neat,
Rabbits rejoice in this clever feat.
Version bumps and features anew—
Hopping through code, as rabbits do!

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.

🔧 ESLint

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.

components/trengo/actions/send-a-message/send-a-message.mjs

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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
at packageResolve (node:internal/modules/esm/resolve:767:81)
at moduleResolve (node:internal/modules/esm/resolve:853:18)
at defaultResolve (node:internal/modules/esm/resolve:983:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:801:12)
at #cachedDefaultResolve (node:internal/modules/esm/loader:725:25)
at ModuleLoader.resolve (node:internal/modules/esm/loader:708:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:309:38)
at #link (node:internal/modules/esm/module_job:202:49)

components/trengo/trengo.app.mjs

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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
at packageResolve (node:internal/modules/esm/resolve:767:81)
at moduleResolve (node:internal/modules/esm/resolve:853:18)
at defaultResolve (node:internal/modules/esm/resolve:983:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:801:12)
at #cachedDefaultResolve (node:internal/modules/esm/loader:725:25)
at ModuleLoader.resolve (node:internal/modules/esm/loader:708:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:309:38)
at #link (node:internal/modules/esm/module_job:202:49)

components/freshdesk/actions/update-ticket/update-ticket.mjs

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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
at packageResolve (node:internal/modules/esm/resolve:767:81)
at moduleResolve (node:internal/modules/esm/resolve:853:18)
at defaultResolve (node:internal/modules/esm/resolve:983:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:801:12)
at #cachedDefaultResolve (node:internal/modules/esm/loader:725:25)
at ModuleLoader.resolve (node:internal/modules/esm/loader:708:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:309:38)
at #link (node:internal/modules/esm/module_job:202:49)

  • 1 others
✨ Finishing Touches
  • 📝 Generate Docstrings

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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 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 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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@adolfo-pd adolfo-pd added the User submitted Submitted by a user label Jul 14, 2025
@pipedream-component-development
Copy link
Collaborator

Thank you so much for submitting this! We've added it to our backlog to review, and our team has been notified.

@pipedream-component-development
Copy link
Collaborator

Thanks for submitting this PR! When we review PRs, we follow the Pipedream component guidelines. If you're not familiar, here's a quick checklist:

Copy link

vercel bot commented Jul 14, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

2 Skipped Deployments
Name Status Preview Comments Updated (UTC)
pipedream-docs ⬜️ Ignored (Inspect) Jul 14, 2025 9:26am
pipedream-docs-redirect-do-not-edit ⬜️ Ignored (Inspect) Jul 14, 2025 9:26am

Copy link

vercel bot commented Jul 14, 2025

@seynadio is attempting to deploy a commit to the Pipedreamers Team on Vercel.

A member of the Team first needs to authorize it.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e21d334 and 4e01d37.

📒 Files selected for processing (5)
  • components/freshdesk/actions/update-ticket/update-ticket.mjs (3 hunks)
  • components/trengo/actions/create-internal-note/create-internal-note.mjs (1 hunks)
  • components/trengo/actions/send-a-message/send-a-message.mjs (2 hunks)
  • components/trengo/package.json (1 hunks)
  • components/trengo/trengo.app.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (4)
components/trengo/package.json (1)
Learnt from: jcortes
PR: PipedreamHQ/pipedream#14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like `fs` to `package.json` dependencies, as they are native modules provided by the Node.js runtime.
components/trengo/actions/create-internal-note/create-internal-note.mjs (1)
Learnt from: jcortes
PR: PipedreamHQ/pipedream#14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
components/trengo/actions/send-a-message/send-a-message.mjs (3)
Learnt from: GTFalcao
PR: PipedreamHQ/pipedream#12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Learnt from: GTFalcao
PR: PipedreamHQ/pipedream#12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Learnt from: jcortes
PR: PipedreamHQ/pipedream#14467
File: components/gainsight_px/actions/create-account/create-account.mjs:4-6
Timestamp: 2024-10-30T15:24:39.294Z
Learning: In `components/gainsight_px/actions/create-account/create-account.mjs`, the action name should be "Create Account" instead of "Create Memory".
components/freshdesk/actions/update-ticket/update-ticket.mjs (2)
Learnt from: GTFalcao
PR: PipedreamHQ/pipedream#12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-07-04T18:11:59.822Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
Learnt from: GTFalcao
PR: PipedreamHQ/pipedream#12731
File: components/hackerone/actions/get-members/get-members.mjs:3-28
Timestamp: 2024-10-08T15:33:38.240Z
Learning: When exporting a summary message in the `run` method of an action, ensure the message is correctly formatted. For example, in the `hackerone-get-members` action, the correct format is `Successfully retrieved ${response.data.length} members`.
🔇 Additional comments (8)
components/trengo/package.json (1)

3-3: LGTM: Appropriate version bump for new functionality.

The version increment from 0.1.0 to 0.1.1 correctly reflects the addition of internal note functionality without introducing breaking changes.

components/trengo/trengo.app.mjs (1)

244-250: LGTM: Well-implemented method following established patterns.

The createInternalNote method is correctly implemented, following the same pattern as other methods in the file and using the appropriate POST request to the /tickets/notes endpoint.

components/freshdesk/actions/update-ticket/update-ticket.mjs (3)

8-8: LGTM: Appropriate version bump for new functionality.

The version increment reflects the addition of internal note functionality.


74-86: LGTM: Well-structured props for internal note functionality.

The boolean internalNote flag and noteBody string prop provide clear control over internal note creation.


120-133: LGTM: Correct implementation of internal note creation.

The early return pattern properly separates internal note creation from ticket updates, using the correct Freshdesk API endpoint /tickets/{ticketId}/notes with the private: true flag.

components/trengo/actions/create-internal-note/create-internal-note.mjs (1)

1-37: LGTM: Clean and focused action implementation.

The action is well-structured with appropriate props and correctly uses the app's createInternalNote method. The note prop is properly made mandatory, and the data structure with ticket_id and note fields is correct.

components/trengo/actions/send-a-message/send-a-message.mjs (2)

6-6: LGTM: Appropriate version bump for new functionality.

The version increment reflects the addition of internal note functionality.


43-49: LGTM: Clear prop definition for internal note toggle.

The boolean prop with appropriate default and description provides clear control over the action behavior.

Comment on lines +52 to +68
if (this.createInternalNote) {
// Create internal note instead of sending message
const resp = await this.app.createInternalNote({
$,
data: {
note: this.message,
// Internal notes might need additional context
metadata: {
channel_id: this.channelId,
contact_identifier: this.contactIdentifier,
contact_name: this.contactName,
},
},
});
$.export("$summary", "Internal note has been created");
return resp;
} else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Critical: Missing ticket_id for internal note creation.

Internal notes must be associated with a ticket, but no ticket_id is being passed to the createInternalNote method. This will likely cause API errors since the /tickets/notes endpoint requires knowing which ticket to attach the note to.

Additionally, the metadata structure being passed is inconsistent with the dedicated create-internal-note action which only passes ticket_id and note.

Consider one of these solutions:

  1. Add a ticketId prop to this action when createInternalNote is true
  2. Remove the internal note functionality from this action since it's better handled by the dedicated create-internal-note action
  3. Clarify the API requirements for the /tickets/notes endpoint
 data: {
+  ticket_id: this.ticketId, // Add this prop to the action
   note: this.message,
-  // Internal notes might need additional context
-  metadata: {
-    channel_id: this.channelId,
-    contact_identifier: this.contactIdentifier,
-    contact_name: this.contactName,
-  },
 },
📝 Committable suggestion

‼️ 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.

Suggested change
if (this.createInternalNote) {
// Create internal note instead of sending message
const resp = await this.app.createInternalNote({
$,
data: {
note: this.message,
// Internal notes might need additional context
metadata: {
channel_id: this.channelId,
contact_identifier: this.contactIdentifier,
contact_name: this.contactName,
},
},
});
$.export("$summary", "Internal note has been created");
return resp;
} else {
if (this.createInternalNote) {
// Create internal note instead of sending message
const resp = await this.app.createInternalNote({
$,
data: {
ticket_id: this.ticketId, // Add this prop to the action
note: this.message,
},
});
$.export("$summary", "Internal note has been created");
return resp;
} else {
🤖 Prompt for AI Agents
In components/trengo/actions/send-a-message/send-a-message.mjs around lines 52
to 68, the internal note creation is missing the required ticket_id parameter,
which is necessary for associating the note with a ticket and avoiding API
errors. To fix this, add a ticketId property to the action and include it in the
data passed to createInternalNote, ensuring the payload matches the expected
structure of the dedicated create-internal-note action by passing only ticket_id
and note. Alternatively, consider removing the internal note functionality from
this action if it is better handled separately.

@seynadio
Copy link
Author

Closing this PR and replacing with #17606 which has only the Trengo changes (no accidental Freshdesk changes included) and improved validation logic

@seynadio seynadio closed this Jul 14, 2025
@seynadio seynadio deleted the trengo-internal-notes branch July 14, 2025 11:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
User submitted Submitted by a user
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants