From 1cf1c33899e8160dd1c69493454e507002dff31a Mon Sep 17 00:00:00 2001 From: martmull Date: Thu, 25 Jun 2026 17:12:30 +0200 Subject: [PATCH] Add command menu items to people data labs (#22180) - Adds command menu items to enrich people and companies - Improve readme ## After image image image image image Review in cubic --- .../public/people-data-labs/README.md | 77 +-- .../public/people-data-labs/package.json | 12 +- .../command-menu-items/enrich-companies.ts | 14 + .../src/command-menu-items/enrich-people.ts | 14 + .../__tests__/select-option-constants.spec.ts | 6 +- .../constants/enrichment-workflow-seeds.ts | 6 +- .../src/constants/universal-identifiers.ts | 22 +- .../enrich-companies-component-effect.tsx | 21 + .../enrich-people-component-effect.tsx | 21 + .../utils/call-enrich-logic-function.utils.ts | 21 + .../enrich-companies.function.ts | 15 +- .../enrich-company.function.ts | 4 +- .../logic-functions/enrich-people.function.ts | 15 +- .../logic-functions/enrich-person.function.ts | 4 +- .../handlers/__tests__/post-install.spec.ts | 12 +- .../logic-functions/post-install.function.ts | 4 +- .../utils/to-bulk-enrich-input.ts | 14 + .../public/people-data-labs/yarn.lock | 448 +++++++++++++++--- 18 files changed, 567 insertions(+), 163 deletions(-) create mode 100644 packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-companies.ts create mode 100644 packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-people.ts create mode 100644 packages/twenty-apps/public/people-data-labs/src/front-components/enrich-companies-component-effect.tsx create mode 100644 packages/twenty-apps/public/people-data-labs/src/front-components/enrich-people-component-effect.tsx create mode 100644 packages/twenty-apps/public/people-data-labs/src/front-components/utils/call-enrich-logic-function.utils.ts create mode 100644 packages/twenty-apps/public/people-data-labs/src/logic-functions/utils/to-bulk-enrich-input.ts diff --git a/packages/twenty-apps/public/people-data-labs/README.md b/packages/twenty-apps/public/people-data-labs/README.md index 1005aec393..ddf2d2b288 100644 --- a/packages/twenty-apps/public/people-data-labs/README.md +++ b/packages/twenty-apps/public/people-data-labs/README.md @@ -1,77 +1,16 @@ -# People Data Labs enrichment +# People Data Labs -Enriches **Person** and **Company** records with data from [People Data Labs](https://www.peopledatalabs.com/) (PDL): job and role details, location, company firmographics, funding, social profiles, and more. +**Turn a name into a full profile — enrich any Person or Company in one click.** -## What it does +## ✨ What you get -For each record you enrich, the app matches it against People Data Labs and writes the result back to Twenty. It fills a handful of Twenty standard fields, adds a rich set of dedicated PDL fields, and records the outcome of the last attempt. +- **+30 rich data fields** per Person and Company — seniority, skills, firmographics, funding, socials & more +- **Run it anywhere** — from the command menu, as a workflow step, or straight from AI chat +- **Smart matching** — finds the right profile from a LinkedIn, email, or domain, and only writes confident matches -### Standard fields it can fill +## 💳 Billing -- **Person:** name, emails, phone numbers, job title, and LinkedIn link. If the person has no company yet, the app also looks up (or creates) their current company and links it. -- **Company:** name, domain name, LinkedIn link, and address. - -Standard fields are only used to complete your existing data. By default they are filled **only when empty**, so your own values are never overwritten unless you explicitly choose to overwrite (see overwrite modes below). The existing person-to-company link is never overwritten. - -### PDL fields it adds - -The app adds around 30 dedicated PDL data fields on Person and 28 on Company (plus the bookkeeping fields listed below). These are always written on a match. Highlights: - -- **Person:** seniority, job role, job title class and sub-role, industry, inferred salary, headline and summaries, years of experience, LinkedIn connections, birth date/year, skills, interests, education, work experience, certifications, languages, social profiles (GitHub, Twitter/X, Facebook), and a detailed PDL location. -- **Company:** industry, company type, size range and employee count, founded year, funding stages and total funding (in USD), headline and summary, legal name, ticker and exchange, tags, alternative names and domains, NAICS/SIC classifications, employee counts by country, and social profiles. - -Each object also gets bookkeeping fields: a PDL id, the raw PDL payload, the time of the last enrichment, the match likelihood (Person), and an enrichment status. - -Two pre-built table views named **Enriched (PDL)** are added — one on People and one on Companies — to surface the enrichment fields. - -## How matching works - -The app matches records using the identifiers already on them, in priority order: - -- **Person:** PDL id, LinkedIn URL, primary email, or full name paired with a company name. LinkedIn URL and email are treated as strong identifiers; a name on its own is not used. -- **Company:** PDL id, website domain, LinkedIn URL, or company name. Website and LinkedIn are treated as strong identifiers. - -When a record has only weak signals (for example a person's name plus company, or a company name alone), the app applies a stricter confidence threshold to reduce false positives. - -If a record has no usable identifier, it is **skipped** (and never billed). - -## Overwrite modes - -When you trigger enrichment you can choose how matched data is written back: - -- **Yes and don't overwrite** (default): writes PDL fields and fills standard fields only where they are currently empty. -- **Yes and overwrite**: writes PDL fields and replaces existing standard field values. -- **No**: returns the enriched data without modifying the record. - -In all cases the dedicated PDL fields are written on a match. - -## Enrichment status - -The enrichment status field written to each record records the outcome of the last attempt, and can hold one of three values: - -- **Matched** — a confident match was found and data was written. -- **No Match** — PDL returned no confident match. -- **Error** — the enrichment attempt failed. - -Records that are skipped because they have no usable identifier are reported as skipped in the action's returned result and bulk summary, but no status is written back to the record (nothing is changed or billed for them). - -## How to trigger it - -- **Manual action:** run enrichment on a single record or on a selection of records from a People or Companies view. -- **Workflow action:** add **Enrich Person**, **Enrich Company**, **Enrich People**, or **Enrich Companies** as a step in a workflow. -- **AI tool:** the single-record **Enrich Person** and **Enrich Company** actions are also available to AI agents. - -Bulk enrichment processes records in batches and reports how many were matched, not found, skipped, or errored. - -## Billing - -Only successful matches are billed, in Twenty credits — records that are not found, skipped, or that error are free. +Pay only for matches, in Twenty credits — **not found and skipped records are free.** - **Person match:** $0.336 - **Company match:** $0.12 - -A match is billed based on PDL's response. In the rare case where a record matches but the write back to Twenty fails afterward, the match is still counted. - -## Setup - -Set the **`PDL_API_KEY`** server variable to your People Data Labs API key. This is required for the app to function. diff --git a/packages/twenty-apps/public/people-data-labs/package.json b/packages/twenty-apps/public/people-data-labs/package.json index 1e50c73ded..ab104459a5 100644 --- a/packages/twenty-apps/public/people-data-labs/package.json +++ b/packages/twenty-apps/public/people-data-labs/package.json @@ -1,6 +1,6 @@ { - "name": "people-data-labs", - "version": "0.1.0", + "name": "@twentyhq/people-data-labs", + "version": "1.0.0", "description": "People Data Labs enrichment app for Twenty", "license": "MIT", "engines": { @@ -21,10 +21,6 @@ "test:watch": "vitest", "test:unit": "vitest run --config vitest.unit.config.ts" }, - "dependencies": { - "twenty-client-sdk": "2.13.0", - "twenty-sdk": "2.13.0" - }, "devDependencies": { "@types/node": "^24.7.2", "@types/react": "^18.2.0", @@ -32,8 +28,8 @@ "oxlint": "^0.16.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "twenty-client-sdk": "^2.14.0", - "twenty-sdk": "^2.14.0", + "twenty-client-sdk": "^2.16.0", + "twenty-sdk": "^2.16.0", "typescript": "^5.9.3", "vite-tsconfig-paths": "^4.2.1", "vitest": "^4.0.0" diff --git a/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-companies.ts b/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-companies.ts new file mode 100644 index 0000000000..3228e6dc2d --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-companies.ts @@ -0,0 +1,14 @@ +import { defineCommandMenuItem, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define'; +import { + PDL_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS, + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS +} from 'src/constants/universal-identifiers'; + +export default defineCommandMenuItem({ + universalIdentifier: PDL_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS.enrichCompanies, + availabilityObjectUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.company.universalIdentifier, + frontComponentUniversalIdentifier: + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS.enrichCompanies, + label: 'Enrich companies', + availabilityType: 'RECORD_SELECTION', +}); diff --git a/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-people.ts b/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-people.ts new file mode 100644 index 0000000000..1e339e8cc6 --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/command-menu-items/enrich-people.ts @@ -0,0 +1,14 @@ +import { defineCommandMenuItem, STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS } from 'twenty-sdk/define'; +import { + PDL_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS, + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS +} from 'src/constants/universal-identifiers'; + +export default defineCommandMenuItem({ + universalIdentifier: PDL_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS.enrichPeople, + availabilityObjectUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier, + frontComponentUniversalIdentifier: + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS.enrichPeople, + label: 'Enrich people', + availabilityType: 'RECORD_SELECTION', +}); diff --git a/packages/twenty-apps/public/people-data-labs/src/constants/__tests__/select-option-constants.spec.ts b/packages/twenty-apps/public/people-data-labs/src/constants/__tests__/select-option-constants.spec.ts index 22656b6799..cb46d403b4 100644 --- a/packages/twenty-apps/public/people-data-labs/src/constants/__tests__/select-option-constants.spec.ts +++ b/packages/twenty-apps/public/people-data-labs/src/constants/__tests__/select-option-constants.spec.ts @@ -18,9 +18,9 @@ import { APPLICATION_UNIVERSAL_IDENTIFIER, DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, PDL_FIELD_UNIVERSAL_IDENTIFIERS, - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS, + PDL_LOGIC_FUNCTION_CONSTANTS, PDL_SELECT_OPTION_UNIVERSAL_IDENTIFIERS, - PDL_VIEW_UNIVERSAL_IDENTIFIERS, + PDL_VIEW_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; import { type SelectOptionMeta } from 'src/types/select-option-meta'; import { normalizeEnumValue } from 'src/utils/normalize-enum-value'; @@ -124,7 +124,7 @@ describe('universal-identifier registry', () => { const registryUuids = collectUuids([ APPLICATION_UNIVERSAL_IDENTIFIER, DEFAULT_ROLE_UNIVERSAL_IDENTIFIER, - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS, + PDL_LOGIC_FUNCTION_CONSTANTS, PDL_FIELD_UNIVERSAL_IDENTIFIERS, PDL_VIEW_UNIVERSAL_IDENTIFIERS, PDL_SELECT_OPTION_UNIVERSAL_IDENTIFIERS, diff --git a/packages/twenty-apps/public/people-data-labs/src/constants/enrichment-workflow-seeds.ts b/packages/twenty-apps/public/people-data-labs/src/constants/enrichment-workflow-seeds.ts index 36f5f04e4b..397d52144a 100644 --- a/packages/twenty-apps/public/people-data-labs/src/constants/enrichment-workflow-seeds.ts +++ b/packages/twenty-apps/public/people-data-labs/src/constants/enrichment-workflow-seeds.ts @@ -1,4 +1,4 @@ -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { type EnrichmentWorkflowSeed } from 'src/types/enrichment-workflow-seed'; const ENRICHMENT_ICON = 'IconSparkles'; @@ -11,7 +11,7 @@ export const ENRICHMENT_WORKFLOW_SEEDS: EnrichmentWorkflowSeed[] = [ icon: ENRICHMENT_ICON, stepName: 'Enrich Companies', logicFunctionUniversalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompanies, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.universalIdentifier, logicFunctionInput: { records: '{{trigger.companies}}' }, }, { @@ -21,7 +21,7 @@ export const ENRICHMENT_WORKFLOW_SEEDS: EnrichmentWorkflowSeed[] = [ icon: ENRICHMENT_ICON, stepName: 'Enrich People', logicFunctionUniversalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichPeople, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.universalIdentifier, logicFunctionInput: { records: '{{trigger.people}}' }, }, ]; diff --git a/packages/twenty-apps/public/people-data-labs/src/constants/universal-identifiers.ts b/packages/twenty-apps/public/people-data-labs/src/constants/universal-identifiers.ts index b229cfdf11..b3a8ba4f2a 100644 --- a/packages/twenty-apps/public/people-data-labs/src/constants/universal-identifiers.ts +++ b/packages/twenty-apps/public/people-data-labs/src/constants/universal-identifiers.ts @@ -4,12 +4,12 @@ export const APPLICATION_UNIVERSAL_IDENTIFIER = export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = 'abb2aa9f-8e9c-4e8b-a336-f864ee78b7cd'; -export const PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS = { - enrichPeople: '65356a82-6734-4fc9-8172-7d30ed1b7859', - enrichPerson: '864ad69b-ff9f-4635-9aed-16fd0c2ad210', - enrichCompanies: 'c769fb49-d495-469f-a58f-1a69ab90ec24', - enrichCompany: '560bbfd9-1107-4f7f-8398-ea835e7e5bbe', - postInstall: '9de46f15-05ec-4314-84c1-b9919b545269', +export const PDL_LOGIC_FUNCTION_CONSTANTS = { + enrichPeople: { universalIdentifier: '65356a82-6734-4fc9-8172-7d30ed1b7859', path: '/people-data-labs/enrich-people' }, + enrichPerson: { universalIdentifier:'864ad69b-ff9f-4635-9aed-16fd0c2ad210', path: '/people-data-labs/enrich-person' }, + enrichCompanies: { universalIdentifier:'c769fb49-d495-469f-a58f-1a69ab90ec24', path: '/people-data-labs/enrich-companies' }, + enrichCompany: { universalIdentifier:'560bbfd9-1107-4f7f-8398-ea835e7e5bbe', path: '/people-data-labs/enrich-company' }, + postInstall: { universalIdentifier:'9de46f15-05ec-4314-84c1-b9919b545269'}, } as const; export const PDL_FIELD_UNIVERSAL_IDENTIFIERS = { @@ -91,6 +91,16 @@ export const PDL_VIEW_UNIVERSAL_IDENTIFIERS = { enrichedPeople: '2866db8e-086a-4b2e-8b89-a583c4181936', } as const; +export const PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS = { + enrichCompanies: '1061d505-6748-48c1-96e9-5dbf6fef6561', + enrichPeople: '3f9af38b-be42-4dc8-89cc-e37566d3aecb', +} + +export const PDL_COMMAND_MENU_ITEM_UNIVERSAL_IDENTIFIERS = { + enrichCompanies: 'df33eaa8-51eb-40c4-8b6c-aceeea4d8fcc', + enrichPeople: '86b3427b-9e86-4077-ba7b-07609b2d095b', +} + export const PDL_SELECT_OPTION_UNIVERSAL_IDENTIFIERS = { personEnrichmentStatus: { matched: '59f2df76-5798-42e2-b647-5091b08a43f1', diff --git a/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-companies-component-effect.tsx b/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-companies-component-effect.tsx new file mode 100644 index 0000000000..1b84bc9e87 --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-companies-component-effect.tsx @@ -0,0 +1,21 @@ +import { defineFrontComponent } from 'twenty-sdk/define'; +import { Command, useSelectedRecordIds } from 'twenty-sdk/front-component'; +import { + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS, + PDL_LOGIC_FUNCTION_CONSTANTS +} from 'src/constants/universal-identifiers'; +import { execute } from 'src/front-components/utils/call-enrich-logic-function.utils'; + + +const Enrich = () => { + const recordIds = useSelectedRecordIds(); + return execute({ path: PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.path, recordIds })} />; +}; + +export default defineFrontComponent({ + universalIdentifier: PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS.enrichCompanies, + name: 'enrich-companies-effect', + description: 'Enrich companies effect', + component: Enrich, + isHeadless: true +}); diff --git a/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-people-component-effect.tsx b/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-people-component-effect.tsx new file mode 100644 index 0000000000..a2dedad3f7 --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/front-components/enrich-people-component-effect.tsx @@ -0,0 +1,21 @@ +import { defineFrontComponent } from 'twenty-sdk/define'; +import { Command, useSelectedRecordIds } from 'twenty-sdk/front-component'; +import { + PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS, + PDL_LOGIC_FUNCTION_CONSTANTS +} from 'src/constants/universal-identifiers'; +import { execute } from 'src/front-components/utils/call-enrich-logic-function.utils'; + + +const Enrich = () => { + const recordIds = useSelectedRecordIds(); + return execute({ path: PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.path, recordIds })} />; +}; + +export default defineFrontComponent({ + universalIdentifier: PDL_FRONT_COMPONENT_UNIVERSAL_IDENTIFIERS.enrichPeople, + name: 'enrich-people-effect', + description: 'Enrich people effect', + component: Enrich, + isHeadless: true +}); diff --git a/packages/twenty-apps/public/people-data-labs/src/front-components/utils/call-enrich-logic-function.utils.ts b/packages/twenty-apps/public/people-data-labs/src/front-components/utils/call-enrich-logic-function.utils.ts new file mode 100644 index 0000000000..3a2019b07a --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/front-components/utils/call-enrich-logic-function.utils.ts @@ -0,0 +1,21 @@ +import { RestApiClient } from 'twenty-client-sdk/rest'; +import { enqueueSnackbar } from 'twenty-sdk/front-component'; + +export const execute = async ({path, recordIds}:{ path: string; recordIds: string[] }) => { + try { + const client = new RestApiClient(); + + + await client.post(`/s${path}`, { recordIds }); + + await enqueueSnackbar({ + message: `Enriched ${recordIds.length > 1 ? 'records.' : 'record.'}`, + variant: 'success', + }); + } catch { + await enqueueSnackbar({ + message: 'Records enrichment failed', + variant: 'error', + }); + } +}; diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-companies.function.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-companies.function.ts index 44bd008a69..ce8ce28eb8 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-companies.function.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-companies.function.ts @@ -1,18 +1,25 @@ import { defineLogicFunction } from 'twenty-sdk/define'; import { UPDATE_FIELDS_OPTION_VALUES } from 'src/constants/update-fields-option-values'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { enrichCompaniesCore } from 'src/logic-functions/handlers/enrich-companies'; -import { type BulkEnrichInput } from 'src/types/bulk-enrich-input'; +import { type EnrichInput, toBulkEnrichInput } from 'src/logic-functions/utils/to-bulk-enrich-input'; -const handler = (input: BulkEnrichInput) => enrichCompaniesCore({ input }); +const handler = (input: EnrichInput) => { + return enrichCompaniesCore({ input: toBulkEnrichInput(input) }); +} export default defineLogicFunction({ - universalIdentifier: PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompanies, + universalIdentifier: PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.universalIdentifier, name: 'enrich-companies', description: 'Enrich one or more Company records with People Data Labs data', timeoutSeconds: 300, handler, + httpRouteTriggerSettings: { + path: PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.path, + httpMethod: 'POST', + isAuthRequired: true + }, workflowActionTriggerSettings: { label: 'Enrich Companies', icon: 'IconSparkles', diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-company.function.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-company.function.ts index 24ab14345b..cd5ebb6d98 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-company.function.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-company.function.ts @@ -1,14 +1,14 @@ import { defineLogicFunction } from 'twenty-sdk/define'; import { UPDATE_FIELDS_OPTION_VALUES } from 'src/constants/update-fields-option-values'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { enrichCompanyCore } from 'src/logic-functions/handlers/enrich-company'; import { type SingleEnrichInput } from 'src/types/single-enrich-input'; const handler = (input: SingleEnrichInput) => enrichCompanyCore({ input }); export default defineLogicFunction({ - universalIdentifier: PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompany, + universalIdentifier: PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompany.universalIdentifier, name: 'enrich-company', description: 'Enrich a single Company record with People Data Labs data (industry, size, funding, location, etc.) given its record id.', diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-people.function.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-people.function.ts index e58e392703..3028ac1e78 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-people.function.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-people.function.ts @@ -1,18 +1,25 @@ import { defineLogicFunction } from 'twenty-sdk/define'; import { UPDATE_FIELDS_OPTION_VALUES } from 'src/constants/update-fields-option-values'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { enrichPeopleCore } from 'src/logic-functions/handlers/enrich-people'; -import { type BulkEnrichInput } from 'src/types/bulk-enrich-input'; +import { type EnrichInput, toBulkEnrichInput } from 'src/logic-functions/utils/to-bulk-enrich-input'; -const handler = (input: BulkEnrichInput) => enrichPeopleCore({ input }); +const handler = (input: EnrichInput) => { + return enrichPeopleCore({ input: toBulkEnrichInput(input) }); +}; export default defineLogicFunction({ - universalIdentifier: PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichPeople, + universalIdentifier: PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.universalIdentifier, name: 'enrich-people', description: 'Enrich one or more Person records with People Data Labs data', timeoutSeconds: 300, handler, + httpRouteTriggerSettings: { + path: PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.path, + httpMethod: 'POST', + isAuthRequired: true + }, workflowActionTriggerSettings: { label: 'Enrich People', icon: 'IconSparkles', diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-person.function.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-person.function.ts index 89d3847fe3..f2c97c272a 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-person.function.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/enrich-person.function.ts @@ -1,14 +1,14 @@ import { defineLogicFunction } from 'twenty-sdk/define'; import { UPDATE_FIELDS_OPTION_VALUES } from 'src/constants/update-fields-option-values'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { enrichPersonCore } from 'src/logic-functions/handlers/enrich-person'; import { type SingleEnrichInput } from 'src/types/single-enrich-input'; const handler = (input: SingleEnrichInput) => enrichPersonCore({ input }); export default defineLogicFunction({ - universalIdentifier: PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichPerson, + universalIdentifier: PDL_LOGIC_FUNCTION_CONSTANTS.enrichPerson.universalIdentifier, name: 'enrich-person', description: 'Enrich a single Person record with People Data Labs data (job, location, social profiles, etc.) given its record id.', diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/handlers/__tests__/post-install.spec.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/handlers/__tests__/post-install.spec.ts index 091c240f47..ac8788574b 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/handlers/__tests__/post-install.spec.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/handlers/__tests__/post-install.spec.ts @@ -1,7 +1,7 @@ import { type MetadataApiClient } from 'twenty-client-sdk/metadata'; import { describe, expect, it, vi } from 'vitest'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; import { createCoreApiClientMock } from 'src/logic-functions/__mocks__/create-core-api-client-mock'; import { postInstallCore } from 'src/logic-functions/handlers/post-install'; @@ -44,12 +44,12 @@ describe('postInstallCore', () => { { id: 'company-fn', universalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompanies, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.universalIdentifier, }, { id: 'person-fn', universalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichPeople, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.universalIdentifier, }, ]); @@ -74,7 +74,7 @@ describe('postInstallCore', () => { { id: 'company-fn', universalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompanies, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.universalIdentifier, }, ]); @@ -97,12 +97,12 @@ describe('postInstallCore', () => { { id: 'company-fn', universalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichCompanies, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichCompanies.universalIdentifier, }, { id: 'person-fn', universalIdentifier: - PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.enrichPeople, + PDL_LOGIC_FUNCTION_CONSTANTS.enrichPeople.universalIdentifier, }, ]); diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/post-install.function.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/post-install.function.ts index 5b1c1a5b4d..5cc6c73f01 100644 --- a/packages/twenty-apps/public/people-data-labs/src/logic-functions/post-install.function.ts +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/post-install.function.ts @@ -1,13 +1,13 @@ import { definePostInstallLogicFunction } from 'twenty-sdk/define'; -import { PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS } from 'src/constants/universal-identifiers'; +import { PDL_LOGIC_FUNCTION_CONSTANTS } from 'src/constants/universal-identifiers'; const handler = async () => { return { seededWorkflows: [] }; }; export default definePostInstallLogicFunction({ - universalIdentifier: PDL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIERS.postInstall, + universalIdentifier: PDL_LOGIC_FUNCTION_CONSTANTS.postInstall.universalIdentifier, name: 'post-install', description: 'Post-install hook for the People Data Labs app (workflow seeding is not currently wired up).', diff --git a/packages/twenty-apps/public/people-data-labs/src/logic-functions/utils/to-bulk-enrich-input.ts b/packages/twenty-apps/public/people-data-labs/src/logic-functions/utils/to-bulk-enrich-input.ts new file mode 100644 index 0000000000..7428e43d6b --- /dev/null +++ b/packages/twenty-apps/public/people-data-labs/src/logic-functions/utils/to-bulk-enrich-input.ts @@ -0,0 +1,14 @@ +import { isObject } from '@sniptt/guards'; +import { type RoutePayload } from 'twenty-sdk/define'; + +import { type BulkEnrichInput } from 'src/types/bulk-enrich-input'; + +type EnrichRouteBody = { recordIds?: string[] }; + +export type EnrichInput = BulkEnrichInput | RoutePayload; + +const isRoutePayload = (input: EnrichInput): input is RoutePayload => + isObject(input) && 'requestContext' in input; + +export const toBulkEnrichInput = (input: EnrichInput): BulkEnrichInput => + isRoutePayload(input) ? { records: input.body?.recordIds ?? [] } : input; diff --git a/packages/twenty-apps/public/people-data-labs/yarn.lock b/packages/twenty-apps/public/people-data-labs/yarn.lock index 12643c3123..75c13bbccd 100644 --- a/packages/twenty-apps/public/people-data-labs/yarn.lock +++ b/packages/twenty-apps/public/people-data-labs/yarn.lock @@ -34,6 +34,15 @@ __metadata: languageName: node linkType: hard +"@emnapi/runtime@npm:^1.7.0": + version: 1.11.1 + resolution: "@emnapi/runtime@npm:1.11.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f + languageName: node + linkType: hard + "@emnapi/wasi-threads@npm:1.2.1": version: 1.2.1 resolution: "@emnapi/wasi-threads@npm:1.2.1" @@ -245,6 +254,233 @@ __metadata: languageName: node linkType: hard +"@img/colour@npm:^1.0.0": + version: 1.1.0 + resolution: "@img/colour@npm:1.1.0" + checksum: 10c0/2ebea2c0bbaee73b99badcefa04e1e71d83f36e5369337d3121dca841f4569533c4e2faddda6d62dd247f0d5cca143711f9446c59bcce81e427ba433a7a94a17 + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": "npm:^1.7.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@inquirer/ansi@npm:^2.0.7": version: 2.0.7 resolution: "@inquirer/ansi@npm:2.0.7" @@ -707,6 +943,24 @@ __metadata: languageName: node linkType: hard +"@twentyhq/people-data-labs@workspace:.": + version: 0.0.0-use.local + resolution: "@twentyhq/people-data-labs@workspace:." + dependencies: + "@types/node": "npm:^24.7.2" + "@types/react": "npm:^18.2.0" + "@typescript/native-preview": "npm:^7.0.0-dev.20260116.1" + oxlint: "npm:^0.16.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + twenty-client-sdk: "npm:^2.16.0" + twenty-sdk: "npm:^2.16.0" + typescript: "npm:^5.9.3" + vite-tsconfig-paths: "npm:^4.2.1" + vitest: "npm:^4.0.0" + languageName: unknown + linkType: soft + "@tybys/wasm-util@npm:^0.10.2": version: 0.10.2 resolution: "@tybys/wasm-util@npm:0.10.2" @@ -741,11 +995,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 25.9.1 - resolution: "@types/node@npm:25.9.1" + version: 26.0.0 + resolution: "@types/node@npm:26.0.0" dependencies: - undici-types: "npm:>=7.24.0 <7.24.7" - checksum: 10c0/9a04682842bebbcf21a1779dfeab9aa733d7bd7bbc0a0edb641ab3a9a3d43eac543225acf669c334f458f1956443ebc072bc3c72840c543b8b356cab5c82d456 + undici-types: "npm:~8.3.0" + checksum: 10c0/f36e21634fd8e8ded162ca486508bd8bb229d398a8d5541f6d8c1255968d4464e53327a77f403b216ef98e3b6f6956882eef83e4857d4bc2be9569dd55d37aae languageName: node linkType: hard @@ -1036,14 +1290,14 @@ __metadata: linkType: hard "axios@npm:^1.16.0": - version: 1.17.0 - resolution: "axios@npm:1.17.0" + version: 1.18.0 + resolution: "axios@npm:1.18.0" dependencies: follow-redirects: "npm:^1.16.0" form-data: "npm:^4.0.5" https-proxy-agent: "npm:^5.0.1" proxy-from-env: "npm:^2.1.0" - checksum: 10c0/c4fa19ff3a3a63bde48beec03ad816b133b9a6385cccffffe172577ab18c6a70e299280d57f12c80c867fe25df41f92cb91d3a8258708a6d2be3e9e085f92650 + checksum: 10c0/f88aae13fd9dd395dea3053c7299178fee62f436f20424a1d6d79ec11ffb7656ba664b4630defbadab2c387b6ea07e29afb9f28b26d8e0e49d45be766983290d languageName: node linkType: hard @@ -1079,9 +1333,9 @@ __metadata: linkType: hard "chardet@npm:^2.1.1": - version: 2.1.1 - resolution: "chardet@npm:2.1.1" - checksum: 10c0/d8391dd412338442b3de0d3a488aa9327f8bcf74b62b8723d6bd0b85c4084d50b731320e0a7c710edb1d44de75969995d2784b80e4c13b004a6c7a0db4c6e793 + version: 2.2.0 + resolution: "chardet@npm:2.2.0" + checksum: 10c0/8d43a1dd3ce535aa070d04139fae62f879b4388394eb1d857364ce416675a1f0f63974fba8208e9cd11b49e1a6da3e65ea6393d0fc654a8c4217c0d74c16b1b4 languageName: node linkType: hard @@ -1199,7 +1453,7 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.3": +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.1.2": version: 2.1.2 resolution: "detect-libc@npm:2.1.2" checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 @@ -1281,8 +1535,8 @@ __metadata: linkType: hard "es-toolkit@npm:^1.39.10": - version: 1.47.0 - resolution: "es-toolkit@npm:1.47.0" + version: 1.48.1 + resolution: "es-toolkit@npm:1.48.1" dependenciesMeta: "@trivago/prettier-plugin-sort-imports@4.3.0": unplugged: true @@ -1290,7 +1544,7 @@ __metadata: unplugged: true vitepress-plugin-sandpack@1.1.4: unplugged: true - checksum: 10c0/6edc9709fccc409fa4adddd318971d8a18335de9225f2dc99021aacba44fe66a2437a831923589c643865caab261a087bd974338294a60bb5a74932caa102901 + checksum: 10c0/29bfccb8aaf088f27ea91b5bf6448b8a46ef5d809139ad9335bea6919d0bc3aadc3206c957ab6c72d65864906fd75cf9ab41fbd936aaf69e58c6259d2821187d languageName: node linkType: hard @@ -1589,9 +1843,9 @@ __metadata: linkType: hard "graphql@npm:^16.8.1": - version: 16.14.0 - resolution: "graphql@npm:16.14.0" - checksum: 10c0/baaa368fcfeb7bf2cdf94b9f31bf916e97eaa9e7e82148a7046f31cbd49b760b38190f22393b024cbdd9ca0f4f46287515de0136b6a0cc164074b36ad7b50618 + version: 16.14.2 + resolution: "graphql@npm:16.14.2" + checksum: 10c0/a95a96961eaff55cc9fe9d31fae6f33499ac988b972d07ea5085024cb1333f515b902f376e7393a5489aa82200a8aff3eb96580e4d1b69d702ed19b6eb1ce97a languageName: node linkType: hard @@ -2090,24 +2344,6 @@ __metadata: languageName: node linkType: hard -"people-data-labs@workspace:.": - version: 0.0.0-use.local - resolution: "people-data-labs@workspace:." - dependencies: - "@types/node": "npm:^24.7.2" - "@types/react": "npm:^18.2.0" - "@typescript/native-preview": "npm:^7.0.0-dev.20260116.1" - oxlint: "npm:^0.16.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - twenty-client-sdk: "npm:^2.14.0" - twenty-sdk: "npm:^2.14.0" - typescript: "npm:^5.9.3" - vite-tsconfig-paths: "npm:^4.2.1" - vitest: "npm:^4.0.0" - languageName: unknown - linkType: soft - "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -2318,6 +2554,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + "semver@npm:^7.3.5": version: 7.8.1 resolution: "semver@npm:7.8.1" @@ -2327,6 +2572,99 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.3": + version: 7.8.5 + resolution: "semver@npm:7.8.5" + bin: + semver: bin/semver.js + checksum: 10c0/b1f3127a5be8125a94f37188b361c212466c292c6910adce3ec106cff5dc211ccaedc4739c11bb70fda59d6fc1f040a9bca289f4e093451521a2372e5231fe0c + languageName: node + linkType: hard + +"sharp@npm:^0.34.5": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/fd79e29df0597a7d5704b8461c51f944ead91a5243691697be6e8243b966402beda53ddc6f0a53b96ea3cb8221f0b244aa588114d3ebf8734fb4aefd41ab802f + languageName: node + linkType: hard + "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -2533,22 +2871,22 @@ __metadata: languageName: node linkType: hard -"twenty-client-sdk@npm:2.14.0, twenty-client-sdk@npm:^2.14.0": - version: 2.14.0 - resolution: "twenty-client-sdk@npm:2.14.0" +"twenty-client-sdk@npm:2.16.0, twenty-client-sdk@npm:^2.16.0": + version: 2.16.0 + resolution: "twenty-client-sdk@npm:2.16.0" dependencies: "@genql/runtime": "npm:^2.10.0" esbuild: "npm:^0.28.1" graphql: "npm:^16.8.1" lodash: "npm:^4.17.21" prettier: "npm:^3.8.3" - checksum: 10c0/eb222a726e21fc98f3a624f9acac7d47f0c769b989911889036665dac7c7c88698ec99beb844bf51a42e1696ea0a067bae8cf47fd751965af52a3720835242f0 + checksum: 10c0/f990220bec103a04ca50dc8bb38c295e94a4e51b27a3188f4a0ae515c204b76bf87f5591739eb705b97e7aa5a9aa6a215d0d4da05297e50a0392801ea64a2234 languageName: node linkType: hard -"twenty-sdk@npm:^2.14.0": - version: 2.14.0 - resolution: "twenty-sdk@npm:2.14.0" +"twenty-sdk@npm:^2.16.0": + version: 2.16.0 + resolution: "twenty-sdk@npm:2.16.0" dependencies: "@sniptt/guards": "npm:^0.2.0" axios: "npm:^1.16.0" @@ -2564,22 +2902,24 @@ __metadata: preact: "npm:^10.28.3" react: "npm:^19.2.0" react-dom: "npm:^19.2.0" + semver: "npm:7.6.3" + sharp: "npm:^0.34.5" tinyglobby: "npm:^0.2.15" - twenty-client-sdk: "npm:2.14.0" + twenty-client-sdk: "npm:2.16.0" typescript: "npm:^5.9.3" uuid: "npm:^13.0.2" bin: twenty: dist/cli.cjs - checksum: 10c0/c4211772f8dd2ba81074a74be5f616c4c264d6bf8a174c5724be6d1c9a8cb3ca68a2674653bb58c059dae4bf1b0f43f91991e73d6a01395807206f0ac44afb08 + checksum: 10c0/528f275f8bda022061a52c3563af514d2257f291fc5a232be90ca6011c50ff18a250984b6c68fc8e4c690644c92e1ccb0b89c511b8a19d832455c8860f2751a8 languageName: node linkType: hard "type-fest@npm:^5.4.1": - version: 5.6.0 - resolution: "type-fest@npm:5.6.0" + version: 5.7.0 + resolution: "type-fest@npm:5.7.0" dependencies: tagged-tag: "npm:^1.0.0" - checksum: 10c0/5468a8ffda7f3904e6f7bbd8069eb8b6dd4bd9156e206df7a01d09a73e28cd1afedf74ead9d0fc12841c8c90074194859feca240511c50800962fde1bd9ddcbc + checksum: 10c0/f71ed17b753649421e419db8cc2e140f930333a1467b1d9cca2e0e4052900fd442f2360bae73f3a6bf9340d949ac46d9a1598c709b4c8089272e7624df9c8716 languageName: node linkType: hard @@ -2603,13 +2943,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:>=7.24.0 <7.24.7": - version: 7.24.6 - resolution: "undici-types@npm:7.24.6" - checksum: 10c0/d9cd8befb643ac904615c280a095ba4240531f6bb4a5e75a22a7483630ca8d3f1016d2ab6ace6ceda1f63b3a2db2fe037fafe121d6917a0187573aa548ff78ca - languageName: node - linkType: hard - "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0" @@ -2617,6 +2950,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~8.3.0": + version: 8.3.0 + resolution: "undici-types@npm:8.3.0" + checksum: 10c0/c8aa7e2fbebfce519654dafadc0ece59be888d2ccaf180fb4495da875e7b536d2456345c384069c7e6f3e9c9ab7435f074957da306f142343eee86ff8048855a + languageName: node + linkType: hard + "undici@npm:^6.25.0": version: 6.27.0 resolution: "undici@npm:6.27.0"