Skip to content

Commit 3c28519

Browse files
authored
Merge branch 'master' into ss/gdrive-shared-drive-regression-fix
2 parents 4cca36e + a55d2c7 commit 3c28519

928 files changed

Lines changed: 19401 additions & 1690 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coderabbit.yaml

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ reviews:
1919
Review this file against the Pipedream component model described in
2020
.github/pipedream-component-guidelines.md.
2121
22+
- Verify the `version` field is incremented from its previous value and the bump
23+
follows semantic versioning (see the Versioning section of the guidelines):
24+
new components start at `0.0.1`; bug fixes and non-breaking refactors → patch;
25+
new optional props or backwards-compatible additions → minor; removed/renamed props
26+
or breaking behavior changes → major; flag any PR where the version was not bumped
27+
or where the bump level seems inconsistent with the scope of the change
28+
- Verify the app's `package.json` version is also bumped by the same or greater
29+
semver segment as the component change
2230
- All prop names, method names, and local variables must use camelCase; API request
2331
parameter names follow the API's own convention and are the only exception
2432
- Props used in more than one component must be defined in the app file's
2533
`propDefinitions` and referenced via `propDefinition` — flag any inline prop
2634
definition that duplicates one already in the app file
27-
- Verify `annotations` values are semantically correct (ESLint already enforces presence):
28-
- `readOnlyHint: true` only when the component exclusively reads data with no side effects
29-
- `destructiveHint: true` for operations that permanently delete data or irreversibly
30-
overwrite it with no recovery path; update/patch/upsert operations are generally
31-
`false` (reversible by another update) unless the specific endpoint does a full
32-
destructive replace — when in doubt, flag and let the author decide
33-
- `openWorldHint: true` for any component making external API calls (almost all);
34-
`false` only for pure utility/formatting components with no HTTP requests
3535
- Prop `description` fields must be written for AI agent consumption:
3636
- Include concrete inline examples for non-obvious formats (JSON objects, IDs, dates, enums)
3737
- Avoid UI-centric language ("select from the dropdown", "choose from the list")
@@ -55,6 +55,14 @@ reviews:
5555
guidelines in .github/pipedream-action-guidelines.md.
5656
5757
Key checks:
58+
- Verify `annotations` values are semantically correct (ESLint already enforces presence):
59+
- `readOnlyHint: true` only when the action exclusively reads data with no side effects
60+
- `destructiveHint: true` for operations that permanently delete data or irreversibly
61+
overwrite it with no recovery path; update/patch/upsert operations are generally
62+
`false` (reversible by another update) unless the specific endpoint does a full
63+
destructive replace — when in doubt, flag and let the author decide
64+
- `openWorldHint: true` for any action making external API calls (almost all);
65+
`false` only for pure utility/formatting actions with no HTTP requests
5866
- `run()` must call `$.export("$summary", ...)` on every successful execution path;
5967
summaries should be concise one-liners with key result info (record ID, name, count)
6068
- When `additionalProps()` or `reloadProps: true` are present, verify they are
@@ -87,6 +95,7 @@ reviews:
8795
guidelines in .github/pipedream-source-guidelines.md.
8896
8997
Key checks:
98+
- Source components must NOT include an `annotations` field — flag its presence as an error
9099
- `dedupe: "unique"` must be set at the top level of the component export
91100
- `$emit(data, metadata)` must include all three metadata fields: `id`, `summary`, `ts`
92101
- The `id` must be stable (deterministic for the same real-world event across runs) and

.github/ISSUE_TEMPLATE/app---service-integration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ assignees: ""
1212

1313
**Is lack of support preventing you from moving forward, or do you have a workaround?**
1414

15-
**Are there specific actions or triggers, you'd like to see for this app? Please let us know here or use the Action and Trigger issue templates to open requests for each!**
15+
**Are there specific actions or triggers you'd like to see for this app? Please let us know here or use the Action and Trigger issue templates to open requests for each!**

.github/pipedream-component-guidelines.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ export default {
3535
key: "app-action-name", // globally unique; kebab-case; prefixed with app slug
3636
name: "Human Readable Name", // shown in UI and as the MCP tool name
3737
description: "...", // shown in UI and used as MCP tool documentation
38-
version: "0.1.0", // semantic versioning; must be incremented on every change
38+
version: "0.0.1", // semantic versioning; must be incremented on every change
3939
type: "action", // or "source"
40-
annotations: { ... }, // MCP tool metadata — see Annotations section
4140
props: { ... }, // configuration inputs
4241
async run({ $ }) { ... }, // execution entry point (signature differs for sources)
4342
};
@@ -48,6 +47,23 @@ values are **semantically correct**, not whether properties exist.
4847

