Skip to content

Commit 43e61a1

Browse files
fix(enrichments): remove Icypeas providers and show Running on in-flight cells (#5572)
* fix(enrichments): remove Icypeas providers and show Running on in-flight cells * fix(enrichments): keep previous value visible while an enrichment cell reruns
1 parent 5d3809a commit 43e61a1

5 files changed

Lines changed: 8 additions & 88 deletions

File tree

apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/cells/cell-render.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ export function resolveCellRender({
8585
return resolveLinkKind(text, currentWorkspaceId) ?? { kind: 'value', text }
8686
}
8787

88+
// Enrichment outputs share an empty blockId, so `runningBlockIds` can never
89+
// match them — the group-level `running` status is the only "worker picked
90+
// this up" signal an enrichment cell has. Checked after the value so a
91+
// rerun keeps showing the previous output until the new result lands.
92+
if (isEnrichmentOutput && exec?.status === 'running') return { kind: 'running' }
93+
8894
if (inFlight && !(groupHasBlockErrors && !blockRunning)) {
8995
// A `pending` cell whose jobId starts with `paused-` is mid-pause
9096
// (workflow yielded for human-in-the-loop). Render as Pending rather

apps/sim/enrichments/email-verification/email-verification.test.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ describe('email-verification enrichment cascade', () => {
1919
'zerobounce',
2020
'neverbounce',
2121
'millionverifier',
22-
'icypeas',
2322
'enrow',
2423
])
2524
})
@@ -39,31 +38,6 @@ describe('email-verification enrichment cascade', () => {
3938
})
4039
})
4140

