@floomhq/signaldash 0.39.9 → 0.39.11

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
@@ -120,7 +120,7 @@ setup installs both from the same pinned npm package
120
120
  the human chose to execute:
121
121
 
122
122
  ```bash
123
- npx -y @floomhq/signaldash@0.39.9 <invite-code>
123
+ npx -y @floomhq/signaldash@0.39.11 <invite-code>
124
124
  ```
125
125
 
126
126
  Run that command in a terminal, not in an agent chat. Do not ask an agent to
@@ -410,7 +410,12 @@ with `private, no-store`, MIME allowlisting, `nosniff`, and a restrictive CSP.
410
410
  The shared calendar displays unscheduled SignalDash and Buffer drafts with the
411
411
  same cards as scheduled posts, marked by a visible `DRAFT` tag and an
412
412
  `Unscheduled` time label. Saved SignalDash media uses separate protected
413
- `/calendar/drafts/...` URLs. Drafts never enter the `items` returned by
413
+ `/calendar/drafts/...` URLs. Each saved SignalDash draft also exposes an
414
+ authenticated edit-and-feedback form. Its CSRF token is bound to the live
415
+ calendar session, draft UUID, and current version. Copy edits and feedback use
416
+ one atomic compare-and-swap, preserve existing media and the first comment,
417
+ append bounded editorial metadata, and never schedule or publish the draft.
418
+ Drafts never enter the `items` returned by
414
419
  `li_scheduled_posts`, preserving its existing calendar contract.
415
420
 
416
421
  `li_scheduled_posts` is the shared planning read across posts stored by
@@ -424,10 +429,11 @@ visible SignalDash and Buffer sources are empty, never that the native LinkedIn
424
429
  calendar is empty.
425
430
 
426
431
  The read-only calendar page renders each stored SignalDash image through a
427
- calendar-session-protected, tenant-scoped media route. It does not invent
428
- visuals for Buffer entries because SignalDash does not store their media bytes.
429
- Calendar media is no-store and becomes unavailable when the session expires or
430
- the originating user is revoked.
432
+ calendar-session-protected, tenant-scoped media route. Buffer image assets and
433
+ video or document thumbnails use a separate authenticated proxy that accepts
434
+ only the provider's validated HTTPS media hosts and never exposes a provider
435
+ URL in browser HTML. Calendar media is no-store and becomes unavailable when
436
+ the session expires or the originating user is revoked.
431
437
 
432
438
  `li_scheduled_post_preview` returns a short-lived, single-use browser handoff
433
439
  for one exact active SignalDash post owned by the authenticated user. The page
@@ -442,6 +448,16 @@ per-client throttle. Already-issued 24-character compact tokens and 48-character
442
448
  `/scheduled-post/h/<token>` or `/calendar/h/<token>` links remain valid until
443
449
  their normal expiry.
444
450
 
451
+ The shared calendar preserves validated Buffer LinkedIn tag ranges and URLs in
452
+ the post body and also keeps the separate tag audit pills. Valid provider
453
+ annotations render as clickable LinkedIn links in both places. SignalDash
454
+ mentions derive inline ranges only when the named occurrence is unique, and
455
+ derive a LinkedIn company link only from a validated numeric provider ID.
456
+ Ambiguous names or unsafe URLs remain plain text. Buffer image assets and
457
+ video/document thumbnails render through the same authenticated, no-store
458
+ media surface as SignalDash attachments; provider asset URLs are never placed
459
+ in the browser HTML.
460
+
445
461
  `li_edit_scheduled_post` replaces one complete scheduled-post payload in place.
446
462
  The preview call takes the exact UUID, text, offset-qualified time, mentions,
447
463
  image bytes, and optional first comment. Confirmation repeats that identical
