@konfeature/ap-email-guessr 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/lib/actions/find-email.d.ts.map +1 -1
- package/src/lib/actions/find-email.js +2 -2
- package/src/lib/actions/find-email.js.map +1 -1
- package/src/lib/common/auth.d.ts +10 -0
- package/src/lib/common/auth.d.ts.map +1 -0
- package/src/lib/common/auth.js +26 -0
- package/src/lib/common/auth.js.map +1 -0
- package/src/lib/common/find-email.d.ts +15 -12
- package/src/lib/common/find-email.d.ts.map +1 -1
- package/src/lib/common/find-email.js +45 -16
- package/src/lib/common/find-email.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konfeature/ap-email-guessr",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Activepieces piece that finds a person's email from their name and company domain — free Microsoft 365 account checks plus no2bounce verification, with early-stop to minimize credits.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe;;;;;;;;EAmG1B,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findEmailAction = void 0;
|
|
4
4
|
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
5
|
+
const auth_1 = require("../common/auth");
|
|
5
6
|
const find_person_1 = require("../common/find-person");
|
|
6
7
|
const no2bounce_verifier_1 = require("../common/verifiers/no2bounce-verifier");
|
|
7
8
|
exports.findEmailAction = (0, pieces_framework_1.createAction)({
|
|
@@ -58,8 +59,7 @@ exports.findEmailAction = (0, pieces_framework_1.createAction)({
|
|
|
58
59
|
const { firstName, lastName, domain, patternSet, maxChecks, useO365 } = context.propsValue;
|
|
59
60
|
const timeoutSeconds = context.propsValue.timeout ?? 15;
|
|
60
61
|
const timeoutMs = Math.min(Math.max(Number(timeoutSeconds) || 15, 1), 120) * 1000;
|
|
61
|
-
const token = (context.auth
|
|
62
|
-
undefined;
|
|
62
|
+
const token = (0, auth_1.readSecretText)(context.auth);
|
|
63
63
|
const result = await (0, find_person_1.findPersonEmail)(firstName, lastName, domain, {
|
|
64
64
|
patternSet: patternSet ?? "common",
|
|
65
65
|
maxChecks: maxChecks != null ? Math.max(1, Number(maxChecks)) : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":";;;AAAA,qEAAwE;AACxE,uDAAwD;AAExD,+EAA4E;AAE/D,QAAA,eAAe,GAAG,IAAA,+BAAY,EAAC;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,WAAW,EACP,ySAAyS;IAC7S,KAAK,EAAE;QACH,SAAS,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,gDAAgD;YAC7D,QAAQ,EAAE,IAAI;SACjB,CAAC;QACF,QAAQ,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,IAAI;SACjB,CAAC;QACF,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACvB,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,IAAI;SACjB,CAAC;QACF,UAAU,EAAE,2BAAQ,CAAC,cAAc,CAAC;YAChC,WAAW,EAAE,aAAa;YAC1B,WAAW,EACP,sGAAsG;YAC1G,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,QAAQ;YACtB,OAAO,EAAE;gBACL,OAAO,EAAE;oBACL,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE;oBAC/C,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE;iBAChD;aACJ;SACJ,CAAC;QACF,SAAS,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACvB,WAAW,EAAE,gCAAgC;YAC7C,WAAW,EACP,6GAA6G;YACjH,QAAQ,EAAE,KAAK;SAClB,CAAC;QACF,OAAO,EAAE,2BAAQ,CAAC,QAAQ,CAAC;YACvB,WAAW,EAAE,gBAAgB;YAC7B,WAAW,EACP,4GAA4G;YAChH,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,IAAI;SACrB,CAAC;QACF,OAAO,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACrB,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,EAAE;SACnB,CAAC;KACL;IACD,KAAK,CAAC,GAAG,CAAC,OAAO;QACb,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,GACjE,OAAO,CAAC,UAAU,CAAC;QACvB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;QACxD,MAAM,SAAS,GACX,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;QACpE,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read an Activepieces SecretText auth value into a clean token string.
|
|
3
|
+
*
|
|
4
|
+
* The engine hands `context.auth` to an action differently across context
|
|
5
|
+
* versions: the bare secret string (legacy V0) or the connection object
|
|
6
|
+
* `{ secret_text }` (V1+, current). Handle both, trim surrounding whitespace,
|
|
7
|
+
* and treat blank as absent so an empty connection reads as "no token".
|
|
8
|
+
*/
|
|
9
|
+
export declare function readSecretText(auth: unknown): string | undefined;
|
|
10
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAShE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Read an Activepieces SecretText auth value into a clean token string.
|
|
4
|
+
*
|
|
5
|
+
* The engine hands `context.auth` to an action differently across context
|
|
6
|
+
* versions: the bare secret string (legacy V0) or the connection object
|
|
7
|
+
* `{ secret_text }` (V1+, current). Handle both, trim surrounding whitespace,
|
|
8
|
+
* and treat blank as absent so an empty connection reads as "no token".
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.readSecretText = readSecretText;
|
|
12
|
+
function hasSecretText(value) {
|
|
13
|
+
return (typeof value === "object" &&
|
|
14
|
+
value !== null &&
|
|
15
|
+
typeof value.secret_text === "string");
|
|
16
|
+
}
|
|
17
|
+
function readSecretText(auth) {
|
|
18
|
+
const raw = typeof auth === "string"
|
|
19
|
+
? auth
|
|
20
|
+
: hasSecretText(auth)
|
|
21
|
+
? auth.secret_text
|
|
22
|
+
: "";
|
|
23
|
+
const trimmed = raw.trim();
|
|
24
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/common/auth.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAcH,wCASC;AAjBD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAiC,CAAC,WAAW,KAAK,QAAQ,CACrE,CAAC;AACN,CAAC;AAED,SAAgB,cAAc,CAAC,IAAa;IACxC,MAAM,GAAG,GACL,OAAO,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credit-minimizing email search (layers 1 + 2).
|
|
3
3
|
*
|
|
4
|
-
* Candidates arrive pre-ordered by likelihood
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `verify` calls; either
|
|
8
|
-
*
|
|
4
|
+
* Candidates arrive pre-ordered by likelihood. The single most-likely address is
|
|
5
|
+
* probed on its own first, then the remainder is swept in rounds of `batchSize`
|
|
6
|
+
* (1 = strictly sequential). A round is one bulk provider call when the verifier
|
|
7
|
+
* exposes `verifyBatch` (no2bounce), otherwise concurrent `verify` calls; either
|
|
8
|
+
* way the round is read back in candidate order, so the verdict is identical to
|
|
9
|
+
* checking one at a time:
|
|
9
10
|
* - stop at the first `valid` hit (layer 2: early-stop), and
|
|
10
|
-
* - stop
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* - stop as soon as a result proves the domain is accept-all (`catchAll` with a
|
|
12
|
+
* non-`valid` verdict), since a catch-all domain can't disambiguate individual
|
|
13
|
+
* mailboxes — every candidate then gets the same catch-all verdict and we stop
|
|
14
|
+
* paying for more rounds (layer 1). The lone first probe means an accept-all
|
|
15
|
+
* domain is caught for one credit instead of a whole round.
|
|
13
16
|
*
|
|
14
17
|
* no2bounce bills per email with no refund, so a round is paid for the moment it
|
|
15
|
-
* is submitted: `creditsUsed` counts every email
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* is submitted: `creditsUsed` counts every email actually queried, even when an
|
|
19
|
+
* early candidate in the final round is the hit. A larger `batchSize` is thus
|
|
20
|
+
* faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a hard
|
|
21
|
+
* ceiling; a `valid` hit on an accept-all domain is reported with reduced
|
|
19
22
|
* confidence and `catchAll: true`.
|
|
20
23
|
*/
|
|
21
24
|
import type { Verifier, VerifyOutcome, VerifyVerdict } from "./verifier";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC7B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAyDD,wBAAsB,SAAS,CAC3B,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CA4E1B"}
|
|
@@ -2,21 +2,24 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Credit-minimizing email search (layers 1 + 2).
|
|
4
4
|
*
|
|
5
|
-
* Candidates arrive pre-ordered by likelihood
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `verify` calls; either
|
|
9
|
-
*
|
|
5
|
+
* Candidates arrive pre-ordered by likelihood. The single most-likely address is
|
|
6
|
+
* probed on its own first, then the remainder is swept in rounds of `batchSize`
|
|
7
|
+
* (1 = strictly sequential). A round is one bulk provider call when the verifier
|
|
8
|
+
* exposes `verifyBatch` (no2bounce), otherwise concurrent `verify` calls; either
|
|
9
|
+
* way the round is read back in candidate order, so the verdict is identical to
|
|
10
|
+
* checking one at a time:
|
|
10
11
|
* - stop at the first `valid` hit (layer 2: early-stop), and
|
|
11
|
-
* - stop
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* - stop as soon as a result proves the domain is accept-all (`catchAll` with a
|
|
13
|
+
* non-`valid` verdict), since a catch-all domain can't disambiguate individual
|
|
14
|
+
* mailboxes — every candidate then gets the same catch-all verdict and we stop
|
|
15
|
+
* paying for more rounds (layer 1). The lone first probe means an accept-all
|
|
16
|
+
* domain is caught for one credit instead of a whole round.
|
|
14
17
|
*
|
|
15
18
|
* no2bounce bills per email with no refund, so a round is paid for the moment it
|
|
16
|
-
* is submitted: `creditsUsed` counts every email
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
19
|
+
* is submitted: `creditsUsed` counts every email actually queried, even when an
|
|
20
|
+
* early candidate in the final round is the hit. A larger `batchSize` is thus
|
|
21
|
+
* faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a hard
|
|
22
|
+
* ceiling; a `valid` hit on an accept-all domain is reported with reduced
|
|
20
23
|
* confidence and `catchAll: true`.
|
|
21
24
|
*/
|
|
22
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -41,6 +44,24 @@ function result(found, email, verdict, catchAll, attempts, creditsUsed) {
|
|
|
41
44
|
attempts,
|
|
42
45
|
};
|
|
43
46
|
}
|
|
47
|
+
// Accept-all is a domain property, so every candidate gets the same catch-all
|
|
48
|
+
// verdict — but only the addresses actually queried were billed (zero-cost rows
|
|
49
|
+
// for the rest keep `creditsUsed` honest while `candidatesChecked` covers all).
|
|
50
|
+
function catchAllForAll(candidates, limit, detected, queried, creditsUsed) {
|
|
51
|
+
const billed = new Map(queried.map((o) => [o.email, o]));
|
|
52
|
+
const attempts = candidates.slice(0, limit).map((email) => {
|
|
53
|
+
const prior = billed.get(email);
|
|
54
|
+
return {
|
|
55
|
+
email,
|
|
56
|
+
verdict: "catch_all",
|
|
57
|
+
catchAll: true,
|
|
58
|
+
creditsUsed: prior?.creditsUsed ?? 0,
|
|
59
|
+
reason: detected.reason,
|
|
60
|
+
raw: prior?.raw,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
return result(false, null, "catch_all", true, attempts, creditsUsed);
|
|
64
|
+
}
|
|
44
65
|
async function findEmail(candidates, verifier, options = {}) {
|
|
45
66
|
const stopOnFirstHit = options.stopOnFirstHit ?? true;
|
|
46
67
|
const batchSize = Math.max(1, options.batchSize ?? 1);
|
|
@@ -48,8 +69,12 @@ async function findEmail(candidates, verifier, options = {}) {
|
|
|
48
69
|
const attempts = [];
|
|
49
70
|
let creditsUsed = 0;
|
|
50
71
|
let firstValid = null;
|
|
51
|
-
|
|
52
|
-
|
|
72
|
+
// Probe the single most-likely candidate first (one credit), then sweep the
|
|
73
|
+
// rest in rounds of `batchSize`.
|
|
74
|
+
let start = 0;
|
|
75
|
+
while (start < limit) {
|
|
76
|
+
const end = Math.min(start + (start === 0 ? 1 : batchSize), limit);
|
|
77
|
+
const round = candidates.slice(start, end);
|
|
53
78
|
const outcomes = verifier.verifyBatch
|
|
54
79
|
? await verifier.verifyBatch(round)
|
|
55
80
|
: await Promise.all(round.map((email) => verifier.verify(email)));
|
|
@@ -60,8 +85,11 @@ async function findEmail(candidates, verifier, options = {}) {
|
|
|
60
85
|
creditsUsed += outcome.creditsUsed;
|
|
61
86
|
}
|
|
62
87
|
for (const outcome of outcomes) {
|
|
63
|
-
|
|
64
|
-
|
|
88
|
+
// Accept-all (a catch-all, or an address scored undeliverable *on* an
|
|
89
|
+
// accept-all domain): no single mailbox can be confirmed, so stop and
|
|
90
|
+
// give every candidate the same catch-all verdict.
|
|
91
|
+
if (outcome.catchAll === true && outcome.verdict !== "valid") {
|
|
92
|
+
return catchAllForAll(candidates, limit, outcome, attempts, creditsUsed);
|
|
65
93
|
}
|
|
66
94
|
if (outcome.verdict === "valid") {
|
|
67
95
|
if (!firstValid) {
|
|
@@ -72,6 +100,7 @@ async function findEmail(candidates, verifier, options = {}) {
|
|
|
72
100
|
}
|
|
73
101
|
}
|
|
74
102
|
}
|
|
103
|
+
start = end;
|
|
75
104
|
}
|
|
76
105
|
if (firstValid) {
|
|
77
106
|
return result(true, firstValid.email, "valid", firstValid.catchAll ?? false, attempts, creditsUsed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"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"}
|