@floomhq/signaldash 0.34.0 → 0.36.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 CHANGED
@@ -102,7 +102,7 @@ setup installs both from the same pinned npm package
102
102
  the human chose to execute:
103
103
 
104
104
  ```bash
105
- npx -y @floomhq/signaldash@0.34.0 <invite-code>
105
+ npx -y @floomhq/signaldash@0.36.0 <invite-code>
106
106
  ```
107
107
 
108
108
  Run that command in a terminal, not in an agent chat. Do not ask an agent to
@@ -121,6 +121,7 @@ SignalDash exposes:
121
121
 
122
122
  - `sd_version()`
123
123
  - `sd_secretary_latest(limit?, continuation?, ack_token?)`
124
+ - `sd_secretary_push_set(enabled, confirm)`
124
125
  - `sd_inspiration_list(limit?, status?, content_kind?)`
125
126
  - `sd_inspiration_status(id, status, resulting_post_urn?, confirm)`
126
127
  - `sd_inspiration_import(source, source_author?, federico_note?, purpose?, content_kind?, credit_required?, credit_note?, format_description?)`
@@ -186,6 +187,26 @@ SignalDash exposes:
186
187
  Every operation runs through the hosted SignalDash backend. Agents never
187
188
  receive the Unipile access key.
188
189
 
190
+ The inspiration library also extracts LinkedIn post references already stored
191
+ inside conversation `signals`. This path scans SQLite only and makes zero
192
+ LinkedIn or Unipile calls. Feed URLs and post slugs become canonical activity
193
+ URNs; `lnkd.in` is contacted with redirects disabled, and the redirect location
194
+ is parsed without requesting `linkedin.com`. An unresolved short link remains
195
+ an `offen` library row with its raw URL. `conversation_sources` preserves each
196
+ sharing signal, thread, time, direction, and exact or unresolved sharer identity
197
+ even when several signals deduplicate to one library URN. The dedicated database
198
+ flag can disable extraction without a deployment.
199
+
200
+ The hourly Secretary push reuses the existing LinkedIn collector cycle and
201
+ adds no second inbox poll. It sends only when a new tracked-thread reply,
202
+ own-post comment or reaction, or approval-ready draft was stored after push was
203
+ enabled. No change means no WhatsApp provider call and no notification. Every
204
+ push resolves the exact configured Secretary group from the connected account
205
+ and live chat list, reads before sending, and requires an exact one-message
206
+ readback. `sd_secretary_push_set` is the database kill switch; enabling starts
207
+ from that instant so old rows do not create a backlog. The self-chat is never a
208
+ fallback.
209
+
189
210
  `li_reply_to_comment` acts only on an inbound comment on the authenticated
190
211
  sender's own post. A preceding `li_post_comments` read records an exact
191
212
  per-comment watermark. Immediately before the write, SignalDash re-proves the
package/bin/sd.mjs CHANGED
@@ -337,6 +337,20 @@ const TOOLS = [
337
337
  additionalProperties: false,
338
338
  },
339
339
  },
