@rolino/contracts 0.4.0 → 0.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // src/index.ts
2
2
  import { z } from "zod";
3
3
  var API_VERSION = "v1";
4
- var CONTRACT_VERSION = "0.14.0";
4
+ var CONTRACT_VERSION = "0.16.0";
5
5
  var RequestMetadataSchema = z.object({
6
6
  requestId: z.string().min(1)
7
7
  });
@@ -15,6 +15,11 @@ var ApiErrorCodeSchema = z.enum([
15
15
  "VALIDATION_ERROR",
16
16
  "CONFLICT",
17
17
  "RATE_LIMITED",
18
+ "DELIVERY_CREDENTIAL_INVALID",
19
+ "DELIVERY_CREDENTIAL_REVOKED",
20
+ "ARTICLE_NOT_PUBLISHED",
21
+ "WEBHOOK_INVALID",
22
+ "WEBHOOK_REPLAYED",
18
23
  "INTERNAL_ERROR"
19
24
  ]);
20
25
  var ApiProblemSchema = z.object({
@@ -25,6 +30,50 @@ var ApiProblemSchema = z.object({
25
30
  }),
26
31
  meta: RequestMetadataSchema
27
32
  });
33
+ var BlogImageSchema = z.object({
34
+ url: z.string().url(),
35
+ altText: z.string().min(1),
36
+ width: z.number().int().positive(),
37
+ height: z.number().int().positive(),
38
+ purpose: z.enum(["FEATURED", "SECTION", "SOCIAL_PREVIEW"])
39
+ });
40
+ var PublishedBlogArticleSchema = z.object({
41
+ id: z.string().min(1),
42
+ revisionId: z.string().min(1),
43
+ revisionNumber: z.number().int().positive(),
44
+ slug: z.string().min(1),
45
+ title: z.string().min(1),
46
+ description: z.string().nullable(),
47
+ excerpt: z.string().nullable(),
48
+ tags: z.array(z.string()),
49
+ author: z.string().min(1),
50
+ language: z.string().min(1),
51
+ markdown: z.string(),
52
+ contentBlocks: z.array(z.unknown()),
53
+ canonicalPath: z.string().startsWith("/"),
54
+ publicUrl: z.string().url(),
55
+ publishedAt: z.string().datetime(),
56
+ updatedAt: z.string().datetime(),
57
+ images: z.array(BlogImageSchema)
58
+ });
59
+ var BlogArticleListSchema = z.object({
60
+ articles: z.array(PublishedBlogArticleSchema.omit({ markdown: true, contentBlocks: true }))
61
+ });
62
+ var BlogMetadataSchema = z.object({
63
+ siteId: z.string().min(1),
64
+ name: z.string().min(1),
65
+ origin: z.string().url(),
66
+ blogBasePath: z.string().startsWith("/"),
67
+ language: z.string().min(1),
68
+ updatedAt: z.string().datetime().nullable()
69
+ });
70
+ var BlogSitemapEntrySchema = z.object({
71
+ url: z.string().url(),
72
+ lastModified: z.string().datetime()
73
+ });
74
+ var BlogSlugRedirectSchema = z.object({
75
+ redirect: z.object({ from: z.string().min(1), to: z.string().min(1), permanent: z.literal(true) })
76
+ });
28
77
  function successEnvelopeSchema(data) {
29
78
  return z.object({
30
79
  data,
@@ -40,8 +89,245 @@ var CapabilityIdSchema = z.enum([
40
89
  "posts:schedule",
41
90
  "posts:publish",
42
91
  "integrations:read",
43
- "calendar:read"
92
+ "calendar:read",
93
+ "seo:read",
94
+ "blog:read",
95
+ "blog:write",
96
+ "blog:manage",
97
+ "blog:publish"
44
98
  ]);
99
+ var AgentBlogPlanSchema = z.object({
100
+ id: z.string().min(1),
101
+ state: z.string().min(1),
102
+ windowStart: z.string().datetime(),
103
+ windowEnd: z.string().datetime(),
104
+ cadence: z.object({ weekdays: z.array(z.number().int().min(0).max(6)) }),
105
+ activeRevisionId: z.string().nullable(),
106
+ itemCount: z.number().int().nonnegative()
107
+ });
108
+ var AgentBlogArticleSchema = z.object({
109
+ id: z.string().min(1),
110
+ state: z.string().min(1),
111
+ title: z.string().min(1),
112
+ slug: z.string().min(1),
113
+ currentDraftId: z.string().nullable(),
114
+ approvedRevisionId: z.string().nullable(),
115
+ publishedRevisionId: z.string().nullable(),
116
+ scheduledPublishAt: z.string().datetime().nullable(),
117
+ updatedAt: z.string().datetime()
118
+ });
119
+ var AgentBlogArticleDetailSchema = AgentBlogArticleSchema.extend({
120
+ draft: z.object({
121
+ id: z.string().min(1),
122
+ version: z.number().int().positive(),
123
+ title: z.string(),
124
+ slug: z.string(),
125
+ description: z.string().nullable(),
126
+ excerpt: z.string().nullable(),
127
+ canonicalPath: z.string(),
128
+ tags: z.array(z.string()),
129
+ author: z.string(),
130
+ language: z.string(),
131
+ markdown: z.string(),
132
+ callToAction: z.unknown().nullable(),
133
+ internalLinks: z.unknown()
134
+ }).nullable(),
135
+ revisions: z.array(z.object({ id: z.string().min(1), revisionNumber: z.number().int().positive(), contentHash: z.string().min(1), approvedAt: z.string().datetime().nullable(), createdAt: z.string().datetime() }))
136
+ });
137
+ var AgentBlogJobSchema = z.object({
138
+ id: z.string().min(1),
139
+ type: z.string().min(1),
140
+ state: z.string().min(1),
141
+ attemptCount: z.number().int().nonnegative(),
142
+ availableAt: z.string().datetime(),
143
+ startedAt: z.string().datetime().nullable(),
144
+ completedAt: z.string().datetime().nullable(),
145
+ lastErrorCode: z.string().nullable(),
146
+ lastErrorMessage: z.string().nullable()
147
+ });
148
+ var AgentBlogDraftUpdateSchema = z.object({
149
+ version: z.number().int().positive(),
150
+ title: z.string().trim().min(1).max(200),
151
+ slug: z.string().trim().min(1).max(160),
152
+ description: z.string().trim().max(320).nullable(),
153
+ excerpt: z.string().trim().max(500).nullable(),
154
+ canonicalPath: z.string().startsWith("/"),
155
+ tags: z.array(z.string().trim().min(1).max(80)).max(30),
156
+ author: z.string().trim().min(1).max(160),
157
+ language: z.string().trim().min(2).max(20),
158
+ markdown: z.string().max(2e5),
159
+ callToAction: z.object({ label: z.string().trim().min(1).max(160), pageId: z.string().min(1).nullable() }).strict().nullable(),
160
+ internalLinks: z.array(z.object({ pageId: z.string().min(1), anchorText: z.string().trim().min(1).max(200) }).strict()).max(20),
161
+ scheduledPublishAt: z.string().datetime().nullable().optional()
162
+ });
163
+ var AgentBlogGenerateRequestSchema = z.object({ idempotencyKey: z.string().trim().min(8).max(200) });
164
+ var AgentBlogDestinationSelectionSchema = z.array(z.string().min(1)).min(1).max(20);
165
+ var AgentBlogPublishPreviewRequestSchema = z.object({ revisionId: z.string().min(1), destinationIds: AgentBlogDestinationSelectionSchema.optional() });
166
+ var AgentBlogPublishExecuteRequestSchema = z.object({ revisionId: z.string().min(1), destinationIds: AgentBlogDestinationSelectionSchema.optional(), confirmationToken: z.string().min(1), idempotencyKey: z.string().trim().min(8).max(200) });
167
+ var AgentBlogPublishingProviderSchema = z.object({ key: z.string(), name: z.string(), description: z.string(), mode: z.string(), rollout: z.enum(["PREVIEW", "VISIBLE"]), capabilities: z.array(z.string()), authorizationStrategy: z.string(), requiresResourceDiscovery: z.boolean(), requiresFieldMapping: z.boolean(), officialDocumentationUrl: z.string().url() }).strict();
168
+ var AgentBlogPublishingDestinationSchema = z.object({ id: z.string(), name: z.string(), providerKey: z.string(), mode: z.string(), status: z.string(), isPrimary: z.boolean(), enabled: z.boolean(), externalSiteName: z.string().nullable(), externalSiteUrl: z.string().url().nullable(), lastTestedAt: z.string().datetime().nullable(), lastSucceededAt: z.string().datetime().nullable(), lastErrorCode: z.string().nullable() }).strict();
169
+ var AgentBlogDeliveryAttemptSchema = z.object({ id: z.string(), articleId: z.string().nullable(), revisionId: z.string().nullable(), destinationId: z.string().nullable(), destinationName: z.string().nullable(), operation: z.string().nullable(), state: z.string(), attemptCount: z.number().int().nonnegative(), errorCode: z.string().nullable(), retryAt: z.string().datetime().nullable(), remoteUrl: z.string().url().nullable(), createdAt: z.string().datetime(), deliveredAt: z.string().datetime().nullable() }).strict();
170
+ var AgentBlogPublishPreviewSchema = z.object({ articleId: z.string(), revisionId: z.string(), contentHash: z.string(), title: z.string(), slug: z.string(), publicUrl: z.string().url(), destinations: z.array(AgentBlogPublishingDestinationSchema), confirmation: z.object({ token: z.string(), expiresAt: z.string().datetime() }) });
171
+ var AgentBlogReadinessSchema = z.enum([
172
+ "MISSING",
173
+ "NOT_STARTED",
174
+ "QUEUED",
175
+ "RUNNING",
176
+ "READY",
177
+ "USED",
178
+ "CONFIGURED",
179
+ "VERIFIED",
180
+ "NEEDS_ATTENTION"
181
+ ]);
182
+ var AgentBlogSetupStatusSchema = z.object({
183
+ projectId: z.string().min(1),
184
+ brandName: z.string().min(1),
185
+ brandWebsite: z.enum(["MISSING", "READY"]),
186
+ websiteOrigin: z.string().url().nullable(),
187
+ siteId: z.string().min(1).nullable(),
188
+ blogBasePath: z.string().startsWith("/").nullable(),
189
+ siteImport: AgentBlogReadinessSchema,
190
+ activeJobId: z.string().min(1).nullable(),
191
+ plan: AgentBlogReadinessSchema,
192
+ activePlanId: z.string().min(1).nullable(),
193
+ deliveryCredential: AgentBlogReadinessSchema,
194
+ revalidation: AgentBlogReadinessSchema,
195
+ nextAction: z.enum([
196
+ "ADD_WEBSITE",
197
+ "IMPORT_SITE",
198
+ "WAIT_FOR_JOB",
199
+ "CREATE_PLAN",
200
+ "REVIEW_PLAN",
201
+ "CONFIGURE_DELIVERY",
202
+ "TEST_CONNECTION",
203
+ "READY"
204
+ ])
205
+ }).strict();
206
+ var AgentBlogCadenceInputSchema = z.object({
207
+ startsOn: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
208
+ weekdays: z.array(z.number().int().min(0).max(6)).min(1).max(7),
209
+ timeZone: z.string().trim().min(1).max(100)
210
+ }).strict().superRefine(({ weekdays }, context) => {
211
+ if (new Set(weekdays).size !== weekdays.length) {
212
+ context.addIssue({ code: "custom", path: ["weekdays"], message: "Weekdays must be unique." });
213
+ }
214
+ });
215
+ var AgentBlogIdempotentRequestSchema = z.object({
216
+ idempotencyKey: z.string().trim().min(8).max(200)
217
+ }).strict();
218
+ var AgentBlogPlanCreateRequestSchema = AgentBlogCadenceInputSchema.and(AgentBlogIdempotentRequestSchema);
219
+ var AgentBlogPlanRetryRequestSchema = AgentBlogIdempotentRequestSchema;
220
+ var AgentBlogPlanItemSchema = z.object({
221
+ id: z.string().min(1),
222
+ planId: z.string().min(1),
223
+ planRevisionId: z.string().min(1),
224
+ version: z.number().int().positive(),
225
+ scheduledLocalDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
226
+ title: z.string().min(1),
227
+ recommendedSlug: z.string().min(1),
228
+ state: z.string().min(1),
229
+ workType: z.string().min(1),
230
+ format: z.string().min(1),
231
+ primaryQuery: z.string().nullable(),
232
+ searchIntent: z.string().nullable(),
233
+ summary: z.string(),
234
+ outline: z.unknown(),
235
+ selectionReason: z.string().min(1),
236
+ evidenceClassification: z.enum(["OBSERVED", "MIXED", "HYPOTHESIS"]),
237
+ evidence: z.unknown(),
238
+ displayMetrics: z.unknown(),
239
+ overlapExplanation: z.string().nullable(),
240
+ existingArticleComparison: z.string().nullable(),
241
+ recommendedLinks: z.unknown(),
242
+ targetConversionPage: z.string().nullable(),
243
+ articleId: z.string().min(1).nullable()
244
+ }).strict();
245
+ var AgentBlogPlanItemStateRequestSchema = z.object({
246
+ state: z.enum(["ACCEPTED", "DISMISSED"]),
247
+ expectedState: z.string().min(1),
248
+ expectedVersion: z.number().int().positive(),
249
+ idempotencyKey: z.string().trim().min(8).max(200)
250
+ }).strict();
251
+ var AgentBlogArticleCreateRequestSchema = z.object({
252
+ expectedState: z.literal("ACCEPTED"),
253
+ expectedVersion: z.number().int().positive(),
254
+ idempotencyKey: z.string().trim().min(8).max(200)
255
+ }).strict();
256
+ var AgentBlogConnectionStatusSchema = z.object({
257
+ projectId: z.string().min(1),
258
+ siteId: z.string().min(1),
259
+ origin: z.string().url(),
260
+ endpoint: z.string().url().nullable(),
261
+ deliveryCredential: z.enum(["MISSING", "READY", "USED"]),
262
+ activeCredentialId: z.string().min(1).nullable(),
263
+ credentialLastUsedAt: z.string().datetime().nullable(),
264
+ revalidation: z.enum(["MISSING", "CONFIGURED", "VERIFIED", "NEEDS_ATTENTION"]),
265
+ revalidationLastTestedAt: z.string().datetime().nullable(),
266
+ revalidationLastSucceededAt: z.string().datetime().nullable(),
267
+ revalidationLastErrorCode: z.string().nullable()
268
+ }).strict();
269
+ var AgentBlogConnectionRequestSchema = z.object({
270
+ endpoint: z.string().url().nullable(),
271
+ credentialAction: z.enum(["KEEP", "CREATE", "ROTATE", "REVOKE"]),
272
+ credentialId: z.string().min(1).nullable(),
273
+ secretAction: z.enum(["KEEP", "CREATE", "ROTATE"])
274
+ }).strict();
275
+ var AgentBlogConnectionPreviewRequestSchema = AgentBlogConnectionRequestSchema;
276
+ var AgentBlogConnectionExecuteRequestSchema = AgentBlogConnectionRequestSchema.extend({
277
+ confirmationToken: z.string().min(1).max(300),
278
+ idempotencyKey: z.string().trim().min(8).max(200)
279
+ }).strict();
280
+ var AgentBlogConnectionPreviewSchema = z.object({
281
+ projectId: z.string().min(1),
282
+ siteId: z.string().min(1),
283
+ siteName: z.string().min(1),
284
+ origin: z.string().url(),
285
+ endpoint: z.string().url().nullable(),
286
+ credentialAction: z.enum(["KEEP", "CREATE", "ROTATE", "REVOKE"]),
287
+ secretAction: z.enum(["KEEP", "CREATE", "ROTATE"]),
288
+ effect: z.string().min(1),
289
+ confirmation: z.object({ token: z.string().min(1), expiresAt: z.string().datetime() }).strict()
290
+ }).strict();
291
+ var AgentBlogConnectionExecuteSchema = z.object({
292
+ projectId: z.string().min(1),
293
+ siteId: z.string().min(1),
294
+ completed: z.literal(true),
295
+ secretDelivered: z.boolean(),
296
+ alreadyDelivered: z.boolean(),
297
+ deliveryToken: z.string().min(1).optional(),
298
+ webhookSecret: z.string().min(1).optional(),
299
+ message: z.string().min(1)
300
+ }).strict();
301
+ var AgentBlogRevalidationTestRequestSchema = AgentBlogIdempotentRequestSchema;
302
+ var AgentBlogRevalidationTestSchema = z.object({
303
+ status: z.enum(["VERIFIED", "NEEDS_ATTENTION"]),
304
+ testedAt: z.string().datetime(),
305
+ errorCode: z.string().nullable()
306
+ }).strict();
307
+ var AgentBlogPlanListResponseSchema = successEnvelopeSchema(z.object({ plans: z.array(AgentBlogPlanSchema) }));
308
+ var AgentBlogArticleListResponseSchema = successEnvelopeSchema(z.object({ articles: z.array(AgentBlogArticleSchema) }));
309
+ var AgentBlogArticleResponseSchema = successEnvelopeSchema(AgentBlogArticleDetailSchema);
310
+ var AgentBlogJobResponseSchema = successEnvelopeSchema(AgentBlogJobSchema);
311
+ var AgentBlogPublishPreviewResponseSchema = successEnvelopeSchema(AgentBlogPublishPreviewSchema);
312
+ var AgentBlogPublishExecuteResponseSchema = successEnvelopeSchema(z.object({ publicationId: z.string(), articleId: z.string(), revisionId: z.string(), publicUrl: z.string().url(), publishedAt: z.string().datetime() }));
313
+ var AgentBlogPublishingProviderListResponseSchema = successEnvelopeSchema(z.object({ providers: z.array(AgentBlogPublishingProviderSchema) }).strict());
314
+ var AgentBlogPublishingDestinationListResponseSchema = successEnvelopeSchema(z.object({ destinations: z.array(AgentBlogPublishingDestinationSchema) }).strict());
315
+ var AgentBlogDeliveryAttemptListResponseSchema = successEnvelopeSchema(z.object({ deliveries: z.array(AgentBlogDeliveryAttemptSchema) }).strict());
316
+ var AgentBlogSetupStatusResponseSchema = successEnvelopeSchema(AgentBlogSetupStatusSchema);
317
+ var AgentBlogPlanItemsResponseSchema = successEnvelopeSchema(z.object({ items: z.array(AgentBlogPlanItemSchema) }).strict());
318
+ var AgentBlogPlanItemResponseSchema = successEnvelopeSchema(AgentBlogPlanItemSchema);
319
+ var AgentBlogPlanQueuedResponseSchema = successEnvelopeSchema(z.object({
320
+ planId: z.string().min(1),
321
+ job: AgentBlogJobSchema
322
+ }).strict());
323
+ var AgentBlogArticleQueuedResponseSchema = successEnvelopeSchema(z.object({
324
+ articleId: z.string().min(1),
325
+ job: AgentBlogJobSchema.nullable()
326
+ }).strict());
327
+ var AgentBlogConnectionStatusResponseSchema = successEnvelopeSchema(AgentBlogConnectionStatusSchema);
328
+ var AgentBlogConnectionPreviewResponseSchema = successEnvelopeSchema(AgentBlogConnectionPreviewSchema);
329
+ var AgentBlogConnectionExecuteResponseSchema = successEnvelopeSchema(AgentBlogConnectionExecuteSchema);
330
+ var AgentBlogRevalidationTestResponseSchema = successEnvelopeSchema(AgentBlogRevalidationTestSchema);
45
331
  var CapabilitySchema = z.object({
46
332
  id: CapabilityIdSchema,
47
333
  available: z.boolean(),
@@ -254,9 +540,24 @@ var PublishingProviderSchema = z.enum([
254
540
  "LINKEDIN"
255
541
  ]);
256
542
  var PUBLISHING_PROVIDER_COUNT = PublishingProviderSchema.options.length;
543
+ var PostDeliveryModeSchema = z.enum(["IMMEDIATE", "SCHEDULED"]);
544
+ var PostDestinationStageSchema = z.enum([
545
+ "DRAFT",
546
+ "QUEUED",
547
+ "UPLOADING",
548
+ "PROCESSING",
549
+ "CONFIRMING_SCHEDULE",
550
+ "SCHEDULED",
551
+ "PUBLISHING",
552
+ "PUBLISHED",
553
+ "ACTION_REQUIRED",
554
+ "FAILED"
555
+ ]);
257
556
  var PostDestinationSchema = z.object({
258
557
  provider: PublishingProviderSchema,
259
558
  status: PlatformPostStatusSchema,
559
+ deliveryMode: PostDeliveryModeSchema,
560
+ stage: PostDestinationStageSchema,
260
561
  captionOverride: z.string().nullable(),
261
562
  scheduledAt: z.string().datetime().nullable(),
262
563
  publishedAt: z.string().datetime().nullable(),
@@ -707,6 +1008,7 @@ var PostScheduleExecuteInputSchema = PostScheduleInputSchema.extend({
707
1008
  }).strict();
708
1009
  var PostSchedulePreviewSchema = z.object({
709
1010
  operation: z.literal("posts.schedule.execute"),
1011
+ deliveryMode: z.literal("SCHEDULED"),
710
1012
  post: z.object({
711
1013
  id: z.string().min(1),
712
1014
  projectId: z.string().min(1),
@@ -715,6 +1017,12 @@ var PostSchedulePreviewSchema = z.object({
715
1017
  }),
716
1018
  schedule: PostScheduleInputSchema,
717
1019
  destinations: z.array(PublishingProviderSchema).min(1).max(PUBLISHING_PROVIDER_COUNT),
1020
+ youtube: z.object({
1021
+ uploadVisibility: z.literal("PRIVATE"),
1022
+ publishVisibility: z.literal("PUBLIC"),
1023
+ preparationStartsImmediately: z.literal(true),
1024
+ confirmationMeaning: z.string().min(1)
1025
+ }).nullable().optional(),
718
1026
  providerReconciliation: z.object({
719
1027
  provider: z.literal("YOUTUBE"),
720
1028
  required: z.boolean(),
@@ -735,6 +1043,8 @@ var PostSchedulePendingSchema = z.object({
735
1043
  provider: z.literal("YOUTUBE"),
736
1044
  mutationId: z.string().min(1),
737
1045
  operation: z.enum(["SCHEDULE", "CANCEL"]),
1046
+ phase: z.literal("REMOTE_SCHEDULE_CONFIRMATION"),
1047
+ videoUploaded: z.literal(true),
738
1048
  message: z.string().min(1)
739
1049
  });
740
1050
  var PostScheduleExecuteResultSchema = z.union([
@@ -755,6 +1065,7 @@ var PostPublishExecuteInputSchema = PostPublishInputSchema.extend({
755
1065
  }).strict();
756
1066
  var PostPublishPreviewSchema = z.object({
757
1067
  operation: z.literal("posts.publish.execute"),
1068
+ deliveryMode: z.literal("IMMEDIATE"),
758
1069
  post: z.object({
759
1070
  id: z.string().min(1),
760
1071
  projectId: z.string().min(1),
@@ -762,6 +1073,11 @@ var PostPublishPreviewSchema = z.object({
762
1073
  status: PostStatusSchema
763
1074
  }),
764
1075
  destinations: PostPublishInputSchema.shape.destinations,
1076
+ youtube: z.object({
1077
+ visibility: YouTubePostSettingsSchema.shape.privacyStatus,
1078
+ preparationStartsImmediately: z.literal(true),
1079
+ createsSchedule: z.literal(false)
1080
+ }).nullable().optional(),
765
1081
  readiness: PostReadinessSchema,
766
1082
  confirmation: z.object({
767
1083
  token: z.string().min(1),
@@ -834,14 +1150,330 @@ var CalendarListDataSchema = z.object({
834
1150
  var CalendarListResponseSchema = successEnvelopeSchema(
835
1151
  CalendarListDataSchema
836
1152
  );
1153
+ var SeoEntityIdSchema = z.string().min(1).max(128).regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/);
1154
+ var SeoCursorSchema = z.string().min(1).max(512).regex(/^[A-Za-z0-9_-]+$/);
1155
+ var SeoOpportunityKindSchema = z.enum([
1156
+ "SEARCH_TOPIC_CTR",
1157
+ "SEARCH_TOPIC_REFRESH",
1158
+ "SEARCH_TOPIC_NEW_ARTICLE",
1159
+ "SEARCH_TOPIC_CONSOLIDATE",
1160
+ "SEARCH_TOPIC_CLUSTER",
1161
+ "COMPETITOR_KEYWORD_GAP",
1162
+ "COMPETITOR_RANK_GAIN",
1163
+ "COMPETITOR_RANK_DROP",
1164
+ "COMPETITOR_SHARED_GAP",
1165
+ "SEO_VALIDATED_COMPETITOR_GAP"
1166
+ ]);
1167
+ var SeoExpectedImpactSchema = z.enum(["HIGH", "MEDIUM", "LOW"]);
1168
+ var SeoEvidenceProvenanceSchema = z.enum([
1169
+ "CUSTOMER_SEARCH_DATA",
1170
+ "MARKET_ESTIMATE",
1171
+ "ROLINO_ANALYSIS"
1172
+ ]);
1173
+ var SeoEvidenceSchema = z.object({
1174
+ title: z.string().min(1).max(180),
1175
+ summary: z.string().min(1).max(500),
1176
+ sourceUrl: z.string().url().max(2048).nullable(),
1177
+ provenance: SeoEvidenceProvenanceSchema,
1178
+ observedAt: z.string().datetime(),
1179
+ periodStart: z.string().datetime().nullable(),
1180
+ periodEnd: z.string().datetime().nullable(),
1181
+ metrics: z.record(
1182
+ z.string().regex(/^[A-Za-z][A-Za-z0-9]{0,39}$/),
1183
+ z.number().finite()
1184
+ ).refine((metrics) => Object.keys(metrics).length <= 20, {
1185
+ message: "SEO evidence can contain at most 20 metrics."
1186
+ }),
1187
+ estimated: z.boolean(),
1188
+ topRowsOnly: z.boolean(),
1189
+ coverageNote: z.string().max(500).nullable()
1190
+ }).strict();
1191
+ var SeoActionDecisionSchema = z.enum(["READY", "NEEDS_REVIEW", "REJECTED"]);
1192
+ var SeoSearchIntentSchema = z.enum(["INFORMATIONAL", "COMMERCIAL", "NAVIGATIONAL", "BRANDED", "SUSPICIOUS"]);
1193
+ var SeoContentTypeSchema = z.enum(["GUIDE", "TUTORIAL", "COMPARISON_PAGE", "LANDING_PAGE", "CONTENT_REFRESH"]);
1194
+ var SeoActionPlanSchema = z.object({
1195
+ version: z.number().int().positive(),
1196
+ decision: SeoActionDecisionSchema,
1197
+ decisionReason: z.string().min(1).max(500),
1198
+ searchIntent: SeoSearchIntentSchema,
1199
+ primaryKeyword: z.string().min(1).max(300),
1200
+ supportingKeywords: z.array(z.string().min(1).max(300)).max(12),
1201
+ questions: z.array(z.string().min(1).max(300)).max(8),
1202
+ contentType: SeoContentTypeSchema,
1203
+ suggestedTitle: z.string().min(1).max(180),
1204
+ angle: z.string().max(500),
1205
+ targetReader: z.string().min(1).max(500),
1206
+ pageGoal: z.string().max(500),
1207
+ outline: z.array(z.object({
1208
+ heading: z.string().min(1).max(180),
1209
+ purpose: z.string().min(1).max(500)
1210
+ }).strict()).max(10),
1211
+ rolinoConnection: z.string().max(600),
1212
+ cta: z.string().max(300),
1213
+ competitorPages: z.array(z.object({
1214
+ domain: z.string().min(1).max(253),
1215
+ url: z.string().url().nullable(),
1216
+ keyword: z.string().min(1).max(300),
1217
+ rank: z.number().min(1).max(1e3).nullable()
1218
+ }).strict()).max(8),
1219
+ existingPage: z.object({
1220
+ title: z.string().min(1).max(180),
1221
+ url: z.string().url()
1222
+ }).strict().nullable(),
1223
+ warnings: z.array(z.string().min(1).max(500)).max(8),
1224
+ researchTasks: z.array(z.string().min(1).max(500)).max(8),
1225
+ cluster: z.object({
1226
+ competitorDomains: z.array(z.string().min(1).max(253)).max(3),
1227
+ bestRank: z.number().min(1).max(1e3).nullable(),
1228
+ estimatedDemand: z.number().min(0).nullable(),
1229
+ firstPartyValidated: z.boolean(),
1230
+ relevanceScore: z.number().min(0).max(1),
1231
+ coverage: z.string().max(500)
1232
+ }).strict()
1233
+ }).strict();
1234
+ var SeoTaskDecisionSchema = z.enum(["READY", "NEEDS_REVIEW", "REJECTED"]);
1235
+ var SeoTaskFormatSchema = z.enum([
1236
+ "BLOG_ARTICLE",
1237
+ "PRODUCT_LANDING_PAGE",
1238
+ "COMPARISON_PAGE",
1239
+ "EXISTING_PAGE_REFRESH",
1240
+ "YOUTUBE_PRODUCTION_PACKAGE",
1241
+ "SOCIAL_CAMPAIGN",
1242
+ "LINK_OUTREACH_TASK",
1243
+ "RESEARCH_TASK"
1244
+ ]);
1245
+ var SeoConfidenceValueSchema = z.object({
1246
+ score: z.number().int().min(0).max(100).nullable(),
1247
+ level: z.enum(["HIGH", "MEDIUM", "LOW", "UNCONFIRMED"]),
1248
+ label: z.string().min(1).max(120),
1249
+ explanation: z.string().min(1).max(500)
1250
+ }).strict();
1251
+ var SeoDecisionConfidenceSchema = z.object({
1252
+ topicRelevance: SeoConfidenceValueSchema,
1253
+ actionReadiness: SeoConfidenceValueSchema
1254
+ }).strict();
1255
+ var SeoTaskEvidenceSummarySchema = z.object({
1256
+ title: z.string().min(1).max(180),
1257
+ summary: z.string().min(1).max(500),
1258
+ provenance: SeoEvidenceProvenanceSchema,
1259
+ observedAt: z.string().datetime(),
1260
+ sourceUrl: z.string().url().max(2048).nullable()
1261
+ }).strict();
1262
+ var SeoAgentTaskSchema = z.object({
1263
+ schemaVersion: z.number().int().positive(),
1264
+ projectId: SeoEntityIdSchema.nullable(),
1265
+ opportunityId: SeoEntityIdSchema.nullable(),
1266
+ legacy: z.boolean(),
1267
+ legacyLabel: z.string().max(500).nullable(),
1268
+ decision: SeoTaskDecisionSchema,
1269
+ decisionReason: z.string().min(1).max(700),
1270
+ objective: z.string().min(1).max(700),
1271
+ primaryFormat: SeoTaskFormatSchema,
1272
+ supportingFormats: z.array(SeoTaskFormatSchema).max(4),
1273
+ formatOptions: z.array(SeoTaskFormatSchema.exclude(["RESEARCH_TASK"])).max(7),
1274
+ confidence: SeoDecisionConfidenceSchema,
1275
+ target: z.object({
1276
+ primaryKeyword: z.string().min(1).max(300),
1277
+ supportingKeywords: z.array(z.string().min(1).max(300)).max(12),
1278
+ searchIntent: SeoSearchIntentSchema,
1279
+ audience: z.string().min(1).max(500),
1280
+ angle: z.string().max(600)
1281
+ }).strict(),
1282
+ suggestedTitles: z.array(z.string().min(1).max(180)).max(3),
1283
+ outline: z.array(z.object({
1284
+ heading: z.string().min(1).max(180),
1285
+ purpose: z.string().min(1).max(600)
1286
+ }).strict()).max(12),
1287
+ researchTasks: z.array(z.string().min(1).max(600)).max(10),
1288
+ competitorPagesToInspect: z.array(z.object({
1289
+ domain: z.string().min(1).max(253),
1290
+ url: z.string().url().max(2048).nullable(),
1291
+ keyword: z.string().min(1).max(300),
1292
+ rank: z.number().int().min(1).max(1e3).nullable()
1293
+ }).strict()).max(8),
1294
+ productFactsToVerify: z.array(z.string().min(1).max(600)).max(8),
1295
+ claimsNotToInvent: z.array(z.string().min(1).max(600)).max(8),
1296
+ deliverables: z.array(z.object({
1297
+ name: z.string().min(1).max(180),
1298
+ requirements: z.array(z.string().min(1).max(600)).min(1).max(8)
1299
+ }).strict()).min(1).max(12),
1300
+ callToAction: z.string().max(400),
1301
+ destination: z.string().min(1).max(700),
1302
+ successMetric: z.object({
1303
+ name: z.string().min(1).max(180),
1304
+ target: z.string().min(1).max(600),
1305
+ measurementWindow: z.string().min(1).max(300)
1306
+ }).strict(),
1307
+ evidenceSummary: z.array(SeoTaskEvidenceSummarySchema).max(5),
1308
+ limitations: z.array(z.string().min(1).max(600)).max(10),
1309
+ nextStep: z.string().min(1).max(700),
1310
+ youtubePackageRequirements: z.object({
1311
+ subject: z.string().min(1).max(300),
1312
+ targetViewer: z.string().min(1).max(500),
1313
+ objective: z.string().min(1).max(700),
1314
+ titleOptions: z.number().int().min(1).max(10),
1315
+ hook: z.string().min(1).max(600),
1316
+ draftScript: z.string().min(1).max(600),
1317
+ sceneList: z.string().min(1).max(600),
1318
+ onScreenText: z.string().min(1).max(600),
1319
+ thumbnailConcept: z.string().min(1).max(600),
1320
+ thumbnailText: z.string().min(1).max(300),
1321
+ description: z.string().min(1).max(600),
1322
+ chapters: z.string().min(1).max(600),
1323
+ callToAction: z.string().max(400),
1324
+ supportingSocialPosts: z.number().int().min(0).max(10)
1325
+ }).strict().nullable(),
1326
+ imageBriefs: z.array(z.object({
1327
+ concept: z.string().min(1).max(600),
1328
+ brief: z.string().min(1).max(800),
1329
+ altText: z.string().min(1).max(500),
1330
+ prompt: z.string().min(1).max(1e3)
1331
+ }).strict()).max(4)
1332
+ }).strict();
1333
+ var SeoOpportunityBriefSchema = z.object({
1334
+ kind: SeoOpportunityKindSchema,
1335
+ title: z.string().min(1).max(180),
1336
+ summary: z.string().min(1).max(600),
1337
+ score: z.number().int().min(0).max(100),
1338
+ confidence: SeoDecisionConfidenceSchema,
1339
+ expectedImpact: SeoExpectedImpactSchema,
1340
+ recommendedAction: z.string().min(1).max(300),
1341
+ actionPlan: SeoActionPlanSchema,
1342
+ task: SeoAgentTaskSchema,
1343
+ evidence: z.array(SeoEvidenceSchema).max(5),
1344
+ brief: z.string().min(1).max(12e3)
1345
+ }).strict();
1346
+ var SeoOpportunitySchema = SeoOpportunityBriefSchema.extend({
1347
+ id: SeoEntityIdSchema,
1348
+ projectId: SeoEntityIdSchema,
1349
+ lastDetectedAt: z.string().datetime(),
1350
+ stale: z.boolean()
1351
+ }).strict();
1352
+ var SeoOpportunityListQuerySchema = z.object({
1353
+ limit: z.coerce.number().int().min(1).max(50).default(20),
1354
+ cursor: SeoCursorSchema.optional(),
1355
+ kind: SeoOpportunityKindSchema.optional(),
1356
+ expectedImpact: SeoExpectedImpactSchema.optional()
1357
+ }).strict();
1358
+ var SeoPageSchema = z.object({
1359
+ limit: z.number().int().min(1).max(50),
1360
+ nextCursor: SeoCursorSchema.nullable()
1361
+ }).strict();
1362
+ var SeoOpportunityListDataSchema = z.object({
1363
+ items: z.array(SeoOpportunitySchema).max(50),
1364
+ page: SeoPageSchema
1365
+ }).strict();
1366
+ var SeoOpportunityListResponseSchema = successEnvelopeSchema(
1367
+ SeoOpportunityListDataSchema
1368
+ );
1369
+ var SeoOpportunityResponseSchema = successEnvelopeSchema(
1370
+ SeoOpportunitySchema
1371
+ );
1372
+ var SeoReportCompletenessSchema = z.enum(["COMPLETE", "PARTIAL"]);
1373
+ var SeoReportTriggerSchema = z.enum(["SCHEDULED", "MANUAL"]);
1374
+ var SeoReportSummarySchema = z.object({
1375
+ id: SeoEntityIdSchema,
1376
+ projectId: SeoEntityIdSchema,
1377
+ periodStart: z.string().datetime(),
1378
+ periodEnd: z.string().datetime(),
1379
+ timeZone: z.string().min(1).max(100),
1380
+ deliveryDay: z.number().int().min(1).max(7),
1381
+ completeness: SeoReportCompletenessSchema,
1382
+ trigger: SeoReportTriggerSchema,
1383
+ createdAt: z.string().datetime(),
1384
+ opportunityCount: z.number().int().min(0).max(5),
1385
+ readyTaskCount: z.number().int().min(0).max(5),
1386
+ researchTaskCount: z.number().int().min(0).max(5),
1387
+ rejectedFindingCount: z.number().int().min(0).max(20),
1388
+ legacy: z.boolean()
1389
+ }).strict();
1390
+ var SeoReportSchema = SeoReportSummarySchema.extend({
1391
+ generatedAt: z.string().datetime(),
1392
+ partialLabel: z.string().max(500).nullable(),
1393
+ freshThrough: z.string().datetime().nullable(),
1394
+ opportunities: z.array(SeoOpportunityBriefSchema).max(5),
1395
+ rejectedFindings: z.array(z.object({
1396
+ decision: z.literal("REJECTED"),
1397
+ query: z.string().min(1).max(300),
1398
+ reason: z.string().min(1).max(700),
1399
+ observedAt: z.string().datetime()
1400
+ }).strict()).max(20)
1401
+ }).strict();
1402
+ var SeoReportListQuerySchema = z.object({
1403
+ limit: z.coerce.number().int().min(1).max(26).default(10),
1404
+ cursor: SeoCursorSchema.optional(),
1405
+ completeness: SeoReportCompletenessSchema.optional()
1406
+ }).strict();
1407
+ var SeoReportListDataSchema = z.object({
1408
+ items: z.array(SeoReportSummarySchema).max(26),
1409
+ page: SeoPageSchema.extend({
1410
+ limit: z.number().int().min(1).max(26)
1411
+ }).strict()
1412
+ }).strict();
1413
+ var SeoReportListResponseSchema = successEnvelopeSchema(
1414
+ SeoReportListDataSchema
1415
+ );
1416
+ var SeoReportResponseSchema = successEnvelopeSchema(SeoReportSchema);
837
1417
  export {
838
1418
  API_VERSION,
839
1419
  ActorSchema,
1420
+ AgentBlogArticleCreateRequestSchema,
1421
+ AgentBlogArticleDetailSchema,
1422
+ AgentBlogArticleListResponseSchema,
1423
+ AgentBlogArticleQueuedResponseSchema,
1424
+ AgentBlogArticleResponseSchema,
1425
+ AgentBlogArticleSchema,
1426
+ AgentBlogCadenceInputSchema,
1427
+ AgentBlogConnectionExecuteRequestSchema,
1428
+ AgentBlogConnectionExecuteResponseSchema,
1429
+ AgentBlogConnectionExecuteSchema,
1430
+ AgentBlogConnectionPreviewRequestSchema,
1431
+ AgentBlogConnectionPreviewResponseSchema,
1432
+ AgentBlogConnectionPreviewSchema,
1433
+ AgentBlogConnectionRequestSchema,
1434
+ AgentBlogConnectionStatusResponseSchema,
1435
+ AgentBlogConnectionStatusSchema,
1436
+ AgentBlogDeliveryAttemptListResponseSchema,
1437
+ AgentBlogDeliveryAttemptSchema,
1438
+ AgentBlogDestinationSelectionSchema,
1439
+ AgentBlogDraftUpdateSchema,
1440
+ AgentBlogGenerateRequestSchema,
1441
+ AgentBlogIdempotentRequestSchema,
1442
+ AgentBlogJobResponseSchema,
1443
+ AgentBlogJobSchema,
1444
+ AgentBlogPlanCreateRequestSchema,
1445
+ AgentBlogPlanItemResponseSchema,
1446
+ AgentBlogPlanItemSchema,
1447
+ AgentBlogPlanItemStateRequestSchema,
1448
+ AgentBlogPlanItemsResponseSchema,
1449
+ AgentBlogPlanListResponseSchema,
1450
+ AgentBlogPlanQueuedResponseSchema,
1451
+ AgentBlogPlanRetryRequestSchema,
1452
+ AgentBlogPlanSchema,
1453
+ AgentBlogPublishExecuteRequestSchema,
1454
+ AgentBlogPublishExecuteResponseSchema,
1455
+ AgentBlogPublishPreviewRequestSchema,
1456
+ AgentBlogPublishPreviewResponseSchema,
1457
+ AgentBlogPublishPreviewSchema,
1458
+ AgentBlogPublishingDestinationListResponseSchema,
1459
+ AgentBlogPublishingDestinationSchema,
1460
+ AgentBlogPublishingProviderListResponseSchema,
1461
+ AgentBlogPublishingProviderSchema,
1462
+ AgentBlogRevalidationTestRequestSchema,
1463
+ AgentBlogRevalidationTestResponseSchema,
1464
+ AgentBlogRevalidationTestSchema,
1465
+ AgentBlogSetupStatusResponseSchema,
1466
+ AgentBlogSetupStatusSchema,
840
1467
  ApiErrorCodeSchema,
841
1468
  ApiMetaResponseSchema,
842
1469
  ApiMetaSchema,
843
1470
  ApiProblemSchema,
844
1471
  AuthenticationKindSchema,
1472
+ BlogArticleListSchema,
1473
+ BlogImageSchema,
1474
+ BlogMetadataSchema,
1475
+ BlogSitemapEntrySchema,
1476
+ BlogSlugRedirectSchema,
845
1477
  CLI_BROWSER_AUTHORIZATION_TIMEOUT_MS,
846
1478
  CONTRACT_VERSION,
847
1479
  CalendarEventSchema,
@@ -875,7 +1507,9 @@ export {
875
1507
  MediaAssetUploadPreparationSchema,
876
1508
  PUBLISHING_PROVIDER_COUNT,
877
1509
  PlatformPostStatusSchema,
1510
+ PostDeliveryModeSchema,
878
1511
  PostDestinationSchema,
1512
+ PostDestinationStageSchema,
879
1513
  PostListDataSchema,
880
1514
  PostListQuerySchema,
881
1515
  PostListResponseSchema,
@@ -909,10 +1543,40 @@ export {
909
1543
  ProviderDeliveryOptionsResponseSchema,
910
1544
  ProviderDeliveryOptionsSchema,
911
1545
  ProviderHealthStatusSchema,
1546
+ PublishedBlogArticleSchema,
912
1547
  PublishingProviderSchema,
913
1548
  ReadinessActionSchema,
914
1549
  ReadinessStatusSchema,
915
1550
  RequestMetadataSchema,
1551
+ SeoActionDecisionSchema,
1552
+ SeoActionPlanSchema,
1553
+ SeoAgentTaskSchema,
1554
+ SeoConfidenceValueSchema,
1555
+ SeoContentTypeSchema,
1556
+ SeoCursorSchema,
1557
+ SeoDecisionConfidenceSchema,
1558
+ SeoEntityIdSchema,
1559
+ SeoEvidenceProvenanceSchema,
1560
+ SeoEvidenceSchema,
1561
+ SeoExpectedImpactSchema,
1562
+ SeoOpportunityBriefSchema,
1563
+ SeoOpportunityKindSchema,
1564
+ SeoOpportunityListDataSchema,
1565
+ SeoOpportunityListQuerySchema,
1566
+ SeoOpportunityListResponseSchema,
1567
+ SeoOpportunityResponseSchema,
1568
+ SeoOpportunitySchema,
1569
+ SeoReportCompletenessSchema,
1570
+ SeoReportListDataSchema,
1571
+ SeoReportListQuerySchema,
1572
+ SeoReportListResponseSchema,
1573
+ SeoReportResponseSchema,
1574
+ SeoReportSchema,
1575
+ SeoReportSummarySchema,
1576
+ SeoReportTriggerSchema,
1577
+ SeoSearchIntentSchema,
1578
+ SeoTaskDecisionSchema,
1579
+ SeoTaskFormatSchema,
916
1580
  TikTokDeliveryOptionsSchema,
917
1581
  TikTokDraftSettingsSchema,
918
1582
  TikTokPostSettingsSchema,