@growth-labs/cms 0.8.20 → 0.8.23

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 (172) hide show
  1. package/dist/cli/foundry-emit.d.ts +14 -0
  2. package/dist/cli/foundry-emit.d.ts.map +1 -0
  3. package/dist/cli/foundry-emit.js +69 -0
  4. package/dist/cli/foundry-emit.js.map +1 -0
  5. package/dist/engine/fronts-publish-intent.d.ts +1 -1
  6. package/dist/engine/fronts-publish-intent.d.ts.map +1 -1
  7. package/dist/engine/fronts-publish-intent.js +12 -1
  8. package/dist/engine/fronts-publish-intent.js.map +1 -1
  9. package/dist/engine/publication-receipt/receipt.d.ts +20 -20
  10. package/dist/engine/publisher.d.ts +16 -1
  11. package/dist/engine/publisher.d.ts.map +1 -1
  12. package/dist/engine/publisher.js +55 -4
  13. package/dist/engine/publisher.js.map +1 -1
  14. package/dist/engine/tags.d.ts.map +1 -1
  15. package/dist/engine/tags.js +18 -1
  16. package/dist/engine/tags.js.map +1 -1
  17. package/dist/engine/topics.d.ts.map +1 -1
  18. package/dist/engine/topics.js +4 -1
  19. package/dist/engine/topics.js.map +1 -1
  20. package/dist/engine/video-source.d.ts +21 -0
  21. package/dist/engine/video-source.d.ts.map +1 -1
  22. package/dist/engine/video-source.js +40 -0
  23. package/dist/engine/video-source.js.map +1 -1
  24. package/dist/foundry-emit.d.ts +146 -0
  25. package/dist/foundry-emit.d.ts.map +1 -0
  26. package/dist/foundry-emit.js +189 -0
  27. package/dist/foundry-emit.js.map +1 -0
  28. package/dist/integration/index.d.ts.map +1 -1
  29. package/dist/integration/index.js +9 -0
  30. package/dist/integration/index.js.map +1 -1
  31. package/dist/integration/options.d.ts +24 -0
  32. package/dist/integration/options.d.ts.map +1 -1
  33. package/dist/integration/options.js +22 -0
  34. package/dist/integration/options.js.map +1 -1
  35. package/dist/providers/null.d.ts.map +1 -1
  36. package/dist/providers/null.js +6 -0
  37. package/dist/providers/null.js.map +1 -1
  38. package/dist/providers/types.d.ts +56 -0
  39. package/dist/providers/types.d.ts.map +1 -1
  40. package/dist/providers/types.js.map +1 -1
  41. package/dist/routes/ai.d.ts.map +1 -1
  42. package/dist/routes/ai.js +21 -13
  43. package/dist/routes/ai.js.map +1 -1
  44. package/dist/routes/analytics.d.ts +1 -0
  45. package/dist/routes/analytics.d.ts.map +1 -1
  46. package/dist/routes/analytics.js +20 -0
  47. package/dist/routes/analytics.js.map +1 -1
  48. package/dist/routes/content.d.ts +27 -0
  49. package/dist/routes/content.d.ts.map +1 -1
  50. package/dist/routes/content.js +58 -12
  51. package/dist/routes/content.js.map +1 -1
  52. package/dist/routes/foundry-publish.d.ts +50 -0
  53. package/dist/routes/foundry-publish.d.ts.map +1 -1
  54. package/dist/routes/foundry-publish.js +540 -27
  55. package/dist/routes/foundry-publish.js.map +1 -1
  56. package/dist/routes/machine-context.d.ts +6 -0
  57. package/dist/routes/machine-context.d.ts.map +1 -0
  58. package/dist/routes/machine-context.js +20 -0
  59. package/dist/routes/machine-context.js.map +1 -0
  60. package/dist/routes/surveys.d.ts +14 -1
  61. package/dist/routes/surveys.d.ts.map +1 -1
  62. package/dist/routes/surveys.js +515 -10
  63. package/dist/routes/surveys.js.map +1 -1
  64. package/dist/schema/insights-ingest.d.ts +8 -8
  65. package/dist/schema/migrations.d.ts.map +1 -1
  66. package/dist/schema/migrations.js +15 -0
  67. package/dist/schema/migrations.js.map +1 -1
  68. package/dist/schema/tables.d.ts +1 -1
  69. package/dist/schema/tables.d.ts.map +1 -1
  70. package/dist/schema/tables.js +2 -0
  71. package/dist/schema/tables.js.map +1 -1
  72. package/dist/surveys/access.d.ts +1 -0
  73. package/dist/surveys/access.d.ts.map +1 -1
  74. package/dist/surveys/access.js +13 -4
  75. package/dist/surveys/access.js.map +1 -1
  76. package/dist/surveys/auto-label.d.ts +100 -0
  77. package/dist/surveys/auto-label.d.ts.map +1 -0
  78. package/dist/surveys/auto-label.js +325 -0
  79. package/dist/surveys/auto-label.js.map +1 -0
  80. package/dist/surveys/schema.d.ts +38 -12
  81. package/dist/surveys/schema.d.ts.map +1 -1
  82. package/dist/surveys/schema.js +18 -1
  83. package/dist/surveys/schema.js.map +1 -1
  84. package/dist/ui/api/_content-config.d.ts.map +1 -1
  85. package/dist/ui/api/_content-config.js +4 -0
  86. package/dist/ui/api/_content-config.js.map +1 -1
  87. package/dist/ui/api/analytics.d.ts.map +1 -1
  88. package/dist/ui/api/analytics.js +5 -2
  89. package/dist/ui/api/analytics.js.map +1 -1
  90. package/dist/ui/api/foundry/articles/[external_id]/publish.d.ts +3 -0
  91. package/dist/ui/api/foundry/articles/[external_id]/publish.d.ts.map +1 -0
  92. package/dist/ui/api/foundry/articles/[external_id]/publish.js +14 -0
  93. package/dist/ui/api/foundry/articles/[external_id]/publish.js.map +1 -0
  94. package/dist/ui/api/surveys/[surveyId]/answers/label.d.ts +3 -0
  95. package/dist/ui/api/surveys/[surveyId]/answers/label.d.ts.map +1 -0
  96. package/dist/ui/api/surveys/[surveyId]/answers/label.js +17 -0
  97. package/dist/ui/api/surveys/[surveyId]/answers/label.js.map +1 -0
  98. package/dist/ui/api/surveys/[surveyId].d.ts.map +1 -1
  99. package/dist/ui/api/surveys/[surveyId].js +28 -1
  100. package/dist/ui/api/surveys/[surveyId].js.map +1 -1
  101. package/dist/ui/commands.d.ts.map +1 -1
  102. package/dist/ui/commands.js +2 -0
  103. package/dist/ui/commands.js.map +1 -1
  104. package/dist/ui/hash-router.d.ts +1 -1
  105. package/dist/ui/hash-router.d.ts.map +1 -1
  106. package/dist/ui/hash-router.js +1 -0
  107. package/dist/ui/hash-router.js.map +1 -1
  108. package/dist/ui/nav.d.ts.map +1 -1
  109. package/dist/ui/nav.js +1 -0
  110. package/dist/ui/nav.js.map +1 -1
  111. package/dist/ui/screens/AnalyticsScreen.d.ts +6 -1
  112. package/dist/ui/screens/AnalyticsScreen.d.ts.map +1 -1
  113. package/dist/ui/screens/AnalyticsScreen.js +13 -8
  114. package/dist/ui/screens/AnalyticsScreen.js.map +1 -1
  115. package/dist/ui/screens/PodcastListeningScreen.d.ts +6 -0
  116. package/dist/ui/screens/PodcastListeningScreen.d.ts.map +1 -0
  117. package/dist/ui/screens/PodcastListeningScreen.js +244 -0
  118. package/dist/ui/screens/PodcastListeningScreen.js.map +1 -0
  119. package/dist/ui/screens/SurveyResponsesScreen.d.ts +4 -2
  120. package/dist/ui/screens/SurveyResponsesScreen.d.ts.map +1 -1
  121. package/dist/ui/screens/SurveyResponsesScreen.js +71 -12
  122. package/dist/ui/screens/SurveyResponsesScreen.js.map +1 -1
  123. package/dist/ui/screens/analytics-data.d.ts +14 -0
  124. package/dist/ui/screens/analytics-data.d.ts.map +1 -1
  125. package/dist/ui/screens/analytics-data.js +16 -0
  126. package/dist/ui/screens/analytics-data.js.map +1 -1
  127. package/dist/ui/screens/podcast-listening-data.d.ts +19 -0
  128. package/dist/ui/screens/podcast-listening-data.d.ts.map +1 -0
  129. package/dist/ui/screens/podcast-listening-data.js +98 -0
  130. package/dist/ui/screens/podcast-listening-data.js.map +1 -0
  131. package/dist/ui/screens/registry.d.ts.map +1 -1
  132. package/dist/ui/screens/registry.js +2 -0
  133. package/dist/ui/screens/registry.js.map +1 -1
  134. package/docs/foundry-publish.md +208 -0
  135. package/migrations/0033_survey_answer_labels.sql +15 -0
  136. package/package.json +9 -3
  137. package/src/cli/foundry-emit.ts +85 -0
  138. package/src/engine/fronts-publish-intent.ts +23 -1
  139. package/src/engine/publisher.ts +80 -4
  140. package/src/engine/tags.ts +21 -1
  141. package/src/engine/topics.ts +4 -1
  142. package/src/engine/video-source.ts +44 -0
  143. package/src/foundry-emit.ts +255 -0
  144. package/src/integration/index.ts +9 -0
  145. package/src/integration/options.ts +23 -0
  146. package/src/providers/null.ts +6 -0
  147. package/src/providers/types.ts +52 -0
  148. package/src/routes/ai.ts +29 -17
  149. package/src/routes/analytics.ts +21 -0
  150. package/src/routes/content.ts +81 -15
  151. package/src/routes/foundry-publish.ts +746 -29
  152. package/src/routes/machine-context.ts +24 -0
  153. package/src/routes/surveys.ts +587 -12
  154. package/src/schema/migrations.ts +15 -0
  155. package/src/schema/tables.ts +2 -0
  156. package/src/surveys/access.ts +14 -4
  157. package/src/surveys/auto-label.ts +420 -0
  158. package/src/surveys/schema.ts +25 -1
  159. package/src/ui/api/_content-config.ts +6 -0
  160. package/src/ui/api/analytics.ts +5 -2
  161. package/src/ui/api/foundry/articles/[external_id]/publish.ts +18 -0
  162. package/src/ui/api/surveys/[surveyId]/answers/label.ts +23 -0
  163. package/src/ui/api/surveys/[surveyId].ts +37 -3
  164. package/src/ui/commands.ts +2 -0
  165. package/src/ui/hash-router.ts +1 -0
  166. package/src/ui/nav.ts +1 -0
  167. package/src/ui/screens/AnalyticsScreen.tsx +34 -6
  168. package/src/ui/screens/PodcastListeningScreen.tsx +529 -0
  169. package/src/ui/screens/SurveyResponsesScreen.tsx +179 -13
  170. package/src/ui/screens/analytics-data.ts +18 -0
  171. package/src/ui/screens/podcast-listening-data.ts +114 -0
  172. package/src/ui/screens/registry.tsx +2 -0