340
+ {
341
+ name: "sd_secretary_push_set",
342
+ path: "/sd/secretary/push/set",
343
+ description: "Enable or disable hourly change-only Secretary notifications to the exact verified WhatsApp group. Enabling re-proves the live WhatsApp account and group and starts from that instant, so old signals do not create a backlog. Disabling is a database kill switch and needs no deploy or restart.",
344
+ inputSchema: {
345
+ type: "object",
346
+ properties: {
347
+ enabled: { type: "boolean" },
348
+ confirm: { type: "boolean", const: true },
349
+ },
350
+ required: ["enabled", "confirm"],
351
+ additionalProperties: false,
352
+ },
353
+ },
340
354
  {
341
355
  name: "sd_inspiration_list",
342
356
  path: "/sd/inspiration/list",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floomhq/signaldash",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "description": "Secure LinkedIn, WhatsApp, and email access for AI agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "scripts": {
20
20
  "test": "node --test",
21
- "check": "node --check bin/sd.mjs && node --check server/server.cjs && node --check server/composio-email.cjs && node --check server/attachments.cjs && node --check server/write-control.cjs && node --check server/secretary-store.cjs && node --check server/secretary-collector.cjs && node --check server/secretary-latest.cjs && node --check server/secretary-approvals.cjs && node --check server/secretary-rules.cjs && node --check server/secretary-shadow-gate.cjs && node --check server/secretary-vault-importer.cjs && node --check server/secretary-inspiration.cjs && node --check server/linkedin-archive-importer.cjs && node --check server/voice-profile.cjs && node --check server/campaign-store.cjs && node --check server/campaign-runner.cjs && node --check server/withdrawal-store.cjs && node --check server/post-scheduler.cjs && node --check server/message-scheduler.cjs && node --check scripts/import-linkedin-archive.mjs && node --check scripts/import-secretary-vault-snapshot.mjs && node --check scripts/rebuild-secretary-actors.mjs && node --check bin/signaldash.js && node --check lib/cli.js && node --check lib/config-file.js && node --check lib/mcp.js && node --check lib/rate-guard.js && node --check lib/secrets.js && node --check lib/unipile.js"
21
+ "check": "node --check bin/sd.mjs && node --check server/server.cjs && node --check server/composio-email.cjs && node --check server/attachments.cjs && node --check server/write-control.cjs && node --check server/secretary-store.cjs && node --check server/secretary-collector.cjs && node --check server/secretary-latest.cjs && node --check server/secretary-approvals.cjs && node --check server/secretary-push.cjs && node --check server/secretary-rules.cjs && node --check server/secretary-shadow-gate.cjs && node --check server/secretary-vault-importer.cjs && node --check server/secretary-inspiration.cjs && node --check server/linkedin-archive-importer.cjs && node --check server/voice-profile.cjs && node --check server/campaign-store.cjs && node --check server/campaign-runner.cjs && node --check server/withdrawal-store.cjs && node --check server/post-scheduler.cjs && node --check server/message-scheduler.cjs && node --check scripts/import-linkedin-archive.mjs && node --check scripts/import-secretary-vault-snapshot.mjs && node --check scripts/rebuild-secretary-actors.mjs && node --check scripts/extract-conversation-inspiration.mjs && node --check bin/signaldash.js && node --check lib/cli.js && node --check lib/config-file.js && node --check lib/mcp.js && node --check lib/rate-guard.js && node --check lib/secrets.js && node --check lib/unipile.js"
22
22
  },
23
23
  "keywords": [
24
24
  "mcp",
@@ -28,8 +28,12 @@ English for every other language. Never reply in Italian or another language
28
28
  Federico does not speak, because doing so represents that he speaks it.
29
29
 
30
30
  Nothing in this skill auto-sends. Federico approves every exact reply, comment
31
- reply, like, or other outward action until he explicitly changes that rule.
32
- The server remains the authority for approval receipts and write guards.
31
+ reply, like, or other third-party action until he explicitly changes that
32
+ rule. SignalDash separately owns one server-rendered exception: when explicitly
33
+ enabled, an hourly change-only notice may go to Federico's exact verified
34
+ Secretary WhatsApp group. The skill does not compose or send that notice. The
35
+ server remains the authority for its dedupe, kill switch, group proof,
36
+ read-before-send guard, and exact readback.
33
37
 
34
38
  When Federico asks for inspiration or formats, call `sd_inspiration_list`.
35
39
  Use `offen` post formats unless he explicitly asks for business ideas or history.
@@ -364,7 +364,8 @@ Use the exact tool names and argument keys below. Limits are optional.
364
364
  |---|---|---|
365
365
  | `sd_version` | no arguments | Read the backend commit, dirty-at-start state, process start time, and package version captured when the serving process started. Use it to distinguish stale deployment from a code failure. |
366
366
  | `sd_secretary_latest` | `limit` optional integer 1-100, default 50; `continuation` optional signed token; `ack_token` optional signed token from the previous successful response | Read the stored Secretary inbox with zero provider calls. Render its rows plus the ignored aggregate as one table. Preserve the prior tokens after an error; on the next successful call pass its acknowledgement and continuation exactly as returned. |
367
- | `sd_inspiration_list` | `limit` optional 1-100, default 20; `status` optional `offen`, `in arbeit`, `genutzt`, or `alle`; `content_kind` optional `post_format`, `business_idea`, or `all` | Read stored inspiration ranked by source engagement with zero provider calls. Defaults exclude genutzt entries and business ideas. Preserve every row's `draft_provenance`, and add credit when `credit_required` is true or recognisable framing or wording is reused. |
367
+ | `sd_secretary_push_set` | `enabled` boolean and `confirm:true` required | Enable or disable change-only hourly notifications to Federico's exact verified Secretary WhatsApp group. Enabling re-proves the account and group from the live chat list and starts from that instant. Disabling is an immediate database kill switch and needs no deploy or restart. |
368
+ | `sd_inspiration_list` | `limit` optional 1-100, default 20; `status` optional `offen`, `in arbeit`, `genutzt`, or `alle`; `content_kind` optional `post_format`, `business_idea`, or `all` | Read stored inspiration ranked by source engagement with zero provider calls. Defaults exclude genutzt entries and business ideas. `conversation_sources` distinguishes who shared a stored post, in which thread, and when; unresolved short links remain visible by raw URL. Preserve every row's `draft_provenance`, and add credit when `credit_required` is true or recognisable framing or wording is reused. |
368
369
  | `sd_inspiration_status` | `id`, `status`, and `confirm:true` required; `resulting_post_urn` required exactly when status is `genutzt` | Record offen, in arbeit, or genutzt state. Genutzt is terminal and the resulting own-post URN prevents the source from ever being proposed again. |
369
370
  | `sd_inspiration_import` | `source` exact LinkedIn post URL or URN; optional source author, Federico note, purpose, content kind, credit fields, and format description | Migration/manual capture through Unipile's documented post retrieval endpoint. The primary capture path remains pasting a URL into the verified Secretary WhatsApp group. |
370
371
  | `sd_inspiration_channel_configure` | exact `chat_id`, `provider_id`, `chat_name`, and `confirm:true` | Re-prove the connected WhatsApp account and exact group in the live chat list, then enable automatic URL capture and same-group acknowledgements. Never substitute a self-chat. |
@@ -431,6 +432,7 @@ Representative calls:
431
432
  ```text
432
433
  sd_version({})
433
434
  sd_secretary_latest({})
435
+ sd_secretary_push_set({"enabled":false,"confirm":true})
434
436
  sd_inspiration_list({})
435
437
  li_list_chats({"limit":20})
436
438
  li_read_messages({"chat_id":"chat_li_7f3a","limit":20})
@@ -1242,9 +1244,13 @@ These rules apply to LinkedIn messages and invitations, WhatsApp, email, and
1242
1244
  public LinkedIn posts.
1243
1245
 
1244
1246
  1. Never send or publish without explicit human approval of the exact
1245
- recipient or audience and the exact final text. The only standing-action
1246
- exception is invitation auto-accept after explicit approval of its exact
1247
- persistent setting and filters.
1247
+ recipient or audience and the exact final text. The standing-action
1248
+ exceptions are invitation auto-accept after explicit approval of its exact
1249
+ persistent setting and filters, and the server-rendered hourly Secretary
1250
+ notification to Federico's exact verified Secretary WhatsApp group after
1251
+ `sd_secretary_push_set` is explicitly enabled. The latter never sends to a
1252
+ third party, never uses a self-chat, and sends nothing when no stored change
1253
+ exists.
1248
1254
  2. Read the exact thread immediately before a message action. For invitations,
1249
1255
  preview the exact target and note or list the exact current invitation.
1250
1256
  Check the recipient, latest inbound message, prior context, relationship,
@@ -20,6 +20,13 @@ Treat LinkedIn, WhatsApp, and email as human accounts, not bulk messaging APIs.
20
20
  the user has not already approved both.
21
21
  6. Send one message, then read the thread again to confirm delivery.
22
22
 
23
+ The only Secretary notification exception is server-rendered and goes to
24
+ Federico's exact verified Secretary WhatsApp group after its database setting
25
+ is explicitly enabled. It re-resolves that group live, never uses a self-chat,
26
+ sends only for a newly stored exact signal or draft identity, and sends nothing
27
+ on a no-change cycle. This exception grants no authority to contact a third
28
+ party.
29
+
23
30
  Never infer a recipient from a partial name. Never send blind. Never retry a
24
31
  send after an ambiguous timeout without first reading the thread.
25
32