4948
---
5049

50+
## Versioning
51+
52+
Every component has a `version` field that must be incremented on every change. New
53+
components always start at `0.0.1`. Follow semantic versioning:
54+
55+
| Change type | Version segment | Examples |
56+
|---|---|---|
57+
| Bug fix, copy/description tweak, refactor with no behavior change | patch (`0.0.x`) | `0.0.1``0.0.2` |
58+
| New optional prop, new output field, backwards-compatible improvement | minor (`0.x.0`) | `0.0.2``0.1.0` |
59+
| Removed or renamed prop, changed output shape, behavior change that breaks existing configs | major (`x.0.0`) | `0.1.0``1.0.0` |
60+
61+
The app's `package.json` must also be bumped by the same or greater segment whenever a
62+
component in that app changes — patch for patch, minor for minor (or higher), major for
63+
major (or higher).
64+
65+
---
66+
5167
## Naming Conventions
5268

5369
All prop names, method names, and local variables must use **camelCase**. This applies
@@ -218,7 +234,10 @@ depends on an earlier selection in a way that fixed optional props cannot repres
218234
219235
## Annotations
220236
221-
Every component must include an `annotations` object that communicates its runtime behavior
237+
**Actions only.** Source components must NOT include an `annotations` object — flag its
238+
presence in any source file as an error.
239+
240+
Every action must include an `annotations` object that communicates its runtime behavior
222241
to AI agents and the Pipedream platform:
223242
224243
```javascript

.github/pull_request_template.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1-
## WHY
1+
## Summary
2+
3+
<!-- Add your PR description here -->
4+
5+
6+
7+
## Checklist
8+
Please check the following items before your PR can be reviewed:
9+
10+
### Versioning
11+
- [ ] All components updated in this PR had their version updated (`0.0.1` for new ones)
12+
- [ ] The app updated in this PR had its `package.json`'s version updated
13+
14+
### New app
15+
If this is a new app, please submit [an app integration request](https://github.com/PipedreamHQ/pipedream/issues/new?template=app---service-integration.md) - the PR will only be reviewed after the app is integrated.
16+
- [ ] The app updated in this PR is already integrated
17+
18+
### CodeRabbit review
19+
After the PR is opened, and if new changes are pushed, CodeRabbit will automatically review it. Do not 'mark as resolved' CodeRabbit's comments, but reply to them instead, whether you agree (and update the PR accordingly) or disagree.
20+
- [ ] I have addressed or acknowledged all of CodeRabbit's review comments
221

3-
<!-- author to complete -->

components/_3commas/_3commas.app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ export default {
88
console.log(Object.keys(this.$auth));
99
},
1010
},
11-
};
11+
};

components/agify/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Overview
2+
3+
The Agify API estimates the age of a person from their first name. With Pipedream, you can use it to enrich contact records, segment users, and tailor experiences without asking customers for their age directly. The response (`name`, `age`, `count`) plugs cleanly into CRMs, marketing tools, and analytics pipelines.
4+
5+
# Example Use Cases
6+
7+
- **Age Diversity Research**: Run names from a public dataset — conference speaker lists, paper authors, hiring rosters — through Agify to estimate age distribution at the cohort level. Useful for diversity audits, academic representation studies, and reporting on fields where self-reported data isn't available.
8+
9+
- **Customer Cohort Analytics**: Batch your customer or subscriber list through Agify and push aggregate age distributions to BigQuery, Snowflake, or your warehouse of choice. Build dashboards that show which products, channels, or campaigns skew which way at the population level.
10+
11+
- **CRM Aggregate Reporting**: When new records land in Salesforce or HubSpot, route a copy through Agify on a schedule and roll the results up into group-level summaries — age bands by segment, channel, or product line — for executive reports.
12+
13+
# Getting Started
14+
15+
Sign up for an [Agify API key](https://agify.io) and paste it into Pipedream when connecting the account. The same key also works with [Genderize](https://pipedream.com/apps/genderize) and [Nationalize](https://pipedream.com/apps/nationalize). Free tier: 2,500 names/month.
16+
17+
# Troubleshooting
18+
19+
- **`401 Unauthorized`**: the API key is missing, mistyped, or has been revoked. Reconnect the account in Pipedream.
20+
- **`age` is `null`**: the name wasn't found in Agify's dataset. This is expected for very rare names — handle it gracefully in downstream steps.
21+
- **`429 Too Many Requests`**: you've hit the monthly request limit. Upgrade the Agify plan, or throttle the workflow.
22+
- **Batch action returns fewer results than names submitted**: requests are capped at 10 names; if you need more, split into chunks.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import app from "../../agify.app.mjs";
2+
3+
export default {
4+
key: "agify-get-age-from-name",
5+
name: "Get Age From Name",
6+
description: "Estimate the age of a name. [See the documentation](https://agify.io/documentation)",
7+
version: "0.0.1",
8+
annotations: {
9+
destructiveHint: false,
10+
openWorldHint: true,
11+
readOnlyHint: true,
12+
},
13+
type: "action",
14+
props: {
15+
app,
16+
name: {
17+
propDefinition: [
18+
app,
19+
"name",
20+
],
21+
},
22+
countryId: {
23+
propDefinition: [
24+
app,
25+
"countryId",
26+
],
27+
},
28+
},
29+
async run({ $ }) {
30+
const response = await this.app.getAgeFromName({
31+
$,
32+
params: {
33+
name: this.name,
34+
country_id: this.countryId,
35+
},
36+
});
37+
$.export("$summary", `Successfully sent the request. Result: ${response.age}`);
38+
return response;
39+
},
40+
};
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { ConfigurationError } from "@pipedream/platform";
2+
import app from "../../agify.app.mjs";
3+
4+
export default {
5+
key: "agify-get-age-from-names",
6+
name: "Get Age From Names (Batch)",
7+
description: "Estimate the age of up to 10 names in a single batch request. [See the documentation](https://agify.io/documentation#batch-usage)",
8+
version: "0.0.1",
9+
annotations: {
10+
destructiveHint: false,
11+
openWorldHint: true,
12+
readOnlyHint: true,
13+
},
14+
type: "action",
15+
props: {
16+
app,
17+
names: {
18+
propDefinition: [
19+
app,
20+
"names",
21+
],
22+
},
23+
countryId: {
24+
propDefinition: [
25+
app,
26+
"countryId",
27+
],
28+
},
29+
},
30+
async run({ $ }) {
31+
if (this.names.length > 10) {
32+
throw new ConfigurationError("Maximum 10 names per batch request");
33+
}
34+
const response = await this.app.getAgeFromNames({
35+
$,
36+
params: {
37+
"name[]": this.names,
38+
"country_id": this.countryId,
39+
},
40+
});
41+
$.export("$summary", `Successfully sent the request. ${response.length} results returned.`);
42+
return response;
43+
},
44+
};

components/agify/agify.app.mjs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { axios } from "@pipedream/platform";
2+
3+
export default {
4+
type: "app",
5+
app: "agify",
6+
propDefinitions: {
7+
name: {
8+
type: "string",
9+
label: "Name",
10+
description: "Name that will be checked",
11+
},
12+
names: {
13+
type: "string[]",
14+
label: "Names",
15+
description: "Up to 10 names to check in a single batch request",
16+
},
17+
countryId: {
18+
type: "string",
19+
label: "Country",
20+
description: "Optional ISO 3166-1 alpha-2 country code (e.g. `US`, `GB`, `DE`) to constrain the prediction to a specific country's name distribution.",
21+
optional: true,
22+
},
23+
},
24+
methods: {
25+
_baseUrl() {
26+
return "https://api.agify.io";
27+
},
28+
async _makeRequest(opts = {}) {
29+
const {
30+
$ = this,
31+
params,
32+
...otherOpts
33+
} = opts;
34+
return axios($, {
35+
...otherOpts,
36+
url: this._baseUrl(),
37+
params: {
38+
api_key: `${this.$auth.api_key}`,
39+
...params,
40+
},
41+
});
42+
},
43+
async getAgeFromName(args = {}) {
44+
return this._makeRequest({
45+
...args,
46+
});
47+
},
48+
async getAgeFromNames(args = {}) {
49+
return this._makeRequest({
50+
...args,
51+
});
52+
},
53+
},
54+
};

components/agify/package.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "@pipedream/agify",
3+
"version": "0.1.0",
4+
"description": "Pipedream Agify Components",
5+
"main": "agify.app.mjs",
6+
"keywords": [
7+
"pipedream",
8+
"agify"
9+
],
10+
"homepage": "https://pipedream.com/apps/agify",
11+
"author": "Pipedream <support@pipedream.com> (https://pipedream.com/)",
12+
"publishConfig": {
13+
"access": "public"
14+
},
15+
"dependencies": {
16+
"@pipedream/platform": "^3.1.1"
17+
}
18+
}

0 commit comments

Comments
 (0)