Files
FlowPilot/flows/grok/mail-rules.js
T
2026-05-23 04:29:37 +08:00

158 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function attachGrokMailRules(root, factory) {
root.MultiPageGrokMailRules = factory(root);
})(typeof self !== 'undefined' ? self : globalThis, function createGrokMailRulesModule(root) {
const grokStateApi = root.MultiPageBackgroundGrokState || null;
const SUBMIT_VERIFICATION_CODE_RULE_ID = 'grok-submit-verification-code';
const SUBMIT_VERIFICATION_CODE_NODE_ID = 'grok-submit-verification-code';
const GROK_VERIFICATION_CODE_PATTERNS = Object.freeze([
Object.freeze({
source: '\\b([A-Z0-9]{3}-[A-Z0-9]{3})\\b',
flags: 'gi',
}),
Object.freeze({
source: '(?:verification\\s*code|confirmation\\s*code|code\\s*is)[:\\s]*(\\d{6})',
flags: 'gi',
}),
Object.freeze({
source: '(?:验证码|代码|确认码)[:\\s为]+(\\d{6})',
flags: 'gi',
}),
Object.freeze({
source: '(?<!#)\\b(\\d{6})\\b',
flags: 'g',
}),
]);
const GROK_SENDER_FILTERS = Object.freeze([
'x.ai',
'xai',
'grok',
]);
const GROK_SUBJECT_FILTERS = Object.freeze([
'xai',
'x.ai',
'grok',
'verification',
'confirmation',
'code',
'验证码',
'确认码',
]);
const GROK_REQUIRED_KEYWORDS = Object.freeze([
'xai',
'x.ai',
'grok',
'verification',
'confirmation',
'code',
'验证码',
'确认码',
]);
function cleanString(value = '') {
return String(value ?? '').trim();
}
function readGrokRuntime(state = {}) {
if (typeof grokStateApi?.ensureRuntimeState === 'function') {
return grokStateApi.ensureRuntimeState(state);
}
return state?.runtimeState?.flowState?.grok || state?.flowState?.grok || {};
}
function buildTargetEmailHints(targetEmail = '') {
const normalizedTarget = cleanString(targetEmail).toLowerCase();
return normalizedTarget ? [normalizedTarget] : [];
}
function getVisibleStep(state = {}) {
const explicitStep = Number(state?.visibleStep || state?.step);
return Number.isInteger(explicitStep) && explicitStep > 0 ? explicitStep : 3;
}
function isMail2925Provider(state = {}) {
return cleanString(state?.mailProvider).toLowerCase() === '2925';
}
function shouldMatchMail2925TargetEmail(state = {}) {
return isMail2925Provider(state)
&& cleanString(state?.mail2925Mode).toLowerCase() === 'receive';
}
function createGrokMailRules(deps = {}) {
const {
LUCKMAIL_PROVIDER = 'luckmail-api',
MAIL_2925_VERIFICATION_INTERVAL_MS = 15000,
MAIL_2925_VERIFICATION_MAX_ATTEMPTS = 15,
} = deps;
function getRuleDefinition(_input, state = {}) {
const runtimeState = readGrokRuntime(state);
const targetEmail = cleanString(runtimeState.register?.email || state?.grokEmail || state?.email).toLowerCase();
const normalizedProvider = cleanString(state?.mailProvider).toLowerCase();
const mail2925Provider = isMail2925Provider(state);
const luckmailProvider = normalizedProvider === cleanString(LUCKMAIL_PROVIDER).toLowerCase();
return {
flowId: 'grok',
ruleId: SUBMIT_VERIFICATION_CODE_RULE_ID,
nodeId: SUBMIT_VERIFICATION_CODE_NODE_ID,
step: getVisibleStep(state),
artifactType: 'code',
codePatterns: GROK_VERIFICATION_CODE_PATTERNS,
filterAfterTimestamp: 0,
requiredKeywords: GROK_REQUIRED_KEYWORDS,
senderFilters: GROK_SENDER_FILTERS,
subjectFilters: GROK_SUBJECT_FILTERS,
targetEmail,
targetEmailHints: buildTargetEmailHints(targetEmail),
mail2925MatchTargetEmail: shouldMatchMail2925TargetEmail(state),
maxAttempts: luckmailProvider
? 3
: (mail2925Provider ? MAIL_2925_VERIFICATION_MAX_ATTEMPTS : 5),
intervalMs: luckmailProvider
? 15000
: (mail2925Provider ? MAIL_2925_VERIFICATION_INTERVAL_MS : 5000),
};
}
function getRuleDefinitionForNode(nodeId, state = {}) {
const normalizedNodeId = cleanString(nodeId);
if (normalizedNodeId && normalizedNodeId !== SUBMIT_VERIFICATION_CODE_NODE_ID) {
throw new Error(`Grok 邮件规则不支持节点:${normalizedNodeId}`);
}
return getRuleDefinition({ nodeId: SUBMIT_VERIFICATION_CODE_NODE_ID }, state);
}
function buildVerificationPollPayload(input, state = {}, overrides = {}) {
return {
...getRuleDefinition(input, state),
...(overrides || {}),
};
}
function buildVerificationPollPayloadForNode(nodeId, state = {}, overrides = {}) {
return {
...getRuleDefinitionForNode(nodeId, state),
...(overrides || {}),
};
}
return {
buildVerificationPollPayload,
buildVerificationPollPayloadForNode,
getRuleDefinition,
getRuleDefinitionForNode,
};
}
return {
GROK_REQUIRED_KEYWORDS,
GROK_SENDER_FILTERS,
GROK_SUBJECT_FILTERS,
GROK_VERIFICATION_CODE_PATTERNS,
SUBMIT_VERIFICATION_CODE_NODE_ID,
SUBMIT_VERIFICATION_CODE_RULE_ID,
createGrokMailRules,
};
});