@jclvsh/dropspace 2.35.0 → 2.36.1

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
@@ -173,7 +173,7 @@ Other agents that read skill files can use the same file from `node_modules/@jcl
173
173
  | `dropspace_platforms` | string[] | No | Platforms to post via official dropspace accounts |
174
174
  | `media_mode` | string | No | `"images"` or `"video"` |
175
175
  | `user_platform_accounts` | object | No | Map of platform key to token_id (UUID). Simple keys: `twitter`, `reddit`, `instagram`, `tiktok`, `youtube`. LinkedIn: `linkedin:personal` or `linkedin:organization:<org_id>`. Facebook: a bare `facebook` key works when you have exactly one Page (send any connection id from `connections list` as the value); to target a specific Page among several, use `facebook:page:<page_id>` or `facebook:<page_id>`, where `page_id` is the entity_id of that Page from `connections list`; several Pages with no `page_id` returns a 400 listing them |
176
- | `platform_contents` | object | No | Per-platform content (mutually exclusive with `custom_content`). Reddit accepts `metadata.subreddits` (string[], max 10, no `r/` prefix — one post per subreddit, each retryable) and `metadata.first_comment` (max 1500). Instagram accepts `instagram_settings.post_type`: `"feed"` (default), `"story"`, or `"carousel"` (every attached image and the video as one carousel, 2 to 10 items) |
176
+ | `platform_contents` | object | No | Per-platform content (mutually exclusive with `custom_content`). Reddit accepts `metadata.subreddits` (string[], max 10, no `r/` prefix — one post per subreddit, each retryable) and `metadata.first_comment` (max 1500). Instagram accepts `instagram_settings.post_type`: `"feed"` (default), `"story"`, `"carousel"` (every attached image and the video as one carousel, 2 to 10 items), or `"trial_reel"` (the video as a reel shown to non-followers first; `instagram_settings.graduation_strategy` `"MANUAL"` (default) or `"SS_PERFORMANCE"` says how it reaches followers) |
177
177
  | `custom_content` | string \| string[] | No | Single content for all platforms, or array of tweets for twitter thread mode (mutually exclusive with `platform_contents`) |
178
178
  | `custom_content_reddit_title` | string | No | Reddit title (required with `custom_content` + reddit) |
179
179
  | `media` | object[] | No | Inline media, URL or base64 (1-10 items, mutually exclusive with `media_assets`) |
@@ -188,7 +188,7 @@ Other agents that read skill files can use the same file from `node_modules/@jcl
188
188
  | `id` | string | Yes | Launch ID |
189
189
  | `scheduled_date` | string \| null | No | ISO 8601 datetime or null to clear |
190
190
  | `status` | string | No | `"draft"`, `"manual"`, `"trigger"`, `"scheduled"`, `"cancelled"` |
191
- | `platform_contents` | object | No | Per-platform content overrides (Instagram: `instagram_settings.post_type` `"feed"`, `"story"`, or `"carousel"`) |
191
+ | `platform_contents` | object | No | Per-platform content overrides (Instagram: `instagram_settings.post_type` `"feed"`, `"story"`, `"carousel"`, or `"trial_reel"`, plus `graduation_strategy` for a trial; a trial reel needs a professional account with 200 or more followers, or the update is refused with the reason) |
192
192
  | `dropspace_platforms` | string[] | No | Official dropspace account platforms |
193
193
  | `user_platform_accounts` | object | No | Map of platform key to token_id (UUID). Simple keys: `twitter`, `reddit`, `instagram`, `tiktok`, `youtube`. LinkedIn: `linkedin:personal` or `linkedin:organization:<org_id>`. Facebook: a bare `facebook` key works when you have exactly one Page (send any connection id from `connections list` as the value); to target a specific Page among several, use `facebook:page:<page_id>` or `facebook:<page_id>`, where `page_id` is the entity_id of that Page from `connections list`; several Pages with no `page_id` returns a 400 listing them |
194
194
  | `media` | object[] | No | Inline media (URL or base64, 1-10 items) |
