maeve-cli 0.10.1 → 0.11.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.
Files changed (3) hide show
  1. package/README.md +91 -0
  2. package/dist/index.js +1958 -137
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -13,7 +13,11 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
13
13
  throw Error('Dynamic require of "' + x + '" is not supported');
14
14
  });
15
15
  var __commonJS = (cb, mod) => function __require2() {
16
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
+ try {
17
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
18
+ } catch (e) {
19
+ throw mod = 0, e;
20
+ }
17
21
  };
18
22
  var __copyProps = (to, from, except, desc) => {
19
23
  if (from && typeof from === "object" || typeof from === "function") {
@@ -74,10 +78,12 @@ var require_dist = __commonJS({
74
78
  };
75
79
  })();
76
80
  Object.defineProperty(exports, "__esModule", { value: true });
77
- exports.CONTENT_GET_COUNTS_CONTRACT = exports.CONTENT_GET_CONTRACT = exports.CONTENT_LIST_CONTRACT = exports.contentGetCountsMcpInputSchema = exports.contentGetMcpInputSchema = exports.contentGetInputSchema = exports.contentGetCountsInputSchema = exports.contentListAgentInputSchema = exports.contentListInputSchema = exports.contentListMcpInputSchema = exports.COMPOSER_PATCH_MEDIA_CONTRACT = exports.COMPOSER_PATCH_TAXONOMY_CONTRACT = exports.COMPOSER_PATCH_SCHEDULE_CONTRACT = exports.COMPOSER_PATCH_CAPTION_CONTRACT = exports.composerPatchOutputSchema = exports.composerPatchArtifactMetadataSchema = exports.composerPatchMediaArtifactMetadataSchema = exports.composerPatchTaxonomyArtifactMetadataSchema = exports.composerPatchScheduleArtifactMetadataSchema = exports.composerPatchCaptionArtifactMetadataSchema = exports.composerPatchMediaInputSchema = exports.composerPatchTaxonomyInputSchema = exports.composerPatchScheduleInputSchema = exports.composerPatchCaptionInputSchema = exports.MEDIA_SEARCH_CONTRACT = exports.mediaSearchOutputSchema = exports.mediaSearchInputSchema = exports.CALENDAR_SUGGEST_PUBLISH_TIMES_CONTRACT = exports.calendarSuggestPublishTimesOutputSchema = exports.calendarSuggestPublishTimesInputSchema = exports.CALENDAR_READ_RANGE_CONTRACT = exports.scheduledPostsListOutputSchema = exports.SCHEDULED_POSTS_PRESENTATION_NOTE_KINDS = exports.calendarReadRangeInputSchema = exports.CONTENT_FIND_RECENT_CONTRACT = exports.contentFindRecentOutputSchema = exports.contentFindRecentInputSchema = exports.MEMORY_REMEMBER_CONTRACT = exports.MEMORY_LIST_CONTRACT = exports.memoryRememberOutputSchema = exports.memoryListOutputSchema = exports.memoryRememberInputSchema = exports.memoryListInputSchema = exports.WORKSPACE_SUMMARY_CONTRACT = exports.workspaceSummaryOutputSchema = exports.workspaceSummaryInputSchema = exports.TIMEZONE_QUALIFIED_ISO8601_TIMESTAMP_ERROR = exports.TOOL_CAPABILITIES = exports.TOOL_WIRE_NAMES = exports.TOOL_OPERATION_IDS = void 0;
78
- exports.analyticsPostsAggregateMcpInputSchema = exports.analyticsPostsMcpInputSchema = exports.analyticsIntegrationMcpInputSchema = exports.analyticsAggregateMcpInputSchema = exports.MEDIA_GET_USAGE_HISTORY_CONTRACT = exports.MEDIA_GET_CONTRACT = exports.MEDIA_LIST_LABELS_CONTRACT = exports.MEDIA_GET_FOLDER_PATH_CONTRACT = exports.MEDIA_GET_FOLDER_CONTRACT = exports.MEDIA_LIST_FOLDERS_CONTRACT = exports.MEDIA_LIST_CONTRACT = exports.mediaGetUsageHistoryAgentInputSchema = exports.mediaGetUsageHistoryInputSchema = exports.mediaGetInputSchema = exports.mediaListLabelsInputSchema = exports.mediaGetFolderPathInputSchema = exports.mediaGetFolderInputSchema = exports.mediaListFoldersInputSchema = exports.mediaListAgentInputSchema = exports.mediaListInputSchema = exports.mediaGetUsageHistoryMcpInputSchema = exports.mediaGetMcpInputSchema = exports.mediaListLabelsMcpInputSchema = exports.mediaGetFolderPathMcpInputSchema = exports.mediaGetFolderMcpInputSchema = exports.mediaListFoldersMcpInputSchema = exports.mediaListMcpInputSchema = exports.HASHTAG_GROUPS_LIST_CONTRACT = exports.CAMPAIGNS_LIST_CONTRACT = exports.TAXONOMY_LIST_CONTRACT = exports.INTEGRATIONS_GET_OPTIONS_CONTRACT = exports.INTEGRATIONS_GET_CAPABILITIES_CONTRACT = exports.INTEGRATIONS_LIST_CONTRACT = exports.hashtagGroupsListOutputSchema = exports.campaignsListOutputSchema = exports.taxonomyListOutputSchema = exports.integrationsListOutputSchema = exports.hashtagGroupsListMcpInputSchema = exports.hashtagGroupsListInputSchema = exports.campaignsListMcpInputSchema = exports.campaignsListInputSchema = exports.taxonomyListMcpInputSchema = exports.taxonomyListInputSchema = exports.integrationsGetOptionsMcpInputSchema = exports.integrationsGetOptionsInputSchema = exports.integrationsGetCapabilitiesMcpInputSchema = exports.integrationsGetCapabilitiesInputSchema = exports.INTEGRATION_OPTION_KEYS = exports.integrationsListMcpInputSchema = exports.integrationsListInputSchema = void 0;
79
- exports.CONTENT_SCHEDULE_CONTRACT = exports.deleteContentOutputSchema = exports.deleteContentMcpInputSchema = exports.deleteContentInputSchema = exports.retryContentOutputSchema = exports.retryContentMcpInputSchema = exports.retryContentInputSchema = exports.restoreContentOutputSchema = exports.restoreContentMcpInputSchema = exports.restoreContentInputSchema = exports.archiveContentOutputSchema = exports.archiveContentMcpInputSchema = exports.archiveContentInputSchema = exports.publishNowOutputSchema = exports.publishNowMcpInputSchema = exports.publishNowInputSchema = exports.contentScheduleOutputSchema = exports.contentScheduleMcpInputSchema = exports.contentScheduleInputSchema = exports.CONTENT_UPDATE_NOTES_CONTRACT = exports.CONTENT_UPDATE_METADATA_CONTRACT = exports.updateContentNotesOutputSchema = exports.updateContentMetadataOutputSchema = exports.updateContentNotesMcpInputSchema = exports.updateContentNotesInputSchema = exports.updateContentMetadataMcpInputSchema = exports.updateContentMetadataInputSchema = exports.CONTENT_UPDATE_DRAFT_CONTRACT = exports.updateDraftContentOutputSchema = exports.updateDraftContentMcpInputSchema = exports.updateDraftContentInputSchema = exports.CONTENT_CREATE_DRAFT_CONTRACT = exports.createDraftContentOutputSchema = exports.createDraftContentMcpInputSchema = exports.createDraftContentInputSchema = exports.ANALYTICS_GET_POST_CONTRACT = exports.ANALYTICS_GET_POSTS_AGGREGATE_CONTRACT = exports.ANALYTICS_GET_POSTS_CONTRACT = exports.ANALYTICS_GET_DEMOGRAPHICS_CONTRACT = exports.ANALYTICS_GET_HEALTH_CONTRACT = exports.ANALYTICS_GET_AGGREGATE_CONTRACT = exports.ANALYTICS_GET_SUMMARY_CONTRACT = exports.postAnalyticsInputSchema = exports.analyticsPostsAgentInputSchema = exports.analyticsPostsInputSchema = exports.analyticsIntegrationInputSchema = exports.analyticsAggregateAgentInputSchema = exports.analyticsAggregateInputSchema = exports.postAnalyticsMcpInputSchema = exports.analyticsPostsAggregateInputSchema = void 0;
80
- exports.TOOL_CONTRACTS = exports.CONTENT_SET_INTENDED_PUBLISH_TIME_CONTRACT = exports.contentSetIntendedPublishTimeOutputSchema = exports.contentSetIntendedPublishTimeMcpInputSchema = exports.contentSetIntendedPublishTimeInputSchema = exports.CONTENT_DELETE_CONTRACT = exports.CONTENT_RETRY_CONTRACT = exports.CONTENT_RESTORE_CONTRACT = exports.CONTENT_ARCHIVE_CONTRACT = exports.CONTENT_PUBLISH_NOW_CONTRACT = void 0;
81
+ exports.taskBoardListMcpInputSchema = exports.taskBoardListInputSchema = exports.contentGetCountsMcpInputSchema = exports.contentGetMcpInputSchema = exports.contentGetInputSchema = exports.contentGetCountsInputSchema = exports.contentListAgentInputSchema = exports.contentListInputSchema = exports.contentListMcpInputSchema = exports.COMPOSER_PATCH_MEDIA_CONTRACT = exports.COMPOSER_PATCH_TAXONOMY_CONTRACT = exports.COMPOSER_PATCH_SCHEDULE_CONTRACT = exports.COMPOSER_PATCH_CAPTION_CONTRACT = exports.composerPatchOutputSchema = exports.composerPatchArtifactMetadataSchema = exports.composerPatchMediaArtifactMetadataSchema = exports.composerPatchTaxonomyArtifactMetadataSchema = exports.composerPatchScheduleArtifactMetadataSchema = exports.composerPatchCaptionArtifactMetadataSchema = exports.composerPatchMediaInputSchema = exports.composerPatchTaxonomyInputSchema = exports.composerPatchScheduleInputSchema = exports.composerPatchCaptionInputSchema = exports.MEDIA_SEARCH_CONTRACT = exports.mediaSearchOutputSchema = exports.mediaSearchInputSchema = exports.CALENDAR_SUGGEST_PUBLISH_TIMES_CONTRACT = exports.calendarSuggestPublishTimesOutputSchema = exports.calendarSuggestPublishTimesInputSchema = exports.CALENDAR_READ_RANGE_CONTRACT = exports.scheduledPostsListOutputSchema = exports.SCHEDULED_POSTS_PRESENTATION_NOTE_KINDS = exports.calendarReadRangeInputSchema = exports.CONTENT_FIND_RECENT_CONTRACT = exports.contentFindRecentOutputSchema = exports.contentFindRecentInputSchema = exports.MEMORY_REMEMBER_CONTRACT = exports.MEMORY_LIST_CONTRACT = exports.memoryRememberOutputSchema = exports.memoryListOutputSchema = exports.memoryRememberInputSchema = exports.memoryListInputSchema = exports.WORKSPACE_SUMMARY_CONTRACT = exports.workspaceSummaryOutputSchema = exports.workspaceSummaryInputSchema = exports.TIMEZONE_QUALIFIED_ISO8601_TIMESTAMP_ERROR = exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS = exports.TOOL_CAPABILITIES = exports.TOOL_WIRE_NAMES = exports.TOOL_OPERATION_IDS = void 0;
82
+ exports.TASK_CHECKLIST_ITEM_CREATE_CONTRACT = exports.TASK_COMMENT_CREATE_CONTRACT = exports.TASK_DELETE_CONTRACT = exports.TASK_RESTORE_CONTRACT = exports.TASK_ARCHIVE_CONTRACT = exports.TASK_MOVE_CONTRACT = exports.TASK_UPDATE_CONTRACT = exports.TASK_CREATE_CONTRACT = exports.TASK_LIST_ARCHIVED_CONTRACT = exports.TASK_LIST_FOR_POST_CONTRACT = exports.TASK_GET_CONTRACT = exports.TASK_BOARD_LIST_CONTRACT = exports.CONTENT_GET_COUNTS_CONTRACT = exports.CONTENT_GET_CONTRACT = exports.CONTENT_LIST_CONTRACT = exports.deleteTaskChecklistItemMcpInputSchema = exports.deleteTaskChecklistItemInputSchema = exports.moveTaskChecklistItemMcpInputSchema = exports.moveTaskChecklistItemInputSchema = exports.moveTaskChecklistItemBodySchema = exports.updateTaskChecklistItemMcpInputSchema = exports.updateTaskChecklistItemInputSchema = exports.updateTaskChecklistItemBodySchema = exports.createTaskChecklistItemMcpInputSchema = exports.createTaskChecklistItemInputSchema = exports.createTaskChecklistItemBodySchema = exports.createTaskCommentMcpInputSchema = exports.createTaskCommentInputSchema = exports.createTaskCommentBodySchema = exports.deleteTaskMcpInputSchema = exports.deleteTaskInputSchema = exports.restoreTaskMcpInputSchema = exports.restoreTaskInputSchema = exports.archiveTaskMcpInputSchema = exports.archiveTaskInputSchema = exports.moveTaskMcpInputSchema = exports.moveTaskInputSchema = exports.moveTaskBodySchema = exports.updateTaskMcpInputSchema = exports.updateTaskInputSchema = exports.updateTaskBodySchema = exports.createTaskMcpInputSchema = exports.createTaskInputSchema = exports.createTaskBodySchema = exports.taskListArchivedMcpInputSchema = exports.taskListArchivedInputSchema = exports.taskListForPostMcpInputSchema = exports.taskListForPostInputSchema = exports.taskGetMcpInputSchema = exports.taskGetInputSchema = void 0;
83
+ exports.analyticsAggregateMcpInputSchema = exports.MEDIA_GET_USAGE_HISTORY_CONTRACT = exports.MEDIA_GET_CONTRACT = exports.MEDIA_LIST_LABELS_CONTRACT = exports.MEDIA_GET_FOLDER_PATH_CONTRACT = exports.MEDIA_GET_FOLDER_CONTRACT = exports.MEDIA_LIST_FOLDERS_CONTRACT = exports.MEDIA_LIST_CONTRACT = exports.mediaGetUsageHistoryAgentInputSchema = exports.mediaGetUsageHistoryInputSchema = exports.mediaGetInputSchema = exports.mediaListLabelsInputSchema = exports.mediaGetFolderPathInputSchema = exports.mediaGetFolderInputSchema = exports.mediaListFoldersInputSchema = exports.mediaListAgentInputSchema = exports.mediaListInputSchema = exports.mediaGetUsageHistoryMcpInputSchema = exports.mediaGetMcpInputSchema = exports.mediaListLabelsMcpInputSchema = exports.mediaGetFolderPathMcpInputSchema = exports.mediaGetFolderMcpInputSchema = exports.mediaListFoldersMcpInputSchema = exports.mediaListMcpInputSchema = exports.HASHTAG_GROUPS_LIST_CONTRACT = exports.CAMPAIGNS_LIST_CONTRACT = exports.TAXONOMY_LIST_CONTRACT = exports.INTEGRATIONS_GET_OPTIONS_CONTRACT = exports.INTEGRATIONS_GET_CAPABILITIES_CONTRACT = exports.INTEGRATIONS_LIST_CONTRACT = exports.hashtagGroupsListOutputSchema = exports.campaignsListOutputSchema = exports.taxonomyListOutputSchema = exports.integrationsListOutputSchema = exports.hashtagGroupsListMcpInputSchema = exports.hashtagGroupsListInputSchema = exports.campaignsListMcpInputSchema = exports.campaignsListInputSchema = exports.taxonomyListMcpInputSchema = exports.taxonomyListInputSchema = exports.integrationsGetOptionsMcpInputSchema = exports.integrationsGetOptionsInputSchema = exports.integrationsGetCapabilitiesMcpInputSchema = exports.integrationsGetCapabilitiesInputSchema = exports.INTEGRATION_OPTION_KEYS = exports.integrationsListMcpInputSchema = exports.integrationsListInputSchema = exports.TASK_CHECKLIST_ITEM_DELETE_CONTRACT = exports.TASK_CHECKLIST_ITEM_MOVE_CONTRACT = exports.TASK_CHECKLIST_ITEM_UPDATE_CONTRACT = void 0;
84
+ exports.archiveContentMcpInputSchema = exports.archiveContentInputSchema = exports.publishNowOutputSchema = exports.publishNowMcpInputSchema = exports.publishNowInputSchema = exports.contentScheduleBatchOutputSchema = exports.contentScheduleBatchInputSchema = exports.SCHEDULE_BATCH_MAX_ITEMS = exports.contentScheduleOutputSchema = exports.contentScheduleMcpInputSchema = exports.contentScheduleInputSchema = exports.CONTENT_UPDATE_NOTES_CONTRACT = exports.CONTENT_UPDATE_METADATA_CONTRACT = exports.updateContentNotesOutputSchema = exports.updateContentMetadataOutputSchema = exports.updateContentNotesMcpInputSchema = exports.updateContentNotesInputSchema = exports.updateContentMetadataMcpInputSchema = exports.updateContentMetadataInputSchema = exports.CONTENT_UPDATE_DRAFT_CONTRACT = exports.updateDraftContentOutputSchema = exports.updateDraftContentMcpInputSchema = exports.updateDraftContentInputSchema = exports.CONTENT_CREATE_DRAFTS_CONTRACT = exports.createDraftsContentOutputSchema = exports.createDraftsContentInputSchema = exports.CREATE_DRAFTS_MAX_ITEMS = exports.CONTENT_CREATE_DRAFT_CONTRACT = exports.createDraftContentOutputSchema = exports.createDraftContentMcpInputSchema = exports.createDraftContentAgentInputSchema = exports.createDraftContentInputSchema = exports.ANALYTICS_GET_POST_CONTRACT = exports.ANALYTICS_GET_POSTS_AGGREGATE_CONTRACT = exports.ANALYTICS_GET_POSTS_CONTRACT = exports.ANALYTICS_GET_DEMOGRAPHICS_CONTRACT = exports.ANALYTICS_GET_HEALTH_CONTRACT = exports.ANALYTICS_GET_AGGREGATE_CONTRACT = exports.ANALYTICS_GET_SUMMARY_CONTRACT = exports.postAnalyticsInputSchema = exports.analyticsPostsAgentInputSchema = exports.analyticsPostsInputSchema = exports.analyticsIntegrationInputSchema = exports.analyticsAggregateAgentInputSchema = exports.analyticsAggregateInputSchema = exports.postAnalyticsMcpInputSchema = exports.analyticsPostsAggregateInputSchema = exports.analyticsPostsAggregateMcpInputSchema = exports.analyticsPostsMcpInputSchema = exports.analyticsIntegrationMcpInputSchema = void 0;
85
+ exports.INBOX_AUTOMATION_RULE_GET_CONTRACT = exports.INBOX_AUTOMATION_RULES_LIST_CONTRACT = exports.listInboxAutomationExecutionsOutputSchema = exports.deleteInboxAutomationRuleOutputSchema = exports.inboxAutomationRuleResultOutputSchema = exports.inboxAutomationRulesListOutputSchema = exports.listInboxAutomationExecutionsMcpInputSchema = exports.listInboxAutomationExecutionsInputSchema = exports.deleteInboxAutomationRuleMcpInputSchema = exports.deleteInboxAutomationRuleInputSchema = exports.updateInboxAutomationRuleMcpInputSchema = exports.updateInboxAutomationRuleInputSchema = exports.createInboxAutomationRuleMcpInputSchema = exports.createInboxAutomationRuleInputSchema = exports.inboxAutomationRuleGetMcpInputSchema = exports.inboxAutomationRuleGetInputSchema = exports.inboxAutomationRulesListMcpInputSchema = exports.inboxAutomationRulesListInputSchema = exports.CONTENT_SET_INTENDED_PUBLISH_TIME_CONTRACT = exports.contentSetIntendedPublishTimeOutputSchema = exports.contentSetIntendedPublishTimeMcpInputSchema = exports.contentSetIntendedPublishTimeInputSchema = exports.CONTENT_DELETE_BATCH_CONTRACT = exports.CONTENT_DELETE_CONTRACT = exports.CONTENT_RETRY_CONTRACT = exports.CONTENT_RESTORE_CONTRACT = exports.CONTENT_ARCHIVE_CONTRACT = exports.CONTENT_PUBLISH_NOW_BATCH_CONTRACT = exports.CONTENT_PUBLISH_NOW_CONTRACT = exports.CONTENT_UNSCHEDULE_CONTRACT = exports.contentUnscheduleOutputSchema = exports.contentUnscheduleInputSchema = exports.CONTENT_SCHEDULE_BATCH_CONTRACT = exports.CONTENT_SCHEDULE_CONTRACT = exports.deleteBatchOutputSchema = exports.deleteBatchInputSchema = exports.DELETE_BATCH_MAX_ITEMS = exports.publishNowBatchOutputSchema = exports.publishNowBatchInputSchema = exports.PUBLISH_NOW_BATCH_MAX_ITEMS = exports.deleteContentOutputSchema = exports.deleteContentMcpInputSchema = exports.deleteContentInputSchema = exports.retryContentOutputSchema = exports.retryContentMcpInputSchema = exports.retryContentInputSchema = exports.restoreContentOutputSchema = exports.restoreContentMcpInputSchema = exports.restoreContentInputSchema = exports.archiveContentOutputSchema = void 0;
86
+ exports.TOOL_CONTRACTS = exports.INBOX_AUTOMATION_EXECUTIONS_LIST_CONTRACT = exports.INBOX_AUTOMATION_RULE_DELETE_CONTRACT = exports.INBOX_AUTOMATION_RULE_UPDATE_CONTRACT = exports.INBOX_AUTOMATION_RULE_CREATE_CONTRACT = void 0;
81
87
  exports.isTimezoneQualifiedIso8601Timestamp = isTimezoneQualifiedIso8601Timestamp;
82
88
  var z9 = __importStar(__require("zod/v4"));
83
89
  exports.TOOL_OPERATION_IDS = {
@@ -95,6 +101,21 @@ var require_dist = __commonJS({
95
101
  contentList: "content.list",
96
102
  contentGet: "content.get",
97
103
  contentGetCounts: "content.get_counts",
104
+ taskBoardList: "task_board.list",
105
+ taskGet: "task.get",
106
+ taskListForPost: "task.list_for_post",
107
+ taskListArchived: "task.list_archived",
108
+ taskCreate: "task.create",
109
+ taskUpdate: "task.update",
110
+ taskMove: "task.move",
111
+ taskArchive: "task.archive",
112
+ taskRestore: "task.restore",
113
+ taskDelete: "task.delete",
114
+ taskCommentCreate: "task.create_comment",
115
+ taskChecklistItemCreate: "task.create_checklist_item",
116
+ taskChecklistItemUpdate: "task.update_checklist_item",
117
+ taskChecklistItemMove: "task.move_checklist_item",
118
+ taskChecklistItemDelete: "task.delete_checklist_item",
98
119
  integrationsList: "integrations.list",
99
120
  integrationsGetCapabilities: "integrations.get_capabilities",
100
121
  integrationsGetOptions: "integrations.get_options",
@@ -102,15 +123,20 @@ var require_dist = __commonJS({
102
123
  campaignsList: "campaigns.list",
103
124
  hashtagGroupsList: "hashtag_groups.list",
104
125
  contentCreateDraft: "content.create_draft",
126
+ contentCreateDrafts: "content.create_drafts",
105
127
  contentUpdateDraft: "content.update_draft",
106
128
  contentUpdateMetadata: "content.update_metadata",
107
129
  contentUpdateNotes: "content.update_notes",
108
130
  contentSchedule: "content.schedule",
131
+ contentScheduleBatch: "content.schedule_batch",
132
+ contentUnschedule: "content.unschedule",
109
133
  contentPublishNow: "content.publish_now",
134
+ contentPublishNowBatch: "content.publish_now_batch",
110
135
  contentArchive: "content.archive",
111
136
  contentRestore: "content.restore",
112
137
  contentRetry: "content.retry",
113
138
  contentDelete: "content.delete",
139
+ contentDeleteBatch: "content.delete_batch",
114
140
  contentSetIntendedPublishTime: "content.set_intended_publish_time",
115
141
  mediaList: "media.list",
116
142
  mediaListFolders: "media.list_folders",
@@ -125,7 +151,13 @@ var require_dist = __commonJS({
125
151
  analyticsGetPosts: "analytics.get_posts",
126
152
  analyticsGetPostsAggregate: "analytics.get_posts_aggregate",
127
153
  analyticsGetPost: "analytics.get_post",
128
- analyticsGetDemographics: "analytics.get_demographics"
154
+ analyticsGetDemographics: "analytics.get_demographics",
155
+ inboxAutomationRulesList: "inbox_automation.list_rules",
156
+ inboxAutomationRuleGet: "inbox_automation.get_rule",
157
+ inboxAutomationRuleCreate: "inbox_automation.create_rule",
158
+ inboxAutomationRuleUpdate: "inbox_automation.update_rule",
159
+ inboxAutomationRuleDelete: "inbox_automation.delete_rule",
160
+ inboxAutomationExecutionsList: "inbox_automation.list_executions"
129
161
  };
130
162
  exports.TOOL_WIRE_NAMES = {
131
163
  workspaceSummary: {
@@ -173,6 +205,51 @@ var require_dist = __commonJS({
173
205
  agent: exports.TOOL_OPERATION_IDS.contentGetCounts,
174
206
  mcp: "get_content_counts"
175
207
  },
208
+ taskBoardList: {
209
+ mcp: "list_tasks"
210
+ },
211
+ taskGet: {
212
+ mcp: "get_task"
213
+ },
214
+ taskListForPost: {
215
+ mcp: "list_tasks_for_post"
216
+ },
217
+ taskListArchived: {
218
+ mcp: "list_archived_tasks"
219
+ },
220
+ taskCreate: {
221
+ mcp: "create_task"
222
+ },
223
+ taskUpdate: {
224
+ mcp: "update_task"
225
+ },
226
+ taskMove: {
227
+ mcp: "move_task"
228
+ },
229
+ taskArchive: {
230
+ mcp: "archive_task"
231
+ },
232
+ taskRestore: {
233
+ mcp: "restore_task"
234
+ },
235
+ taskDelete: {
236
+ mcp: "delete_task"
237
+ },
238
+ taskCommentCreate: {
239
+ mcp: "create_task_comment"
240
+ },
241
+ taskChecklistItemCreate: {
242
+ mcp: "create_task_checklist_item"
243
+ },
244
+ taskChecklistItemUpdate: {
245
+ mcp: "update_task_checklist_item"
246
+ },
247
+ taskChecklistItemMove: {
248
+ mcp: "move_task_checklist_item"
249
+ },
250
+ taskChecklistItemDelete: {
251
+ mcp: "delete_task_checklist_item"
252
+ },
176
253
  integrationsList: {
177
254
  agent: exports.TOOL_OPERATION_IDS.integrationsList,
178
255
  mcp: "list_integrations"
@@ -201,6 +278,9 @@ var require_dist = __commonJS({
201
278
  agent: exports.TOOL_OPERATION_IDS.contentCreateDraft,
202
279
  mcp: "create_draft_content"
203
280
  },
281
+ contentCreateDrafts: {
282
+ agent: exports.TOOL_OPERATION_IDS.contentCreateDrafts
283
+ },
204
284
  contentUpdateDraft: {
205
285
  agent: exports.TOOL_OPERATION_IDS.contentUpdateDraft,
206
286
  mcp: "update_content"
@@ -217,10 +297,19 @@ var require_dist = __commonJS({
217
297
  agent: exports.TOOL_OPERATION_IDS.contentSchedule,
218
298
  mcp: "schedule_content"
219
299
  },
300
+ contentScheduleBatch: {
301
+ agent: exports.TOOL_OPERATION_IDS.contentScheduleBatch
302
+ },
303
+ contentUnschedule: {
304
+ agent: exports.TOOL_OPERATION_IDS.contentUnschedule
305
+ },
220
306
  contentPublishNow: {
221
307
  agent: exports.TOOL_OPERATION_IDS.contentPublishNow,
222
308
  mcp: "publish_now"
223
309
  },
310
+ contentPublishNowBatch: {
311
+ agent: exports.TOOL_OPERATION_IDS.contentPublishNowBatch
312
+ },
224
313
  contentArchive: {
225
314
  agent: exports.TOOL_OPERATION_IDS.contentArchive,
226
315
  mcp: "archive_content"
@@ -237,6 +326,9 @@ var require_dist = __commonJS({
237
326
  agent: exports.TOOL_OPERATION_IDS.contentDelete,
238
327
  mcp: "delete_content"
239
328
  },
329
+ contentDeleteBatch: {
330
+ agent: exports.TOOL_OPERATION_IDS.contentDeleteBatch
331
+ },
240
332
  contentSetIntendedPublishTime: {
241
333
  agent: exports.TOOL_OPERATION_IDS.contentSetIntendedPublishTime,
242
334
  mcp: "set_intended_publish_time"
@@ -296,6 +388,24 @@ var require_dist = __commonJS({
296
388
  analyticsGetDemographics: {
297
389
  agent: exports.TOOL_OPERATION_IDS.analyticsGetDemographics,
298
390
  mcp: "get_analytics_demographics"
391
+ },
392
+ inboxAutomationRulesList: {
393
+ mcp: "list_inbox_automation_rules"
394
+ },
395
+ inboxAutomationRuleGet: {
396
+ mcp: "get_inbox_automation_rule"
397
+ },
398
+ inboxAutomationRuleCreate: {
399
+ mcp: "create_inbox_automation_rule"
400
+ },
401
+ inboxAutomationRuleUpdate: {
402
+ mcp: "update_inbox_automation_rule"
403
+ },
404
+ inboxAutomationRuleDelete: {
405
+ mcp: "delete_inbox_automation_rule"
406
+ },
407
+ inboxAutomationExecutionsList: {
408
+ mcp: "list_inbox_automation_executions"
299
409
  }
300
410
  };
301
411
  exports.TOOL_CAPABILITIES = {
@@ -312,8 +422,13 @@ var require_dist = __commonJS({
312
422
  contentReviewSetIntendedPublishTime: "content.review.set_intended_publish_time",
313
423
  mediaRead: "media.read",
314
424
  analyticsRead: "analytics.read",
315
- integrationsRead: "integrations.read"
425
+ integrationsRead: "integrations.read",
426
+ taskBoardRead: "task_board.read",
427
+ taskBoardManage: "task_board.manage",
428
+ inboxRead: "inbox.read",
429
+ inboxAutomationManage: "inbox.automation_manage"
316
430
  };
431
+ exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS = 4 * 60 * 60 * 1e3;
317
432
  function defineToolContract(contract) {
318
433
  return contract;
319
434
  }
@@ -438,12 +553,16 @@ var require_dist = __commonJS({
438
553
  inputSchema: exports.memoryRememberInputSchema,
439
554
  outputSchema: exports.memoryRememberOutputSchema,
440
555
  requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceUpdate],
441
- confirmation: { required: false },
556
+ confirmation: {
557
+ required: false,
558
+ actionType: exports.TOOL_OPERATION_IDS.memoryRemember,
559
+ buildSummary: (input) => `Save a workspace ${input.kind} to memory (${input.content.length} characters).`
560
+ },
442
561
  idempotency: { required: true },
443
562
  surfaces: {
444
563
  agent: {
445
564
  name: exports.TOOL_WIRE_NAMES.memoryRemember.agent,
446
- description: "Store a durable workspace preference, brand rule, or factual context explicitly provided by the user.",
565
+ description: `Store a durable workspace preference, brand rule, or factual context explicitly provided by the user. For standing rules the workspace must always follow (prohibited words, compliance requirements, hard do/don't instructions), use a kind containing "rule", "constraint", "policy", "compliance", or "prohibited" (for example brand_rule, compliance_policy, prohibited_terms); those kinds are always injected into future turns. Use descriptive kinds like preference, brand_voice, or note for everything else.`,
447
566
  access: "write",
448
567
  gated: false,
449
568
  safeInputSummary: (input) => `kind=${input.kind} contentLength=${input.content.length}`
@@ -829,16 +948,22 @@ var require_dist = __commonJS({
829
948
  exports.COMPOSER_PATCH_CAPTION_CONTRACT = defineToolContract({
830
949
  canonicalName: exports.TOOL_OPERATION_IDS.composerPatchCaption,
831
950
  wireNames: exports.TOOL_WIRE_NAMES.composerPatchCaption,
832
- description: "Create a browser-owned composer patch that replaces a caption or first comment.",
951
+ description: "Replace a caption or first comment only after the user directly asks to edit the open surface.",
833
952
  inputSchema: exports.composerPatchCaptionInputSchema,
834
953
  outputSchema: exports.composerPatchOutputSchema,
835
954
  requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftUpdate],
836
- confirmation: { required: false },
955
+ // required stays false: the card only appears when the safety layer asks for
956
+ // one (surface-edit intent gate); a directly requested edit stages silently.
957
+ confirmation: {
958
+ required: false,
959
+ actionType: exports.TOOL_OPERATION_IDS.composerPatchCaption,
960
+ buildSummary: (input) => buildComposerCaptionPatchConfirmationSummary(input)
961
+ },
837
962
  idempotency: { required: true },
838
963
  surfaces: {
839
964
  agent: {
840
965
  name: exports.TOOL_WIRE_NAMES.composerPatchCaption.agent,
841
- description: "Create a browser-owned composer patch that replaces a caption or first comment.",
966
+ description: "Replace a caption or first comment only after the user directly asks to edit the open surface. For questions, critique, summaries, recommendations, or option requests, answer in chat without patching or asking whether to apply the answer.",
842
967
  access: "write",
843
968
  gated: false,
844
969
  safeInputSummary: (input) => `targetDraftId=current field=${input.field ?? "caption"} captionLength=${input.caption.length}`
@@ -848,16 +973,20 @@ var require_dist = __commonJS({
848
973
  exports.COMPOSER_PATCH_SCHEDULE_CONTRACT = defineToolContract({
849
974
  canonicalName: exports.TOOL_OPERATION_IDS.composerPatchSchedule,
850
975
  wireNames: exports.TOOL_WIRE_NAMES.composerPatchSchedule,
851
- description: "Create a browser-owned composer patch for schedule fields.",
976
+ description: "Change composer schedule fields only after the user directly asks to edit them.",
852
977
  inputSchema: exports.composerPatchScheduleInputSchema,
853
978
  outputSchema: exports.composerPatchOutputSchema,
854
979
  requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftUpdate],
855
- confirmation: { required: false },
980
+ confirmation: {
981
+ required: false,
982
+ actionType: exports.TOOL_OPERATION_IDS.composerPatchSchedule,
983
+ buildSummary: (input) => input.scheduledAt ? `Stage a schedule change on the open draft: ${input.scheduledAt}${input.timezone ? ` (${input.timezone})` : ""}. Nothing is saved until you save the draft.` : "Stage a schedule change on the open draft. Nothing is saved until you save the draft."
984
+ },
856
985
  idempotency: { required: true },
857
986
  surfaces: {
858
987
  agent: {
859
988
  name: exports.TOOL_WIRE_NAMES.composerPatchSchedule.agent,
860
- description: "Create a browser-owned composer patch for schedule fields.",
989
+ description: "Change composer schedule fields only after the user directly asks to edit them. Questions and recommendations stay in chat without a patch or an offer to apply the answer.",
861
990
  access: "write",
862
991
  gated: false,
863
992
  safeInputSummary: (input) => `targetDraftId=current scheduledAt=${input.scheduledAt ?? "unchanged"} timezone=${input.timezone ?? "unchanged"}`
@@ -867,16 +996,20 @@ var require_dist = __commonJS({
867
996
  exports.COMPOSER_PATCH_TAXONOMY_CONTRACT = defineToolContract({
868
997
  canonicalName: exports.TOOL_OPERATION_IDS.composerPatchTaxonomy,
869
998
  wireNames: exports.TOOL_WIRE_NAMES.composerPatchTaxonomy,
870
- description: "Create a browser-owned composer patch for labels, pillars, formats, or hashtags.",
999
+ description: "Change labels, pillars, formats, or hashtags only after the user directly asks to edit them.",
871
1000
  inputSchema: exports.composerPatchTaxonomyInputSchema,
872
1001
  outputSchema: exports.composerPatchOutputSchema,
873
1002
  requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftUpdate],
874
- confirmation: { required: false },
1003
+ confirmation: {
1004
+ required: false,
1005
+ actionType: exports.TOOL_OPERATION_IDS.composerPatchTaxonomy,
1006
+ buildSummary: (input) => buildComposerTaxonomyPatchConfirmationSummary(input)
1007
+ },
875
1008
  idempotency: { required: true },
876
1009
  surfaces: {
877
1010
  agent: {
878
1011
  name: exports.TOOL_WIRE_NAMES.composerPatchTaxonomy.agent,
879
- description: "Create a browser-owned composer patch for labels, pillars, formats, or hashtags.",
1012
+ description: "Change labels, pillars, formats, or hashtags only after the user directly asks to edit them. Taxonomy questions and recommendations stay in chat without a patch or an offer to apply the answer.",
880
1013
  access: "write",
881
1014
  gated: false,
882
1015
  safeInputSummary: (input) => [
@@ -892,16 +1025,20 @@ var require_dist = __commonJS({
892
1025
  exports.COMPOSER_PATCH_MEDIA_CONTRACT = defineToolContract({
893
1026
  canonicalName: exports.TOOL_OPERATION_IDS.composerPatchMedia,
894
1027
  wireNames: exports.TOOL_WIRE_NAMES.composerPatchMedia,
895
- description: "Create a browser-owned composer patch that replaces the open draft's media list.",
1028
+ description: "Replace the open draft's media list only after the user directly asks to edit it.",
896
1029
  inputSchema: exports.composerPatchMediaInputSchema,
897
1030
  outputSchema: exports.composerPatchOutputSchema,
898
1031
  requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftUpdate],
899
- confirmation: { required: false },
1032
+ confirmation: {
1033
+ required: false,
1034
+ actionType: exports.TOOL_OPERATION_IDS.composerPatchMedia,
1035
+ buildSummary: (input) => `Stage a media change on the open draft (${input.contentMedia.length} item${input.contentMedia.length === 1 ? "" : "s"}). Nothing is saved until you save the draft.`
1036
+ },
900
1037
  idempotency: { required: true },
901
1038
  surfaces: {
902
1039
  agent: {
903
1040
  name: exports.TOOL_WIRE_NAMES.composerPatchMedia.agent,
904
- description: "Create a browser-owned composer patch that replaces the open draft's media list.",
1041
+ description: "Replace the open draft's media list only after the user directly asks to edit it. Media questions and recommendations stay in chat without a patch or an offer to apply the answer.",
905
1042
  access: "write",
906
1043
  gated: false,
907
1044
  safeInputSummary: (input) => `targetDraftId=current media=${input.contentMedia.length}`
@@ -1016,6 +1153,213 @@ var require_dist = __commonJS({
1016
1153
  includePendingApproval: z9.boolean().optional().describe("Include pending approval count. Requires Standard or Premium plan.")
1017
1154
  }).strict();
1018
1155
  var contentSelectionToolsets = ["content_selection", "content_read_only", "content_workflow", "content_workflow_all"];
1156
+ var taskBoardReadToolsets = [
1157
+ "task_board_read",
1158
+ "task_board_workflow",
1159
+ "task_board_workflow_all",
1160
+ "content_selection",
1161
+ "content_read_only",
1162
+ "content_workflow",
1163
+ "content_workflow_all"
1164
+ ];
1165
+ var taskBoardWorkflowToolsets = ["task_board_workflow", "task_board_workflow_all"];
1166
+ var taskBoardDangerousToolsets = ["task_board_dangerous", "task_board_workflow_all"];
1167
+ exports.taskBoardListInputSchema = z9.object({}).strict();
1168
+ exports.taskBoardListMcpInputSchema = z9.object({
1169
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID.")
1170
+ }).strict();
1171
+ exports.taskGetInputSchema = z9.object({
1172
+ taskId: z9.string().uuid().describe("Task ID to retrieve."),
1173
+ includeComments: z9.boolean().default(false).describe("Include task comments."),
1174
+ includeActivity: z9.boolean().default(false).describe("Include task activity history."),
1175
+ activityLimit: z9.number().int().min(1).max(100).default(50).describe("Activity page size, maximum 100."),
1176
+ activityCursor: z9.string().trim().min(1).nullable().optional().describe("Activity pagination cursor.")
1177
+ }).strict();
1178
+ exports.taskGetMcpInputSchema = exports.taskGetInputSchema.extend({
1179
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID.")
1180
+ }).strict();
1181
+ exports.taskListForPostInputSchema = z9.object({
1182
+ postId: z9.string().uuid().describe("Linked content post ID.")
1183
+ }).strict();
1184
+ exports.taskListForPostMcpInputSchema = exports.taskListForPostInputSchema.extend({
1185
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID.")
1186
+ }).strict();
1187
+ exports.taskListArchivedInputSchema = z9.object({
1188
+ limit: z9.number().int().min(1).max(100).default(50).describe("Archive page size, maximum 100."),
1189
+ cursor: z9.string().trim().min(1).nullable().optional().describe("Archive pagination cursor.")
1190
+ }).strict();
1191
+ exports.taskListArchivedMcpInputSchema = exports.taskListArchivedInputSchema.extend({
1192
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID.")
1193
+ }).strict();
1194
+ var TASK_BOARD_PRIORITY_VALUES = ["urgent", "high", "medium", "low"];
1195
+ var workspaceIdSchema = z9.string().uuid().describe("Maeve workspace ID.");
1196
+ var taskTitleSchema = z9.string().regex(/\S/, "title should not be blank").max(180);
1197
+ var taskDescriptionSchema = z9.string().max(5e3);
1198
+ var taskColorSchema = z9.string().regex(/^#[0-9a-fA-F]{6}$/, "must be a #rrggbb hex color");
1199
+ var taskUuidV4Schema = z9.uuidv4();
1200
+ var taskUuidV4ListSchema = z9.array(taskUuidV4Schema).max(50);
1201
+ var taskDueAtSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/, "must be an ISO date (YYYY-MM-DD)").refine(isTaskDateOnly, "must be a valid ISO date (YYYY-MM-DD)");
1202
+ var taskChecklistTitleSchema = z9.string().regex(/\S/, "title should not be blank").max(500);
1203
+ function isTaskDateOnly(value) {
1204
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
1205
+ if (!match)
1206
+ return false;
1207
+ const [, yearRaw, monthRaw, dayRaw] = match;
1208
+ const year = Number.parseInt(yearRaw, 10);
1209
+ const month = Number.parseInt(monthRaw, 10);
1210
+ const day = Number.parseInt(dayRaw, 10);
1211
+ const time = Date.UTC(year, month - 1, day);
1212
+ if (!Number.isFinite(time))
1213
+ return false;
1214
+ const parsed = new Date(time);
1215
+ return parsed.getUTCFullYear() === year && parsed.getUTCMonth() + 1 === month && parsed.getUTCDate() === day;
1216
+ }
1217
+ var createTaskBodyShape = {
1218
+ title: taskTitleSchema.describe("Task title, maximum 180 characters."),
1219
+ description: taskDescriptionSchema.nullable().optional().describe("Task description, maximum 5000 characters."),
1220
+ color: taskColorSchema.nullable().optional().describe("Card color as a #rrggbb hex value."),
1221
+ columnId: taskUuidV4Schema.nullable().optional().describe("Target column ID. Defaults to the backlog column."),
1222
+ postId: z9.string().uuid().nullable().optional().describe("Content post ID to link to the task."),
1223
+ assigneeIds: taskUuidV4ListSchema.optional().describe("Workspace member user IDs to assign, maximum 50."),
1224
+ labelIds: taskUuidV4ListSchema.optional().describe("Task board label IDs to apply, maximum 50."),
1225
+ priority: z9.enum(TASK_BOARD_PRIORITY_VALUES).nullable().optional().describe("Task priority."),
1226
+ dueAt: taskDueAtSchema.nullable().optional().describe("Due date as YYYY-MM-DD."),
1227
+ checklistItemTitles: z9.array(taskChecklistTitleSchema).max(25).optional().describe("Starter checklist item titles, maximum 25.")
1228
+ };
1229
+ exports.createTaskBodySchema = z9.object(createTaskBodyShape).strict();
1230
+ exports.createTaskInputSchema = exports.createTaskBodySchema;
1231
+ exports.createTaskMcpInputSchema = z9.object({
1232
+ workspaceId: workspaceIdSchema,
1233
+ ...createTaskBodyShape
1234
+ }).strict();
1235
+ var updateTaskBodyShape = {
1236
+ title: taskTitleSchema.optional().describe("Task title, maximum 180 characters."),
1237
+ description: taskDescriptionSchema.nullable().optional().describe("Pass null to clear the description."),
1238
+ color: taskColorSchema.nullable().optional().describe("Pass null to clear the card color."),
1239
+ postId: z9.string().uuid().nullable().optional().describe("Content post ID to link; pass null to unlink."),
1240
+ assigneeIds: taskUuidV4ListSchema.optional().describe("Full replacement set of assignee user IDs, maximum 50."),
1241
+ labelIds: taskUuidV4ListSchema.optional().describe("Full replacement set of label IDs, maximum 50."),
1242
+ priority: z9.enum(TASK_BOARD_PRIORITY_VALUES).nullable().optional().describe("Pass null to clear the priority."),
1243
+ dueAt: taskDueAtSchema.nullable().optional().describe("Due date as YYYY-MM-DD; pass null to clear.")
1244
+ };
1245
+ exports.updateTaskBodySchema = z9.object(updateTaskBodyShape).strict();
1246
+ exports.updateTaskInputSchema = z9.object({
1247
+ taskId: z9.string().uuid().describe("Task ID to update."),
1248
+ ...updateTaskBodyShape
1249
+ }).strict();
1250
+ exports.updateTaskMcpInputSchema = z9.object({
1251
+ workspaceId: workspaceIdSchema,
1252
+ taskId: z9.string().uuid().describe("Task ID to update."),
1253
+ ...updateTaskBodyShape
1254
+ }).strict();
1255
+ var moveTaskBodyShape = {
1256
+ targetColumnId: taskUuidV4Schema.describe("Column to move the task into."),
1257
+ beforeTaskId: taskUuidV4Schema.nullable().optional().describe("Place the task immediately before this task."),
1258
+ afterTaskId: taskUuidV4Schema.nullable().optional().describe("Place the task immediately after this task.")
1259
+ };
1260
+ exports.moveTaskBodySchema = z9.object(moveTaskBodyShape).strict();
1261
+ exports.moveTaskInputSchema = z9.object({
1262
+ taskId: z9.string().uuid().describe("Task ID to move."),
1263
+ ...moveTaskBodyShape
1264
+ }).strict();
1265
+ exports.moveTaskMcpInputSchema = z9.object({
1266
+ workspaceId: workspaceIdSchema,
1267
+ taskId: z9.string().uuid().describe("Task ID to move."),
1268
+ ...moveTaskBodyShape
1269
+ }).strict();
1270
+ exports.archiveTaskInputSchema = z9.object({
1271
+ taskId: z9.string().uuid().describe("Task ID to archive.")
1272
+ }).strict();
1273
+ exports.archiveTaskMcpInputSchema = exports.archiveTaskInputSchema.extend({
1274
+ workspaceId: workspaceIdSchema
1275
+ }).strict();
1276
+ exports.restoreTaskInputSchema = z9.object({
1277
+ taskId: z9.string().uuid().describe("Archived task ID to restore.")
1278
+ }).strict();
1279
+ exports.restoreTaskMcpInputSchema = exports.restoreTaskInputSchema.extend({
1280
+ workspaceId: workspaceIdSchema
1281
+ }).strict();
1282
+ var deleteTaskInputShape = {
1283
+ taskId: z9.string().uuid().describe("Task ID to delete."),
1284
+ confirmationText: z9.string().optional().describe("Exact confirmation text: delete_task:<taskId>."),
1285
+ dangerouslyAutoConfirm: z9.boolean().optional().describe("Never honored for this action; deletion always requires the exact confirmation text.")
1286
+ };
1287
+ exports.deleteTaskInputSchema = z9.object(deleteTaskInputShape).strict();
1288
+ exports.deleteTaskMcpInputSchema = z9.object({
1289
+ workspaceId: workspaceIdSchema,
1290
+ ...deleteTaskInputShape
1291
+ }).strict();
1292
+ var createTaskCommentBodyShape = {
1293
+ content: z9.string().max(4e3).describe("Comment text, maximum 4000 characters. @mentions notify workspace members.")
1294
+ };
1295
+ exports.createTaskCommentBodySchema = z9.object(createTaskCommentBodyShape).strict();
1296
+ exports.createTaskCommentInputSchema = z9.object({
1297
+ taskId: z9.string().uuid().describe("Task ID to comment on."),
1298
+ ...createTaskCommentBodyShape
1299
+ }).strict();
1300
+ exports.createTaskCommentMcpInputSchema = z9.object({
1301
+ workspaceId: workspaceIdSchema,
1302
+ taskId: z9.string().uuid().describe("Task ID to comment on."),
1303
+ ...createTaskCommentBodyShape
1304
+ }).strict();
1305
+ var createTaskChecklistItemBodyShape = {
1306
+ title: taskChecklistTitleSchema.describe("Checklist item title, maximum 500 characters."),
1307
+ beforeItemId: taskUuidV4Schema.nullable().optional().describe("Insert immediately before this checklist item."),
1308
+ afterItemId: taskUuidV4Schema.nullable().optional().describe("Insert immediately after this checklist item.")
1309
+ };
1310
+ exports.createTaskChecklistItemBodySchema = z9.object(createTaskChecklistItemBodyShape).strict();
1311
+ exports.createTaskChecklistItemInputSchema = z9.object({
1312
+ taskId: z9.string().uuid().describe("Parent task ID."),
1313
+ ...createTaskChecklistItemBodyShape
1314
+ }).strict();
1315
+ exports.createTaskChecklistItemMcpInputSchema = z9.object({
1316
+ workspaceId: workspaceIdSchema,
1317
+ taskId: z9.string().uuid().describe("Parent task ID."),
1318
+ ...createTaskChecklistItemBodyShape
1319
+ }).strict();
1320
+ var updateTaskChecklistItemBodyShape = {
1321
+ title: taskChecklistTitleSchema.optional().describe("Checklist item title, maximum 500 characters."),
1322
+ isCompleted: z9.boolean().optional().describe("Mark the checklist item complete or incomplete.")
1323
+ };
1324
+ exports.updateTaskChecklistItemBodySchema = z9.object(updateTaskChecklistItemBodyShape).strict();
1325
+ exports.updateTaskChecklistItemInputSchema = z9.object({
1326
+ taskId: z9.string().uuid().describe("Parent task ID."),
1327
+ itemId: z9.string().uuid().describe("Checklist item ID to update."),
1328
+ ...updateTaskChecklistItemBodyShape
1329
+ }).strict();
1330
+ exports.updateTaskChecklistItemMcpInputSchema = z9.object({
1331
+ workspaceId: workspaceIdSchema,
1332
+ taskId: z9.string().uuid().describe("Parent task ID."),
1333
+ itemId: z9.string().uuid().describe("Checklist item ID to update."),
1334
+ ...updateTaskChecklistItemBodyShape
1335
+ }).strict();
1336
+ var moveTaskChecklistItemBodyShape = {
1337
+ beforeItemId: taskUuidV4Schema.nullable().optional().describe("Place immediately before this checklist item."),
1338
+ afterItemId: taskUuidV4Schema.nullable().optional().describe("Place immediately after this checklist item.")
1339
+ };
1340
+ exports.moveTaskChecklistItemBodySchema = z9.object(moveTaskChecklistItemBodyShape).strict();
1341
+ exports.moveTaskChecklistItemInputSchema = z9.object({
1342
+ taskId: z9.string().uuid().describe("Parent task ID."),
1343
+ itemId: z9.string().uuid().describe("Checklist item ID to move."),
1344
+ ...moveTaskChecklistItemBodyShape
1345
+ }).strict();
1346
+ exports.moveTaskChecklistItemMcpInputSchema = z9.object({
1347
+ workspaceId: workspaceIdSchema,
1348
+ taskId: z9.string().uuid().describe("Parent task ID."),
1349
+ itemId: z9.string().uuid().describe("Checklist item ID to move."),
1350
+ ...moveTaskChecklistItemBodyShape
1351
+ }).strict();
1352
+ var deleteTaskChecklistItemInputShape = {
1353
+ taskId: z9.string().uuid().describe("Parent task ID."),
1354
+ itemId: z9.string().uuid().describe("Checklist item ID to delete."),
1355
+ confirmationText: z9.string().optional().describe("Exact confirmation text: delete_task_checklist_item:<itemId>."),
1356
+ dangerouslyAutoConfirm: z9.boolean().optional().describe("Never honored for this action; deletion always requires the exact confirmation text.")
1357
+ };
1358
+ exports.deleteTaskChecklistItemInputSchema = z9.object(deleteTaskChecklistItemInputShape).strict();
1359
+ exports.deleteTaskChecklistItemMcpInputSchema = z9.object({
1360
+ workspaceId: workspaceIdSchema,
1361
+ ...deleteTaskChecklistItemInputShape
1362
+ }).strict();
1019
1363
  exports.CONTENT_LIST_CONTRACT = {
1020
1364
  canonicalName: exports.TOOL_OPERATION_IDS.contentList,
1021
1365
  wireNames: exports.TOOL_WIRE_NAMES.contentList,
@@ -1031,82 +1375,549 @@ var require_dist = __commonJS({
1031
1375
  // promoted to the agent surface must carry at least one capability.
1032
1376
  requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceRead],
1033
1377
  confirmation: { required: false },
1034
- idempotency: { required: false },
1378
+ idempotency: { required: false },
1379
+ surfaces: {
1380
+ agent: {
1381
+ name: exports.TOOL_WIRE_NAMES.contentList.agent,
1382
+ description: "List saved content in the current workspace with status, workflow, review-lifecycle, integration, and sort filters. Items include full captions, so keep limit small and page with offset. Prefer content.find_recent for a quick recency scan. Read-only.",
1383
+ access: "read",
1384
+ gated: false,
1385
+ safeInputSummary: (input) => `status=${input.status ?? "any"} limit=${input.limit ?? 10} offset=${input.offset ?? 0}`
1386
+ },
1387
+ mcp: {
1388
+ name: exports.TOOL_WIRE_NAMES.contentList.mcp,
1389
+ title: "List Content",
1390
+ description: "List Maeve content for a workspace using public API filters and sanitized output. Defaults intentionally exclude review-held pending_approval content; explicit reviewLifecycle filters opt into review-held content and include reviewLifecycle on items.",
1391
+ scope: "mcp:read",
1392
+ toolsets: contentSelectionToolsets,
1393
+ annotations: mcpReadAnnotations
1394
+ }
1395
+ }
1396
+ };
1397
+ exports.CONTENT_GET_CONTRACT = {
1398
+ canonicalName: exports.TOOL_OPERATION_IDS.contentGet,
1399
+ wireNames: exports.TOOL_WIRE_NAMES.contentGet,
1400
+ description: "Get one Maeve content item with public API detail fields, sanitized media, and sanitized platform settings. When reviewLifecycle is present, use its state, blockers, and nextAction instead of content.status alone for review workflow decisions.",
1401
+ inputSchema: exports.contentGetInputSchema,
1402
+ wireInputSchemas: {
1403
+ mcp: exports.contentGetMcpInputSchema
1404
+ },
1405
+ outputSchema: mcpStructuredContentOutputSchema,
1406
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceRead],
1407
+ confirmation: { required: false },
1408
+ idempotency: { required: false },
1409
+ surfaces: {
1410
+ agent: {
1411
+ name: exports.TOOL_WIRE_NAMES.contentGet.agent,
1412
+ description: "Read one saved content item in the current workspace, including sanitized media, captions, workflow metadata, and platform settings.",
1413
+ access: "read",
1414
+ gated: false,
1415
+ safeInputSummary: (input) => `contentId=${input.contentId}`
1416
+ },
1417
+ mcp: {
1418
+ name: exports.TOOL_WIRE_NAMES.contentGet.mcp,
1419
+ title: "Get Content",
1420
+ description: "Get one Maeve content item with public API detail fields, sanitized media, and sanitized platform settings. When reviewLifecycle is present, use its state, blockers, and nextAction instead of content.status alone for review workflow decisions.",
1421
+ scope: "mcp:read",
1422
+ toolsets: contentSelectionToolsets,
1423
+ annotations: mcpReadAnnotations
1424
+ }
1425
+ }
1426
+ };
1427
+ exports.CONTENT_GET_COUNTS_CONTRACT = {
1428
+ canonicalName: exports.TOOL_OPERATION_IDS.contentGetCounts,
1429
+ wireNames: exports.TOOL_WIRE_NAMES.contentGetCounts,
1430
+ description: "Get safe content workflow counts for an Maeve workspace, including failed content and premium-plan pending approvals.",
1431
+ inputSchema: exports.contentGetCountsInputSchema,
1432
+ wireInputSchemas: {
1433
+ mcp: exports.contentGetCountsMcpInputSchema
1434
+ },
1435
+ outputSchema: mcpStructuredContentOutputSchema,
1436
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceRead],
1437
+ confirmation: { required: false },
1438
+ idempotency: { required: false },
1439
+ surfaces: {
1440
+ agent: {
1441
+ name: exports.TOOL_WIRE_NAMES.contentGetCounts.agent,
1442
+ description: "Read safe content workflow counts for the current workspace: failed content, plus pending approvals when includePendingApproval is true. Cheap way to check whether anything needs attention before listing. Read-only.",
1443
+ access: "read",
1444
+ gated: false,
1445
+ safeInputSummary: (input) => `includePendingApproval=${input.includePendingApproval ?? false}`
1446
+ },
1447
+ mcp: {
1448
+ name: exports.TOOL_WIRE_NAMES.contentGetCounts.mcp,
1449
+ title: "Get Content Counts",
1450
+ description: "Get safe content workflow counts for an Maeve workspace, including failed content and premium-plan pending approvals.",
1451
+ scope: "mcp:read",
1452
+ toolsets: contentSelectionToolsets,
1453
+ annotations: mcpReadAnnotations
1454
+ }
1455
+ }
1456
+ };
1457
+ exports.TASK_BOARD_LIST_CONTRACT = {
1458
+ canonicalName: exports.TOOL_OPERATION_IDS.taskBoardList,
1459
+ wireNames: exports.TOOL_WIRE_NAMES.taskBoardList,
1460
+ description: "List active task board columns, tasks, members, and task details. Tasks include descriptions, priorities, due dates, assignees, checklist items, labels, and linked content.",
1461
+ inputSchema: exports.taskBoardListInputSchema,
1462
+ wireInputSchemas: {
1463
+ mcp: exports.taskBoardListMcpInputSchema
1464
+ },
1465
+ outputSchema: mcpStructuredContentOutputSchema,
1466
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardRead],
1467
+ confirmation: { required: false },
1468
+ idempotency: { required: false },
1469
+ surfaces: {
1470
+ mcp: {
1471
+ name: exports.TOOL_WIRE_NAMES.taskBoardList.mcp,
1472
+ title: "List Tasks",
1473
+ description: "List active Maeve task board columns, tasks, members, and task details. Tasks include descriptions, priorities, due dates, assignees, checklist items, labels, and linked content.",
1474
+ scope: "mcp:read",
1475
+ toolsets: taskBoardReadToolsets,
1476
+ annotations: mcpReadAnnotations
1477
+ }
1478
+ }
1479
+ };
1480
+ exports.TASK_GET_CONTRACT = {
1481
+ canonicalName: exports.TOOL_OPERATION_IDS.taskGet,
1482
+ wireNames: exports.TOOL_WIRE_NAMES.taskGet,
1483
+ description: "Get one Maeve task with details, including checklist items, labels, assignees, linked content, and optional comments and activity.",
1484
+ inputSchema: exports.taskGetInputSchema,
1485
+ wireInputSchemas: {
1486
+ mcp: exports.taskGetMcpInputSchema
1487
+ },
1488
+ outputSchema: mcpStructuredContentOutputSchema,
1489
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardRead],
1490
+ confirmation: { required: false },
1491
+ idempotency: { required: false },
1492
+ surfaces: {
1493
+ mcp: {
1494
+ name: exports.TOOL_WIRE_NAMES.taskGet.mcp,
1495
+ title: "Get Task",
1496
+ description: "Get one Maeve task with details. The task includes checklist items, labels, assignees, linked content, description, priority, and due date. Set includeComments or includeActivity when the surrounding discussion or task history is needed.",
1497
+ scope: "mcp:read",
1498
+ toolsets: taskBoardReadToolsets,
1499
+ annotations: mcpReadAnnotations
1500
+ }
1501
+ }
1502
+ };
1503
+ exports.TASK_LIST_FOR_POST_CONTRACT = {
1504
+ canonicalName: exports.TOOL_OPERATION_IDS.taskListForPost,
1505
+ wireNames: exports.TOOL_WIRE_NAMES.taskListForPost,
1506
+ description: "List active Maeve tasks linked to one content post.",
1507
+ inputSchema: exports.taskListForPostInputSchema,
1508
+ wireInputSchemas: {
1509
+ mcp: exports.taskListForPostMcpInputSchema
1510
+ },
1511
+ outputSchema: mcpStructuredContentOutputSchema,
1512
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardRead],
1513
+ confirmation: { required: false },
1514
+ idempotency: { required: false },
1515
+ surfaces: {
1516
+ mcp: {
1517
+ name: exports.TOOL_WIRE_NAMES.taskListForPost.mcp,
1518
+ title: "List Tasks For Post",
1519
+ description: "List active Maeve tasks linked to one content post. Each task includes checklist items, labels, assignees, and linked content.",
1520
+ scope: "mcp:read",
1521
+ toolsets: taskBoardReadToolsets,
1522
+ annotations: mcpReadAnnotations
1523
+ }
1524
+ }
1525
+ };
1526
+ exports.TASK_LIST_ARCHIVED_CONTRACT = {
1527
+ canonicalName: exports.TOOL_OPERATION_IDS.taskListArchived,
1528
+ wireNames: exports.TOOL_WIRE_NAMES.taskListArchived,
1529
+ description: "List archived Maeve tasks with task details, including checklist items, labels, assignees, and linked content.",
1530
+ inputSchema: exports.taskListArchivedInputSchema,
1531
+ wireInputSchemas: {
1532
+ mcp: exports.taskListArchivedMcpInputSchema
1533
+ },
1534
+ outputSchema: mcpStructuredContentOutputSchema,
1535
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardRead],
1536
+ confirmation: { required: false },
1537
+ idempotency: { required: false },
1538
+ surfaces: {
1539
+ mcp: {
1540
+ name: exports.TOOL_WIRE_NAMES.taskListArchived.mcp,
1541
+ title: "List Archived Tasks",
1542
+ description: "List archived Maeve tasks with task details, including checklist items, labels, assignees, and linked content.",
1543
+ scope: "mcp:read",
1544
+ toolsets: taskBoardReadToolsets,
1545
+ annotations: mcpReadAnnotations
1546
+ }
1547
+ }
1548
+ };
1549
+ function buildDeleteTaskConfirmationSummary(input) {
1550
+ return `Delete task ${input.taskId} from the task board. Deleted tasks cannot be restored.`;
1551
+ }
1552
+ function buildDeleteTaskChecklistItemConfirmationSummary(input) {
1553
+ return `Delete checklist item ${input.itemId} from task ${input.taskId}. This cannot be undone.`;
1554
+ }
1555
+ exports.TASK_CREATE_CONTRACT = {
1556
+ canonicalName: exports.TOOL_OPERATION_IDS.taskCreate,
1557
+ wireNames: exports.TOOL_WIRE_NAMES.taskCreate,
1558
+ description: "Create a Maeve task board task with optional description, color, column, linked content post, assignees, labels, priority, due date, and starter checklist items. Assignees are notified.",
1559
+ inputSchema: exports.createTaskInputSchema,
1560
+ wireInputSchemas: {
1561
+ mcp: exports.createTaskMcpInputSchema
1562
+ },
1563
+ outputSchema: mcpStructuredContentOutputSchema,
1564
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1565
+ confirmation: { required: false },
1566
+ idempotency: {
1567
+ required: true,
1568
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskCreate, context.workspaceId, shortStableHash(input)].join(":")
1569
+ },
1570
+ surfaces: {
1571
+ mcp: {
1572
+ name: exports.TOOL_WIRE_NAMES.taskCreate.mcp,
1573
+ title: "Create Task",
1574
+ description: "Create a Maeve task board task. Supports description, color, column, linked content post, assignees, labels, priority, due date, and starter checklist items. Assignees are notified.",
1575
+ scope: "mcp:write",
1576
+ toolsets: taskBoardWorkflowToolsets,
1577
+ annotations: {
1578
+ readOnlyHint: false,
1579
+ destructiveHint: false,
1580
+ idempotentHint: false,
1581
+ openWorldHint: false
1582
+ }
1583
+ }
1584
+ }
1585
+ };
1586
+ exports.TASK_UPDATE_CONTRACT = {
1587
+ canonicalName: exports.TOOL_OPERATION_IDS.taskUpdate,
1588
+ wireNames: exports.TOOL_WIRE_NAMES.taskUpdate,
1589
+ description: "Update a Maeve task board task: title, description, color, linked content post, assignees, labels, priority, and due date. Assignee and label arrays are full replacement sets. Archived tasks are read-only until restored.",
1590
+ inputSchema: exports.updateTaskInputSchema,
1591
+ wireInputSchemas: {
1592
+ mcp: exports.updateTaskMcpInputSchema
1593
+ },
1594
+ outputSchema: mcpStructuredContentOutputSchema,
1595
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1596
+ confirmation: { required: false },
1597
+ idempotency: {
1598
+ required: true,
1599
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskUpdate, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1600
+ },
1601
+ surfaces: {
1602
+ mcp: {
1603
+ name: exports.TOOL_WIRE_NAMES.taskUpdate.mcp,
1604
+ title: "Update Task",
1605
+ description: "Update a Maeve task board task: title, description, color, linked content post (null unlinks), assignees, labels, priority, and due date. Assignee and label arrays are full replacement sets. Archived tasks are read-only until restored.",
1606
+ scope: "mcp:write",
1607
+ toolsets: taskBoardWorkflowToolsets,
1608
+ annotations: {
1609
+ readOnlyHint: false,
1610
+ destructiveHint: false,
1611
+ idempotentHint: true,
1612
+ openWorldHint: false
1613
+ }
1614
+ }
1615
+ }
1616
+ };
1617
+ exports.TASK_MOVE_CONTRACT = {
1618
+ canonicalName: exports.TOOL_OPERATION_IDS.taskMove,
1619
+ wireNames: exports.TOOL_WIRE_NAMES.taskMove,
1620
+ description: "Move a Maeve task board task to a column, optionally anchored before or after another task in that column. Archived tasks cannot be moved.",
1621
+ inputSchema: exports.moveTaskInputSchema,
1622
+ wireInputSchemas: {
1623
+ mcp: exports.moveTaskMcpInputSchema
1624
+ },
1625
+ outputSchema: mcpStructuredContentOutputSchema,
1626
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1627
+ confirmation: { required: false },
1628
+ idempotency: {
1629
+ required: true,
1630
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskMove, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1631
+ },
1632
+ surfaces: {
1633
+ mcp: {
1634
+ name: exports.TOOL_WIRE_NAMES.taskMove.mcp,
1635
+ title: "Move Task",
1636
+ description: "Move a Maeve task board task to a column, optionally anchored before or after another task in that column. Omit both anchors to place the task at the top. Archived tasks cannot be moved.",
1637
+ scope: "mcp:write",
1638
+ toolsets: taskBoardWorkflowToolsets,
1639
+ annotations: {
1640
+ readOnlyHint: false,
1641
+ destructiveHint: false,
1642
+ idempotentHint: true,
1643
+ openWorldHint: false
1644
+ }
1645
+ }
1646
+ }
1647
+ };
1648
+ exports.TASK_ARCHIVE_CONTRACT = {
1649
+ canonicalName: exports.TOOL_OPERATION_IDS.taskArchive,
1650
+ wireNames: exports.TOOL_WIRE_NAMES.taskArchive,
1651
+ description: "Archive a Maeve task board task. Archived tasks are read-only and recoverable with restore_task; archiving an already archived task is a no-op.",
1652
+ inputSchema: exports.archiveTaskInputSchema,
1653
+ wireInputSchemas: {
1654
+ mcp: exports.archiveTaskMcpInputSchema
1655
+ },
1656
+ outputSchema: mcpStructuredContentOutputSchema,
1657
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1658
+ confirmation: { required: false },
1659
+ idempotency: {
1660
+ required: true,
1661
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskArchive, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1662
+ },
1663
+ surfaces: {
1664
+ mcp: {
1665
+ name: exports.TOOL_WIRE_NAMES.taskArchive.mcp,
1666
+ title: "Archive Task",
1667
+ description: "Archive a Maeve task board task. Archived tasks are read-only and recoverable with restore_task; archiving an already archived task is a no-op.",
1668
+ scope: "mcp:write",
1669
+ toolsets: taskBoardWorkflowToolsets,
1670
+ annotations: {
1671
+ readOnlyHint: false,
1672
+ destructiveHint: false,
1673
+ idempotentHint: true,
1674
+ openWorldHint: false
1675
+ }
1676
+ }
1677
+ }
1678
+ };
1679
+ exports.TASK_RESTORE_CONTRACT = {
1680
+ canonicalName: exports.TOOL_OPERATION_IDS.taskRestore,
1681
+ wireNames: exports.TOOL_WIRE_NAMES.taskRestore,
1682
+ description: "Restore an archived Maeve task board task to the top of its column. Restoring an active task is a no-op.",
1683
+ inputSchema: exports.restoreTaskInputSchema,
1684
+ wireInputSchemas: {
1685
+ mcp: exports.restoreTaskMcpInputSchema
1686
+ },
1687
+ outputSchema: mcpStructuredContentOutputSchema,
1688
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1689
+ confirmation: { required: false },
1690
+ idempotency: {
1691
+ required: true,
1692
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskRestore, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1693
+ },
1694
+ surfaces: {
1695
+ mcp: {
1696
+ name: exports.TOOL_WIRE_NAMES.taskRestore.mcp,
1697
+ title: "Restore Task",
1698
+ description: "Restore an archived Maeve task board task to the top of its column. Restoring an active task is a no-op.",
1699
+ scope: "mcp:write",
1700
+ toolsets: taskBoardWorkflowToolsets,
1701
+ annotations: {
1702
+ readOnlyHint: false,
1703
+ destructiveHint: false,
1704
+ idempotentHint: true,
1705
+ openWorldHint: false
1706
+ }
1707
+ }
1708
+ }
1709
+ };
1710
+ exports.TASK_DELETE_CONTRACT = {
1711
+ canonicalName: exports.TOOL_OPERATION_IDS.taskDelete,
1712
+ wireNames: exports.TOOL_WIRE_NAMES.taskDelete,
1713
+ description: "Delete a Maeve task board task. Deleted tasks disappear from the board and archive and cannot be restored. High-risk: requires the exact confirmation text delete_task:<taskId>; dangerous auto-confirm is never honored for this action.",
1714
+ inputSchema: exports.deleteTaskInputSchema,
1715
+ wireInputSchemas: {
1716
+ mcp: exports.deleteTaskMcpInputSchema
1717
+ },
1718
+ outputSchema: mcpStructuredContentOutputSchema,
1719
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1720
+ confirmation: {
1721
+ required: true,
1722
+ actionType: exports.TOOL_OPERATION_IDS.taskDelete,
1723
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
1724
+ buildSummary: (input) => buildDeleteTaskConfirmationSummary(input)
1725
+ },
1726
+ idempotency: {
1727
+ required: true,
1728
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskDelete, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1729
+ },
1730
+ surfaces: {
1731
+ mcp: {
1732
+ name: exports.TOOL_WIRE_NAMES.taskDelete.mcp,
1733
+ title: "Delete Task",
1734
+ description: "Delete a Maeve task board task. Deleted tasks disappear from the board and archive and cannot be restored. High-risk: requires the exact confirmation text delete_task:<taskId>; dangerous auto-confirm is never honored for this action.",
1735
+ scope: "mcp:dangerous",
1736
+ toolsets: taskBoardDangerousToolsets,
1737
+ annotations: {
1738
+ readOnlyHint: false,
1739
+ destructiveHint: true,
1740
+ idempotentHint: false,
1741
+ openWorldHint: false
1742
+ }
1743
+ }
1744
+ }
1745
+ };
1746
+ exports.TASK_COMMENT_CREATE_CONTRACT = {
1747
+ canonicalName: exports.TOOL_OPERATION_IDS.taskCommentCreate,
1748
+ wireNames: exports.TOOL_WIRE_NAMES.taskCommentCreate,
1749
+ description: "Add a comment to a Maeve task board task. @mentions in the comment notify the mentioned workspace members. Archived task comments are read-only.",
1750
+ inputSchema: exports.createTaskCommentInputSchema,
1751
+ wireInputSchemas: {
1752
+ mcp: exports.createTaskCommentMcpInputSchema
1753
+ },
1754
+ outputSchema: mcpStructuredContentOutputSchema,
1755
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1756
+ confirmation: { required: false },
1757
+ idempotency: {
1758
+ required: true,
1759
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskCommentCreate, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1760
+ },
1761
+ surfaces: {
1762
+ mcp: {
1763
+ name: exports.TOOL_WIRE_NAMES.taskCommentCreate.mcp,
1764
+ title: "Create Task Comment",
1765
+ description: "Add a comment to a Maeve task board task. @mentions in the comment notify the mentioned workspace members. Archived task comments are read-only.",
1766
+ scope: "mcp:write",
1767
+ toolsets: taskBoardWorkflowToolsets,
1768
+ annotations: {
1769
+ readOnlyHint: false,
1770
+ destructiveHint: false,
1771
+ idempotentHint: false,
1772
+ openWorldHint: false
1773
+ }
1774
+ }
1775
+ }
1776
+ };
1777
+ exports.TASK_CHECKLIST_ITEM_CREATE_CONTRACT = {
1778
+ canonicalName: exports.TOOL_OPERATION_IDS.taskChecklistItemCreate,
1779
+ wireNames: exports.TOOL_WIRE_NAMES.taskChecklistItemCreate,
1780
+ description: "Add a checklist item to a Maeve task board task, optionally anchored before or after an existing item. Archived task checklists are read-only.",
1781
+ inputSchema: exports.createTaskChecklistItemInputSchema,
1782
+ wireInputSchemas: {
1783
+ mcp: exports.createTaskChecklistItemMcpInputSchema
1784
+ },
1785
+ outputSchema: mcpStructuredContentOutputSchema,
1786
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1787
+ confirmation: { required: false },
1788
+ idempotency: {
1789
+ required: true,
1790
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.taskChecklistItemCreate, context.workspaceId, input.taskId, shortStableHash(input)].join(":")
1791
+ },
1792
+ surfaces: {
1793
+ mcp: {
1794
+ name: exports.TOOL_WIRE_NAMES.taskChecklistItemCreate.mcp,
1795
+ title: "Create Task Checklist Item",
1796
+ description: "Add a checklist item to a Maeve task board task, optionally anchored before or after an existing item. Archived task checklists are read-only.",
1797
+ scope: "mcp:write",
1798
+ toolsets: taskBoardWorkflowToolsets,
1799
+ annotations: {
1800
+ readOnlyHint: false,
1801
+ destructiveHint: false,
1802
+ idempotentHint: false,
1803
+ openWorldHint: false
1804
+ }
1805
+ }
1806
+ }
1807
+ };
1808
+ exports.TASK_CHECKLIST_ITEM_UPDATE_CONTRACT = {
1809
+ canonicalName: exports.TOOL_OPERATION_IDS.taskChecklistItemUpdate,
1810
+ wireNames: exports.TOOL_WIRE_NAMES.taskChecklistItemUpdate,
1811
+ description: "Update a checklist item on a Maeve task board task: title and completion state. Archived task checklists are read-only.",
1812
+ inputSchema: exports.updateTaskChecklistItemInputSchema,
1813
+ wireInputSchemas: {
1814
+ mcp: exports.updateTaskChecklistItemMcpInputSchema
1815
+ },
1816
+ outputSchema: mcpStructuredContentOutputSchema,
1817
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1818
+ confirmation: { required: false },
1819
+ idempotency: {
1820
+ required: true,
1821
+ buildKey: (input, context) => [
1822
+ exports.TOOL_OPERATION_IDS.taskChecklistItemUpdate,
1823
+ context.workspaceId,
1824
+ input.taskId,
1825
+ input.itemId,
1826
+ shortStableHash(input)
1827
+ ].join(":")
1828
+ },
1035
1829
  surfaces: {
1036
- agent: {
1037
- name: exports.TOOL_WIRE_NAMES.contentList.agent,
1038
- description: "List saved content in the current workspace with status, workflow, review-lifecycle, integration, and sort filters. Items include full captions, so keep limit small and page with offset. Prefer content.find_recent for a quick recency scan. Read-only.",
1039
- access: "read",
1040
- gated: false,
1041
- safeInputSummary: (input) => `status=${input.status ?? "any"} limit=${input.limit ?? 10} offset=${input.offset ?? 0}`
1042
- },
1043
1830
  mcp: {
1044
- name: exports.TOOL_WIRE_NAMES.contentList.mcp,
1045
- title: "List Content",
1046
- description: "List Maeve content for a workspace using public API filters and sanitized output. Defaults intentionally exclude review-held pending_approval content; explicit reviewLifecycle filters opt into review-held content and include reviewLifecycle on items.",
1047
- scope: "mcp:read",
1048
- toolsets: contentSelectionToolsets,
1049
- annotations: mcpReadAnnotations
1831
+ name: exports.TOOL_WIRE_NAMES.taskChecklistItemUpdate.mcp,
1832
+ title: "Update Task Checklist Item",
1833
+ description: "Update a checklist item on a Maeve task board task: title and completion state. Archived task checklists are read-only.",
1834
+ scope: "mcp:write",
1835
+ toolsets: taskBoardWorkflowToolsets,
1836
+ annotations: {
1837
+ readOnlyHint: false,
1838
+ destructiveHint: false,
1839
+ idempotentHint: true,
1840
+ openWorldHint: false
1841
+ }
1050
1842
  }
1051
1843
  }
1052
1844
  };
1053
- exports.CONTENT_GET_CONTRACT = {
1054
- canonicalName: exports.TOOL_OPERATION_IDS.contentGet,
1055
- wireNames: exports.TOOL_WIRE_NAMES.contentGet,
1056
- description: "Get one Maeve content item with public API detail fields, sanitized media, and sanitized platform settings. When reviewLifecycle is present, use its state, blockers, and nextAction instead of content.status alone for review workflow decisions.",
1057
- inputSchema: exports.contentGetInputSchema,
1845
+ exports.TASK_CHECKLIST_ITEM_MOVE_CONTRACT = {
1846
+ canonicalName: exports.TOOL_OPERATION_IDS.taskChecklistItemMove,
1847
+ wireNames: exports.TOOL_WIRE_NAMES.taskChecklistItemMove,
1848
+ description: "Reorder a checklist item on a Maeve task board task, anchored before or after another item. Archived task checklists are read-only.",
1849
+ inputSchema: exports.moveTaskChecklistItemInputSchema,
1058
1850
  wireInputSchemas: {
1059
- mcp: exports.contentGetMcpInputSchema
1851
+ mcp: exports.moveTaskChecklistItemMcpInputSchema
1060
1852
  },
1061
1853
  outputSchema: mcpStructuredContentOutputSchema,
1062
- requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceRead],
1854
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1063
1855
  confirmation: { required: false },
1064
- idempotency: { required: false },
1856
+ idempotency: {
1857
+ required: true,
1858
+ buildKey: (input, context) => [
1859
+ exports.TOOL_OPERATION_IDS.taskChecklistItemMove,
1860
+ context.workspaceId,
1861
+ input.taskId,
1862
+ input.itemId,
1863
+ shortStableHash(input)
1864
+ ].join(":")
1865
+ },
1065
1866
  surfaces: {
1066
- agent: {
1067
- name: exports.TOOL_WIRE_NAMES.contentGet.agent,
1068
- description: "Read one saved content item in the current workspace, including sanitized media, captions, workflow metadata, and platform settings.",
1069
- access: "read",
1070
- gated: false,
1071
- safeInputSummary: (input) => `contentId=${input.contentId}`
1072
- },
1073
1867
  mcp: {
1074
- name: exports.TOOL_WIRE_NAMES.contentGet.mcp,
1075
- title: "Get Content",
1076
- description: "Get one Maeve content item with public API detail fields, sanitized media, and sanitized platform settings. When reviewLifecycle is present, use its state, blockers, and nextAction instead of content.status alone for review workflow decisions.",
1077
- scope: "mcp:read",
1078
- toolsets: contentSelectionToolsets,
1079
- annotations: mcpReadAnnotations
1868
+ name: exports.TOOL_WIRE_NAMES.taskChecklistItemMove.mcp,
1869
+ title: "Move Task Checklist Item",
1870
+ description: "Reorder a checklist item on a Maeve task board task, anchored before or after another item. Omit both anchors to move it to the top. Archived task checklists are read-only.",
1871
+ scope: "mcp:write",
1872
+ toolsets: taskBoardWorkflowToolsets,
1873
+ annotations: {
1874
+ readOnlyHint: false,
1875
+ destructiveHint: false,
1876
+ idempotentHint: true,
1877
+ openWorldHint: false
1878
+ }
1080
1879
  }
1081
1880
  }
1082
1881
  };
1083
- exports.CONTENT_GET_COUNTS_CONTRACT = {
1084
- canonicalName: exports.TOOL_OPERATION_IDS.contentGetCounts,
1085
- wireNames: exports.TOOL_WIRE_NAMES.contentGetCounts,
1086
- description: "Get safe content workflow counts for an Maeve workspace, including failed content and premium-plan pending approvals.",
1087
- inputSchema: exports.contentGetCountsInputSchema,
1882
+ exports.TASK_CHECKLIST_ITEM_DELETE_CONTRACT = {
1883
+ canonicalName: exports.TOOL_OPERATION_IDS.taskChecklistItemDelete,
1884
+ wireNames: exports.TOOL_WIRE_NAMES.taskChecklistItemDelete,
1885
+ description: "Delete a checklist item from a Maeve task board task. High-risk: requires the exact confirmation text delete_task_checklist_item:<itemId>; dangerous auto-confirm is never honored for this action.",
1886
+ inputSchema: exports.deleteTaskChecklistItemInputSchema,
1088
1887
  wireInputSchemas: {
1089
- mcp: exports.contentGetCountsMcpInputSchema
1888
+ mcp: exports.deleteTaskChecklistItemMcpInputSchema
1090
1889
  },
1091
1890
  outputSchema: mcpStructuredContentOutputSchema,
1092
- requiredCapabilities: [exports.TOOL_CAPABILITIES.workspaceRead],
1093
- confirmation: { required: false },
1094
- idempotency: { required: false },
1891
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.taskBoardManage],
1892
+ confirmation: {
1893
+ required: true,
1894
+ actionType: exports.TOOL_OPERATION_IDS.taskChecklistItemDelete,
1895
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
1896
+ buildSummary: (input) => buildDeleteTaskChecklistItemConfirmationSummary(input)
1897
+ },
1898
+ idempotency: {
1899
+ required: true,
1900
+ buildKey: (input, context) => [
1901
+ exports.TOOL_OPERATION_IDS.taskChecklistItemDelete,
1902
+ context.workspaceId,
1903
+ input.taskId,
1904
+ input.itemId,
1905
+ shortStableHash(input)
1906
+ ].join(":")
1907
+ },
1095
1908
  surfaces: {
1096
- agent: {
1097
- name: exports.TOOL_WIRE_NAMES.contentGetCounts.agent,
1098
- description: "Read safe content workflow counts for the current workspace: failed content, plus pending approvals when includePendingApproval is true. Cheap way to check whether anything needs attention before listing. Read-only.",
1099
- access: "read",
1100
- gated: false,
1101
- safeInputSummary: (input) => `includePendingApproval=${input.includePendingApproval ?? false}`
1102
- },
1103
1909
  mcp: {
1104
- name: exports.TOOL_WIRE_NAMES.contentGetCounts.mcp,
1105
- title: "Get Content Counts",
1106
- description: "Get safe content workflow counts for an Maeve workspace, including failed content and premium-plan pending approvals.",
1107
- scope: "mcp:read",
1108
- toolsets: contentSelectionToolsets,
1109
- annotations: mcpReadAnnotations
1910
+ name: exports.TOOL_WIRE_NAMES.taskChecklistItemDelete.mcp,
1911
+ title: "Delete Task Checklist Item",
1912
+ description: "Delete a checklist item from a Maeve task board task. High-risk: requires the exact confirmation text delete_task_checklist_item:<itemId>; dangerous auto-confirm is never honored for this action.",
1913
+ scope: "mcp:write",
1914
+ toolsets: taskBoardWorkflowToolsets,
1915
+ annotations: {
1916
+ readOnlyHint: false,
1917
+ destructiveHint: true,
1918
+ idempotentHint: false,
1919
+ openWorldHint: false
1920
+ }
1110
1921
  }
1111
1922
  }
1112
1923
  };
@@ -1140,6 +1951,7 @@ var require_dist = __commonJS({
1140
1951
  "locations",
1141
1952
  "instagram-catalogs",
1142
1953
  "instagram-products",
1954
+ "instagram-audio",
1143
1955
  "youtube-video-categories"
1144
1956
  ];
1145
1957
  exports.integrationsGetCapabilitiesInputSchema = z9.object({
@@ -1151,8 +1963,9 @@ var require_dist = __commonJS({
1151
1963
  }).strict();
1152
1964
  var integrationOptionRequestShape = {
1153
1965
  regionCode: z9.string().max(2).optional().describe("Optional ISO country code, for example US."),
1154
- query: z9.string().max(255).optional().describe("Search text for locations or products."),
1155
- catalogId: z9.string().max(255).optional().describe("Instagram catalog ID for product search.")
1966
+ query: z9.string().max(255).optional().describe("Search text for locations, products, or audio."),
1967
+ catalogId: z9.string().max(255).optional().describe("Instagram catalog ID for product search."),
1968
+ audioType: z9.enum(["music", "original_sound"]).optional().describe("Required for instagram-audio: search licensed music or original sounds.")
1156
1969
  };
1157
1970
  exports.integrationsGetOptionsInputSchema = z9.object({
1158
1971
  integrationId: z9.string().uuid().describe("Integration ID to inspect. Use integrations.list to resolve account names to IDs."),
@@ -1766,14 +2579,52 @@ var require_dist = __commonJS({
1766
2579
  }
1767
2580
  };
1768
2581
  var analyticsDaysSchema = z9.union([z9.number().int().min(1).max(90), z9.literal("all")]);
2582
+ var analyticsAgentDaysSchema = z9.number().int().min(1).max(90);
2583
+ var ANALYTICS_RANGE_MAX_SPAN_DAYS = 366;
2584
+ var analyticsRangeStartDateSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/, "startDate must be a YYYY-MM-DD date.").optional().describe("Custom start, YYYY-MM-DD.");
2585
+ var analyticsRangeEndDateSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/, "endDate must be a YYYY-MM-DD date.").optional().describe("Custom inclusive end, YYYY-MM-DD.");
2586
+ function analyticsRangeRefinement(input, ctx) {
2587
+ const { startDate, endDate } = input;
2588
+ if (!startDate && !endDate)
2589
+ return;
2590
+ if (!startDate || !endDate) {
2591
+ ctx.addIssue({
2592
+ code: "custom",
2593
+ path: [startDate ? "endDate" : "startDate"],
2594
+ message: "startDate and endDate must be provided together."
2595
+ });
2596
+ return;
2597
+ }
2598
+ if (endDate < startDate) {
2599
+ ctx.addIssue({
2600
+ code: "custom",
2601
+ path: ["endDate"],
2602
+ message: "endDate must be on or after startDate."
2603
+ });
2604
+ return;
2605
+ }
2606
+ const spanDays = (Date.parse(`${endDate}T00:00:00Z`) - Date.parse(`${startDate}T00:00:00Z`)) / DAY_MS + 1;
2607
+ if (spanDays > ANALYTICS_RANGE_MAX_SPAN_DAYS) {
2608
+ ctx.addIssue({
2609
+ code: "custom",
2610
+ path: ["endDate"],
2611
+ message: `Date range must span ${ANALYTICS_RANGE_MAX_SPAN_DAYS} days or less.`
2612
+ });
2613
+ }
2614
+ }
2615
+ function summarizeAnalyticsRange(input) {
2616
+ return input.startDate && input.endDate ? `range=${input.startDate}..${input.endDate}` : `days=${input.days ?? 30}`;
2617
+ }
1769
2618
  var analyticsPostSortFields = ["recent", "engagement", "views"];
1770
2619
  var analyticsOverviewToolsets = ["analytics_overview", "analytics_read_only"];
1771
2620
  var analyticsPostsToolsets = ["analytics_posts", "analytics_read_only"];
1772
2621
  exports.analyticsAggregateMcpInputSchema = z9.object({
1773
2622
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
1774
2623
  integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Optional integration IDs to include. Empty returns no metrics."),
1775
- days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.')
1776
- }).strict();
2624
+ days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.'),
2625
+ startDate: analyticsRangeStartDateSchema,
2626
+ endDate: analyticsRangeEndDateSchema
2627
+ }).strict().superRefine(analyticsRangeRefinement);
1777
2628
  exports.analyticsIntegrationMcpInputSchema = z9.object({
1778
2629
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
1779
2630
  integrationId: z9.string().uuid().describe("Integration ID to inspect.")
@@ -1785,35 +2636,45 @@ var require_dist = __commonJS({
1785
2636
  limit: z9.number().int().min(1).max(50).optional().describe("Page size. Default 10 single, 12 aggregate."),
1786
2637
  offset: z9.number().int().min(0).optional().describe("Offset for pagination."),
1787
2638
  days: analyticsDaysSchema.optional().describe("Aggregate analytics window. Default 30."),
2639
+ startDate: analyticsRangeStartDateSchema,
2640
+ endDate: analyticsRangeEndDateSchema,
1788
2641
  sortBy: z9.enum(analyticsPostSortFields).optional().describe("Aggregate sort. Default recent.")
1789
- }).strict();
2642
+ }).strict().superRefine(analyticsRangeRefinement);
1790
2643
  exports.analyticsPostsAggregateMcpInputSchema = z9.object({
1791
2644
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
1792
2645
  integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Optional integration IDs to include. Empty returns no posts."),
1793
2646
  limit: z9.number().int().min(1).max(50).optional().describe("Page size. Default 12."),
1794
2647
  offset: z9.number().int().min(0).optional().describe("Offset for pagination. Default 0."),
1795
2648
  days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.'),
2649
+ startDate: analyticsRangeStartDateSchema,
2650
+ endDate: analyticsRangeEndDateSchema,
1796
2651
  sortBy: z9.enum(analyticsPostSortFields).optional().describe("Sort field. Default recent.")
1797
- }).strict();
2652
+ }).strict().superRefine(analyticsRangeRefinement);
1798
2653
  exports.analyticsPostsAggregateInputSchema = z9.object({
1799
- integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Optional integration IDs to include. Empty returns no posts."),
1800
- limit: z9.number().int().min(1).max(50).optional().describe("Page size. Default 12."),
1801
- offset: z9.number().int().min(0).optional().describe("Offset for pagination. Default 0."),
1802
- days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.'),
1803
- sortBy: z9.enum(analyticsPostSortFields).optional().describe("Sort field. Default recent.")
1804
- }).strict();
2654
+ integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Channels to include; empty returns no posts."),
2655
+ limit: z9.number().int().min(1).max(50).optional().describe("Default 12."),
2656
+ offset: z9.number().int().min(0).optional().describe("Default 0."),
2657
+ days: analyticsDaysSchema.optional().describe("1-90 or all; default 30."),
2658
+ startDate: analyticsRangeStartDateSchema,
2659
+ endDate: analyticsRangeEndDateSchema,
2660
+ sortBy: z9.enum(analyticsPostSortFields).optional().describe("Default recent.")
2661
+ }).strict().superRefine(analyticsRangeRefinement);
1805
2662
  exports.postAnalyticsMcpInputSchema = z9.object({
1806
2663
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
1807
2664
  contentId: z9.string().uuid().describe("Published content ID.")
1808
2665
  }).strict();
1809
2666
  exports.analyticsAggregateInputSchema = z9.object({
1810
2667
  integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Optional integration IDs to include. Empty returns no metrics."),
1811
- days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.')
1812
- }).strict();
2668
+ days: analyticsDaysSchema.optional().describe('Analytics window, either an integer between 1 and 90 or "all". Default 30.'),
2669
+ startDate: analyticsRangeStartDateSchema,
2670
+ endDate: analyticsRangeEndDateSchema
2671
+ }).strict().superRefine(analyticsRangeRefinement);
1813
2672
  exports.analyticsAggregateAgentInputSchema = z9.object({
1814
2673
  integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Integration IDs for the connected channels to include. Empty returns no metrics."),
1815
- days: z9.number().int().min(1).max(90).optional().describe("Analytics window in days, between 1 and 90. Default 30.")
1816
- }).strict();
2674
+ days: analyticsAgentDaysSchema.optional().describe("Analytics window in days, between 1 and 90. Default 30."),
2675
+ startDate: analyticsRangeStartDateSchema,
2676
+ endDate: analyticsRangeEndDateSchema
2677
+ }).strict().superRefine(analyticsRangeRefinement);
1817
2678
  exports.analyticsIntegrationInputSchema = z9.object({
1818
2679
  integrationId: z9.string().uuid().describe("Integration ID to inspect.")
1819
2680
  }).strict();
@@ -1823,16 +2684,20 @@ var require_dist = __commonJS({
1823
2684
  limit: z9.number().int().min(1).max(50).optional().describe("Page size. Default 10 single, 12 aggregate."),
1824
2685
  offset: z9.number().int().min(0).optional().describe("Offset for pagination."),
1825
2686
  days: analyticsDaysSchema.optional().describe("Aggregate analytics window. Default 30."),
2687
+ startDate: analyticsRangeStartDateSchema,
2688
+ endDate: analyticsRangeEndDateSchema,
1826
2689
  sortBy: z9.enum(analyticsPostSortFields).optional().describe("Aggregate sort. Default recent.")
1827
- }).strict();
2690
+ }).strict().superRefine(analyticsRangeRefinement);
1828
2691
  exports.analyticsPostsAgentInputSchema = z9.object({
1829
2692
  integrationId: z9.string().uuid().optional().describe("Single integration ID to inspect."),
1830
2693
  integrationIds: z9.array(z9.string().uuid()).max(20).optional().describe("Integration IDs for aggregated post analytics. Used when integrationId is omitted."),
1831
2694
  limit: z9.number().int().min(1).max(20).optional().describe("Page size, maximum 20. Default 10 single, 12 aggregate."),
1832
2695
  offset: z9.number().int().min(0).optional().describe("Offset for pagination."),
1833
- days: z9.number().int().min(1).max(90).optional().describe("Analytics window in days, between 1 and 90. Default 30."),
2696
+ days: analyticsAgentDaysSchema.optional().describe("Analytics window in days, between 1 and 90. Default 30."),
2697
+ startDate: analyticsRangeStartDateSchema,
2698
+ endDate: analyticsRangeEndDateSchema,
1834
2699
  sortBy: z9.enum(analyticsPostSortFields).optional().describe("Aggregate sort. Default recent.")
1835
- }).strict();
2700
+ }).strict().superRefine(analyticsRangeRefinement);
1836
2701
  exports.postAnalyticsInputSchema = z9.object({
1837
2702
  contentId: z9.string().uuid().describe("Published content ID.")
1838
2703
  }).strict();
@@ -1855,7 +2720,7 @@ var require_dist = __commonJS({
1855
2720
  description: "Read an aggregated account analytics summary (metrics nested under an analytics key) for selected connected channels. Prefer analytics.get_aggregate for the same data unnested. Pass integrationIds from Workspace context; an omitted or empty list returns no metrics. Read-only.",
1856
2721
  access: "read",
1857
2722
  gated: false,
1858
- safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} days=${input.days ?? 30}`
2723
+ safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} ${summarizeAnalyticsRange(input)}`
1859
2724
  },
1860
2725
  mcp: {
1861
2726
  name: exports.TOOL_WIRE_NAMES.analyticsGetSummary.mcp,
@@ -1883,10 +2748,10 @@ var require_dist = __commonJS({
1883
2748
  surfaces: {
1884
2749
  agent: {
1885
2750
  name: exports.TOOL_WIRE_NAMES.analyticsGetAggregate.agent,
1886
- description: "Read aggregated account analytics metrics (audience, reach, engagement, views) across the workspace's connected channels for a window of up to 90 days. Pass integrationIds from Workspace context; an omitted or empty list returns no metrics. Use to ground performance answers in real account-level numbers. Read-only.",
2751
+ description: "Read aggregated account analytics metrics (audience, reach, engagement, views) across the workspace's connected channels for a preset window of up to 90 days, all time, or an explicit startDate/endDate range (up to 366 days). Pass integrationIds from Workspace context; an omitted or empty list returns no metrics. Use to ground performance answers in real account-level numbers. Read-only.",
1887
2752
  access: "read",
1888
2753
  gated: false,
1889
- safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} days=${input.days ?? 30}`
2754
+ safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} ${summarizeAnalyticsRange(input)}`
1890
2755
  },
1891
2756
  mcp: {
1892
2757
  name: exports.TOOL_WIRE_NAMES.analyticsGetAggregate.mcp,
@@ -1977,7 +2842,7 @@ var require_dist = __commonJS({
1977
2842
  description: "Read sanitized per-post analytics for one channel (integrationId) or several (integrationIds). Prefer analytics.get_posts_aggregate for cross-channel post performance; use this when you need a single channel or offset pagination. Keep limit small. Read-only.",
1978
2843
  access: "read",
1979
2844
  gated: false,
1980
- safeInputSummary: (input) => `integrationId=${input.integrationId ?? "none"} integrationIds=${input.integrationIds?.length ?? "none"} days=${input.days ?? 30} limit=${input.limit ?? "default"}`
2845
+ safeInputSummary: (input) => `integrationId=${input.integrationId ?? "none"} integrationIds=${input.integrationIds?.length ?? "none"} ${summarizeAnalyticsRange(input)} limit=${input.limit ?? "default"}`
1981
2846
  },
1982
2847
  mcp: {
1983
2848
  name: exports.TOOL_WIRE_NAMES.analyticsGetPosts.mcp,
@@ -2008,10 +2873,10 @@ var require_dist = __commonJS({
2008
2873
  surfaces: {
2009
2874
  agent: {
2010
2875
  name: exports.TOOL_WIRE_NAMES.analyticsGetPostsAggregate.agent,
2011
- description: "Read recent post performance analytics across the workspace's connected accounts. Read-only; use to ground performance references before drafting. Pass integrationIds for the connected channels to include (integrationId values are listed in Workspace context); an omitted or empty list returns no posts.",
2876
+ description: "Read post analytics across connected channels. Pass integrationIds from Workspace context; empty returns no posts. Use days (1-90 or all) or startDate/endDate (max 366 days). Read-only.",
2012
2877
  access: "read",
2013
2878
  gated: false,
2014
- safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} days=${input.days ?? 30} sortBy=${input.sortBy ?? "recent"} limit=${input.limit ?? 12}`
2879
+ safeInputSummary: (input) => `integrationIds=${input.integrationIds?.length ?? "none"} ${summarizeAnalyticsRange(input)} sortBy=${input.sortBy ?? "recent"} limit=${input.limit ?? 12}`
2015
2880
  },
2016
2881
  mcp: {
2017
2882
  name: exports.TOOL_WIRE_NAMES.analyticsGetPostsAggregate.mcp,
@@ -2057,6 +2922,7 @@ var require_dist = __commonJS({
2057
2922
  var WORKBENCH_PRIORITY_VALUES = ["urgent", "high", "medium", "low"];
2058
2923
  var LINKEDIN_POLL_DURATION_VALUES = ["ONE_DAY", "THREE_DAYS", "SEVEN_DAYS", "FOURTEEN_DAYS"];
2059
2924
  var LINKEDIN_POLL_VOTE_SELECTION_TYPE_VALUES = ["SINGLE_VOTE"];
2925
+ var TIKTOK_MUSIC_CLIP_TYPES = ["full_duration", "trending"];
2060
2926
  var FACEBOOK_PAGE_POST_CTA_TYPES = [
2061
2927
  "LEARN_MORE",
2062
2928
  "SIGN_UP",
@@ -2086,7 +2952,9 @@ var require_dist = __commonJS({
2086
2952
  { key: "locationId", type: "string" },
2087
2953
  { key: "audio_id", type: "string" },
2088
2954
  { key: "audio_volume", type: "number", min: 0, max: 100 },
2089
- { key: "video_volume", type: "number", min: 0, max: 100 }
2955
+ { key: "video_volume", type: "number", min: 0, max: 100 },
2956
+ { key: "trialReel", type: "boolean" },
2957
+ { key: "trialReelGraduationStrategy", type: "string", enum: ["manual", "automatic"] }
2090
2958
  ],
2091
2959
  facebook: FACEBOOK_PAGE_SETTINGS_FIELDS,
2092
2960
  "facebook-page": FACEBOOK_PAGE_SETTINGS_FIELDS,
@@ -2096,7 +2964,6 @@ var require_dist = __commonJS({
2096
2964
  threads: [
2097
2965
  { key: "topicTag", type: "string" },
2098
2966
  { key: "linkAttachment", type: "string" },
2099
- { key: "isGhostPost", type: "boolean" },
2100
2967
  { key: "locationId", type: "string" },
2101
2968
  { key: "replyControl", type: "string", enum: THREADS_REPLY_CONTROL_VALUES }
2102
2969
  ],
@@ -2110,7 +2977,8 @@ var require_dist = __commonJS({
2110
2977
  { key: "is_aigc", type: "boolean" },
2111
2978
  { key: "tiktok_post_to_drafts", type: "boolean" },
2112
2979
  { key: "photo_cover_index", type: "number" },
2113
- { key: "auto_add_music", type: "boolean" }
2980
+ { key: "auto_add_music", type: "boolean" },
2981
+ { key: "tiktok_music", type: "tiktok_music" }
2114
2982
  ],
2115
2983
  youtube: [
2116
2984
  { key: "privacyStatus", type: "string", enum: ["public", "unlisted", "private"] },
@@ -2125,9 +2993,25 @@ var require_dist = __commonJS({
2125
2993
  { key: "boardId", type: "string" },
2126
2994
  { key: "link", type: "string" },
2127
2995
  { key: "altText", type: "string" }
2996
+ ],
2997
+ "google-business-profile": [
2998
+ { key: "googlePostType", type: "string", enum: ["standard", "event", "offer"] },
2999
+ {
3000
+ key: "googleCallToActionType",
3001
+ type: "string",
3002
+ enum: ["book", "order", "shop", "learn_more", "sign_up", "call"]
3003
+ },
3004
+ { key: "googleCallToActionUrl", type: "string" },
3005
+ { key: "googleEventTitle", type: "string" },
3006
+ { key: "googleEventStartAt", type: "string" },
3007
+ { key: "googleEventEndAt", type: "string" },
3008
+ { key: "googleOfferCouponCode", type: "string" },
3009
+ { key: "googleOfferRedeemOnlineUrl", type: "string" },
3010
+ { key: "googleOfferTerms", type: "string" },
3011
+ { key: "googleLanguageCode", type: "string" }
2128
3012
  ]
2129
3013
  };
2130
- function createDraftProviderSettingsZodSchema() {
3014
+ function createDraftProviderSettingsZodSchema(excludedKeys = /* @__PURE__ */ new Set()) {
2131
3015
  const shape = {};
2132
3016
  const fieldsByKey = /* @__PURE__ */ new Map();
2133
3017
  for (const fields of Object.values(CREATE_DRAFT_PROVIDER_SETTINGS_FIELDS_BY_PLATFORM)) {
@@ -2136,11 +3020,15 @@ var require_dist = __commonJS({
2136
3020
  }
2137
3021
  }
2138
3022
  for (const field of fieldsByKey.values()) {
3023
+ if (excludedKeys.has(field.key))
3024
+ continue;
2139
3025
  shape[field.key] = createDraftProviderSettingZodField(field).optional();
2140
3026
  }
2141
3027
  return z9.object(shape).strict();
2142
3028
  }
2143
3029
  function createDraftProviderSettingZodField(field) {
3030
+ if (field.type === "tiktok_music")
3031
+ return createDraftTikTokMusicSelectionSchema;
2144
3032
  if (field.enum?.length) {
2145
3033
  return z9.enum(field.enum);
2146
3034
  }
@@ -2157,7 +3045,22 @@ var require_dist = __commonJS({
2157
3045
  schema = schema.max(field.max);
2158
3046
  return schema;
2159
3047
  }
3048
+ var createDraftTikTokMusicSelectionSchema = z9.object({
3049
+ integrationId: z9.string().trim().min(1),
3050
+ countryCode: z9.string().trim().toUpperCase().regex(/^[A-Z]{2}$/),
3051
+ commercialMusicId: z9.string().trim().min(1),
3052
+ songClipId: z9.string().trim().min(1),
3053
+ clipType: z9.enum(TIKTOK_MUSIC_CLIP_TYPES),
3054
+ trackName: z9.string().trim().min(1),
3055
+ artist: z9.string().trim().min(1),
3056
+ trackDurationSeconds: z9.number().positive().nullable(),
3057
+ clipDurationSeconds: z9.number().positive().nullable(),
3058
+ genres: z9.array(z9.string()),
3059
+ musicSoundVolume: z9.number().int().min(0).max(100),
3060
+ videoOriginalSoundVolume: z9.number().int().min(0).max(100)
3061
+ }).strict();
2160
3062
  var createDraftContentSettingsSchema = createDraftProviderSettingsZodSchema();
3063
+ var createDraftContentAgentSettingsSchema = createDraftProviderSettingsZodSchema(/* @__PURE__ */ new Set(["tiktok_music"]));
2161
3064
  var createDraftContentMediaSchema = z9.array(z9.object({
2162
3065
  mediaId: z9.string().uuid(),
2163
3066
  order: z9.number().int().min(0).optional(),
@@ -2204,34 +3107,41 @@ var require_dist = __commonJS({
2204
3107
  })).max(20).optional().describe("Optional thread/reply draft messages with canonical captions and media relationships.")
2205
3108
  };
2206
3109
  exports.createDraftContentInputSchema = z9.object(createDraftContentInputShape).strict();
3110
+ exports.createDraftContentAgentInputSchema = exports.createDraftContentInputSchema.extend({
3111
+ settings: createDraftContentAgentSettingsSchema.optional().describe("Optional strict platform-specific provider settings.")
3112
+ });
2207
3113
  exports.createDraftContentMcpInputSchema = z9.object({
2208
3114
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
2209
3115
  ...createDraftContentInputShape
2210
3116
  }).strict();
3117
+ var createDraftContentResultSchema = z9.object({
3118
+ contentId: z9.string(),
3119
+ status: z9.string(),
3120
+ appUrl: z9.url().optional(),
3121
+ title: z9.string().nullable(),
3122
+ integrationId: z9.string(),
3123
+ platform: z9.string().nullable(),
3124
+ accountLabel: z9.string().nullable(),
3125
+ groupId: z9.string().optional(),
3126
+ contentIds: z9.array(z9.string()).optional()
3127
+ }).strict();
3128
+ var createDraftIdempotencyResultSchema = z9.object({
3129
+ key: z9.string(),
3130
+ replayed: z9.boolean()
3131
+ }).strict();
2211
3132
  exports.createDraftContentOutputSchema = z9.object({
2212
3133
  ok: z9.literal(true),
2213
3134
  renderHint: z9.literal("draft_created"),
2214
- content: z9.object({
2215
- contentId: z9.string(),
2216
- status: z9.string(),
2217
- title: z9.string().nullable(),
2218
- integrationId: z9.string(),
2219
- platform: z9.string().nullable(),
2220
- accountLabel: z9.string().nullable(),
2221
- groupId: z9.string().optional(),
2222
- contentIds: z9.array(z9.string()).optional()
2223
- }).strict(),
2224
- idempotency: z9.object({
2225
- key: z9.string(),
2226
- replayed: z9.boolean()
2227
- }).strict()
3135
+ content: createDraftContentResultSchema,
3136
+ idempotency: createDraftIdempotencyResultSchema
2228
3137
  }).strict();
2229
3138
  exports.CONTENT_CREATE_DRAFT_CONTRACT = {
2230
3139
  canonicalName: exports.TOOL_OPERATION_IDS.contentCreateDraft,
2231
3140
  wireNames: exports.TOOL_WIRE_NAMES.contentCreateDraft,
2232
- description: "Create Maeve content as a saved draft only. Does not schedule or publish, and requires explicit user confirmation on agent surfaces.",
3141
+ description: "Create Maeve content as a saved draft only. Does not schedule or publish. Agent use requires explicit create or save language; confirmation depends on workspace autonomy.",
2233
3142
  inputSchema: exports.createDraftContentInputSchema,
2234
3143
  wireInputSchemas: {
3144
+ agent: exports.createDraftContentAgentInputSchema,
2235
3145
  mcp: exports.createDraftContentMcpInputSchema
2236
3146
  },
2237
3147
  outputSchema: exports.createDraftContentOutputSchema,
@@ -2253,7 +3163,7 @@ var require_dist = __commonJS({
2253
3163
  surfaces: {
2254
3164
  agent: {
2255
3165
  name: exports.TOOL_WIRE_NAMES.contentCreateDraft.agent,
2256
- description: "Creates a REAL saved draft in Maeve. Only call this when the user explicitly asks to save or create a draft. This always requires explicit user confirmation before executing.",
3166
+ description: "Creates a REAL saved draft in Maeve. Only call this when the user explicitly asks to save or create a draft. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2257
3167
  access: "write",
2258
3168
  gated: false,
2259
3169
  safeInputSummary: (input) => [
@@ -2278,6 +3188,67 @@ var require_dist = __commonJS({
2278
3188
  }
2279
3189
  }
2280
3190
  };
3191
+ exports.CREATE_DRAFTS_MAX_ITEMS = 20;
3192
+ exports.createDraftsContentInputSchema = z9.object({
3193
+ idempotencyKey: z9.string().max(255).optional().describe("Optional batch idempotency key. Generated and returned when omitted."),
3194
+ drafts: z9.array(exports.createDraftContentInputSchema).min(1).max(exports.CREATE_DRAFTS_MAX_ITEMS).describe("Draft definitions to create. Each item takes the same fields as content.create_draft.")
3195
+ }).strict();
3196
+ exports.createDraftsContentOutputSchema = z9.object({
3197
+ ok: z9.literal(true),
3198
+ renderHint: z9.literal("drafts_created"),
3199
+ createdCount: z9.number().int().min(0),
3200
+ failedCount: z9.number().int().min(0),
3201
+ results: z9.array(z9.discriminatedUnion("ok", [
3202
+ z9.object({
3203
+ ok: z9.literal(true),
3204
+ index: z9.number().int().min(0),
3205
+ content: createDraftContentResultSchema,
3206
+ idempotency: createDraftIdempotencyResultSchema
3207
+ }).strict(),
3208
+ z9.object({
3209
+ ok: z9.literal(false),
3210
+ index: z9.number().int().min(0),
3211
+ error: z9.object({
3212
+ code: z9.string(),
3213
+ message: z9.string()
3214
+ }).strict()
3215
+ }).strict()
3216
+ ]))
3217
+ }).strict();
3218
+ exports.CONTENT_CREATE_DRAFTS_CONTRACT = defineToolContract({
3219
+ canonicalName: exports.TOOL_OPERATION_IDS.contentCreateDrafts,
3220
+ wireNames: exports.TOOL_WIRE_NAMES.contentCreateDrafts,
3221
+ description: `Create up to ${exports.CREATE_DRAFTS_MAX_ITEMS} Maeve content drafts in one batch under a single user confirmation. Drafts only; does not schedule or publish.`,
3222
+ inputSchema: exports.createDraftsContentInputSchema,
3223
+ outputSchema: exports.createDraftsContentOutputSchema,
3224
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftCreate],
3225
+ confirmation: {
3226
+ required: true,
3227
+ actionType: exports.TOOL_OPERATION_IDS.contentCreateDrafts,
3228
+ buildSummary: (input) => buildCreateDraftsConfirmationSummary(input)
3229
+ },
3230
+ idempotency: {
3231
+ required: true,
3232
+ buildKey: (input, context) => [
3233
+ exports.TOOL_OPERATION_IDS.contentCreateDrafts,
3234
+ context.workspaceId,
3235
+ input.idempotencyKey?.trim() || shortStableHash(input)
3236
+ ].join(":")
3237
+ },
3238
+ surfaces: {
3239
+ agent: {
3240
+ name: exports.TOOL_WIRE_NAMES.contentCreateDrafts.agent,
3241
+ description: `Creates multiple REAL saved drafts in Maeve under one user confirmation. Prefer this over repeated content.create_draft calls whenever the user asks for more than one draft (up to ${exports.CREATE_DRAFTS_MAX_ITEMS} per call). Only call it when the user explicitly asks to save or create drafts. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.`,
3242
+ access: "write",
3243
+ gated: false,
3244
+ safeInputSummary: (input) => [
3245
+ `drafts=${input.drafts.length}`,
3246
+ `integrations=${new Set(input.drafts.map((draft) => draft.integrationId)).size}`,
3247
+ `idempotencyKey=${input.idempotencyKey ? "present" : "absent"}`
3248
+ ].join(" ")
3249
+ }
3250
+ }
3251
+ });
2281
3252
  var updateDraftContentInputShape = {
2282
3253
  contentId: z9.string().uuid().describe("Draft or scheduled content ID to edit."),
2283
3254
  internalTitle: z9.string().max(500).nullable().optional().describe("Internal planning title. Never published. Pass null to clear."),
@@ -2333,7 +3304,7 @@ var require_dist = __commonJS({
2333
3304
  surfaces: {
2334
3305
  agent: {
2335
3306
  name: exports.TOOL_WIRE_NAMES.contentUpdateDraft.agent,
2336
- description: "Updates a REAL saved draft or scheduled content item in Maeve. Only call this when the user explicitly asks to edit saved content. This always requires explicit user confirmation before executing.",
3307
+ description: "Updates a REAL saved draft or scheduled content item in Maeve. Only call this when the user explicitly asks to edit saved content. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2337
3308
  access: "write",
2338
3309
  gated: false,
2339
3310
  safeInputSummary: (input) => [
@@ -2361,6 +3332,7 @@ var require_dist = __commonJS({
2361
3332
  var contentMetadataUuidArraySchema = z9.array(z9.string().uuid());
2362
3333
  var updateContentMetadataInputShape = {
2363
3334
  contentId: z9.string().uuid().describe("Content ID whose planning metadata should be updated."),
3335
+ organizationalTitle: z9.string().max(240).nullable().optional().describe("Organizational title shown inside Maeve. Never published. Pass null to clear."),
2364
3336
  labelIds: contentMetadataUuidArraySchema.optional().describe("Replacement workspace content label IDs. Empty array clears."),
2365
3337
  pillarIds: contentMetadataUuidArraySchema.optional().describe("Replacement content pillar IDs. Empty array clears."),
2366
3338
  formatIds: contentMetadataUuidArraySchema.optional().describe("Replacement content format IDs. Empty array clears."),
@@ -2416,6 +3388,7 @@ var require_dist = __commonJS({
2416
3388
  workspaceId: z9.string(),
2417
3389
  status: z9.string(),
2418
3390
  workflowStatus: z9.string().nullable(),
3391
+ organizationalTitle: z9.string().nullable(),
2419
3392
  labelIds: z9.array(z9.string()),
2420
3393
  labels: z9.array(publicContentLabelOutputSchema),
2421
3394
  pillarIds: z9.array(z9.string()),
@@ -2444,7 +3417,7 @@ var require_dist = __commonJS({
2444
3417
  exports.CONTENT_UPDATE_METADATA_CONTRACT = {
2445
3418
  canonicalName: exports.TOOL_OPERATION_IDS.contentUpdateMetadata,
2446
3419
  wireNames: exports.TOOL_WIRE_NAMES.contentUpdateMetadata,
2447
- description: "Update planning metadata on one existing draft or scheduled content item. Omitted fields remain unchanged; provided arrays replace existing assignments and empty arrays clear.",
3420
+ description: "Update the organizational title and planning metadata on one existing draft, scheduled, or published content item. The organizational title is internal to Maeve and never changes a provider title. Omitted fields remain unchanged; provided arrays replace existing assignments and empty arrays clear.",
2448
3421
  inputSchema: exports.updateContentMetadataInputSchema,
2449
3422
  wireInputSchemas: {
2450
3423
  mcp: exports.updateContentMetadataMcpInputSchema
@@ -2463,12 +3436,13 @@ var require_dist = __commonJS({
2463
3436
  surfaces: {
2464
3437
  agent: {
2465
3438
  name: exports.TOOL_WIRE_NAMES.contentUpdateMetadata.agent,
2466
- description: "Updates REAL saved content planning metadata in Maeve: labels, pillars, formats, assignees, priority, campaign, and campaign phase. This always requires explicit user confirmation before executing.",
3439
+ description: "Updates REAL saved content organizational metadata in Maeve: organizational title, labels, pillars, formats, assignees, priority, campaign, and campaign phase. The organizational title is never published. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2467
3440
  access: "write",
2468
3441
  gated: false,
2469
3442
  safeInputSummary: (input) => [
2470
3443
  `contentId=${input.contentId}`,
2471
3444
  `fields=${countUpdateMetadataFields(input)}`,
3445
+ `organizationalTitle=${Object.prototype.hasOwnProperty.call(input, "organizationalTitle") ? input.organizationalTitle === null ? "clear" : "present" : "unchanged"}`,
2472
3446
  `labels=${input.labelIds?.length ?? "unchanged"}`,
2473
3447
  `assignees=${input.assigneeIds?.length ?? "unchanged"}`
2474
3448
  ].join(" ")
@@ -2476,7 +3450,7 @@ var require_dist = __commonJS({
2476
3450
  mcp: {
2477
3451
  name: exports.TOOL_WIRE_NAMES.contentUpdateMetadata.mcp,
2478
3452
  title: "Update Content Metadata",
2479
- description: "Update planning metadata on one existing draft or scheduled content item. Omitted fields remain unchanged; provided arrays replace existing assignments and empty arrays clear.",
3453
+ description: "Update the organizational title and planning metadata on one existing draft, scheduled, or published content item. The organizational title is internal to Maeve and never changes a provider title. Omitted fields remain unchanged; provided arrays replace existing assignments and empty arrays clear.",
2480
3454
  scope: "mcp:write",
2481
3455
  toolsets: ["content_drafting", "content_workflow", "content_workflow_all"],
2482
3456
  annotations: {
@@ -2510,7 +3484,7 @@ var require_dist = __commonJS({
2510
3484
  surfaces: {
2511
3485
  agent: {
2512
3486
  name: exports.TOOL_WIRE_NAMES.contentUpdateNotes.agent,
2513
- description: "Updates REAL internal notes on saved Maeve content. Notes are never published. This always requires explicit user confirmation before executing.",
3487
+ description: "Updates REAL internal notes on saved Maeve content. Notes are never published. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2514
3488
  access: "write",
2515
3489
  gated: false,
2516
3490
  safeInputSummary: (input) => `contentId=${input.contentId} notesLength=${input.notes.length}`
@@ -2542,6 +3516,7 @@ var require_dist = __commonJS({
2542
3516
  var publicContentMutationOutputSchema = z9.object({
2543
3517
  id: z9.string(),
2544
3518
  status: z9.string(),
3519
+ appUrl: z9.url().optional(),
2545
3520
  groupId: z9.string().optional(),
2546
3521
  contentIds: z9.array(z9.string()).optional()
2547
3522
  }).strict();
@@ -2556,6 +3531,37 @@ var require_dist = __commonJS({
2556
3531
  action: z9.literal("scheduled")
2557
3532
  }).strict()
2558
3533
  }).strict();
3534
+ exports.SCHEDULE_BATCH_MAX_ITEMS = 20;
3535
+ exports.contentScheduleBatchInputSchema = z9.object({
3536
+ idempotencyKey: z9.string().max(255).optional().describe("Optional batch idempotency key."),
3537
+ items: z9.array(z9.object({
3538
+ contentId: z9.string().uuid().describe("Content ID to schedule or reschedule."),
3539
+ scheduledAt: z9.string().describe("ISO-8601 scheduled time. Include a timezone, or omit it to use the workspace timezone, for example 2026-05-01T09:00:00."),
3540
+ label: z9.string().max(200).optional().describe("Display-only content title as you know it; does not change the saved content.")
3541
+ }).strict()).min(1).max(exports.SCHEDULE_BATCH_MAX_ITEMS).describe("Content items to schedule under one confirmation.")
3542
+ }).strict();
3543
+ exports.contentScheduleBatchOutputSchema = z9.object({
3544
+ ok: z9.literal(true),
3545
+ renderHint: z9.literal("contents_scheduled"),
3546
+ scheduledCount: z9.number().int().min(0),
3547
+ failedCount: z9.number().int().min(0),
3548
+ results: z9.array(z9.discriminatedUnion("ok", [
3549
+ z9.object({
3550
+ ok: z9.literal(true),
3551
+ index: z9.number().int().min(0),
3552
+ content: exports.contentScheduleOutputSchema.shape.content
3553
+ }).strict(),
3554
+ z9.object({
3555
+ ok: z9.literal(false),
3556
+ index: z9.number().int().min(0),
3557
+ contentId: z9.string().uuid(),
3558
+ error: z9.object({
3559
+ code: z9.string(),
3560
+ message: z9.string()
3561
+ }).strict()
3562
+ }).strict()
3563
+ ]))
3564
+ }).strict();
2559
3565
  var publishNowInputShape = {
2560
3566
  contentId: z9.string().uuid().describe("Draft or scheduled content ID to publish now."),
2561
3567
  confirmationText: z9.string().optional().describe("Exact confirmation text: publish_now:<contentId>."),
@@ -2642,7 +3648,7 @@ var require_dist = __commonJS({
2642
3648
  workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
2643
3649
  ...deleteContentInputShape
2644
3650
  }).strict();
2645
- var deleteContentModeSchema = z9.enum(["hard_deleted", "platform_deleted"]);
3651
+ var deleteContentModeSchema = z9.enum(["hard_deleted", "platform_deleted", "locally_deleted"]);
2646
3652
  exports.deleteContentOutputSchema = z9.object({
2647
3653
  content: z9.object({
2648
3654
  mode: deleteContentModeSchema,
@@ -2654,6 +3660,64 @@ var require_dist = __commonJS({
2654
3660
  action: z9.literal("content_deleted")
2655
3661
  }).strict()
2656
3662
  }).strict();
3663
+ var batchContentMutationItemSchema = z9.object({
3664
+ contentId: z9.string().uuid().describe("Content ID to mutate."),
3665
+ label: z9.string().max(200).optional().describe("Display-only content title as you know it; does not change the saved content.")
3666
+ }).strict();
3667
+ exports.PUBLISH_NOW_BATCH_MAX_ITEMS = 20;
3668
+ exports.publishNowBatchInputSchema = z9.object({
3669
+ idempotencyKey: z9.string().max(255).optional().describe("Optional batch idempotency key."),
3670
+ items: z9.array(batchContentMutationItemSchema).min(1).max(exports.PUBLISH_NOW_BATCH_MAX_ITEMS).describe("Content items to publish now under one confirmation.")
3671
+ }).strict();
3672
+ exports.publishNowBatchOutputSchema = z9.object({
3673
+ ok: z9.literal(true),
3674
+ renderHint: z9.literal("contents_published"),
3675
+ publishedCount: z9.number().int().min(0),
3676
+ failedCount: z9.number().int().min(0),
3677
+ results: z9.array(z9.discriminatedUnion("ok", [
3678
+ z9.object({
3679
+ ok: z9.literal(true),
3680
+ index: z9.number().int().min(0),
3681
+ content: exports.publishNowOutputSchema.shape.content
3682
+ }).strict(),
3683
+ z9.object({
3684
+ ok: z9.literal(false),
3685
+ index: z9.number().int().min(0),
3686
+ contentId: z9.string().uuid(),
3687
+ error: z9.object({
3688
+ code: z9.string(),
3689
+ message: z9.string()
3690
+ }).strict()
3691
+ }).strict()
3692
+ ]))
3693
+ }).strict();
3694
+ exports.DELETE_BATCH_MAX_ITEMS = 20;
3695
+ exports.deleteBatchInputSchema = z9.object({
3696
+ idempotencyKey: z9.string().max(255).optional().describe("Optional batch idempotency key."),
3697
+ items: z9.array(batchContentMutationItemSchema).min(1).max(exports.DELETE_BATCH_MAX_ITEMS).describe("Content items to delete under one confirmation.")
3698
+ }).strict();
3699
+ exports.deleteBatchOutputSchema = z9.object({
3700
+ ok: z9.literal(true),
3701
+ renderHint: z9.literal("contents_deleted"),
3702
+ deletedCount: z9.number().int().min(0),
3703
+ failedCount: z9.number().int().min(0),
3704
+ results: z9.array(z9.discriminatedUnion("ok", [
3705
+ z9.object({
3706
+ ok: z9.literal(true),
3707
+ index: z9.number().int().min(0),
3708
+ content: exports.deleteContentOutputSchema.shape.content
3709
+ }).strict(),
3710
+ z9.object({
3711
+ ok: z9.literal(false),
3712
+ index: z9.number().int().min(0),
3713
+ contentId: z9.string().uuid(),
3714
+ error: z9.object({
3715
+ code: z9.string(),
3716
+ message: z9.string()
3717
+ }).strict()
3718
+ }).strict()
3719
+ ]))
3720
+ }).strict();
2657
3721
  exports.CONTENT_SCHEDULE_CONTRACT = {
2658
3722
  canonicalName: exports.TOOL_OPERATION_IDS.contentSchedule,
2659
3723
  wireNames: exports.TOOL_WIRE_NAMES.contentSchedule,
@@ -2676,7 +3740,7 @@ var require_dist = __commonJS({
2676
3740
  surfaces: {
2677
3741
  agent: {
2678
3742
  name: exports.TOOL_WIRE_NAMES.contentSchedule.agent,
2679
- description: "Schedules REAL saved content for publishing on the connected external account and creates the publishing queue job. This always requires explicit user confirmation before executing.",
3743
+ description: "Schedules REAL saved content for publishing on the connected external account and creates the publishing queue job. Requires user confirmation when the workspace autonomy level is always_ask or when a scheduled time is less than one hour away; otherwise it executes directly with a content.unschedule undo.",
2680
3744
  access: "write",
2681
3745
  gated: false,
2682
3746
  safeInputSummary: (input) => `contentId=${input.contentId} scheduledAt=${input.scheduledAt}`
@@ -2696,6 +3760,81 @@ var require_dist = __commonJS({
2696
3760
  }
2697
3761
  }
2698
3762
  };
3763
+ exports.CONTENT_SCHEDULE_BATCH_CONTRACT = defineToolContract({
3764
+ canonicalName: exports.TOOL_OPERATION_IDS.contentScheduleBatch,
3765
+ wireNames: exports.TOOL_WIRE_NAMES.contentScheduleBatch,
3766
+ description: `Schedule up to ${exports.SCHEDULE_BATCH_MAX_ITEMS} Maeve content items in one batch under a single user confirmation.`,
3767
+ inputSchema: exports.contentScheduleBatchInputSchema,
3768
+ outputSchema: exports.contentScheduleBatchOutputSchema,
3769
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.contentSchedule],
3770
+ confirmation: {
3771
+ required: true,
3772
+ actionType: exports.TOOL_OPERATION_IDS.contentScheduleBatch,
3773
+ buildSummary: (input) => buildScheduleBatchConfirmationSummary(input),
3774
+ buildDisplay: (input) => ({
3775
+ kind: "batch",
3776
+ items: input.items.map((item) => ({
3777
+ label: resolveBatchDisplayLabel(item.label, item.contentId),
3778
+ detail: truncateText(item.scheduledAt, 120) ?? item.scheduledAt.slice(0, 120),
3779
+ entityId: item.contentId
3780
+ }))
3781
+ })
3782
+ },
3783
+ idempotency: {
3784
+ required: true,
3785
+ buildKey: (input, context) => [
3786
+ exports.TOOL_OPERATION_IDS.contentScheduleBatch,
3787
+ context.workspaceId,
3788
+ input.idempotencyKey?.trim() || shortStableHash(input)
3789
+ ].join(":")
3790
+ },
3791
+ surfaces: {
3792
+ agent: {
3793
+ name: exports.TOOL_WIRE_NAMES.contentScheduleBatch.agent,
3794
+ description: `Schedules multiple REAL saved content items for publishing under one user confirmation. Prefer this over repeated content.schedule calls whenever the user asks to schedule more than one item (up to ${exports.SCHEDULE_BATCH_MAX_ITEMS} per call). Requires user confirmation when the workspace autonomy level is always_ask or when a scheduled time is less than one hour away; otherwise it executes directly with a content.unschedule undo.`,
3795
+ access: "write",
3796
+ gated: false,
3797
+ safeInputSummary: (input) => `items=${input.items.length} idempotencyKey=${input.idempotencyKey ? "present" : "absent"}`
3798
+ }
3799
+ }
3800
+ });
3801
+ exports.contentUnscheduleInputSchema = z9.object({
3802
+ contentId: z9.string().uuid().describe("Scheduled Maeve content ID to revert to draft.")
3803
+ }).strict();
3804
+ exports.contentUnscheduleOutputSchema = z9.object({
3805
+ ok: z9.literal(true),
3806
+ renderHint: z9.literal("content_unscheduled"),
3807
+ content: z9.object({
3808
+ contentId: z9.string(),
3809
+ status: z9.literal("draft")
3810
+ }).strict()
3811
+ }).strict();
3812
+ exports.CONTENT_UNSCHEDULE_CONTRACT = defineToolContract({
3813
+ canonicalName: exports.TOOL_OPERATION_IDS.contentUnschedule,
3814
+ wireNames: exports.TOOL_WIRE_NAMES.contentUnschedule,
3815
+ description: "Unschedule a scheduled Maeve content item: cancels the publishing queue job and reverts the content to draft. This is the undo for content.schedule and content.schedule_batch.",
3816
+ inputSchema: exports.contentUnscheduleInputSchema,
3817
+ outputSchema: exports.contentUnscheduleOutputSchema,
3818
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.contentSchedule],
3819
+ confirmation: {
3820
+ required: false,
3821
+ actionType: exports.TOOL_OPERATION_IDS.contentUnschedule,
3822
+ buildSummary: (input) => `Unschedule content ${input.contentId} and revert it to a draft.`
3823
+ },
3824
+ idempotency: {
3825
+ required: true,
3826
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.contentUnschedule, context.workspaceId, input.contentId].join(":")
3827
+ },
3828
+ surfaces: {
3829
+ agent: {
3830
+ name: exports.TOOL_WIRE_NAMES.contentUnschedule.agent,
3831
+ description: "Unschedules scheduled Maeve content: cancels the publishing queue job and reverts it to draft. Use this to undo a schedule the user no longer wants. Fails if the content has already been sent or is inside the publish execution window.",
3832
+ access: "write",
3833
+ gated: false,
3834
+ safeInputSummary: (input) => `contentId=${input.contentId}`
3835
+ }
3836
+ }
3837
+ });
2699
3838
  exports.CONTENT_PUBLISH_NOW_CONTRACT = {
2700
3839
  canonicalName: exports.TOOL_OPERATION_IDS.contentPublishNow,
2701
3840
  wireNames: exports.TOOL_WIRE_NAMES.contentPublishNow,
@@ -2709,6 +3848,7 @@ var require_dist = __commonJS({
2709
3848
  confirmation: {
2710
3849
  required: true,
2711
3850
  actionType: exports.TOOL_OPERATION_IDS.contentPublishNow,
3851
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
2712
3852
  buildSummary: (input) => buildPublishNowConfirmationSummary(input)
2713
3853
  },
2714
3854
  idempotency: {
@@ -2738,6 +3878,38 @@ var require_dist = __commonJS({
2738
3878
  }
2739
3879
  }
2740
3880
  };
3881
+ exports.CONTENT_PUBLISH_NOW_BATCH_CONTRACT = defineToolContract({
3882
+ canonicalName: exports.TOOL_OPERATION_IDS.contentPublishNowBatch,
3883
+ wireNames: exports.TOOL_WIRE_NAMES.contentPublishNowBatch,
3884
+ description: `Publish up to ${exports.PUBLISH_NOW_BATCH_MAX_ITEMS} Maeve content items immediately in one batch under a single user confirmation.`,
3885
+ inputSchema: exports.publishNowBatchInputSchema,
3886
+ outputSchema: exports.publishNowBatchOutputSchema,
3887
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.contentPublishNow],
3888
+ confirmation: {
3889
+ required: true,
3890
+ actionType: exports.TOOL_OPERATION_IDS.contentPublishNowBatch,
3891
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
3892
+ buildSummary: (input) => buildPublishNowBatchConfirmationSummary(input),
3893
+ buildDisplay: (input) => buildBatchConfirmationDisplay(input.items)
3894
+ },
3895
+ idempotency: {
3896
+ required: true,
3897
+ buildKey: (input, context) => [
3898
+ exports.TOOL_OPERATION_IDS.contentPublishNowBatch,
3899
+ context.workspaceId,
3900
+ input.idempotencyKey?.trim() || shortStableHash(input)
3901
+ ].join(":")
3902
+ },
3903
+ surfaces: {
3904
+ agent: {
3905
+ name: exports.TOOL_WIRE_NAMES.contentPublishNowBatch.agent,
3906
+ description: `Publishes multiple REAL saved content items immediately under one user confirmation. Prefer this over repeated content.publish_now calls whenever the user asks to publish more than one item (up to ${exports.PUBLISH_NOW_BATCH_MAX_ITEMS} per call). This always requires explicit user confirmation before executing.`,
3907
+ access: "write",
3908
+ gated: false,
3909
+ safeInputSummary: (input) => `items=${input.items.length} idempotencyKey=${input.idempotencyKey ? "present" : "absent"}`
3910
+ }
3911
+ }
3912
+ });
2741
3913
  exports.CONTENT_ARCHIVE_CONTRACT = {
2742
3914
  canonicalName: exports.TOOL_OPERATION_IDS.contentArchive,
2743
3915
  wireNames: exports.TOOL_WIRE_NAMES.contentArchive,
@@ -2760,7 +3932,7 @@ var require_dist = __commonJS({
2760
3932
  surfaces: {
2761
3933
  agent: {
2762
3934
  name: exports.TOOL_WIRE_NAMES.contentArchive.agent,
2763
- description: "Archives REAL published saved content in Maeve. This always requires explicit user confirmation before executing.",
3935
+ description: "Archives REAL published saved content in Maeve. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2764
3936
  access: "write",
2765
3937
  gated: false,
2766
3938
  safeInputSummary: (input) => `contentId=${input.contentId}`
@@ -2802,7 +3974,7 @@ var require_dist = __commonJS({
2802
3974
  surfaces: {
2803
3975
  agent: {
2804
3976
  name: exports.TOOL_WIRE_NAMES.contentRestore.agent,
2805
- description: "Restores REAL archived saved content in Maeve. This always requires explicit user confirmation before executing.",
3977
+ description: "Restores REAL archived saved content in Maeve. Whether this needs user confirmation depends on the workspace agent autonomy level; at the default level it executes directly.",
2806
3978
  access: "write",
2807
3979
  gated: false,
2808
3980
  safeInputSummary: (input) => `contentId=${input.contentId}`
@@ -2835,6 +4007,7 @@ var require_dist = __commonJS({
2835
4007
  confirmation: {
2836
4008
  required: true,
2837
4009
  actionType: exports.TOOL_OPERATION_IDS.contentRetry,
4010
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
2838
4011
  buildSummary: (input) => buildRetryConfirmationSummary(input)
2839
4012
  },
2840
4013
  idempotency: {
@@ -2877,6 +4050,7 @@ var require_dist = __commonJS({
2877
4050
  confirmation: {
2878
4051
  required: true,
2879
4052
  actionType: exports.TOOL_OPERATION_IDS.contentDelete,
4053
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
2880
4054
  buildSummary: (input) => buildDeleteConfirmationSummary(input)
2881
4055
  },
2882
4056
  idempotency: {
@@ -2905,7 +4079,62 @@ var require_dist = __commonJS({
2905
4079
  }
2906
4080
  }
2907
4081
  }
2908
- };
4082
+ };
4083
+ exports.CONTENT_DELETE_BATCH_CONTRACT = defineToolContract({
4084
+ canonicalName: exports.TOOL_OPERATION_IDS.contentDeleteBatch,
4085
+ wireNames: exports.TOOL_WIRE_NAMES.contentDeleteBatch,
4086
+ description: `Delete up to ${exports.DELETE_BATCH_MAX_ITEMS} Maeve content items in one batch under a single user confirmation.`,
4087
+ inputSchema: exports.deleteBatchInputSchema,
4088
+ outputSchema: exports.deleteBatchOutputSchema,
4089
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.contentDraftDelete],
4090
+ confirmation: {
4091
+ required: true,
4092
+ actionType: exports.TOOL_OPERATION_IDS.contentDeleteBatch,
4093
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
4094
+ buildSummary: (input) => buildDeleteBatchConfirmationSummary(input),
4095
+ buildDisplay: (input) => buildBatchConfirmationDisplay(input.items)
4096
+ },
4097
+ idempotency: {
4098
+ required: true,
4099
+ buildKey: (input, context) => [
4100
+ exports.TOOL_OPERATION_IDS.contentDeleteBatch,
4101
+ context.workspaceId,
4102
+ input.idempotencyKey?.trim() || shortStableHash(input)
4103
+ ].join(":")
4104
+ },
4105
+ surfaces: {
4106
+ agent: {
4107
+ name: exports.TOOL_WIRE_NAMES.contentDeleteBatch.agent,
4108
+ description: `Permanently deletes multiple REAL saved content items under one user confirmation. Prefer this over repeated content.delete calls whenever the user asks to delete more than one item (up to ${exports.DELETE_BATCH_MAX_ITEMS} per call). This always requires explicit user confirmation before executing.`,
4109
+ access: "write",
4110
+ gated: false,
4111
+ safeInputSummary: (input) => `items=${input.items.length} idempotencyKey=${input.idempotencyKey ? "present" : "absent"}`
4112
+ }
4113
+ }
4114
+ });
4115
+ function buildComposerCaptionPatchConfirmationSummary(input) {
4116
+ const fieldLabel = input.field === "firstComment" ? "first comment" : "caption";
4117
+ const target = input.platform ? `${input.platform} ${fieldLabel}` : fieldLabel;
4118
+ const preview = truncateText(input.caption, 120);
4119
+ if (preview) {
4120
+ const punctuation = /[.!?]$/.test(preview) ? "" : ".";
4121
+ return `Stage a new ${target} on the open draft: "${preview}"${punctuation} Nothing is saved until you save the draft.`;
4122
+ }
4123
+ return `Stage a new ${target} on the open draft. Nothing is saved until you save the draft.`;
4124
+ }
4125
+ function buildComposerTaxonomyPatchConfirmationSummary(input) {
4126
+ const changed = [];
4127
+ if (input.labelIds)
4128
+ changed.push("labels");
4129
+ if (input.pillarIds)
4130
+ changed.push("pillars");
4131
+ if (input.formatIds)
4132
+ changed.push("formats");
4133
+ if (input.hashtags)
4134
+ changed.push("hashtags");
4135
+ const fields = changed.length > 0 ? changed.join(", ") : "taxonomy";
4136
+ return `Stage a ${fields} change on the open draft. Nothing is saved until you save the draft.`;
4137
+ }
2909
4138
  function buildCreateDraftConfirmationSummary(input) {
2910
4139
  const title = truncateText(resolveCreateDraftTitle(input), 120);
2911
4140
  const captionPreview = title ? null : truncateText(input.captions?.canonical, 120);
@@ -2919,6 +4148,16 @@ var require_dist = __commonJS({
2919
4148
  function hasCreateDraftTitle(input) {
2920
4149
  return Boolean(resolveCreateDraftTitle(input));
2921
4150
  }
4151
+ function buildCreateDraftsConfirmationSummary(input) {
4152
+ const count = input.drafts.length;
4153
+ const integrationCount = new Set(input.drafts.map((draft) => draft.integrationId)).size;
4154
+ const target = integrationCount === 1 ? "1 account" : `${integrationCount} accounts`;
4155
+ const previews = input.drafts.map((draft) => truncateText(resolveCreateDraftTitle(draft) ?? draft.captions?.canonical, 60)).filter((preview) => Boolean(preview)).slice(0, 3).map((preview) => `"${preview}"`);
4156
+ const base = count === 1 ? `Create 1 saved draft for ${target}` : `Create ${count} saved drafts across ${target}`;
4157
+ if (previews.length === 0)
4158
+ return `${base}.`;
4159
+ return `${base}: ${previews.join(", ")}${count > previews.length ? ", \u2026" : ""}.`;
4160
+ }
2922
4161
  function resolveCreateDraftTitle(input) {
2923
4162
  return input.internalTitle?.trim() || input.publishTitle?.trim() || null;
2924
4163
  }
@@ -2940,6 +4179,13 @@ var require_dist = __commonJS({
2940
4179
  }
2941
4180
  function buildUpdateMetadataConfirmationSummary(input) {
2942
4181
  const fields = countUpdateMetadataFields(input);
4182
+ if (Object.prototype.hasOwnProperty.call(input, "organizationalTitle")) {
4183
+ const title = truncateText(input.organizationalTitle?.trim(), 120);
4184
+ if (fields === 1) {
4185
+ return title ? `Rename saved content ${input.contentId} inside Maeve to "${title}".` : `Clear the organizational title for saved content ${input.contentId}.`;
4186
+ }
4187
+ return title ? `Update saved content ${input.contentId} metadata (${fields} fields), including the organizational title "${title}".` : `Update saved content ${input.contentId} metadata (${fields} fields), including clearing the organizational title.`;
4188
+ }
2943
4189
  return `Update saved content ${input.contentId} metadata (${fields} ${fields === 1 ? "field" : "fields"}).`;
2944
4190
  }
2945
4191
  function countUpdateMetadataFields(input) {
@@ -2952,9 +4198,21 @@ var require_dist = __commonJS({
2952
4198
  function buildScheduleConfirmationSummary(input) {
2953
4199
  return `Schedule real publishing for saved content ${input.contentId} on the connected external account at ${input.scheduledAt}.`;
2954
4200
  }
4201
+ function buildScheduleBatchConfirmationSummary(input) {
4202
+ const count = input.items.length;
4203
+ const previews = input.items.slice(0, 3).map((item) => `"${resolveBatchDisplayLabel(item.label, item.contentId)}"`);
4204
+ const base = `Schedule ${count} ${count === 1 ? "post" : "posts"}`;
4205
+ return `${base}: ${previews.join(", ")}${count > previews.length ? ", \u2026" : ""}.`;
4206
+ }
4207
+ function resolveBatchDisplayLabel(label, contentId) {
4208
+ return truncateText(label, 120) ?? contentId.slice(0, 8);
4209
+ }
2955
4210
  function buildPublishNowConfirmationSummary(input) {
2956
4211
  return `Publish saved content ${input.contentId} immediately to the connected external account.`;
2957
4212
  }
4213
+ function buildPublishNowBatchConfirmationSummary(input) {
4214
+ return buildBatchConfirmationSummary("Publish", input.items, "now");
4215
+ }
2958
4216
  function buildArchiveConfirmationSummary(input) {
2959
4217
  return `Archive saved content ${input.contentId}.`;
2960
4218
  }
@@ -2967,6 +4225,24 @@ var require_dist = __commonJS({
2967
4225
  function buildDeleteConfirmationSummary(input) {
2968
4226
  return `Permanently delete saved content ${input.contentId}. This will delete the content item from Maeve and cannot be undone.`;
2969
4227
  }
4228
+ function buildDeleteBatchConfirmationSummary(input) {
4229
+ return `${buildBatchConfirmationSummary("Permanently delete", input.items)} This cannot be undone.`;
4230
+ }
4231
+ function buildBatchConfirmationSummary(action, items, suffix = "") {
4232
+ const count = items.length;
4233
+ const previews = items.slice(0, 3).map((item) => `"${resolveBatchDisplayLabel(item.label, item.contentId)}"`);
4234
+ const timing = suffix ? ` ${suffix}` : "";
4235
+ return `${action} ${count} ${count === 1 ? "post" : "posts"}${timing}: ${previews.join(", ")}${count > previews.length ? ", \u2026" : ""}.`;
4236
+ }
4237
+ function buildBatchConfirmationDisplay(items) {
4238
+ return {
4239
+ kind: "batch",
4240
+ items: items.map((item) => ({
4241
+ label: resolveBatchDisplayLabel(item.label, item.contentId),
4242
+ entityId: item.contentId
4243
+ }))
4244
+ };
4245
+ }
2970
4246
  function shortStableHash(value) {
2971
4247
  const text = stableStringify(value);
2972
4248
  let hash = 2166136261;
@@ -3054,6 +4330,322 @@ var require_dist = __commonJS({
3054
4330
  }
3055
4331
  }
3056
4332
  };
4333
+ var INBOX_AUTOMATION_MAX_KEYWORDS = 20;
4334
+ var INBOX_AUTOMATION_MAX_KEYWORD_LENGTH = 80;
4335
+ var INBOX_AUTOMATION_BODY_TRANSPORT_MAX = 1e4;
4336
+ var inboxAutomationToolsets = ["inbox_automation"];
4337
+ var inboxAutomationTriggerSchema = z9.enum(["comment_keyword", "dm_keyword", "dm_welcome"]);
4338
+ var inboxAutomationMatchModeSchema = z9.enum(["any", "contains", "exact"]);
4339
+ var inboxAutomationPostScopeSchema = z9.enum(["all", "specific"]);
4340
+ var inboxAutomationExecutionStatusSchema = z9.enum(["pending", "completed", "partial", "failed", "skipped", "expired"]);
4341
+ var inboxAutomationKeywordsSchema = z9.array(z9.string().trim().toLowerCase().max(INBOX_AUTOMATION_MAX_KEYWORD_LENGTH)).max(INBOX_AUTOMATION_MAX_KEYWORDS).describe('Keywords the trigger matches on. Ignored when matchMode is "any".');
4342
+ var inboxAutomationReplyBodySchema = z9.string().trim().max(INBOX_AUTOMATION_BODY_TRANSPORT_MAX);
4343
+ var inboxAutomationRuleSchema = z9.object({
4344
+ id: z9.string(),
4345
+ integrationId: z9.string(),
4346
+ name: z9.string(),
4347
+ trigger: inboxAutomationTriggerSchema,
4348
+ matchMode: inboxAutomationMatchModeSchema,
4349
+ keywords: z9.array(z9.string()),
4350
+ postScope: inboxAutomationPostScopeSchema,
4351
+ postIds: z9.array(z9.string()),
4352
+ publicReplyBody: z9.string().nullable(),
4353
+ privateReplyBody: z9.string().nullable(),
4354
+ dmReplyBody: z9.string().nullable(),
4355
+ applyTagIds: z9.array(z9.string()),
4356
+ assignToUserId: z9.string().nullable(),
4357
+ disclosureEnabled: z9.boolean(),
4358
+ cooldownHours: z9.number().int(),
4359
+ dailyCap: z9.number().int(),
4360
+ enabled: z9.boolean(),
4361
+ pausedAt: z9.string().nullable(),
4362
+ pausedReason: z9.string().nullable(),
4363
+ consecutiveFailures: z9.number().int(),
4364
+ createdByUserId: z9.string().nullable(),
4365
+ createdAt: z9.string().nullable(),
4366
+ updatedAt: z9.string().nullable(),
4367
+ executionCount: z9.number().int()
4368
+ }).strict();
4369
+ var inboxAutomationExecutionSchema = z9.object({
4370
+ id: z9.string(),
4371
+ ruleId: z9.string(),
4372
+ threadId: z9.string(),
4373
+ triggerMessageId: z9.string(),
4374
+ participantPlatformId: z9.string().nullable(),
4375
+ platformCommentId: z9.string().nullable(),
4376
+ privateReplyPlanned: z9.boolean(),
4377
+ status: inboxAutomationExecutionStatusSchema,
4378
+ actionsPlanned: z9.array(z9.string()),
4379
+ actionsCompleted: z9.record(z9.string(), z9.unknown()),
4380
+ error: z9.string().nullable(),
4381
+ deferredUntil: z9.string().nullable(),
4382
+ deferCount: z9.number().int(),
4383
+ createdAt: z9.string().nullable(),
4384
+ completedAt: z9.string().nullable()
4385
+ }).strict();
4386
+ exports.inboxAutomationRulesListInputSchema = z9.object({}).strict();
4387
+ exports.inboxAutomationRulesListMcpInputSchema = z9.object({
4388
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID.")
4389
+ }).strict();
4390
+ var inboxAutomationRuleGetInputShape = {
4391
+ ruleId: z9.string().uuid().describe("Automation rule ID.")
4392
+ };
4393
+ exports.inboxAutomationRuleGetInputSchema = z9.object(inboxAutomationRuleGetInputShape).strict();
4394
+ exports.inboxAutomationRuleGetMcpInputSchema = z9.object({
4395
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
4396
+ ...inboxAutomationRuleGetInputShape
4397
+ }).strict();
4398
+ var createInboxAutomationRuleInputShape = {
4399
+ name: z9.string().trim().min(1).max(120).describe("Rule name shown in the inbox automation dialog."),
4400
+ integrationId: z9.string().uuid().describe("Instagram or Facebook integration the rule listens on."),
4401
+ trigger: inboxAutomationTriggerSchema.describe("comment_keyword replies to post comments, dm_keyword replies to DMs, dm_welcome greets first-time DMs."),
4402
+ matchMode: inboxAutomationMatchModeSchema.optional().describe('Keyword match mode. Defaults to "contains".'),
4403
+ keywords: inboxAutomationKeywordsSchema.optional(),
4404
+ postScope: inboxAutomationPostScopeSchema.optional().describe('Comment rules only. Defaults to "all".'),
4405
+ postIds: z9.array(z9.string().max(255)).max(50).optional().describe('Post IDs the rule targets when postScope is "specific".'),
4406
+ publicReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("Public comment reply body."),
4407
+ privateReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("Private reply sent to the commenter as a DM."),
4408
+ dmReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("DM reply body for DM rules."),
4409
+ applyTagIds: z9.array(z9.string().uuid()).max(20).optional().describe("Inbox tag IDs applied to the matched thread."),
4410
+ assignToUserId: z9.string().uuid().nullable().optional().describe("Workspace member assigned to the matched thread."),
4411
+ disclosureEnabled: z9.boolean().optional().describe("Append the automated-reply disclosure line to sends. Defaults to true."),
4412
+ cooldownHours: z9.number().int().min(0).max(168).optional().describe("Per-participant cooldown in hours (0-168). Defaults to 24."),
4413
+ dailyCap: z9.number().int().min(1).max(1e3).optional().describe("Maximum executions per day. Defaults to 200."),
4414
+ enabled: z9.boolean().optional().describe("MCP creates default to disabled; pass true (or update later) to start the rule.")
4415
+ };
4416
+ exports.createInboxAutomationRuleInputSchema = z9.object(createInboxAutomationRuleInputShape).strict();
4417
+ exports.createInboxAutomationRuleMcpInputSchema = z9.object({
4418
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
4419
+ ...createInboxAutomationRuleInputShape
4420
+ }).strict();
4421
+ var updateInboxAutomationRuleInputShape = {
4422
+ ruleId: z9.string().uuid().describe("Automation rule ID."),
4423
+ name: z9.string().trim().min(1).max(120).optional(),
4424
+ trigger: inboxAutomationTriggerSchema.optional(),
4425
+ matchMode: inboxAutomationMatchModeSchema.optional(),
4426
+ keywords: inboxAutomationKeywordsSchema.optional(),
4427
+ postScope: inboxAutomationPostScopeSchema.optional(),
4428
+ postIds: z9.array(z9.string().max(255)).max(50).optional(),
4429
+ publicReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("Pass null to clear."),
4430
+ privateReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("Pass null to clear."),
4431
+ dmReplyBody: inboxAutomationReplyBodySchema.nullable().optional().describe("Pass null to clear."),
4432
+ applyTagIds: z9.array(z9.string().uuid()).max(20).optional(),
4433
+ assignToUserId: z9.string().uuid().nullable().optional().describe("Pass null to clear."),
4434
+ disclosureEnabled: z9.boolean().optional(),
4435
+ cooldownHours: z9.number().int().min(0).max(168).optional(),
4436
+ dailyCap: z9.number().int().min(1).max(1e3).optional(),
4437
+ enabled: z9.boolean().optional().describe("Enable or disable the rule. Enabling clears an auto-pause and resets the failure counter.")
4438
+ };
4439
+ exports.updateInboxAutomationRuleInputSchema = z9.object(updateInboxAutomationRuleInputShape).strict();
4440
+ exports.updateInboxAutomationRuleMcpInputSchema = z9.object({
4441
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
4442
+ ...updateInboxAutomationRuleInputShape
4443
+ }).strict();
4444
+ var deleteInboxAutomationRuleInputShape = {
4445
+ ruleId: z9.string().uuid().describe("Automation rule ID to delete."),
4446
+ confirmationText: z9.string().optional().describe("Exact confirmation text: inbox_automation_delete:<ruleId>."),
4447
+ dangerouslyAutoConfirm: z9.boolean().optional().describe("Never honored for this action; deletion always requires the exact confirmation text.")
4448
+ };
4449
+ exports.deleteInboxAutomationRuleInputSchema = z9.object(deleteInboxAutomationRuleInputShape).strict();
4450
+ exports.deleteInboxAutomationRuleMcpInputSchema = z9.object({
4451
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
4452
+ ...deleteInboxAutomationRuleInputShape
4453
+ }).strict();
4454
+ var listInboxAutomationExecutionsInputShape = {
4455
+ ruleId: z9.string().uuid().describe("Automation rule ID."),
4456
+ limit: z9.number().int().min(1).max(100).optional().describe("Executions per page (max 100, default 50)."),
4457
+ offset: z9.number().int().min(0).optional().describe("Rows to skip."),
4458
+ status: inboxAutomationExecutionStatusSchema.optional().describe("Filter by execution status.")
4459
+ };
4460
+ exports.listInboxAutomationExecutionsInputSchema = z9.object(listInboxAutomationExecutionsInputShape).strict();
4461
+ exports.listInboxAutomationExecutionsMcpInputSchema = z9.object({
4462
+ workspaceId: z9.string().uuid().describe("Maeve workspace ID."),
4463
+ ...listInboxAutomationExecutionsInputShape
4464
+ }).strict();
4465
+ exports.inboxAutomationRulesListOutputSchema = z9.object({
4466
+ rules: z9.array(inboxAutomationRuleSchema)
4467
+ }).strict();
4468
+ exports.inboxAutomationRuleResultOutputSchema = z9.object({
4469
+ rule: inboxAutomationRuleSchema
4470
+ }).strict();
4471
+ exports.deleteInboxAutomationRuleOutputSchema = z9.object({
4472
+ success: z9.literal(true),
4473
+ confirmationMode: lifecycleConfirmationModeSchema
4474
+ }).strict();
4475
+ exports.listInboxAutomationExecutionsOutputSchema = z9.object({
4476
+ executions: z9.array(inboxAutomationExecutionSchema),
4477
+ total: z9.number().int().nonnegative()
4478
+ }).strict();
4479
+ function buildDeleteInboxAutomationRuleConfirmationSummary(input) {
4480
+ return `Permanently delete inbox automation rule ${input.ruleId}. The rule stops matching immediately and its configuration cannot be recovered.`;
4481
+ }
4482
+ exports.INBOX_AUTOMATION_RULES_LIST_CONTRACT = {
4483
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationRulesList,
4484
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationRulesList,
4485
+ description: "List the inbox auto-reply automation rules configured for a workspace, including enabled/paused state and execution counts.",
4486
+ inputSchema: exports.inboxAutomationRulesListInputSchema,
4487
+ wireInputSchemas: {
4488
+ mcp: exports.inboxAutomationRulesListMcpInputSchema
4489
+ },
4490
+ outputSchema: exports.inboxAutomationRulesListOutputSchema,
4491
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxRead],
4492
+ confirmation: { required: false },
4493
+ idempotency: { required: false },
4494
+ surfaces: {
4495
+ mcp: {
4496
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationRulesList.mcp,
4497
+ title: "List Inbox Automation Rules",
4498
+ description: "List the inbox auto-reply automation rules configured for a workspace, including enabled/paused state and execution counts.",
4499
+ scope: "mcp:read",
4500
+ toolsets: inboxAutomationToolsets,
4501
+ annotations: mcpReadAnnotations
4502
+ }
4503
+ }
4504
+ };
4505
+ exports.INBOX_AUTOMATION_RULE_GET_CONTRACT = {
4506
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationRuleGet,
4507
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationRuleGet,
4508
+ description: "Get one inbox auto-reply automation rule with its full trigger, action, and safety configuration.",
4509
+ inputSchema: exports.inboxAutomationRuleGetInputSchema,
4510
+ wireInputSchemas: {
4511
+ mcp: exports.inboxAutomationRuleGetMcpInputSchema
4512
+ },
4513
+ outputSchema: exports.inboxAutomationRuleResultOutputSchema,
4514
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxRead],
4515
+ confirmation: { required: false },
4516
+ idempotency: { required: false },
4517
+ surfaces: {
4518
+ mcp: {
4519
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationRuleGet.mcp,
4520
+ title: "Get Inbox Automation Rule",
4521
+ description: "Get one inbox auto-reply automation rule with its full trigger, action, and safety configuration.",
4522
+ scope: "mcp:read",
4523
+ toolsets: inboxAutomationToolsets,
4524
+ annotations: mcpReadAnnotations
4525
+ }
4526
+ }
4527
+ };
4528
+ exports.INBOX_AUTOMATION_RULE_CREATE_CONTRACT = {
4529
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationRuleCreate,
4530
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationRuleCreate,
4531
+ description: "Create an inbox auto-reply automation rule for an Instagram or Facebook account. MCP creates default to disabled so a half-configured rule never replies to real customers; enable it explicitly once configured.",
4532
+ inputSchema: exports.createInboxAutomationRuleInputSchema,
4533
+ wireInputSchemas: {
4534
+ mcp: exports.createInboxAutomationRuleMcpInputSchema
4535
+ },
4536
+ outputSchema: exports.inboxAutomationRuleResultOutputSchema,
4537
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxAutomationManage],
4538
+ confirmation: { required: false },
4539
+ idempotency: {
4540
+ required: true,
4541
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.inboxAutomationRuleCreate, context.workspaceId, shortStableHash(input)].join(":")
4542
+ },
4543
+ surfaces: {
4544
+ mcp: {
4545
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationRuleCreate.mcp,
4546
+ title: "Create Inbox Automation Rule",
4547
+ description: "Create an inbox auto-reply automation rule for an Instagram or Facebook account. MCP creates default to disabled so a half-configured rule never replies to real customers; enable it explicitly (enabled: true here, or via update) once configured.",
4548
+ scope: "mcp:write",
4549
+ toolsets: inboxAutomationToolsets,
4550
+ annotations: {
4551
+ readOnlyHint: false,
4552
+ destructiveHint: false,
4553
+ idempotentHint: false,
4554
+ openWorldHint: false
4555
+ }
4556
+ }
4557
+ }
4558
+ };
4559
+ exports.INBOX_AUTOMATION_RULE_UPDATE_CONTRACT = {
4560
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationRuleUpdate,
4561
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationRuleUpdate,
4562
+ description: "Update an inbox auto-reply automation rule. The enabled field enables or disables the rule; enabling clears an auto-pause and resets the failure counter. Rules stay pinned to their integration; retargeting is delete + recreate.",
4563
+ inputSchema: exports.updateInboxAutomationRuleInputSchema,
4564
+ wireInputSchemas: {
4565
+ mcp: exports.updateInboxAutomationRuleMcpInputSchema
4566
+ },
4567
+ outputSchema: exports.inboxAutomationRuleResultOutputSchema,
4568
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxAutomationManage],
4569
+ confirmation: { required: false },
4570
+ idempotency: {
4571
+ required: true,
4572
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.inboxAutomationRuleUpdate, context.workspaceId, input.ruleId, shortStableHash(input)].join(":")
4573
+ },
4574
+ surfaces: {
4575
+ mcp: {
4576
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationRuleUpdate.mcp,
4577
+ title: "Update Inbox Automation Rule",
4578
+ description: "Update an inbox auto-reply automation rule. Set enabled to true or false to enable or disable it; enabling clears an auto-pause and resets the failure counter.",
4579
+ scope: "mcp:write",
4580
+ toolsets: inboxAutomationToolsets,
4581
+ annotations: {
4582
+ readOnlyHint: false,
4583
+ destructiveHint: false,
4584
+ idempotentHint: true,
4585
+ openWorldHint: false
4586
+ }
4587
+ }
4588
+ }
4589
+ };
4590
+ exports.INBOX_AUTOMATION_RULE_DELETE_CONTRACT = {
4591
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationRuleDelete,
4592
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationRuleDelete,
4593
+ description: "Permanently delete an inbox auto-reply automation rule. High-risk: requires the exact confirmation text inbox_automation_delete:<ruleId>; dangerous auto-confirm is never honored for this action.",
4594
+ inputSchema: exports.deleteInboxAutomationRuleInputSchema,
4595
+ wireInputSchemas: {
4596
+ mcp: exports.deleteInboxAutomationRuleMcpInputSchema
4597
+ },
4598
+ outputSchema: exports.deleteInboxAutomationRuleOutputSchema,
4599
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxAutomationManage],
4600
+ confirmation: {
4601
+ required: true,
4602
+ actionType: exports.TOOL_OPERATION_IDS.inboxAutomationRuleDelete,
4603
+ ttlMs: exports.CONFIRMATION_TTL_PUBLISH_DESTRUCTIVE_MS,
4604
+ buildSummary: (input) => buildDeleteInboxAutomationRuleConfirmationSummary(input)
4605
+ },
4606
+ idempotency: {
4607
+ required: true,
4608
+ buildKey: (input, context) => [exports.TOOL_OPERATION_IDS.inboxAutomationRuleDelete, context.workspaceId, input.ruleId, shortStableHash(input)].join(":")
4609
+ },
4610
+ surfaces: {
4611
+ mcp: {
4612
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationRuleDelete.mcp,
4613
+ title: "Delete Inbox Automation Rule",
4614
+ description: "Permanently delete an inbox auto-reply automation rule. High-risk: requires the exact confirmation text inbox_automation_delete:<ruleId>; dangerous auto-confirm is never honored for this action.",
4615
+ scope: "mcp:write",
4616
+ toolsets: inboxAutomationToolsets,
4617
+ annotations: {
4618
+ readOnlyHint: false,
4619
+ destructiveHint: true,
4620
+ idempotentHint: false,
4621
+ openWorldHint: false
4622
+ }
4623
+ }
4624
+ }
4625
+ };
4626
+ exports.INBOX_AUTOMATION_EXECUTIONS_LIST_CONTRACT = {
4627
+ canonicalName: exports.TOOL_OPERATION_IDS.inboxAutomationExecutionsList,
4628
+ wireNames: exports.TOOL_WIRE_NAMES.inboxAutomationExecutionsList,
4629
+ description: "List the execution history of an inbox auto-reply automation rule, including per-action outcomes and pacing deferrals.",
4630
+ inputSchema: exports.listInboxAutomationExecutionsInputSchema,
4631
+ wireInputSchemas: {
4632
+ mcp: exports.listInboxAutomationExecutionsMcpInputSchema
4633
+ },
4634
+ outputSchema: exports.listInboxAutomationExecutionsOutputSchema,
4635
+ requiredCapabilities: [exports.TOOL_CAPABILITIES.inboxRead],
4636
+ confirmation: { required: false },
4637
+ idempotency: { required: false },
4638
+ surfaces: {
4639
+ mcp: {
4640
+ name: exports.TOOL_WIRE_NAMES.inboxAutomationExecutionsList.mcp,
4641
+ title: "List Inbox Automation Executions",
4642
+ description: "List the execution history of an inbox auto-reply automation rule, including per-action outcomes and pacing deferrals.",
4643
+ scope: "mcp:read",
4644
+ toolsets: inboxAutomationToolsets,
4645
+ annotations: mcpReadAnnotations
4646
+ }
4647
+ }
4648
+ };
3057
4649
  exports.TOOL_CONTRACTS = [
3058
4650
  exports.WORKSPACE_SUMMARY_CONTRACT,
3059
4651
  exports.MEMORY_LIST_CONTRACT,
@@ -3069,22 +4661,45 @@ var require_dist = __commonJS({
3069
4661
  exports.CONTENT_LIST_CONTRACT,
3070
4662
  exports.CONTENT_GET_CONTRACT,
3071
4663
  exports.CONTENT_GET_COUNTS_CONTRACT,
4664
+ exports.TASK_BOARD_LIST_CONTRACT,
4665
+ exports.TASK_GET_CONTRACT,
4666
+ exports.TASK_LIST_FOR_POST_CONTRACT,
4667
+ exports.TASK_LIST_ARCHIVED_CONTRACT,
4668
+ exports.TASK_CREATE_CONTRACT,
4669
+ exports.TASK_UPDATE_CONTRACT,
4670
+ exports.TASK_MOVE_CONTRACT,
4671
+ exports.TASK_ARCHIVE_CONTRACT,
4672
+ exports.TASK_RESTORE_CONTRACT,
4673
+ exports.TASK_DELETE_CONTRACT,
4674
+ exports.TASK_COMMENT_CREATE_CONTRACT,
4675
+ exports.TASK_CHECKLIST_ITEM_CREATE_CONTRACT,
4676
+ exports.TASK_CHECKLIST_ITEM_UPDATE_CONTRACT,
4677
+ exports.TASK_CHECKLIST_ITEM_MOVE_CONTRACT,
4678
+ exports.TASK_CHECKLIST_ITEM_DELETE_CONTRACT,
3072
4679
  exports.INTEGRATIONS_LIST_CONTRACT,
3073
4680
  exports.INTEGRATIONS_GET_CAPABILITIES_CONTRACT,
3074
4681
  exports.INTEGRATIONS_GET_OPTIONS_CONTRACT,
3075
4682
  exports.TAXONOMY_LIST_CONTRACT,
3076
4683
  exports.CAMPAIGNS_LIST_CONTRACT,
3077
4684
  exports.HASHTAG_GROUPS_LIST_CONTRACT,
4685
+ // No Workbench command exists on any package surface (Maeve agent, CLI,
4686
+ // MCP). Document 06 removed the dormant Workbench list/get/patch contracts
4687
+ // entirely; future Workbench tools require a separate approved plan.
3078
4688
  exports.CONTENT_CREATE_DRAFT_CONTRACT,
4689
+ exports.CONTENT_CREATE_DRAFTS_CONTRACT,
3079
4690
  exports.CONTENT_UPDATE_DRAFT_CONTRACT,
3080
4691
  exports.CONTENT_UPDATE_METADATA_CONTRACT,
3081
4692
  exports.CONTENT_UPDATE_NOTES_CONTRACT,
3082
4693
  exports.CONTENT_SCHEDULE_CONTRACT,
4694
+ exports.CONTENT_SCHEDULE_BATCH_CONTRACT,
4695
+ exports.CONTENT_UNSCHEDULE_CONTRACT,
3083
4696
  exports.CONTENT_PUBLISH_NOW_CONTRACT,
4697
+ exports.CONTENT_PUBLISH_NOW_BATCH_CONTRACT,
3084
4698
  exports.CONTENT_ARCHIVE_CONTRACT,
3085
4699
  exports.CONTENT_RESTORE_CONTRACT,
3086
4700
  exports.CONTENT_RETRY_CONTRACT,
3087
4701
  exports.CONTENT_DELETE_CONTRACT,
4702
+ exports.CONTENT_DELETE_BATCH_CONTRACT,
3088
4703
  exports.CONTENT_SET_INTENDED_PUBLISH_TIME_CONTRACT,
3089
4704
  exports.MEDIA_LIST_CONTRACT,
3090
4705
  exports.MEDIA_LIST_FOLDERS_CONTRACT,
@@ -3099,7 +4714,13 @@ var require_dist = __commonJS({
3099
4714
  exports.ANALYTICS_GET_POSTS_CONTRACT,
3100
4715
  exports.ANALYTICS_GET_POSTS_AGGREGATE_CONTRACT,
3101
4716
  exports.ANALYTICS_GET_POST_CONTRACT,
3102
- exports.ANALYTICS_GET_DEMOGRAPHICS_CONTRACT
4717
+ exports.ANALYTICS_GET_DEMOGRAPHICS_CONTRACT,
4718
+ exports.INBOX_AUTOMATION_RULES_LIST_CONTRACT,
4719
+ exports.INBOX_AUTOMATION_RULE_GET_CONTRACT,
4720
+ exports.INBOX_AUTOMATION_RULE_CREATE_CONTRACT,
4721
+ exports.INBOX_AUTOMATION_RULE_UPDATE_CONTRACT,
4722
+ exports.INBOX_AUTOMATION_RULE_DELETE_CONTRACT,
4723
+ exports.INBOX_AUTOMATION_EXECUTIONS_LIST_CONTRACT
3103
4724
  ];
3104
4725
  }
3105
4726
  });
@@ -4407,16 +6028,22 @@ var threadsReplyControlValues = [
4407
6028
  "parent_post_author_only",
4408
6029
  "followers_only"
4409
6030
  ];
6031
+ var googleBusinessProfilePostTypes = ["standard", "event", "offer"];
6032
+ var googleBusinessProfileCtaTypes = ["book", "order", "shop", "learn_more", "sign_up", "call"];
4410
6033
  var settingsSchema = z4.object({
4411
6034
  collaborators: z4.array(z4.string()).optional(),
4412
6035
  locationId: z4.string().optional(),
6036
+ trialReel: z4.boolean().optional(),
6037
+ trialReelGraduationStrategy: z4.enum(["manual", "automatic"]).optional(),
6038
+ audio_id: z4.string().optional(),
6039
+ audio_volume: z4.number().min(0).max(100).optional(),
6040
+ video_volume: z4.number().min(0).max(100).optional(),
4413
6041
  facebookLinkUrl: z4.string().optional(),
4414
6042
  facebookCtaType: z4.enum(facebookPagePostCtaTypes).optional(),
4415
6043
  facebookLocationId: z4.string().optional(),
4416
6044
  xCommunityUrl: z4.string().optional(),
4417
6045
  topicTag: z4.string().optional(),
4418
6046
  linkAttachment: z4.string().optional(),
4419
- isGhostPost: z4.boolean().optional(),
4420
6047
  replyControl: z4.enum(threadsReplyControlValues).optional(),
4421
6048
  privacy_level: z4.string().optional(),
4422
6049
  disable_comment: z4.boolean().optional(),
@@ -4428,6 +6055,7 @@ var settingsSchema = z4.object({
4428
6055
  tiktok_post_to_drafts: z4.boolean().optional(),
4429
6056
  photo_cover_index: z4.number().optional(),
4430
6057
  auto_add_music: z4.boolean().optional(),
6058
+ tiktok_music: z4.record(z4.string(), z4.unknown()).optional(),
4431
6059
  privacyStatus: z4.enum(["public", "unlisted", "private"]).optional(),
4432
6060
  categoryId: z4.string().optional(),
4433
6061
  tags: z4.array(z4.string()).optional(),
@@ -4437,7 +6065,17 @@ var settingsSchema = z4.object({
4437
6065
  license: z4.enum(["youtube", "creativeCommon"]).optional(),
4438
6066
  boardId: z4.string().optional(),
4439
6067
  link: z4.string().optional(),
4440
- altText: z4.string().optional()
6068
+ altText: z4.string().optional(),
6069
+ googlePostType: z4.enum(googleBusinessProfilePostTypes).optional(),
6070
+ googleCallToActionType: z4.enum(googleBusinessProfileCtaTypes).optional(),
6071
+ googleCallToActionUrl: z4.string().optional(),
6072
+ googleEventTitle: z4.string().optional(),
6073
+ googleEventStartAt: z4.string().optional(),
6074
+ googleEventEndAt: z4.string().optional(),
6075
+ googleOfferCouponCode: z4.string().optional(),
6076
+ googleOfferRedeemOnlineUrl: z4.string().optional(),
6077
+ googleOfferTerms: z4.string().optional(),
6078
+ googleLanguageCode: z4.string().optional()
4441
6079
  }).strict().superRefine((settings, context) => {
4442
6080
  for (const key of unsupportedSettingsKeys) {
4443
6081
  if (Object.prototype.hasOwnProperty.call(settings, key)) {
@@ -4459,7 +6097,14 @@ var createContentBaseSchema = z4.object({
4459
6097
  contentMedia: contentMediaSchema.optional(),
4460
6098
  scheduledAt: isoWithTimezone.optional(),
4461
6099
  settings: settingsSchema,
4462
- postType: z4.enum(["post", "reel", "story", "thread"]).optional(),
6100
+ postType: z4.enum(["post", "reel", "story", "thread", "poll"]).optional(),
6101
+ poll: z4.object({
6102
+ question: z4.string().min(1).max(140),
6103
+ options: z4.array(z4.object({ text: z4.string().min(1).max(30) }).strict()).min(2).max(4),
6104
+ duration: z4.enum(["ONE_DAY", "THREE_DAYS", "SEVEN_DAYS", "FOURTEEN_DAYS"]),
6105
+ voteSelectionType: z4.literal("SINGLE_VOTE").optional(),
6106
+ isVoterVisibleToAuthor: z4.literal(true).optional()
6107
+ }).strict().nullable().optional(),
4463
6108
  firstComment: z4.string().optional(),
4464
6109
  shareToFeed: z4.boolean().optional(),
4465
6110
  pillarIds: z4.array(uuid4).optional(),
@@ -5933,6 +7578,181 @@ function registerTaxonomyCommands(program) {
5933
7578
  });
5934
7579
  }
5935
7580
 
7581
+ // src/tasks-schema.ts
7582
+ var import_tool_contracts2 = __toESM(require_dist(), 1);
7583
+ var createTaskSchema = import_tool_contracts2.createTaskBodySchema;
7584
+ var updateTaskSchema = import_tool_contracts2.updateTaskBodySchema;
7585
+ var moveTaskSchema = import_tool_contracts2.moveTaskBodySchema;
7586
+ var createTaskCommentSchema = import_tool_contracts2.createTaskCommentBodySchema;
7587
+ var createTaskChecklistItemSchema = import_tool_contracts2.createTaskChecklistItemBodySchema;
7588
+ var updateTaskChecklistItemSchema = import_tool_contracts2.updateTaskChecklistItemBodySchema;
7589
+ var moveTaskChecklistItemSchema = import_tool_contracts2.moveTaskChecklistItemBodySchema;
7590
+
7591
+ // src/commands/tasks.ts
7592
+ function registerTaskCommands(program) {
7593
+ addConnectionOptions(program.command("tasks:list")).description("List task board columns, active tasks, and members for a workspace.").requiredOption("-w, --workspace <id>", "Workspace ID.").action(async (options, command) => {
7594
+ const client = createApiClient(resolveConfig(command));
7595
+ writeRawJson(await client.request("GET", `/v1/workspaces/${options.workspace}/task-board`));
7596
+ });
7597
+ addConnectionOptions(program.command("tasks:archive")).description("List archived task board tasks.").requiredOption("-w, --workspace <id>", "Workspace ID.").option("--limit <number>", "Page size.").option("--cursor <cursor>", "Pagination cursor.").action(async (options, command) => {
7598
+ const client = createApiClient(resolveConfig(command));
7599
+ writeRawJson(
7600
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/archive`, {
7601
+ query: { limit: options.limit, cursor: options.cursor }
7602
+ })
7603
+ );
7604
+ });
7605
+ addConnectionOptions(program.command("tasks:get")).description("Get one task board task with checklist items and optional comments or activity.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").option("--include-comments", "Include task comments.").option("--include-activity", "Include task activity.").option("--activity-limit <number>", "Activity page size.").option("--activity-cursor <cursor>", "Activity pagination cursor.").action(async (options, command) => {
7606
+ const client = createApiClient(resolveConfig(command));
7607
+ writeRawJson(
7608
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}`, {
7609
+ query: {
7610
+ includeComments: options.includeComments,
7611
+ includeActivity: options.includeActivity,
7612
+ activityLimit: options.activityLimit,
7613
+ activityCursor: options.activityCursor
7614
+ }
7615
+ })
7616
+ );
7617
+ });
7618
+ addConnectionOptions(program.command("tasks:for-post")).description("List active task board tasks linked to a content post.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--post-id <postId>", "Content post ID.").action(async (options, command) => {
7619
+ const client = createApiClient(resolveConfig(command));
7620
+ writeRawJson(
7621
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/posts/${options.postId}/tasks`)
7622
+ );
7623
+ });
7624
+ addConnectionOptions(program.command("tasks:linkable-posts")).description("List content posts that can be linked to task board tasks.").requiredOption("-w, --workspace <id>", "Workspace ID.").option("--query <text>", "Search text.").option("--limit <number>", "Page size.").option("--sort <sort>", "Sort order: suggested, recent, created, or title.").option("--stage <stage>", "Filter by stage: idea, drafting, review, scheduled, or published.").option("--board <filter>", "Filter by content board placement: on_board or off_board.").action(async (options, command) => {
7625
+ const client = createApiClient(resolveConfig(command));
7626
+ writeRawJson(
7627
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/linkable-posts`, {
7628
+ query: {
7629
+ query: options.query,
7630
+ limit: options.limit,
7631
+ sort: options.sort,
7632
+ stage: options.stage,
7633
+ board: options.board
7634
+ }
7635
+ })
7636
+ );
7637
+ });
7638
+ addConnectionOptions(program.command("tasks:comments")).description("List comments for one task board task.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").action(async (options, command) => {
7639
+ const client = createApiClient(resolveConfig(command));
7640
+ writeRawJson(
7641
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/comments`)
7642
+ );
7643
+ });
7644
+ addConnectionOptions(program.command("tasks:activity")).description("List activity for one task board task.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").option("--limit <number>", "Page size.").option("--cursor <cursor>", "Pagination cursor.").action(async (options, command) => {
7645
+ const client = createApiClient(resolveConfig(command));
7646
+ writeRawJson(
7647
+ await client.request("GET", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/activity`, {
7648
+ query: { limit: options.limit, cursor: options.cursor }
7649
+ })
7650
+ );
7651
+ });
7652
+ addConnectionOptions(program.command("tasks:create")).description("Create a task board task from a JSON payload.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--json <file>", "JSON file with the task payload.").action(async (options, command) => {
7653
+ const payload = createTaskSchema.parse(await readJsonFile(options.json));
7654
+ const client = createApiClient(resolveConfig(command));
7655
+ writeRawJson(
7656
+ await client.request("POST", `/v1/workspaces/${options.workspace}/task-board/tasks`, { body: payload })
7657
+ );
7658
+ });
7659
+ addConnectionOptions(program.command("tasks:update")).description("Update a task board task from a JSON payload. Archived tasks are read-only until restored.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--json <file>", "JSON file with the fields to change.").action(async (options, command) => {
7660
+ const payload = updateTaskSchema.parse(await readJsonFile(options.json));
7661
+ const client = createApiClient(resolveConfig(command));
7662
+ writeRawJson(
7663
+ await client.request("PATCH", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}`, {
7664
+ body: payload
7665
+ })
7666
+ );
7667
+ });
7668
+ addConnectionOptions(program.command("tasks:move")).description("Move a task board task to a column, optionally anchored before or after another task.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--json <file>", "JSON file with targetColumnId and optional beforeTaskId/afterTaskId.").action(async (options, command) => {
7669
+ const payload = moveTaskSchema.parse(await readJsonFile(options.json));
7670
+ const client = createApiClient(resolveConfig(command));
7671
+ writeRawJson(
7672
+ await client.request("PATCH", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/move`, {
7673
+ body: payload
7674
+ })
7675
+ );
7676
+ });
7677
+ addConnectionOptions(program.command("tasks:archive-task")).description("Archive a task board task. Archived tasks are read-only and recoverable with tasks:restore.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").action(async (options, command) => {
7678
+ const client = createApiClient(resolveConfig(command));
7679
+ writeRawJson(
7680
+ await client.request("POST", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/archive`)
7681
+ );
7682
+ });
7683
+ addConnectionOptions(program.command("tasks:restore")).description("Restore an archived task board task to the top of its column.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").action(async (options, command) => {
7684
+ const client = createApiClient(resolveConfig(command));
7685
+ writeRawJson(
7686
+ await client.request("POST", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/restore`)
7687
+ );
7688
+ });
7689
+ addConnectionOptions(program.command("tasks:delete")).description("Delete a task board task. Deleted tasks cannot be restored.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").option("--yes", "Confirm permanent task deletion.").action(async (options, command) => {
7690
+ if (!options.yes) {
7691
+ throw new CliError("tasks:delete requires --yes because deleted tasks cannot be restored.", {
7692
+ code: "INVALID_OPTIONS"
7693
+ });
7694
+ }
7695
+ const client = createApiClient(resolveConfig(command));
7696
+ writeRawJson(await client.request("DELETE", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}`));
7697
+ });
7698
+ addConnectionOptions(program.command("tasks:comments:create")).description("Add a comment to a task board task. @mentions notify workspace members.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--json <file>", "JSON file with the comment content.").action(async (options, command) => {
7699
+ const payload = createTaskCommentSchema.parse(await readJsonFile(options.json));
7700
+ const client = createApiClient(resolveConfig(command));
7701
+ writeRawJson(
7702
+ await client.request("POST", `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/comments`, {
7703
+ body: payload
7704
+ })
7705
+ );
7706
+ });
7707
+ addConnectionOptions(program.command("tasks:checklist:create")).description("Add a checklist item to a task board task.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--json <file>", "JSON file with the checklist item title and optional anchors.").action(async (options, command) => {
7708
+ const payload = createTaskChecklistItemSchema.parse(await readJsonFile(options.json));
7709
+ const client = createApiClient(resolveConfig(command));
7710
+ writeRawJson(
7711
+ await client.request(
7712
+ "POST",
7713
+ `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/checklist-items`,
7714
+ { body: payload }
7715
+ )
7716
+ );
7717
+ });
7718
+ addConnectionOptions(program.command("tasks:checklist:update")).description("Update a checklist item title or completion state.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--item <itemId>", "Checklist item ID.").requiredOption("--json <file>", "JSON file with the fields to change.").action(async (options, command) => {
7719
+ const payload = updateTaskChecklistItemSchema.parse(await readJsonFile(options.json));
7720
+ const client = createApiClient(resolveConfig(command));
7721
+ writeRawJson(
7722
+ await client.request(
7723
+ "PATCH",
7724
+ `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/checklist-items/${options.item}`,
7725
+ { body: payload }
7726
+ )
7727
+ );
7728
+ });
7729
+ addConnectionOptions(program.command("tasks:checklist:move")).description("Reorder a checklist item, anchored before or after another item.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--item <itemId>", "Checklist item ID.").requiredOption("--json <file>", "JSON file with beforeItemId and/or afterItemId (empty object moves to top).").action(async (options, command) => {
7730
+ const payload = moveTaskChecklistItemSchema.parse(await readJsonFile(options.json));
7731
+ const client = createApiClient(resolveConfig(command));
7732
+ writeRawJson(
7733
+ await client.request(
7734
+ "PATCH",
7735
+ `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/checklist-items/${options.item}/move`,
7736
+ { body: payload }
7737
+ )
7738
+ );
7739
+ });
7740
+ addConnectionOptions(program.command("tasks:checklist:delete")).description("Delete a checklist item from a task board task.").requiredOption("-w, --workspace <id>", "Workspace ID.").requiredOption("--id <taskId>", "Task ID.").requiredOption("--item <itemId>", "Checklist item ID.").option("--yes", "Confirm checklist item deletion.").action(async (options, command) => {
7741
+ if (!options.yes) {
7742
+ throw new CliError("tasks:checklist:delete requires --yes because it permanently removes the item.", {
7743
+ code: "INVALID_OPTIONS"
7744
+ });
7745
+ }
7746
+ const client = createApiClient(resolveConfig(command));
7747
+ writeRawJson(
7748
+ await client.request(
7749
+ "DELETE",
7750
+ `/v1/workspaces/${options.workspace}/task-board/tasks/${options.id}/checklist-items/${options.item}`
7751
+ )
7752
+ );
7753
+ });
7754
+ }
7755
+
5936
7756
  // src/commands/workspaces.ts
5937
7757
  function registerWorkspaceCommands(program) {
5938
7758
  addConnectionOptions(program.command("workspaces:list")).description("List workspaces accessible to the API key.").action(async (_options, command) => {
@@ -5967,6 +7787,7 @@ function createProgram() {
5967
7787
  registerCampaignCommands(program);
5968
7788
  registerStrategyCommands(program);
5969
7789
  registerTaxonomyCommands(program);
7790
+ registerTaskCommands(program);
5970
7791
  registerHashtagCommands(program);
5971
7792
  registerAnalyticsCommands(program);
5972
7793
  registerInboxCommands(program);