@floomhq/signaldash 0.39.13 → 0.39.17

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.13 <invite-code>
123
+ npx -y @floomhq/signaldash@0.39.17 <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
@@ -412,12 +412,50 @@ 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
413
  `/calendar/drafts/...` URLs. Each saved SignalDash draft also exposes an
414
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.
415
+ 60-minute calendar session, draft UUID, and current version. Copy edits,
416
+ feedback, and up to four private feedback images use one atomic
417
+ compare-and-swap. Inline saves keep the active filter and scroll position;
418
+ the server-rendered fallback returns to the same card. Uploaded images are
419
+ stored as private review evidence and served only through the tenant-scoped
420
+ calendar session. A reviewer can explicitly replace the current post images
421
+ with the same uploads; without that choice, the post media remains unchanged.
422
+ Reviews preserve the first comment and append bounded editorial metadata.
423
+ Saving non-empty feedback or reference-only feedback images also creates one durable,
424
+ tenant- and draft-version-bound
425
+ Codex rewrite job in the same SQLite transaction. A separate
426
+ `signaldash-draft-rewrite.service` worker leases those jobs with bounded retries
427
+ and timeouts. It runs Codex ephemerally with user configuration, repository
428
+ rules, shell, apps, browser, and web search disabled; the child receives only a
429
+ sanitized environment and a private temporary directory containing the output
430
+ schema and that review's images. Structured output can update only the draft
431
+ text and editorial revision state. A newer human edit supersedes stale model
432
+ output. An explicit image replacement without feedback keeps the copy unchanged,
433
+ while notes, feedback images, mentions, post attachments, first comment,
434
+ hold gates, and source metadata remain unchanged after the review transaction.
435
+ Cards show `queued`,
436
+ `rewriting`, `ready`, `failed`, or `superseded`; no rewrite approves, schedules,
437
+ publishes, or calls a social provider. Each SignalDash draft card
438
+ also names its exact version and the next verified free 08:00 UTC publishing
439
+ slot. `Approve & schedule` re-reads the complete SignalDash and Buffer calendar,
440
+ then atomically creates the scheduled post, preserves its copy, mentions,
441
+ ordered images, and first comment, records the approval, and removes the source
442
+ draft. Stale versions, reused approvals, foreign sessions, incomplete Buffer
443
+ reads, and newly occupied days fail closed without calling a provider.
418
444
  Drafts never enter the `items` returned by
419
445
  `li_scheduled_posts`, preserving its existing calendar contract.
420
446
 
447
+ On AX41, install the tracked worker unit without loading `sd.env`. The worker
448
+ runs as `federicodeponte`. Its privileged `ExecStartPre` grants that account
449
+ write access only to the SQLite database and current WAL/SHM, adds write/search
450
+ without directory listing, and retains the sticky bit so it cannot replace
451
+ root-owned files. No default ACL is used; the API environment/state files stay
452
+ inaccessible via the unit's `InaccessiblePaths` even if a legacy deployment
453
+ has broader mode bits.
454
+ The exact-release deployment overrides `ExecStart` to the merged release path,
455
+ then verifies `systemd-analyze security`, the service log, and `/sd_version`.
456
+ Codex login is maintained in `/home/federicodeponte/.codex`; deployment enables
457
+ the worker only after a real ephemeral read-only Codex sentinel succeeds.
458
+
421
459
  `li_scheduled_posts` is the shared planning read across posts stored by
422
460
  SignalDash and the configured Buffer LinkedIn channel. Every item names its
423
461
  source, and the response reports independent completeness for SignalDash,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floomhq/signaldash",
3
- "version": "0.39.13",
3
+ "version": "0.39.17",
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/content-pipeline.cjs && node --check server/buffer-calendar.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 scripts/render-content-board.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/content-pipeline.cjs && node --check server/buffer-calendar.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/draft-rewrite-worker.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 scripts/render-content-board.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",
@@ -451,7 +451,7 @@ Use the exact tool names and argument keys below. Limits are optional.
451
451
  | `li_draft_post` | `text` required, max 3000; `publish` optional; `scheduled_at` optional offset-qualified ISO date-time; `content_pipeline_id` normally required for scheduling while that user's pipeline is enabled; `content_pipeline_override` optional exact `{reason,confirm?,approval_hash?}`; `mentions` optional array of up to 25 exact `{name,profile_id}` objects; `attachments` optional array of up to 20 exact `{filename,content_type,content_base64}` images, max 5 MiB each and 12 MiB total; `first_comment` optional, max 1250 | Create a server-confirmed draft, publish now, or persist an exact future LinkedIn post and its approved first comment. An enabled pipeline normally runs its fact, exact-text, shared-calendar, frequency, and breathing preflight. For one deliberate exception, preview the exact payload with `{reason}`, show it to the human, then repeat it with `confirm:true` and the returned single-use payload-bound `approval_hash`. The audit record preserves the reason, preview ID, and approval time; every non-pipeline provider safety guard remains active. |
452
452
  | `li_set_scheduled_post_first_comment` | `id` required UUID; `first_comment` required, max 1250; `confirm:true` required | Attach one exact approved first comment to a scheduled post. SignalDash publishes it through the same connected account after the post and never republishes the post if the comment fails. |
453
453
  | `li_save_post_draft` | `text` required, max 3000; `mentions` optional up to 25; `attachments` optional up to 20 exact images, max 5 MiB each and 12 MiB total; `first_comment` optional, max 1250; `source_key` optional tenant-scoped idempotency key, max 256; `metadata` optional bounded structured source/editorial context | Persist one arbitrary LinkedIn draft without scheduling or publishing. Exact ordered image bytes and ordinary duplicate drafts are retained. An identical `source_key` replay returns the existing draft; changed content under that key is refused. Tenant limits are 1,000 drafts and 100 MiB decoded attachment bytes. No provider call or action budget is used. |
454
- | `li_post_drafts` | no arguments | List durable SignalDash drafts with attachment metadata, never base64, and return a fresh one-use calendar link. The calendar uses the scheduled-post card design for unscheduled SignalDash and Buffer drafts, with a visible `DRAFT` tag. Stored drafts remain separate from scheduled posts and never appear in `li_scheduled_posts.items`. |
454
+ | `li_post_drafts` | no arguments | List durable SignalDash drafts with attachment metadata, never base64, and return a fresh one-use calendar link. The calendar uses the scheduled-post card design for unscheduled SignalDash and Buffer drafts, with a visible `DRAFT` tag. Its 60-minute review session saves copy, notes, and up to four private feedback images inline without reloading the calendar. Reviewers can explicitly replace the post's current images with those uploads; unchecked uploads remain private references. Each SignalDash draft card also displays its exact version and next verified free 08:00 UTC slot. `Approve & schedule` rechecks the complete SignalDash and Buffer calendar, then atomically moves the exact draft into that slot without a provider call. Stored drafts remain separate from scheduled posts until this explicit approval succeeds. |
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`. |