@sellable/mcp 0.1.475 → 0.1.477
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/dist/tools/leads.d.ts +50 -3
- package/dist/tools/leads.js +29 -17
- package/dist/tools/prompts.js +1 -1
- package/dist/tools/refill-sends.d.ts +27 -0
- package/dist/tools/refill-sends.js +166 -6
- package/dist/tools/refill-target-plan.js +56 -2
- package/dist/tools/registry.d.ts +45 -0
- package/dist/tools/sequencer.js +5 -6
- package/package.json +1 -1
- package/skills/create-campaign-v2/references/final-handoff-contract.md +9 -7
- package/skills/create-campaign-v2-tail/SKILL.md +13 -10
- package/skills/create-evergreen-campaigns/SKILL.md +11 -6
- package/skills/refill-sends/SKILL.md +40 -22
- package/skills/refill-sends-workflow/SKILL.md +45 -24
- package/skills/workflow-sequences/SKILL.md +1 -1
|
@@ -86,9 +86,9 @@ only when the caller explicitly needs a custom non-recommended cadence, or when
|
|
|
86
86
|
you have just reread the campaign after `confirm_lead_list` and proved the
|
|
87
87
|
current campaign table has no sequence while an older stale shell table is
|
|
88
88
|
causing campaign-level `SEQUENCE_EXISTS`. In that stale-shell repair case, use
|
|
89
|
-
`attach_sequence` on the current workflowTableId with the same
|
|
90
|
-
|
|
91
|
-
repair a table other than the current workflowTableId.
|
|
89
|
+
`attach_sequence` on the current workflowTableId with the same product template
|
|
90
|
+
the backend would select; do not substitute the manual Paid InMail Campaign and
|
|
91
|
+
never repair a table other than the current workflowTableId.
|
|
92
92
|
|
|
93
93
|
Hard gates — if you find yourself about to violate any of these, stop
|
|
94
94
|
first:
|
|
@@ -533,10 +533,12 @@ Shape:
|
|
|
533
533
|
route and describe the Sequence view.
|
|
534
534
|
8. Call `attach_recommended_sequence({ campaignId, currentStep: "send" })`
|
|
535
535
|
(bind the tier-recommended sequence to the campaign). Explain the sequence
|
|
536
|
-
choice plainly: Sales Nav/Recruiter senders get the Sales Nav
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
536
|
+
choice plainly: Sales Nav/Recruiter senders get the unified Sales Nav
|
|
537
|
+
cascade (Open Profile -> Open InMail, otherwise fresh paid credits >= 5 ->
|
|
538
|
+
paid InMail, otherwise connection request -> accepted wait -> DM), while
|
|
539
|
+
Basic/Premium/mixed senders get the Premium invite-to-DM strategy. The manual
|
|
540
|
+
Paid InMail Campaign remains an explicit custom template, not the normal
|
|
541
|
+
recommended path. If the tool response
|
|
540
542
|
does not persist `currentStep: "send"`, call
|
|
541
543
|
`update_campaign({ campaignId, currentStep: "send" })`.
|
|
542
544
|
Then reread `get_campaign({ campaignId })` and `list_tables()` and verify the
|
|
@@ -544,9 +546,10 @@ Shape:
|
|
|
544
546
|
`attach_recommended_sequence` returned `SEQUENCE_EXISTS` but the current table
|
|
545
547
|
still has `hasSequence:false`, do not continue to launch handoff from that
|
|
546
548
|
stale shell proof. Repair only the current workflowTableId with
|
|
547
|
-
`attach_sequence` using the same
|
|
548
|
-
|
|
549
|
-
|
|
549
|
+
`attach_sequence` using the same product template the recommended selector
|
|
550
|
+
would have chosen, or stop and report the stale-shell sequence blocker if
|
|
551
|
+
replacement was not explicitly approved. Do not substitute the manual Paid
|
|
552
|
+
InMail Campaign for this repair.
|
|
550
553
|
9. Surface the `handoff.orientation` string from `auto-execute.yaml` without
|
|
551
554
|
repeating the watch URL.
|
|
552
555
|
10. Ask the final launch greenlight with the structured question function:
|
|
@@ -1515,7 +1515,11 @@ Message, and verify current-revision sample messages before final completion.
|
|
|
1515
1515
|
- DM lanes: add a `Delivery format:` line — either `multiline (each paragraph sends as its own DM message)` or `single message`. When multiline, the template's blank-line paragraphs ARE the message boundaries — write each one as a standalone typed message.
|
|
1516
1516
|
- **InMail lanes can never be multiline**: an InMail is one message and the recipient must reply before anything else can be sent. InMail-bound templates must read as one cohesive message — declare `Delivery format: single message (InMail — no follow-up until reply)` and never structure the copy to depend on multi-message pacing.
|
|
1517
1517
|
|
|
1518
|
-
- The sequence is auto-selected by sender tier; do not hand-author sequence
|
|
1518
|
+
- The sequence is auto-selected by sender tier; do not hand-author sequence
|
|
1519
|
+
templates here. Sales Nav/Recruiter senders may receive the unified Sales
|
|
1520
|
+
Nav cascade through `attach_recommended_sequence`; attaching it does not
|
|
1521
|
+
spend paid InMail credits by itself. Do not substitute the manual Paid
|
|
1522
|
+
InMail Campaign template.
|
|
1519
1523
|
3. **Customer-Visible Completion Contract**: a named evergreen lane that appears
|
|
1520
1524
|
as a campaign card or campaign-backed table is not done when the shell exists.
|
|
1521
1525
|
It is done only when the customer can open the campaign and land on final
|
|
@@ -1592,7 +1596,7 @@ Message, and verify current-revision sample messages before final completion.
|
|
|
1592
1596
|
completion, approve exactly one quality-valid generated row. If one or more
|
|
1593
1597
|
rows are already approved, do not add more approvals during evergreen
|
|
1594
1598
|
completion. Never broad approve all rows.
|
|
1595
|
-
- The recommended
|
|
1599
|
+
- The recommended tier-aware sequence is attached to the current campaign
|
|
1596
1600
|
table, and the watched campaign is on Send. Use
|
|
1597
1601
|
`attach_recommended_sequence({ campaignId, currentStep:"send" })` when a
|
|
1598
1602
|
safe attach is needed. After `confirm_lead_list` or any source-list copy,
|
|
@@ -1602,10 +1606,11 @@ Message, and verify current-revision sample messages before final completion.
|
|
|
1602
1606
|
before reporting completion. If a stale shell table has sequence columns but
|
|
1603
1607
|
the current campaign table does not, `SEQUENCE_EXISTS` is not enough:
|
|
1604
1608
|
record the stale shell table id, then repair the current workflowTableId
|
|
1605
|
-
with `attach_sequence` using the same
|
|
1606
|
-
`attach_recommended_sequence` would have selected.
|
|
1607
|
-
|
|
1608
|
-
the current lane packet explicitly allowed sequence
|
|
1609
|
+
with `attach_sequence` using the same product template
|
|
1610
|
+
`attach_recommended_sequence` would have selected. Do not substitute the
|
|
1611
|
+
manual Paid InMail Campaign, and never attach/replace sequence outside the
|
|
1612
|
+
current table unless the current lane packet explicitly allowed sequence
|
|
1613
|
+
repair.
|
|
1609
1614
|
- If the current campaign table is still `DRAFT` after sequence/readiness
|
|
1610
1615
|
proof, call `pause_campaign({ campaignId })` and reread. `pause_campaign`
|
|
1611
1616
|
is the product-native review-state transition; it is not a launch and does
|
|
@@ -89,10 +89,16 @@ When the host can call typed MCP tools, start with:
|
|
|
89
89
|
refill_sends({ yolo?: boolean, senders?: string[], senderIds?: string[], senderNames?: string[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
That command helper
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
That command helper normalizes arguments and returns the execution contract. In
|
|
93
|
+
non-yolo mode it does not mutate. In `--yolo`, it may execute exactly one safe
|
|
94
|
+
bounded primitive from the fresh `target.globalActionQueue[0]`, then reread and
|
|
95
|
+
return the new target plan; currently safe primitives are paid-credit refresh,
|
|
96
|
+
existing-row message preparation, same-source row copy, and read-only wait
|
|
97
|
+
rereads. It does not approve messages without the bounded approval gate, lower
|
|
98
|
+
paid-InMail thresholds, switch source families, create campaigns, launch, send,
|
|
99
|
+
or write scheduler rows. Continue with the workflow below for route selection,
|
|
100
|
+
state rereads, approval gating, source import, preparation, and bounded
|
|
101
|
+
approval.
|
|
96
102
|
|
|
97
103
|
First call `get_auth_status({})`. If auth or active workspace is not OK, follow
|
|
98
104
|
the returned login/workspace guidance before route resolution. Do not run refill
|
|
@@ -131,18 +137,21 @@ eligible senders, selected sender-local days, gross target, actual sent
|
|
|
131
137
|
coverage, scheduler-owned scheduled coverage across active enrolled campaigns,
|
|
132
138
|
projected coverage (`sent + scheduled`), inferred per-sender send lane/action
|
|
133
139
|
selections, ready buffer, remaining projected gap, paid-InMail credit/threshold
|
|
134
|
-
feasibility, `targetShapeRevision`, and `stateRevision`. Refill target lanes
|
|
135
|
-
|
|
136
|
-
(`send_inmail_closed`),
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
`
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
feasibility, `targetShapeRevision`, and `stateRevision`. Refill target lanes are
|
|
141
|
+
connection invites (`send_invite`), standalone paid InMails
|
|
142
|
+
(`send_inmail_closed`), or unified Sales Nav cascades represented publicly as
|
|
143
|
+
`send_inmail_closed` with `campaignClassification:"sales_nav_cascade"`. For a
|
|
144
|
+
Sales Nav cascade, refill the selected campaign first; its sequence can route
|
|
145
|
+
prospects to Open InMail, paid InMail while fresh credits are >= 5, or
|
|
146
|
+
same-campaign connection fallback without asking for separate open/paid/
|
|
147
|
+
connection campaigns. DMs (`send_dm`) are follow-up actions, not refill horizon
|
|
148
|
+
target capacity, and must not be counted as refill sent, scheduled, or ready
|
|
149
|
+
coverage. When `actionTypes` are omitted, trust the target plan's inferred lane
|
|
150
|
+
rather than asking which campaign class to fill. If a stale target plan selects
|
|
151
|
+
`send_dm` or `send_inmail_open` as the lane, stop and re-plan with the current
|
|
152
|
+
planner before mutation.
|
|
153
|
+
Short form: trust the target plan's inferred lane when it is a connection invite,
|
|
154
|
+
paid-InMail refill lane, or unified Sales Nav cascade.
|
|
146
155
|
|
|
147
156
|
Structured planner packet:
|
|
148
157
|
|
|
@@ -161,14 +170,23 @@ Structured planner packet:
|
|
|
161
170
|
- `manualAlternates` are not yolo actions. Threshold lowering and campaign
|
|
162
171
|
creation are manual continuations only.
|
|
163
172
|
|
|
173
|
+
Refill action ladder: approve generated rows only when an explicit bounded
|
|
174
|
+
approval gate exists, process all existing same-campaign unenriched/unprepared
|
|
175
|
+
rows in bounded batches before any source work, then copy bounded net-new rows
|
|
176
|
+
from the selected source (`selectedLeadListId`, provider, and source
|
|
177
|
+
fingerprint preserved), then use provider-aligned source-more. A new source or
|
|
178
|
+
provider switch changes the reply-rate baseline and is a manual alternate, not a
|
|
179
|
+
`--yolo` side effect.
|
|
180
|
+
|
|
164
181
|
Run-local paid-credit guard: in `--yolo`, the `refill_sends` MCP command
|
|
165
182
|
automatically maintains a `refreshedPaidInmailSenderIds` set for the current
|
|
166
183
|
command call. If its first target plan has stale/missing paid-InMail credit
|
|
167
184
|
facts, it refreshes each selected sender at most once, reruns
|
|
168
185
|
`get_refill_target_plan`, and returns the post-refresh `targetPlan` before
|
|
169
|
-
choosing the next prep/
|
|
186
|
+
choosing the next prep/source-copy/read-only wait action. If fresh facts are still below
|
|
170
187
|
threshold, below-threshold paid-InMail facts fall back to an existing connection
|
|
171
|
-
lane or a manual
|
|
188
|
+
lane, the same Sales Nav cascade campaign's connection branch, or a manual
|
|
189
|
+
continuation.
|
|
172
190
|
|
|
173
191
|
Compact refill lessons: sender-level target plan is final truth; trust
|
|
174
192
|
`schedulerGate.sendable` and scheduler gate blockers, not raw
|
|
@@ -201,8 +219,8 @@ post-refresh `targetPlan`. Trust `refill_sends.autoPaidInmailRefresh`: it should
|
|
|
201
219
|
show the exact sender ids refreshed once, sender-credit-cache write receipts,
|
|
202
220
|
and a returned post-refresh `targetPlan`. Continue from that post-refresh packet.
|
|
203
221
|
If paid InMail is below threshold after the fresh credit read, report the exact
|
|
204
|
-
campaign/table/column threshold action or connection fallback;
|
|
205
|
-
lower paid-InMail thresholds or create campaigns.
|
|
222
|
+
campaign/table/column threshold action or same-campaign connection fallback;
|
|
223
|
+
`--yolo` does not lower paid-InMail thresholds or create campaigns.
|
|
206
224
|
|
|
207
225
|
If the plain route's managed waterfall targets are stale, for example skipped
|
|
208
226
|
targets show archived/completed shared slots or the returned targets do not cover
|
|
@@ -254,7 +272,7 @@ they change `stateRevision`, not `targetShapeRevision`, and do not require a
|
|
|
254
272
|
second approval.
|
|
255
273
|
|
|
256
274
|
In `--yolo`, continue as far as the rendered packet safely allows. After each
|
|
257
|
-
apply/prep/
|
|
275
|
+
apply/prep/source-copy/read-only wait result, reread state, settle processing when needed, and move to
|
|
258
276
|
the next selected sender or start-eligible same-packet campaign instead of
|
|
259
277
|
stopping after the first partial result. If no in-packet safe action remains,
|
|
260
278
|
return concrete continuation options with campaign names, exact ids, which option
|
|
@@ -268,7 +286,7 @@ selected sender: selected send days, gross capacity, actual sent cells, future
|
|
|
268
286
|
scheduler-owned scheduled cells with non-null `scheduledFor`, projected count,
|
|
269
287
|
ready-to-schedule buffer, remaining projected gap, paid-InMail feasibility,
|
|
270
288
|
`targetShapeRevision`, `stateRevision`, and the next MCP primitive that can
|
|
271
|
-
reduce the gap. After every apply/prep/
|
|
289
|
+
reduce the gap. After every apply/prep/source-copy/read-only wait result, wait for processing, reread
|
|
272
290
|
the target plan/refill state, recompute the ledger, then keep applying safe
|
|
273
291
|
bounded actions until projected coverage fills the target window or a concrete
|
|
274
292
|
non-scheduler blocker is proven.
|
|
@@ -75,20 +75,23 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
|
75
75
|
campaigns, projected coverage (`sent + scheduled`), ready buffer, remaining
|
|
76
76
|
projected gap, paid-InMail credit/threshold feasibility, bounded action
|
|
77
77
|
candidates, `targetShapeRevision`, and `stateRevision`.
|
|
78
|
-
Refill target lanes are
|
|
79
|
-
(`
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
Refill target lanes are connection invites (`send_invite`), standalone paid
|
|
79
|
+
InMails (`send_inmail_closed`), or unified Sales Nav cascades represented
|
|
80
|
+
publicly as `send_inmail_closed` with
|
|
81
|
+
`campaignClassification:"sales_nav_cascade"`. For a Sales Nav cascade, fill
|
|
82
|
+
the selected campaign first; its sequence can route prospects to Open InMail,
|
|
83
|
+
paid InMail while fresh credits are >= 5, or same-campaign connection
|
|
84
|
+
fallback without asking for separate open/paid/connection campaigns. DMs
|
|
85
|
+
(`send_dm`) are follow-up actions, not refill horizon capacity. Do not count
|
|
86
|
+
their sent, scheduled, or ready cells when deciding whether a sender needs
|
|
87
|
+
refill. When `actionTypes` are omitted, trust the target plan's inferred lane;
|
|
88
|
+
do not ask the operator which campaign class to fill after the plan has
|
|
89
|
+
inferred that from active campaign future scheduled, recent scheduled, and
|
|
90
|
+
ready evidence. If a stale planner/tool response selects `send_dm` or
|
|
91
|
+
`send_inmail_open`, treat that as unsupported stale refill state and re-plan
|
|
92
|
+
with a current planner before any mutation.
|
|
93
|
+
Short form: trust the target plan's inferred lane when it is a connection
|
|
94
|
+
invite, paid-InMail refill lane, or unified Sales Nav cascade.
|
|
92
95
|
Structured planner packet:
|
|
93
96
|
- `target.eligibleSenderLedger` is the public sender eligibility ledger.
|
|
94
97
|
- `target.senderRefillPlans[]` is the canonical sender-level packet; read and
|
|
@@ -105,14 +108,22 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
|
105
108
|
- `nextActions[0]` is the current sender's smallest safe primitive.
|
|
106
109
|
- `manualAlternates` are not yolo actions. Threshold lowering and campaign
|
|
107
110
|
creation are manual continuations only.
|
|
111
|
+
Refill action ladder: approve generated rows only when an explicit bounded
|
|
112
|
+
approval gate exists, process all existing same-campaign
|
|
113
|
+
unenriched/unprepared rows in bounded batches before any source work, then
|
|
114
|
+
copy bounded net-new rows from the selected source (`selectedLeadListId`,
|
|
115
|
+
provider, and source fingerprint preserved), then use provider-aligned
|
|
116
|
+
source-more. A new source or provider switch changes the reply-rate baseline
|
|
117
|
+
and is a manual alternate, not a `--yolo` side effect.
|
|
108
118
|
Run-local paid-credit guard: in `--yolo`, the `refill_sends` MCP command
|
|
109
119
|
automatically maintains a `refreshedPaidInmailSenderIds` set for the current
|
|
110
120
|
command call. If its first target plan has stale/missing paid-InMail credit
|
|
111
121
|
facts, it refreshes each selected sender at most once, reruns
|
|
112
122
|
`get_refill_target_plan`, and returns the post-refresh `targetPlan` before
|
|
113
|
-
choosing the next prep/
|
|
123
|
+
choosing the next prep/source-copy/read-only wait action. If fresh facts are still below
|
|
114
124
|
threshold, below-threshold paid-InMail facts fall back to an existing
|
|
115
|
-
connection lane
|
|
125
|
+
connection lane, the same Sales Nav cascade campaign's connection branch, or
|
|
126
|
+
a manual continuation.
|
|
116
127
|
Compact refill lessons: sender-level target plan is final truth; trust
|
|
117
128
|
`schedulerGate.sendable` and scheduler gate blockers, not raw
|
|
118
129
|
`unipileAccountStatus` labels alone; use compact prep status checks for
|
|
@@ -147,7 +158,7 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
|
147
158
|
should show the exact sender ids refreshed once, sender-credit-cache write
|
|
148
159
|
receipts, and a returned post-refresh `targetPlan`. Continue from that
|
|
149
160
|
post-refresh packet. If paid InMail is below threshold after the fresh credit read, report
|
|
150
|
-
the exact campaign/table/column threshold action or
|
|
161
|
+
the exact campaign/table/column threshold action or same-campaign
|
|
151
162
|
connection fallback; `--yolo` does not lower paid-InMail thresholds or create campaigns.
|
|
152
163
|
2. Call `resolve_campaign_fill_route`. Use `intent:"plain"` for generic
|
|
153
164
|
fill/load language, `intent:"active"` only when the user explicitly narrowed
|
|
@@ -282,10 +293,13 @@ dashboard-active campaign-backed sequence evidence:
|
|
|
282
293
|
|
|
283
294
|
1. Prefer the sender's most recent future scheduled refill action, then the most
|
|
284
295
|
recent recent scheduled refill action, then ready refill rows.
|
|
285
|
-
2. Refill actions are
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
296
|
+
2. Refill actions are `send_invite` or `send_inmail_closed`; unified Sales Nav
|
|
297
|
+
cascades also appear as `send_inmail_closed` with
|
|
298
|
+
`campaignClassification:"sales_nav_cascade"`.
|
|
299
|
+
3. If the most recent active campaign evidence is DM, ignore it for refill lane
|
|
300
|
+
selection. If open InMail evidence belongs to a unified Sales Nav cascade,
|
|
301
|
+
keep the cascade campaign as the selected `send_inmail_closed` target; do not
|
|
302
|
+
create side open/paid/connection campaigns.
|
|
289
303
|
4. If no connection/paid-InMail evidence exists, fall back to the selected
|
|
290
304
|
active campaign sequence, still choosing only one of `send_invite` or
|
|
291
305
|
`send_inmail_closed` for that sender.
|
|
@@ -418,8 +432,15 @@ search_signals({ campaignOfferId, currentStep:"signal-discovery", confirmed:true
|
|
|
418
432
|
```
|
|
419
433
|
|
|
420
434
|
Use `select_promising_posts` before importing. For a fresh source refill, prefer
|
|
421
|
-
`selectionMode:"replace"` and `scrapePlanMode:"
|
|
422
|
-
|
|
435
|
+
`selectionMode:"replace"` and `scrapePlanMode:"all-selected"`, then call
|
|
436
|
+
`import_leads` without `targetEngagerCount` or `maxPostsToScrape` so the scrape
|
|
437
|
+
uses the selected posts' max available engagers within backend provider caps.
|
|
438
|
+
Do not invent, lower, or pass a people-to-check target for refill imports unless
|
|
439
|
+
Christian explicitly supplied that target or post cap in the current request or
|
|
440
|
+
approval packet. If Christian did supply an explicit `targetEngagerCount` or
|
|
441
|
+
`maxPostsToScrape`, use `scrapePlanMode:"capacity-target"` and respect the
|
|
442
|
+
under-capacity refusal: ask for approval to expand the selected post set or
|
|
443
|
+
switch source instead of scraping a target-mismatched set.
|
|
423
444
|
|
|
424
445
|
If `import_leads` returns `reusedExistingSourceList` but the user explicitly
|
|
425
446
|
approved a different selected-post scrape, retry `import_leads` with the existing `sourceLeadListId` from that response or from refill state. For Signal
|
|
@@ -538,7 +559,7 @@ same refill request, do not ask the `Accept` / `Decline` question. Instead:
|
|
|
538
559
|
caps/dates, approval mode, blockers, and side-effect class still match the
|
|
539
560
|
packet;
|
|
540
561
|
4. execute only the exact packet;
|
|
541
|
-
5. after each terminal credit-refresh/apply/prep/
|
|
562
|
+
5. after each terminal credit-refresh/apply/prep/source-copy/read-only wait result, rerun
|
|
542
563
|
`get_refill_target_plan`, reread state, settle processing when needed,
|
|
543
564
|
recompute the target-window saturation ledger, and continue with the next smallest
|
|
544
565
|
safe action inside the same bounded packet until every selected sender is
|
|
@@ -77,7 +77,7 @@ This is the canonical MCP workflow for creating sequencer tables. Prefer this ov
|
|
|
77
77
|
- `INVITE` only
|
|
78
78
|
- `INVITE -> accepted -> DM`
|
|
79
79
|
- `COMMENT` only
|
|
80
|
-
-
|
|
80
|
+
- Sales Nav unified cascade: Open Profile -> Open InMail, otherwise paid-credit check -> Paid InMail or connection fallback
|
|
81
81
|
|
|
82
82
|
## Output
|
|
83
83
|
|