42-
describe('icypeas', () => {
43-
const p = provider('icypeas')
44-
it('maps FOUND/DEBITED to deliverable and NOT_FOUND to undeliverable', () => {
45-
expect(p.toolId).toBe('icypeas_verify_email')
46-
expect(p.buildParams(emailInput)).toEqual({ email: 'john@acme.com' })
47-
expect(p.buildParams({ email: '' })).toBeNull()
48-
expect(p.mapOutput({ status: 'FOUND' })).toEqual({ status: 'valid', deliverable: true })
49-
expect(p.mapOutput({ status: 'DEBITED' })).toEqual({ status: 'valid', deliverable: true })
50-
expect(p.mapOutput({ status: 'NOT_FOUND' })).toEqual({
51-
status: 'invalid',
52-
deliverable: false,
53-
})
54-
expect(p.mapOutput({ status: 'DEBITED_NOT_FOUND' })).toEqual({
55-
status: 'invalid',
56-
deliverable: false,
57-
})
58-
})
59-
it('falls through on inconclusive statuses', () => {
60-
expect(p.mapOutput({ status: 'BAD_INPUT' })).toBeNull()
61-
expect(p.mapOutput({ status: 'INSUFFICIENT_FUNDS' })).toBeNull()
62-
expect(p.mapOutput({ status: 'ABORTED' })).toBeNull()
63-
expect(p.mapOutput({})).toBeNull()
64-
})
65-
})
66-
6741
describe('enrow', () => {
6842
const p = provider('enrow')
6943
it('maps the valid/invalid qualifier and falls through otherwise', () => {

apps/sim/enrichments/email-verification/email-verification.ts

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { EnrichmentConfig } from '@/enrichments/types'
55
/**
66
* Email Verification enrichment. Checks an email address's deliverability via a
77
* verifier waterfall — ZeroBounce first (highest coverage), then NeverBounce,
8-
* then MillionVerifier, then Icypeas, then Enrow. A provider that returns a
8+
* then MillionVerifier, then Enrow. A provider that returns a
99
* definitive verdict (valid / invalid / catch_all / disposable / etc.) fills the
1010
* cell; a provider that can only return `unknown` falls through to the next so
1111
* the row gets the most confident answer available. All providers support hosted
@@ -68,26 +68,6 @@ export const emailVerificationEnrichment: EnrichmentConfig = {
6868
return { status, deliverable: output.deliverable === true }
6969
},
7070
}),
71-
toolProvider({
72-
id: 'icypeas',
73-
label: 'Icypeas',
74-
toolId: 'icypeas_verify_email',
75-
buildParams: (inputs) => {
76-
const email = str(inputs.email)
77-
if (!email) return null
78-
return { email }
79-
},
80-
mapOutput: (output) => {
81-
// FOUND/DEBITED → deliverable, NOT_FOUND/DEBITED_NOT_FOUND → undeliverable.
82-
// Bad input / insufficient funds / aborted are inconclusive → fall through.
83-
const status = str(output.status)
84-
if (status === 'FOUND' || status === 'DEBITED')
85-
return { status: 'valid', deliverable: true }
86-
if (status === 'NOT_FOUND' || status === 'DEBITED_NOT_FOUND')
87-
return { status: 'invalid', deliverable: false }
88-
return null
89-
},
90-
}),
9171
toolProvider({
9272
id: 'enrow',
9373
label: 'Enrow',

apps/sim/enrichments/work-email/work-email.test.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ describe('work-email enrichment cascade', () => {
2626
'datagma',
2727
'leadmagic',
2828
'dropcontact',
29-
'icypeas',
3029
'enrow',
3130
])
3231
})
@@ -130,25 +129,6 @@ describe('work-email enrichment cascade', () => {
130129
})
131130
})
132131

133-
describe('icypeas', () => {
134-
const p = provider('icypeas')
135-
it('splits the name when possible and keeps mononym rows', () => {
136-
expect(p.toolId).toBe('icypeas_find_email')
137-
expect(p.buildParams(nameDomain)).toEqual({
138-
firstname: 'John',
139-
lastname: 'Doe',
140-
domainOrCompany: 'acme.com',
141-
})
142-
// single-token name runs with firstname alone (lastname is optional)
143-
expect(p.buildParams({ fullName: 'Cher', companyDomain: 'acme.com' })).toEqual({
144-
firstname: 'Cher',
145-
domainOrCompany: 'acme.com',
146-
})
147-
expect(p.buildParams({ fullName: 'John Doe' })).toBeNull()
148-
expect(p.mapOutput({ email: 'j@acme.com' })).toEqual({ email: 'j@acme.com' })
149-
})
150-
})
151-
152132
describe('enrow', () => {
153133
const p = provider('enrow')
154134
it('maps full name + company domain', () => {

apps/sim/enrichments/work-email/work-email.ts

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { EnrichmentConfig } from '@/enrichments/types'
88
* available identifiers (company domain, LinkedIn URL) via a provider waterfall:
99
* deterministic finders first (Hunter, Findymail by name then by LinkedIn), then
1010
* enrichment/reveal providers (Prospeo, Wiza), then People Data Labs as a broad
11-
* record-match fallback, then Datagma, LeadMagic, Dropcontact, Icypeas, and Enrow
11+
* record-match fallback, then Datagma, LeadMagic, Dropcontact, and Enrow
1212
* as additional finders. Each provider opportunistically uses whatever
1313
* identifiers the row provides and self-skips when it has none usable, so adding
1414
* more inputs widens coverage. First email wins; all providers support hosted keys.
@@ -189,26 +189,6 @@ export const workEmailEnrichment: EnrichmentConfig = {
189189
return email ? { email } : null
190190
},
191191
}),
192-
toolProvider({
193-
id: 'icypeas',
194-
label: 'Icypeas',
195-
toolId: 'icypeas_find_email',
196-
buildParams: (inputs) => {
197-
// Icypeas only requires domainOrCompany; firstname/lastname are optional,
198-
// so a mononym still runs with firstname alone rather than self-skipping.
199-
const fullName = str(inputs.fullName)
200-
const domainOrCompany = normalizeDomain(inputs.companyDomain)
201-
if (!fullName || !domainOrCompany) return null
202-
const name = splitName(inputs.fullName)
203-
return name
204-
? { firstname: name.firstName, lastname: name.lastName, domainOrCompany }
205-
: { firstname: fullName, domainOrCompany }
206-
},
207-
mapOutput: (output) => {
208-
const email = str(output.email)
209-
return email ? { email } : null
210-
},
211-
}),
212192
toolProvider({
213193
id: 'enrow',
214194
label: 'Enrow',

0 commit comments

Comments
 (0)