package/bin/sd.mjs CHANGED
@@ -1909,6 +1909,7 @@ const TOOLS = [
1909
1909
  meta: { type: "array", maxItems: 4, items: { type: "string", maxLength: 80 } },
1910
1910
  org: { type: "string", maxLength: 120 },
1911
1911
  tags: { type: "array", maxItems: 5, items: { type: "string", maxLength: 28 } },
1912
+ facts: { type: "array", maxItems: 4, items: { type: "object", properties: { label: { type: "string", maxLength: 24 }, value: { type: "string", maxLength: 120 } }, required: ["label","value"], additionalProperties: false } },
1912
1913
  factors: {
1913
1914
  type: "array", maxItems: 6,
1914
1915
  items: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floomhq/signaldash",
3
- "version": "0.39.9",
3
+ "version": "0.39.11",
4
4
  "description": "Secure LinkedIn, WhatsApp, and email access for AI agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -455,7 +455,7 @@ Use the exact tool names and argument keys below. Limits are optional.
455
455
  | `li_update_post_draft` | `id`, complete replacement `text`, and current `expected_version` required; `mentions`, `attachments`, and `first_comment` optional | Atomically replace the complete saved draft. A stale version is refused with the current version and timestamp. Omitting an optional field clears it. No provider call occurs. |
456
456
  | `li_delete_post_draft` | `id`, current `expected_version`, and `confirm:true` required | Permanently delete one exact saved SignalDash draft. Unknown, foreign, deleted, and replayed identifiers are indistinguishable. This cannot delete LinkedIn-native or scheduled content. |
457
457
  | `li_post_draft_preview` | `id` required UUID | Create a short-lived, single-use `https://signaldash.dev/d/<token>` browser handoff for one exact saved draft. Its page and exact image bytes are protected by a tenant-, draft-, and originating-session-scoped cookie under `/drafts`. |
458
- | `li_scheduled_posts` | no arguments | Read one shared content-calendar view across SignalDash and the configured Buffer LinkedIn channel. Inspect `completeness` and every `sources.*.state` before treating absence as an empty calendar. Native LinkedIn scheduled posts and drafts are invisible because Unipile has no documented read route for them; SignalDash does not use raw Voyager routes or linkedin.com browser access. An empty `items` array proves only that the visible sources returned no entries. |
458
+ | `li_scheduled_posts` | no arguments | Read one shared content-calendar view across SignalDash and the configured Buffer LinkedIn channel. The browser calendar renders validated Buffer company tags both inline and as audit pills, and proxies supported Buffer image previews through its authenticated no-store media route without exposing provider URLs. Inspect `completeness` and every `sources.*.state` before treating absence as an empty calendar. Native LinkedIn scheduled posts and drafts are invisible because Unipile has no documented read route for them; SignalDash does not use raw Voyager routes or linkedin.com browser access. An empty `items` array proves only that the visible sources returned no entries. |
459
459
  | `li_profile` | `identifier` required, a public id or member id | Read one LinkedIn profile: name, headline, public identifier, provider id, network distance and the profile picture url. Read-only, one provider call, and it returns those six fields rather than the provider's whole record about a person. It exists because pictures were otherwise a by-product of engagement only: reactions and comments carry one, the stored connections carry no picture field, chats carry none, and the invitation preview refuses anyone already connected, so every new name in a shortlist stayed faceless. |
460
460
  | `sd_share_list` | `action` create/list/revoke, plus `title`, `columns`, `rows`, optional `note`, or `token` to revoke | Share one selection as a standalone `https://signaldash.dev/l/<token>` page that anyone with the link can open. `create` returns the url ONCE and stores only its SHA-256 hash, so a lost link can be revoked but never recovered. The page is a fixed snapshot and never re-reads the source, so a list shared today does not keep disclosing tomorrow's data. Pass `people` instead of `rows` for a shortlist of humans: each renders as a card with a photo where the provider supplies one and initials where it does not, an optional `score` out of 100, and the `reason` that earned it, with the scoring rule in `rubric` so the reader can check it. For a plain table, every row must have exactly as many cells as there are columns, because a crooked table reads as a claim about the wrong person. `list` shows every live link with its non-secret `list_id` and open count, so a link whose url is lost can still be switched off and a forgotten one stays visible; `revoke` takes either the `token` or that `list_id` and kills it immediately, and a revoked token is indistinguishable from one that never existed. |
461
461
  | `li_scheduled_post_preview` | `id` required UUID | Create a short-lived, single-use `https://signaldash.dev/p/<token>` browser handoff for one exact active SignalDash post. The isolated page includes its stored image attachments through account- and post-scoped protected media routes. |