package/dist/routes/ai.js CHANGED
@@ -17,7 +17,7 @@ import { generateContentDek } from '../engine/ai-dek.js';
17
17
  import { headlinesPrompt, metaDescriptionPrompt, proofreadPrompt, takeawaysPrompt, } from '../engine/ai-prompts.js';
18
18
  import { applyAiWrite, parseLockedFields } from '../engine/ai-writeback.js';
19
19
  import { buildOgCardSpec } from '../engine/og-render.js';
20
- import { getContentItem } from '../engine/publisher.js';
20
+ import { canonicalEditStatement, getContentItem, updateContentItem, } from '../engine/publisher.js';
21
21
  import { canPerformContentAction } from './authz-matrix.js';
22
22
  import { resolveConfig } from './config.js';
23
23
  import { json, requireId } from './context.js';
@@ -163,6 +163,9 @@ export function createAiRoutes(config) {
163
163
  if (result.status === 'unavailable') {
164
164
  return llmUnavailableResponse({ reason: result.reason }, { dek: null, written: false });
165
165
  }
166
+ // An editor-triggered dek is a human-initiated canonical change.
167
+ if (result.written)
168
+ await canonicalEditStatement(ctx.db, idResult.id).run();
166
169
  return json({
167
170
  dek: result.dek,
168
171
  written: result.written,
@@ -263,14 +266,17 @@ export function createAiRoutes(config) {
263
266
  });
264
267
  if (writeResult.written) {
265
268
  const now = Math.floor(Date.now() / 1000);
266
- await ctx.db
267
- .prepare(`UPDATE article_content
269
+ // An editor-triggered write-back is a human-initiated canonical change.
270
+ await ctx.db.batch([
271
+ ctx.db
272
+ .prepare(`UPDATE article_content
268
273
  SET ai_takeaways = ?,
269
274
  ai_takeaways_at = ?,
270
275
  ai_takeaways_model = ?
271
276
  WHERE content_id = ?`)
272
- .bind(JSON.stringify(takeaways), now, 'llm-dispatch', id)
273
- .run();
277
+ .bind(JSON.stringify(takeaways), now, 'llm-dispatch', id),
278
+ canonicalEditStatement(ctx.db, id),
279
+ ]);
274
280
  }
275
281
  return json({
276
282
  takeaways: writeResult.value,
@@ -323,10 +329,9 @@ export function createAiRoutes(config) {
323
329
  value: description,
324
330
  });
325
331
  if (writeResult.written) {
326
- await ctx.db
327
- .prepare('UPDATE content_items SET description = ?, updated_at = unixepoch() WHERE id = ?')
328
- .bind(description, id)
329
- .run();
332
+ // Through the editor's own save path, so it is a canonical edit. The
333
+ // existing category is passed through so the save changes nothing else.
334
+ await updateContentItem(ctx.db, id, { description, primaryCategory: item.channel });
330
335
  }
331
336
  return json({
332
337
  description: writeResult.value,
@@ -399,10 +404,13 @@ export function createAiRoutes(config) {
399
404
  value: imageKey,
400
405
  });
401
406
  if (writeResult.written) {
402
- await ctx.db
403
- .prepare('UPDATE content_items SET ai_og_image_id = ?, updated_at = unixepoch() WHERE id = ?')
404
- .bind(imageKey, id)
405
- .run();
407
+ // An editor-triggered write-back is a human-initiated canonical change.
408
+ await ctx.db.batch([
409
+ ctx.db
410
+ .prepare('UPDATE content_items SET ai_og_image_id = ?, updated_at = unixepoch() WHERE id = ?')
411
+ .bind(imageKey, id),
412
+ canonicalEditStatement(ctx.db, id),
413
+ ]);
406
414
  }
407
415
  return json({
408
416
  ogImageId: imageKey,
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/routes/ai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/routes/ai.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface AnalyticsRouteHandlers {
10
10
  topContent(ctx: RouteContext): Promise<Response>;
11
11
  trafficSources(ctx: RouteContext): Promise<Response>;
12
12
  articleDetail(ctx: RouteContext): Promise<Response>;
13
+ podcastListening(ctx: RouteContext): Promise<Response>;
13
14
  }
14
15
  export declare function createAnalyticsRoutes(config: AnalyticsRouteConfig): AnalyticsRouteHandlers;
15
16
  //# sourceMappingURL=analytics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGvD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChD,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpD,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACnD;AAaD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CAyC1F"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGvD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChD,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpD,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnD,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACtD;AAaD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CA6D1F"}
@@ -56,6 +56,26 @@ export function createAnalyticsRoutes(config) {
56
56
  const slug = url.searchParams.get('slug') ?? '';
57
57
  return json(await providers.analytics.getArticleDetail(slug, range));
58
58
  },
59
+ // Podcast listening panel — same publisher gate and ?range=<Nd> window
60
+ // as the other analytics handlers, but NOT a ProviderResult envelope:
61
+ // the provider returns null when the site has no podcast listening
62
+ // analytics at all, which this route answers with a 404 the screen
63
+ // renders as an explicit "not available" state. A provider that is
64
+ // implemented but fails throws — the route 500s loudly, never zeros.
65
+ async podcastListening(ctx) {
66
+ const denied = await config.authz.requirePublisher(ctx);
67
+ if (denied)
68
+ return denied;
69
+ const range = parseRange(ctx.request.url);
70
+ const listening = await providers.analytics.getPodcastListening({
71
+ from: new Date(range.from * 1000).toISOString(),
72
+ to: new Date(range.to * 1000).toISOString(),
73
+ });
74
+ if (!listening) {
75
+ return json({ error: 'podcast listening analytics is not available' }, 404);
76
+ }
77
+ return json(listening);
78
+ },
59
79
  };
60
80
  }
61
81
  //# sourceMappingURL=analytics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { ContentStatus } from '../schema/types.js';
2
2
  import type { CmsRouteConfig } from './config.js';
3
3
  import { type RouteContext } from './context.js';
4
+ import type { FoundryPublishOptions } from './foundry-publish.js';
4
5
  import type { DispatchWebhookHook } from './webhooks.js';
5
6
  export type { DispatchWebhookHook };
6
7
  export interface MediaSourceReadiness {
@@ -87,6 +88,17 @@ export interface ContentRouteConfig extends CmsRouteConfig {
87
88
  videoSourceProductionEnabled?: boolean;
88
89
  /** Internal machine-route constraint: atomically update only in this status. */
89
90
  updateStatusConstraint?: ContentStatus;
91
+ /**
92
+ * Internal (Foundry machine route, M3-18): replaces ONLY the publish action's
93
+ * commit step (publishContent + createRevision) with the caller's — publishOne
94
+ * with the publication's live surfaces. Every other step of the native publish
95
+ * action (readiness, body guard, dek, tag check, activity log, takeaways, FAQ,
96
+ * the content.published webhook) runs unchanged, through the same handler.
97
+ */
98
+ publishCommit?: (ctx: RouteContext, input: {
99
+ contentId: string;
100
+ now: number;
101
+ }) => Promise<void>;
90
102
  /**
91
103
  * Optional webhook dispatcher hook (P7 Task 9). Fired at each content
92
104
  * lifecycle transition (publish, unpublish, schedule, archive, create, etc.).
@@ -101,6 +113,21 @@ export interface ContentRouteConfig extends CmsRouteConfig {
101
113
  * when absent so callers without a workspace concept still produce a scoped row.
102
114
  */
103
115
  activeWorkspaceId?: string;
116
+ /**
117
+ * Per-publication opt-in for the Foundry machine route's publish transition
118
+ * (M3-18). Omitted, or `autoPublish` anything but `true`, keeps that route
119
+ * draft-only and byte-identical to the v1 route. Read only by routes/foundry-publish.ts.
120
+ */
121
+ foundryPublish?: FoundryPublishOptions;
122
+ /**
123
+ * This publication's canonical host for the Foundry route family, declared
124
+ * statically (the integration's `foundryCanonicalHost`, so it reaches every
125
+ * request whatever the host's per-request hooks set). Once a host is declared
126
+ * here or in `foundryPublish.canonicalHost`, the Foundry route verifies only
127
+ * the host-bound `foundry-cms-v2` string and never the legacy dot form.
128
+ * Read only by routes/foundry-publish.ts.
129
+ */
130
+ foundryCanonicalHost?: string;
104
131
  }
105
132
  type ContentType = 'article' | 'video' | 'podcast' | 'newsletter' | 'page';
106
133
  export declare function normaliseNextcloudShareUrl(value: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/routes/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/routes/content.ts"],"names":[],"mappings":"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"}
@@ -29,12 +29,14 @@ import { applySlugRenameRedirects } from '../engine/slug-redirects.js';
29
29
  import { invalidateMediaCaptureStatements, softDeleteContent } from '../engine/soft-delete.js';
30
30
  import { normalizeSourceSections } from '../engine/source-sections.js';
31
31
  import { TagInputError } from '../engine/taxonomy.js';
32
+ import { VideoSourceNotIngestableError } from '../engine/video-source.js';
32
33
  import { isValidTimeZone, PUBLISH_TIMEZONE_FALLBACK, parseLocalDateTimeInZoneToUnixSeconds, } from '../lib/publish-timezone.js';
33
34
  import { parseLayoutEnvelope } from '../schema/layout.js';
34
35
  import { parsePortableTextEnvelope } from '../schema/portable-text.js';
35
36
  import { canPerformContentAction } from './authz-matrix.js';
36
37
  import { resolveConfig } from './config.js';
37
38
  import { json, requireId } from './context.js';
39
+ import { isFoundryMachineContext } from './machine-context.js';
38
40
  function positiveIntegerDuration(value) {
39
41
  if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0)
40
42
  return null;
@@ -61,6 +63,11 @@ function mediaSourceProviderErrorResponse(error) {
61
63
  return null;
62
64
  return json({ error: failure.message, reason: failure.code }, failure.status);
63
65
  }
66
+ function videoSourceNotIngestableResponse(error) {
67
+ if (!(error instanceof VideoSourceNotIngestableError))
68
+ return null;
69
+ return json({ error: error.message, reason: 'video_source_not_ingestable' }, 400);
70
+ }
64
71
  function verifiedMediaDurationConflictResponse(error) {
65
72
  if (!(error instanceof VerifiedMediaDurationConflictError))
66
73
  return null;
@@ -238,6 +245,7 @@ const ContentMetadataSchema = z
238
245
  const NEXTCLOUD_SHARE_HOSTS = ['drive.fulcrum-portal.com'];
239
246
  const NEXTCLOUD_SHARE_PATH_RE = /^\/s\/([A-Za-z0-9_-]+)(?:\/download)?\/?$/;
240
247
  const NEXTCLOUD_DIRECT_PATH_RE = /^\/public\.php\/dav\/files\/[A-Za-z0-9_-]+$/;
248
+ const NEXTCLOUD_SHARE_NOISE_PARAMS = new Set(['dir', 'editing', 'openfile']);
241
249
  export function normaliseNextcloudShareUrl(value) {
242
250
  let url;
243
251
  try {
@@ -255,12 +263,18 @@ export function normaliseNextcloudShareUrl(value) {
255
263
  url.hash) {
256
264
  return value;
257
265
  }
258
- const onlyDirQuery = url.search === '' || (url.searchParams.get('dir') !== null && url.searchParams.size === 1);
266
+ // Nextcloud's copy-link output adds page-navigation noise -- `?dir=/` from a
267
+ // folder listing, `?dir=/&editing=false&openfile=true` from the viewer --
268
+ // none of which changes the file a share serves. Any other parameter may
269
+ // select a different resource, so the URL is kept and the publisher's
270
+ // ingest guard refuses it (HomeFronts 2026-10-01T18:05Z).
271
+ const onlyNoiseQuery = url.search === '' ||
272
+ [...url.searchParams.keys()].every((key) => NEXTCLOUD_SHARE_NOISE_PARAMS.has(key));
259
273
  if (NEXTCLOUD_DIRECT_PATH_RE.test(url.pathname)) {
260
- return url.search === '' ? value : onlyDirQuery ? `https://${host}${url.pathname}` : value;
274
+ return url.search === '' ? value : onlyNoiseQuery ? `https://${host}${url.pathname}` : value;
261
275
  }
262
276
  const share = NEXTCLOUD_SHARE_PATH_RE.exec(url.pathname);
263
- if (!share || !onlyDirQuery)
277
+ if (!share || !onlyNoiseQuery)
264
278
  return value;
265
279
  return `https://${host}/public.php/dav/files/${share[1]}`;
266
280
  }
@@ -842,6 +856,14 @@ export function createContentRoutes(config) {
842
856
  * — identical guard pattern to dispatchTakeaways / logActivity.
843
857
  * When no hook is injected this is a no-op (no 501, no error).
844
858
  */
859
+ /**
860
+ * Only a context the HMAC-verified Foundry route marked is the machine
861
+ * (routes/machine-context.ts); a subject or userId string never decides it,
862
+ * so no person can act as the machine. Any other actor is a person.
863
+ */
864
+ async function isFoundryActor(ctx) {
865
+ return isFoundryMachineContext(ctx);
866
+ }
845
867
  async function fireWebhook(ctx, eventType, data) {
846
868
  if (!dispatchWebhook)
847
869
  return;
@@ -1032,10 +1054,15 @@ export function createContentRoutes(config) {
1032
1054
  if (op === 'topic') {
1033
1055
  const { topic } = parsed.data;
1034
1056
  for (const id of ids) {
1035
- await ctx.db
1036
- .prepare('UPDATE content_items SET primary_topic = ?, updated_at = unixepoch() WHERE id = ? AND deleted_at IS NULL')
1037
- .bind(topic, id)
1038
- .run();
1057
+ // Through the editor's own save path, so it is a canonical edit; the
1058
+ // existing category is passed through so the save changes nothing else.
1059
+ const existing = await getContentItem(ctx.db, id);
1060
+ if (!existing || existing.deleted_at != null)
1061
+ continue;
1062
+ await updateContentItem(ctx.db, id, {
1063
+ primaryTopic: topic,
1064
+ primaryCategory: existing.channel,
1065
+ });
1039
1066
  }
1040
1067
  return json({ updated: ids });
1041
1068
  }
@@ -1132,6 +1159,9 @@ export function createContentRoutes(config) {
1132
1159
  catch (error) {
1133
1160
  if (error instanceof TagInputError)
1134
1161
  return tagInputErrorResponse(error);
1162
+ const notIngestable = videoSourceNotIngestableResponse(error);
1163
+ if (notIngestable)
1164
+ return notIngestable;
1135
1165
  const conflict = verifiedMediaDurationConflictResponse(error);
1136
1166
  if (conflict)
1137
1167
  return conflict;
@@ -1341,6 +1371,9 @@ export function createContentRoutes(config) {
1341
1371
  catch (error) {
1342
1372
  if (error instanceof TagInputError)
1343
1373
  return tagInputErrorResponse(error);
1374
+ const notIngestable = videoSourceNotIngestableResponse(error);
1375
+ if (notIngestable)
1376
+ return notIngestable;
1344
1377
  const conflict = verifiedMediaDurationConflictResponse(error);
1345
1378
  if (conflict)
1346
1379
  return conflict;
@@ -1580,8 +1613,13 @@ export function createContentRoutes(config) {
1580
1613
  throw error;
1581
1614
  }
1582
1615
  try {
1583
- await publishContent(ctx.db, id, publishedAt, now);
1584
- await createRevision(ctx.db, id, ctx.userId || null);
1616
+ if (config.publishCommit) {
1617
+ await config.publishCommit(ctx, { contentId: id, now });
1618
+ }
1619
+ else {
1620
+ await publishContent(ctx.db, id, publishedAt, now);
1621
+ await createRevision(ctx.db, id, ctx.userId || null);
1622
+ }
1585
1623
  }
1586
1624
  catch (error) {
1587
1625
  if (error instanceof TagInputError)
@@ -1674,7 +1712,10 @@ export function createContentRoutes(config) {
1674
1712
  }
1675
1713
  }
1676
1714
  if (action === 'unpublish') {
1677
- await unpublishContent(ctx.db, id);
1715
+ // A person's unpublish sticks: it is a canonical edit, so a machine
1716
+ // publisher cannot put the item back without a new write. The
1717
+ // machine's own unpublish is not, so it can republish its item.
1718
+ await unpublishContent(ctx.db, id, { canonicalEdit: !(await isFoundryActor(ctx)) });
1678
1719
  // Fire content.unpublished webhook.
1679
1720
  await fireWebhook(ctx, 'content.unpublished', {
1680
1721
  id,
@@ -1702,8 +1743,10 @@ export function createContentRoutes(config) {
1702
1743
  if (action === 'unschedule') {
1703
1744
  // publish_tz is NOT NULL (DEFAULT 'Europe/Paris'); reset it to the
1704
1745
  // default rather than nulling it (a NULL violates the constraint).
1746
+ // A person pulling a scheduled item is a canonical edit (see unpublish).
1747
+ const pulledByPerson = !(await isFoundryActor(ctx));
1705
1748
  await ctx.db
1706
- .prepare("UPDATE content_items SET status = 'draft', publish_at = NULL, publish_tz = 'Europe/Paris', updated_at = unixepoch() WHERE id = ?")
1749
+ .prepare(`UPDATE content_items SET status = 'draft', publish_at = NULL, publish_tz = 'Europe/Paris', updated_at = unixepoch()${pulledByPerson ? ', canonical_version = canonical_version + 1' : ''} WHERE id = ?`)
1707
1750
  .bind(id)
1708
1751
  .run();
1709
1752
  return json({ status: 'draft' });
@@ -1735,8 +1778,11 @@ export function createContentRoutes(config) {
1735
1778
  // publish_at so a de-scheduled item doesn't carry a phantom publish time.
1736
1779
  // publish_tz is NOT NULL (DEFAULT 'Europe/Paris'), so it is reset to the
1737
1780
  // default rather than nulled.
1781
+ // A person moving the item back to draft or review is a canonical
1782
+ // edit (see unpublish); the machine never calls set-status.
1783
+ const movedByPerson = !(await isFoundryActor(ctx));
1738
1784
  await ctx.db
1739
- .prepare("UPDATE content_items SET status = ?, publish_at = NULL, publish_tz = 'Europe/Paris', updated_at = unixepoch() WHERE id = ?")
1785
+ .prepare(`UPDATE content_items SET status = ?, publish_at = NULL, publish_tz = 'Europe/Paris', updated_at = unixepoch()${movedByPerson ? ', canonical_version = canonical_version + 1' : ''} WHERE id = ?`)
1740
1786
  .bind(status, id)
1741
1787
  .run();
1742
1788
  // Fire content.review when submitted for review.