Skip to content
Open
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
04e8c2a
new ticketsauce actions and source
sergio-eliot-rodriguez Oct 16, 2025
94760df
new ticket components: catches by coderabit
sergio-eliot-rodriguez Oct 17, 2025
46e2542
new ticket components: lint fixes
sergio-eliot-rodriguez Oct 17, 2025
3418247
Update components/ticketsauce/actions/get-orders/get-orders.mjs
GTFalcao Oct 17, 2025
6039bcd
Merge remote-tracking branch 'upstream/master' into ticketsauce-compo…
sergio-eliot-rodriguez Oct 18, 2025
f12bbae
Update components/ticketsauce/actions/get-orders/get-orders.mjs
GTFalcao Oct 17, 2025
74418a1
Merge remote-tracking branch 'upstream/master' into ticketsauce-compo…
sergio-eliot-rodriguez Oct 19, 2025
3e107bc
Merge branch 'ticketsauce-components' of https://github.com/sergio-el…
sergio-eliot-rodriguez Oct 19, 2025
cf31f14
Update components/ticketsauce/actions/get-events/get-events.mjs
sergio-eliot-rodriguez Oct 19, 2025
73f21d3
Update components/ticketsauce/actions/get-events/get-events.mjs
sergio-eliot-rodriguez Oct 19, 2025
1d1cee5
Update components/ticketsauce/actions/get-event-details/get-event-det…
sergio-eliot-rodriguez Oct 19, 2025
7fbf1d0
new ticketsauce actions and source
sergio-eliot-rodriguez Oct 16, 2025
4053425
new ticket components: catches by coderabit
sergio-eliot-rodriguez Oct 17, 2025
38b7217
new ticket components: lint fixes
sergio-eliot-rodriguez Oct 17, 2025
442c587
Update components/ticketsauce/actions/get-orders/get-orders.mjs
GTFalcao Oct 17, 2025
deb15cf
Update components/ticketsauce/actions/get-events/get-events.mjs
sergio-eliot-rodriguez Oct 19, 2025
4d59e81
Update components/ticketsauce/actions/get-events/get-events.mjs
sergio-eliot-rodriguez Oct 19, 2025
59b8e40
Update components/ticketsauce/actions/get-event-details/get-event-det…
sergio-eliot-rodriguez Oct 19, 2025
bd77627
new ticketsauce components: addressing reivew comments by Guilherm
sergio-eliot-rodriguez Oct 19, 2025
92856bc
new ticketsauce components: addressing review comments by Guilherme
sergio-eliot-rodriguez Oct 19, 2025
109323f
Adding app scaffolding for topdesk
danhsiung Oct 20, 2025
fd6b048
Adding app scaffolding for copicake
danhsiung Oct 20, 2025
ffab7aa
Adding app scaffolding for cronly
danhsiung Oct 20, 2025
54291be
Merging pull request #18785
michelle0927 Oct 21, 2025
27daacf
Add Airweave app (#18779)
EwanTauran Oct 21, 2025
a9fffb6
Adding app scaffolding for coinapi
danhsiung Oct 21, 2025
ae337a2
Merge branch 'ticketsauce-components' of https://github.com/sergio-el…
sergio-eliot-rodriguez Oct 21, 2025
37abd15
added summaries to getOrderDetails getEventDetails and getTicketCheck…
sergio-eliot-rodriguez Oct 21, 2025
4304a3c
fixed eslint errors
sergio-eliot-rodriguez Oct 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions components/airweave/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Airweave Integration for Pipedream

Airweave is an open-source platform that makes **any app searchable for your agent** by syncing data from various sources with minimal configuration for agentic search.

## What is Airweave?

Airweave serves as a bridge between your data sources and agents, transforming raw data into queryable knowledge. It can extract and process data from:

- API endpoints (REST)
- Productivity and collaboration tools
- Relational databases
- Document stores
- File systems and storage services

## Available Actions

### Collections
- **Search Collection** - Search across all data sources within a collection (semantic + keyword search)
- **List Collections** - Get all collections in your organization
- **Create Collection** - Create a new collection to group data sources
- **Get Collection** - Retrieve details of a specific collection
- **Delete Collection** - Permanently remove a collection and all associated data

### Sources
- **List Sources** - Get all available data source connectors
- **Trigger Sync** - Manually trigger a data sync for a source connection

## Setup

1. Sign up for an Airweave account at [airweave.ai](https://airweave.ai)
2. Get your API key from the Airweave dashboard (Settings → API Keys)
3. Connect your Airweave account in Pipedream by entering your API key

## Example Workflows

### Slack Q&A Bot
Slash command → Search Airweave collection → Reply with relevant information

### Support Automation
Form submission → Search documentation → Create support ticket with context

### Daily Digest
Cron schedule → Search recent updates → Send email summary

### GitHub Integration
New issue → Search codebase → Auto-comment with relevant code references

## Authentication

This integration uses API key authentication. You can find your API key in your Airweave dashboard under Settings → API Keys.

Optionally, you can specify a custom base URL if you're using a self-hosted Airweave instance.

## Links

- [Airweave Documentation](https://docs.airweave.ai)
- [Airweave GitHub](https://github.com/airweave-ai/airweave)
- [API Reference](https://docs.airweave.ai/api-reference)
- [Airweave TypeScript SDK](https://github.com/airweave-ai/typescript-sdk)

## Support

For issues or questions:
- Airweave Community: [GitHub Discussions](https://github.com/airweave-ai/airweave/discussions)
- Pipedream Support: [pipedream.com/support](https://pipedream.com/support)

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-create-collection",
name: "Create Collection",
description: "Create a new Airweave collection. Collections are logical groups of data sources that provide unified search capabilities. The newly created collection is initially empty until you add source connections to it. [See the documentation](https://docs.airweave.ai/api-reference/collections/create)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: false,
},
type: "action",
props: {
airweave,
name: {
type: "string",
label: "Name",
description: "Display name for the collection (e.g., 'Customer Support Data')",
},
readableId: {
type: "string",
label: "Readable ID",
description: "URL-friendly identifier for the collection (lowercase, hyphens allowed, e.g., 'customer-support-data'). This cannot be changed after creation.",
},
description: {
type: "string",
label: "Description",
description: "Optional description of what this collection contains and its purpose",
optional: true,
},
},
async run({ $ }) {
const response = await this.airweave.createCollection({
name: this.name,
readable_id: this.readableId,
description: this.description,
});

$.export("$summary", `Successfully created collection: ${response.name} (${response.readable_id})`);

return response;
},
};

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-delete-collection",
name: "Delete Collection",
description: "Delete a collection and all associated data. This permanently removes the collection including all synced data and source connections. This action cannot be undone. [See the documentation](https://docs.airweave.ai/api-reference/collections/delete)",
version: "0.0.1",
annotations: {
destructiveHint: true,
openWorldHint: true,
readOnlyHint: false,
},
type: "action",
props: {
airweave,
collectionId: {
propDefinition: [
airweave,
"collectionId",
],
},
confirmation: {
type: "string",
label: "Confirmation",
description: "Type 'DELETE' to confirm deletion. This action cannot be undone.",
},
},
async run({ $ }) {
if (this.confirmation !== "DELETE") {
throw new Error("Please type 'DELETE' to confirm deletion. This action cannot be undone.");
}
Comment on lines +22 to +31
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 | 🟠 Major

Harden confirmation check and summary for 204/empty responses.

DELETE often returns 204. Guard against undefined response and make confirmation user-proof (trim + case-insensitive).

   confirmation: {
     type: "string",
     label: "Confirmation",
     description: "Type 'DELETE' to confirm deletion. This action cannot be undone.",
+    placeholder: "DELETE",
   },
 ...
   async run({ $ }) {
-    if (this.confirmation !== "DELETE") {
+    if ((this.confirmation ?? "").trim().toUpperCase() !== "DELETE") {
       throw new Error("Please type 'DELETE' to confirm deletion. This action cannot be undone.");
     }
 
-    const response = await this.airweave.deleteCollection(this.collectionId);
+    const response = await this.airweave.deleteCollection(this.collectionId);
 
-    $.export("$summary", `Successfully deleted collection: ${response.name} (${response.readable_id})`);
+    const name = response?.name ?? this.collectionId;
+    const rid = response?.readable_id ?? this.collectionId;
+    $.export("$summary", `Successfully deleted collection: ${name} (${rid})`);

As per component guidelines.

Also applies to: 33-37

🤖 Prompt for AI Agents
In components/airweave/actions/delete-collection/delete-collection.mjs around
lines 22-31 (and similarly apply to 33-37), the confirmation check and handling
of DELETE responses need hardening: make the confirmation check robust by
trimming whitespace and comparing case-insensitively (e.g., normalize
this.confirmation before validating against "DELETE"), and guard response
processing to accept 204/no-body results by checking for undefined/null response
or empty body before accessing fields — treat a 204 or missing body as a
successful deletion and set the summary accordingly; update error messages and
summary logic to reflect these cases.


const response = await this.airweave.deleteCollection(this.collectionId);

$.export("$summary", `Successfully deleted collection: ${response.name} (${response.readable_id})`);

return response;
},
};

31 changes: 31 additions & 0 deletions components/airweave/actions/get-collection/get-collection.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-get-collection",
name: "Get Collection",
description: "Retrieve details of a specific collection by its readable ID. [See the documentation](https://docs.airweave.ai/api-reference/collections/get)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
type: "action",
props: {
airweave,
collectionId: {
propDefinition: [
airweave,
"collectionId",
],
},
},
async run({ $ }) {
const response = await this.airweave.getCollection(this.collectionId);

$.export("$summary", `Successfully retrieved collection: ${response.name} (${response.readable_id})`);

return response;
},
};

46 changes: 46 additions & 0 deletions components/airweave/actions/list-collections/list-collections.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-list-collections",
name: "List Collections",
description: "List all collections in your organization. Collections are logical groups of data sources that provide unified search capabilities. [See the documentation](https://docs.airweave.ai/api-reference/collections/list)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
type: "action",
props: {
airweave,
skip: {
type: "integer",
label: "Skip",
description: "Number of collections to skip for pagination",
optional: true,
default: 0,
min: 0,
},
limit: {
type: "integer",
label: "Limit",
description: "Maximum number of collections to return",
optional: true,
default: 50,
min: 1,
max: 100,
},
},
async run({ $ }) {
const response = await this.airweave.listCollections({
skip: this.skip,
limit: this.limit,
});

const count = response.length;
$.export("$summary", `Successfully retrieved ${count} collection(s)`);

return response;
},
};

26 changes: 26 additions & 0 deletions components/airweave/actions/list-sources/list-sources.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-list-sources",
name: "List Available Sources",
description: "List all available data source connectors. These are the types of integrations Airweave can connect to (e.g., GitHub, Slack, Google Drive, PostgreSQL, etc.). [See the documentation](https://docs.airweave.ai/api-reference/sources/list)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
type: "action",
props: {
airweave,
},
async run({ $ }) {
const response = await this.airweave.listSources();

const count = response.length;
$.export("$summary", `Successfully retrieved ${count} available source connector(s)`);

return response;
},
};

Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-search-collection",
name: "Search Collection",
description: "Search across all data sources within a collection using semantic and keyword search. [See the documentation](https://docs.airweave.ai/api-reference/collections/search)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: true,
},
type: "action",
props: {
airweave,
collectionId: {
propDefinition: [
airweave,
"collectionId",
],
},
searchQuery: {
propDefinition: [
airweave,
"searchQuery",
],
},
searchLimit: {
propDefinition: [
airweave,
"searchLimit",
],
},
responseType: {
propDefinition: [
airweave,
"responseType",
],
},
offset: {
type: "integer",
label: "Offset",
description: "Number of results to skip for pagination",
optional: true,
default: 0,
min: 0,
},
recencyBias: {
type: "string",
label: "Recency Bias",
description: "How much to weigh recency vs similarity (0-1). 0 = no recency effect; 1 = rank by recency only",
optional: true,
},
Comment on lines +48 to +53
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 | 🟡 Minor

Validate recencyBias and avoid passing NaN/out-of-range.

parseFloat may yield NaN; also enforce 0–1 bounds to prevent API errors.

-    recencyBias: {
+    recencyBias: {
       type: "string",
       label: "Recency Bias",
       description: "How much to weigh recency vs similarity (0-1). 0 = no recency effect; 1 = rank by recency only",
       optional: true,
     },
@@
-    if (this.recencyBias !== undefined) {
-      params.recency_bias = parseFloat(this.recencyBias);
-    }
+    if (this.recencyBias !== undefined && this.recencyBias !== "") {
+      const rb = parseFloat(this.recencyBias);
+      if (Number.isNaN(rb) || rb < 0 || rb > 1) {
+        throw new Error(`Invalid recencyBias "${this.recencyBias}". Expected a number between 0 and 1.`);
+      }
+      params.recency_bias = rb;
+    }

Also applies to: 66-68

🤖 Prompt for AI Agents
In components/airweave/actions/search-collection/search-collection.mjs around
lines 48-53 (and also apply same fix to lines 66-68), the recencyBias value is
parsed with parseFloat and may become NaN or outside the allowed 0–1 range;
validate and sanitize it by checking the parsed value is a finite number and
then clamp it to the 0–1 interval (or fallback to a safe default like 0 if
invalid) before passing to the API to avoid NaN or out-of-range errors.

},
async run({ $ }) {
const params = {
query: this.searchQuery,
limit: this.searchLimit,
offset: this.offset,
};

if (this.responseType) {
params.response_type = this.responseType;
}

if (this.recencyBias !== undefined) {
params.recency_bias = parseFloat(this.recencyBias);
}

const response = await this.airweave.searchCollection(
this.collectionId,
params,
);

const resultCount = response.results?.length || 0;
$.export("$summary", `Successfully searched collection "${this.collectionId}" and found ${resultCount} result(s)`);

return response;
},
};

43 changes: 43 additions & 0 deletions components/airweave/actions/trigger-sync/trigger-sync.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import airweave from "../../airweave.app.mjs";

export default {
key: "airweave-trigger-sync",
name: "Trigger Source Connection Sync",
description: "Manually trigger a data sync for a source connection. The sync job runs asynchronously in the background and returns immediately with job details. [See the documentation](https://docs.airweave.ai/api-reference/source-connections/run)",
version: "0.0.1",
annotations: {
destructiveHint: false,
openWorldHint: true,
readOnlyHint: false,
},
type: "action",
props: {
airweave,
collectionId: {
propDefinition: [
airweave,
"collectionId",
],
description: "The collection that contains the source connection",
},
sourceConnectionId: {
propDefinition: [
airweave,
"sourceConnectionId",
(c) => ({
collectionId: c.collectionId,
}),
],
},
},
async run({ $ }) {
const response = await this.airweave.runSourceConnection(
this.sourceConnectionId,
);

$.export("$summary", `Successfully triggered sync job: ${response.id} (Status: ${response.status})`);

return response;
},
};

Loading
Loading