@@ -34,7 +34,7 @@ export function registerLaunchCommands(program, client) {
34
34
  .option("--persona <id>", "persona ID for tone/style")
35
35
  .option("--dropspace-platforms <list>", "platforms for official dropspace accounts", parseList)
36
36
  .option("--media-mode <mode>", "media mode: images or video")
37
- .option("--platform-contents <json>", 'per-platform content as JSON string. reddit supports metadata.subreddits (string[], max 10, no r/ prefix — one post per subreddit) and metadata.first_comment (max 1500). instagram supports instagram_settings.post_type: feed, story, or carousel (every attached image and the video as one carousel, 2 to 10 items). e.g. \'{"reddit":{"title":"...","content":"...","metadata":{"subreddits":["SideProject"],"first_comment":"..."}}}\'')
37
+ .option("--platform-contents <json>", 'per-platform content as JSON string. reddit supports metadata.subreddits (string[], max 10, no r/ prefix — one post per subreddit) and metadata.first_comment (max 1500). instagram supports instagram_settings.post_type: feed, story, carousel (every attached image and the video as one carousel, 2 to 10 items), or trial_reel (the video as a reel shown to non-followers first; needs a professional account with 200 or more followers; instagram_settings.graduation_strategy MANUAL (default) or SS_PERFORMANCE says how it reaches followers). e.g. \'{"reddit":{"title":"...","content":"...","metadata":{"subreddits":["SideProject"],"first_comment":"..."}}}\'')
38
38
  .option("--custom-content <text>", "single content string for all platforms")
39
39
  .option("--reddit-title <title>", "reddit title (with custom-content)")
40
40
  .option("--user-accounts <json>", 'platform→token_id map as JSON. simple key = primary account ("instagram"); composite key targets a specific account when you have several ("instagram:<account_id>", ids from `connections list`) - works for instagram/tiktok/youtube/twitter/reddit. facebook: bare "facebook" for your one Page, or "facebook:page:<page_id>" / "facebook:<page_id>" for a specific one (id from `connections list`); several Pages and no page_id returns a 400. linkedin: "linkedin:personal" or "linkedin:organization:<org_id>"')
@@ -108,7 +108,7 @@ export function registerLaunchCommands(program, client) {
108
108
  .option("--schedule <datetime>", "ISO 8601 schedule datetime (empty to clear)")
109
109
  .option("--status <status>", "status: draft, manual, trigger, scheduled, cancelled")
110
110
  .option("--persona <id>", "persona ID (empty to clear)")
111
- .option("--platform-contents <json>", 'per-platform content as JSON string. reddit supports metadata.subreddits (string[], max 10, no r/ prefix — one post per subreddit) and metadata.first_comment (max 1500). instagram supports instagram_settings.post_type: feed, story, or carousel (every attached image and the video as one carousel, 2 to 10 items). e.g. \'{"reddit":{"title":"...","content":"...","metadata":{"subreddits":["SideProject"],"first_comment":"..."}}}\'')
111
+ .option("--platform-contents <json>", 'per-platform content as JSON string. reddit supports metadata.subreddits (string[], max 10, no r/ prefix — one post per subreddit) and metadata.first_comment (max 1500). instagram supports instagram_settings.post_type: feed, story, carousel (every attached image and the video as one carousel, 2 to 10 items), or trial_reel (the video as a reel shown to non-followers first; needs a professional account with 200 or more followers; instagram_settings.graduation_strategy MANUAL (default) or SS_PERFORMANCE says how it reaches followers). e.g. \'{"reddit":{"title":"...","content":"...","metadata":{"subreddits":["SideProject"],"first_comment":"..."}}}\'')
112
112
  .option("--dropspace-platforms <list>", "official dropspace account platforms", parseList)
113
113
  .option("--attribution-mode <mode>", 'how official-account posts credit you: "handle" (default) or "anonymous"')
114
114
  .option("--user-accounts <json>", 'platform→token_id map as JSON. simple key = primary account ("instagram"); composite key targets a specific account when you have several ("instagram:<account_id>", ids from `connections list`) - works for instagram/tiktok/youtube/twitter/reddit. facebook: bare "facebook" for your one Page, or "facebook:page:<page_id>" / "facebook:<page_id>" for a specific one (id from `connections list`); several Pages and no page_id returns a 400. linkedin: "linkedin:personal" or "linkedin:organization:<org_id>"')
@@ -119,7 +119,7 @@ export function registerLaunchTools(server, client) {
119
119
  platform_contents: z
120
120
  .record(z.string(), z.record(z.string(), z.unknown()))
121
121
  .optional()
122
- .describe('per-platform content — each value needs "content" (string). Instagram takes "instagram_settings": { "post_type": "feed" (default) | "carousel" | "story" } and Facebook takes "facebook_settings": { "post_type": "feed" | "story" } - "carousel" (Instagram only) posts every attached image and the launch video as ONE carousel in media order, 2 to 10 items, where "feed" would post the video as a reel and leave the images out; "story" posts each image as a 24-hour story frame with no caption. Reddit also requires "title" (max 300) and supports "metadata": { "subreddits": string[] (max 10, names without the r/ prefix — posts the launch once per subreddit, each tracked and retryable on its own; omit to post to the default community), "first_comment": string (max 1500 — posted as a comment under each reddit post once it goes live) }. for multi-account reddit, each connected account can target its own subreddits via "reddit:<account_id>" content keys (falls back to the base "reddit" block); a subreddit is posted by at most one of your accounts per launch (first wins, others skipped as SUBREDDIT_ALREADY_TARGETED). each subreddit has its own rules: many restrict or ban promotional posts and posting where the account has no history gets filtered, so target a few genuinely relevant subreddits rather than blasting. Twitter supports "thread" (string[], max 6, each ≤280 or ≤25,000 for X Premium) instead of "content". TikTok supports "tiktok_settings": { "publish_mode"?: "direct"|"draft" (default "direct"; "draft" uploads to the TikTok inbox to finish and publish in-app), "privacy_level": "PUBLIC_TO_EVERYONE"|"FOLLOWER_OF_CREATOR"|"MUTUAL_FOLLOW_FRIENDS"|"SELF_ONLY" (required before publish in direct mode; not required for draft), "allow_comments"?, "allow_duet"?, "allow_stitch"?, "is_commercial"?, "is_your_brand"?, "is_branded_content"?, "auto_add_music"? (booleans, direct mode), "cover_timestamp_ms"? (integer 0-600000 — which frame TikTok uses as the cover, in ms from the start; VIDEO posts only, photo posts take their cover by index; omit for the first frame) }. YouTube requires video and supports "title" (max 100 chars). character limits: Twitter 280/tweet (25,000 for X Premium), LinkedIn 3000, Instagram 2200, Reddit 3000, Facebook 3000, TikTok 4000, YouTube 5000 (description). X Premium status is auto-detected from the connected account. mutually exclusive with custom_content'),
122
+ .describe('per-platform content — each value needs "content" (string). Instagram takes "instagram_settings": { "post_type": "feed" (default) | "carousel" | "story" | "trial_reel", "graduation_strategy"?: "MANUAL" (default) | "SS_PERFORMANCE" } and Facebook takes "facebook_settings": { "post_type": "feed" | "story" } - "carousel" (Instagram only) posts every attached image and the launch video as ONE carousel in media order, 2 to 10 items, where "feed" would post the video as a reel and leave the images out; "story" posts each image as a 24-hour story frame with no caption; "trial_reel" (Instagram only) posts the video as a reel shown to non-followers first, off the profile until it graduates - "MANUAL" when the creator shares it in the Instagram app, "SS_PERFORMANCE" when Instagram sees it performing well; Instagram allows trial reels from professional accounts with 200 or more followers, so a connected account below that bar is refused with the reason; a trial reel needs a video and leaves photos out. Reddit also requires "title" (max 300) and supports "metadata": { "subreddits": string[] (max 10, names without the r/ prefix — posts the launch once per subreddit, each tracked and retryable on its own; omit to post to the default community), "first_comment": string (max 1500 — posted as a comment under each reddit post once it goes live) }. for multi-account reddit, each connected account can target its own subreddits via "reddit:<account_id>" content keys (falls back to the base "reddit" block); a subreddit is posted by at most one of your accounts per launch (first wins, others skipped as SUBREDDIT_ALREADY_TARGETED). each subreddit has its own rules: many restrict or ban promotional posts and posting where the account has no history gets filtered, so target a few genuinely relevant subreddits rather than blasting. Twitter supports "thread" (string[], max 6, each ≤280 or ≤25,000 for X Premium) instead of "content". TikTok supports "tiktok_settings": { "publish_mode"?: "direct"|"draft" (default "direct"; "draft" uploads to the TikTok inbox to finish and publish in-app), "privacy_level": "PUBLIC_TO_EVERYONE"|"FOLLOWER_OF_CREATOR"|"MUTUAL_FOLLOW_FRIENDS"|"SELF_ONLY" (required before publish in direct mode; not required for draft), "allow_comments"?, "allow_duet"?, "allow_stitch"?, "is_commercial"?, "is_your_brand"?, "is_branded_content"?, "auto_add_music"? (booleans, direct mode), "cover_timestamp_ms"? (integer 0-600000 — which frame TikTok uses as the cover, in ms from the start; VIDEO posts only, photo posts take their cover by index; omit for the first frame) }. YouTube requires video and supports "title" (max 100 chars). character limits: Twitter 280/tweet (25,000 for X Premium), LinkedIn 3000, Instagram 2200, Reddit 3000, Facebook 3000, TikTok 4000, YouTube 5000 (description). X Premium status is auto-detected from the connected account. mutually exclusive with custom_content'),
123
123
  custom_content: z
124
124
  .union([z.string().min(1), z.array(z.string()).min(1).max(6)])
125
125
  .optional()
@@ -244,7 +244,7 @@ export function registerLaunchTools(server, client) {
244
244
  platform_contents: z
245
245
  .record(z.string(), z.record(z.string(), z.unknown()))
246
246
  .optional()
247
- .describe('per-platform content update (deep-merged with existing). each value can include "content" (string). Instagram takes "instagram_settings": { "post_type": "feed" | "carousel" | "story" } ("carousel" posts every attached image and the launch video as ONE carousel, 2 to 10 items) and Facebook takes "facebook_settings": { "post_type": "feed" | "story" }. Twitter supports "thread" (string[]) instead. Reddit "title" is optional on update, and "metadata" accepts "subreddits" (string[], max 10, no r/ prefix — one post per subreddit) and "first_comment" (string, max 1500). TikTok "tiktok_settings" is deep-merged — you can update individual fields (e.g. just "privacy_level") without overwriting the rest. see create_launch for full field details'),
247
+ .describe('per-platform content update (deep-merged with existing). each value can include "content" (string). Instagram takes "instagram_settings": { "post_type": "feed" | "carousel" | "story" | "trial_reel", "graduation_strategy"?: "MANUAL" | "SS_PERFORMANCE" } ("carousel" posts every attached image and the launch video as ONE carousel, 2 to 10 items; "trial_reel" posts the video as a reel shown to non-followers first, graduating per graduation_strategy; needs a professional account with 200 or more followers, or the update is refused with the reason) and Facebook takes "facebook_settings": { "post_type": "feed" | "story" }. Twitter supports "thread" (string[]) instead. Reddit "title" is optional on update, and "metadata" accepts "subreddits" (string[], max 10, no r/ prefix — one post per subreddit) and "first_comment" (string, max 1500). TikTok "tiktok_settings" is deep-merged — you can update individual fields (e.g. just "privacy_level") without overwriting the rest. see create_launch for full field details'),
248
248
  dropspace_platforms: z.array(z.enum(PLATFORMS)).optional().describe("official dropspace account platforms"),
249
249
  attribution_mode: z
250
250
  .enum(["handle", "anonymous"])
package/dist/types.d.ts CHANGED
@@ -170,6 +170,8 @@ export interface Connection {
170
170
  account_info: unknown | null;
171
171
  account_type: string | null;
172
172
  is_active: boolean;
173
+ /** Why the connection is inactive (the connection.expired reason); null while live. */
174
+ inactive_reason: string | null;
173
175
  expires_at: string | null;
174
176
  created_at: string;
175
177
  updated_at: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jclvsh/dropspace",
3
- "version": "2.35.0",
3
+ "version": "2.36.1",
4
4
  "description": "MCP server and CLI for the Dropspace API",
5
5
  "repository": {
6
6
  "type": "git",