@floomhq/signaldash 0.13.0 → 0.22.0
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/README.md +88 -1
- package/bin/sd.mjs +391 -25
- package/lib/cli.js +16 -22
- package/lib/config-file.js +114 -0
- package/package.json +2 -2
- package/skills/signaldash/SKILL.md +655 -31
- package/skills/signaldash-safe-usage/SKILL.md +74 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: signaldash-safe-usage
|
|
3
|
-
description: Safely read and send LinkedIn, WhatsApp, or email messages through the SignalDash MCP without triggering account restrictions or contacting the wrong person. Use whenever an agent uses li_list_chats, li_read_messages, li_send_message, wa_list_chats, wa_read_messages, wa_send_message, email_list, email_read, or email_send.
|
|
3
|
+
description: Safely search stored LinkedIn connections, inspect exact contact state and action budgets, read and send LinkedIn, WhatsApp, or email messages, and operate exact LinkedIn invitations or human-approved invitation batches through the SignalDash MCP without triggering account restrictions or contacting the wrong person. Use whenever an agent uses li_search_connections, sd_contact_state, sd_budget_status, li_list_chats, li_read_messages, li_send_message, li_send_invitation, li_invitations_received, li_accept_invitation, li_invitations_sent, li_withdraw_invitation, li_create_invitation_batch, li_get_invitation_batch, li_cancel_invitation_batch, wa_list_chats, wa_read_messages, wa_send_message, email_list, email_read, or email_send.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Use SignalDash safely
|
|
@@ -23,6 +23,21 @@ Treat LinkedIn, WhatsApp, and email as human accounts, not bulk messaging APIs.
|
|
|
23
23
|
Never infer a recipient from a partial name. Never send blind. Never retry a
|
|
24
24
|
send after an ambiguous timeout without first reading the thread.
|
|
25
25
|
|
|
26
|
+
## Contact-state limits
|
|
27
|
+
|
|
28
|
+
- `sd_contact_state` uses exact user-and-channel identifiers only. It does not
|
|
29
|
+
infer that a LinkedIn profile, WhatsApp number, and email address belong to
|
|
30
|
+
one person.
|
|
31
|
+
- Inspect state with `action:"get"` before outreach planning. Stop when
|
|
32
|
+
`campaign_eligible` is false.
|
|
33
|
+
- Add a suppression only after explicit human approval of the exact channel,
|
|
34
|
+
identifier kind, and reason. Use `action:"suppress"` with an allowed reason
|
|
35
|
+
and `confirm:true`.
|
|
36
|
+
- Never switch identifiers or channels to evade `contact_suppressed`,
|
|
37
|
+
`recipient_replied`, `already_contacted`, or `already_connected`.
|
|
38
|
+
- MCP cannot clear a suppression. Escalate mistaken suppressions to the
|
|
39
|
+
SignalDash operator.
|
|
40
|
+
|
|
26
41
|
## Email limits
|
|
27
42
|
|
|
28
43
|
- `email_send` accepts one recipient per call. Never loop to simulate a bulk
|
|
@@ -37,12 +52,62 @@ send after an ambiguous timeout without first reading the thread.
|
|
|
37
52
|
|
|
38
53
|
## LinkedIn limits
|
|
39
54
|
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
- Prefer `li_search_connections` for list building inside the user's existing
|
|
56
|
+
network. It searches the account-scoped stored snapshot and exact local
|
|
57
|
+
contact state only; it makes no LinkedIn, Unipile, HarvestAPI, or other paid
|
|
58
|
+
discovery request. A missing snapshot requires the paced `signaldash
|
|
59
|
+
connections` sync, never an improvised profile-fetch loop.
|
|
60
|
+
- Treat connection-search results as planning evidence, not action approval.
|
|
61
|
+
Inspect `already_in_contact`, `contact_state`, and `blocking_reasons`.
|
|
62
|
+
Resolve, review, and approve every later action through its one-object flow.
|
|
63
|
+
- Read `sd_budget_status` before planning multiple LinkedIn actions. Treat its
|
|
64
|
+
campaign-excluded portion as capacity campaigns cannot consume, never as a
|
|
65
|
+
reserved or guaranteed manual allowance. Its counts cover SignalDash
|
|
66
|
+
attempts, not all native LinkedIn activity.
|
|
67
|
+
- Keep normal messaging at human volume. Use the cap reported in each hosted
|
|
68
|
+
response; LinkedIn messages, invitations, invitation maintenance, and post
|
|
69
|
+
publishing share the stable sender's daily action budget.
|
|
70
|
+
- Let SignalDash serialize LinkedIn writes and apply action-specific jitter. Do
|
|
71
|
+
not parallelize write calls or bypass the guard. Invitation jitter completes
|
|
72
|
+
before the server's final provider preflight and action reservation.
|
|
73
|
+
- Campaign invitations use a sender-local Monday-Friday 09:00-17:00 work
|
|
74
|
+
window and a durable 90-180 second per-sender pacing interval. Timing is
|
|
75
|
+
checked before final preflight and atomically during action reservation.
|
|
76
|
+
Downtime does not authorize a catch-up burst.
|
|
77
|
+
- `li_create_invitation_batch` accepts only 1-10 immutable canonical LinkedIn
|
|
78
|
+
`/in/` URLs with an exact inclusion reason and optional exact note for each
|
|
79
|
+
target. It starts a durable preview, never a provider write. Use
|
|
80
|
+
`li_get_invitation_batch` until the preview is complete, then give the exact
|
|
81
|
+
`approval_url` to the human.
|
|
82
|
+
- MCP cannot approve a batch. Never enter the human credential, automate the
|
|
83
|
+
approval page, preselect targets, or claim approval from an MCP confirmation.
|
|
84
|
+
The human authenticates separately, reviews every stored row, and selects
|
|
85
|
+
each exact invitation.
|
|
86
|
+
- To cancel, first call `li_get_invitation_batch`, show the exact state and
|
|
87
|
+
approval hash, obtain explicit approval, then call
|
|
88
|
+
`li_cancel_invitation_batch` once with that exact hash and `confirm:true`.
|
|
89
|
+
Cancel affects only unstarted targets and cannot recall an executing write.
|
|
90
|
+
- Do not emulate pause, resume, priority, future scheduling, recurring runs,
|
|
91
|
+
dynamic target generation, or automatic follow-ups. A changed target, note,
|
|
92
|
+
reason, sender binding, or source label requires a new batch and new human
|
|
93
|
+
approval.
|
|
94
|
+
- SignalDash does not expose future start dates, recurring schedules,
|
|
95
|
+
automatic follow-ups, acceptance-triggered messages, or multi-message
|
|
96
|
+
sequences. Treat every later message as new context that needs a fresh
|
|
97
|
+
thread read, exact draft, and human approval.
|
|
44
98
|
- LinkedIn invitation ceilings vary and often surface around 100 invitations
|
|
45
|
-
per week. SignalDash
|
|
99
|
+
per week. SignalDash enforces a separate default policy cap of 100 outbound
|
|
100
|
+
invitation attempts per stable sender each UTC week. This is not a claim
|
|
101
|
+
about a LinkedIn-safe threshold.
|
|
102
|
+
- Preview `li_send_invitation` once without `confirm`, show the exact target and
|
|
103
|
+
note, obtain approval, then repeat the identical payload once with
|
|
104
|
+
`confirm:true`.
|
|
105
|
+
- Before `li_accept_invitation` or `li_withdraw_invitation`, list the exact
|
|
106
|
+
current received or sent invitation, show the exact action, and obtain
|
|
107
|
+
approval. Never loop over an invitation page.
|
|
108
|
+
- Relationship uncertainty, an existing connection, an existing one-to-one
|
|
109
|
+
chat, a pending invitation in either direction, an incomplete bounded page,
|
|
110
|
+
a sender lock, or `outcome_unknown` blocks the action.
|
|
46
111
|
- Never bulk-fetch profiles, run enrichment sweeps, or repeatedly open
|
|
47
112
|
individual profiles. Prefer chat lists, exported connection data, and
|
|
48
113
|
cached records.
|
|
@@ -71,13 +136,13 @@ sessions, and repeated checkpoint retries trigger restrictions.
|
|
|
71
136
|
Do not work around daily caps, jitter, duplicate detection, account scoping,
|
|
72
137
|
or the persistent warning lock.
|
|
73
138
|
|
|
74
|
-
On a warning
|
|
139
|
+
On a warning or `outcome_unknown`:
|
|
75
140
|
|
|
76
141
|
1. Stop all sends on that account.
|
|
77
142
|
2. Inspect LinkedIn or WhatsApp manually for a restriction or checkpoint.
|
|
78
143
|
3. Wait until the account is clearly back in good standing.
|
|
79
|
-
4. Let
|
|
80
|
-
|
|
144
|
+
4. Let the hosted SignalDash operator reconcile and clear the durable sender
|
|
145
|
+
lock. A local session change cannot clear it.
|
|
81
146
|
5. Resume at a lower volume.
|
|
82
147
|
|
|
83
148
|
Let the agent act slowly and human-like. Account health outranks throughput.
|