@growth-labs/cms 0.8.17 → 0.8.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -161,7 +161,7 @@ multiple labels canonicalize to the same slug across the fleet, for example
161
161
  Every tag write/read boundary uses the shared taxonomy validator. Labels must be
162
162
  trimmed, NFC-normalized, nonblank strings that slugify to a canonical slug, with
163
163
  no duplicate canonical slugs within one content item. The measured fleet evidence
164
- in `docs/cms-taxonomy-fleet-evidence.{json,md}` set the package bounds:
164
+ in `docs/log/2026-09-19-cms-taxonomy-fleet-evidence.{json,md}` (in `growth-labs/publishing`) set the package bounds:
165
165
 
166
166
  - `MAX_ITEM_TAG_COUNT = 32`
167
167
  - `MAX_TAG_LABEL_BYTES = 128`
@@ -21,23 +21,39 @@ export declare function dismissInsight(db: D1Database, siteId: string, intentKey
21
21
  /** Clear a dismissal so the intent reappears on the next board read. */
22
22
  export declare function undismissInsight(db: D1Database, siteId: string, intentKey: string): Promise<void>;
23
23
  export type ReplaceOutcome = 'applied' | 'duplicate' | 'stale';
24
+ /** Identity read from the committed run row, never echoed from the incoming request. */
25
+ export interface InsightPublicationIdentity {
26
+ eventId: string;
27
+ siteId: string;
28
+ runDate: string;
29
+ runAttempt: number;
30
+ runId: string | null;
31
+ contentHash: string;
32
+ /** RFC 8785 SHA-256 of the full validated {meta, rows}, including actual row content. */
33
+ payloadSha256: string | null;
34
+ /** Legacy rows have no digest/run identity and cannot confirm a duplicate. */
35
+ verified: boolean;
36
+ }
24
37
  export interface ReplaceResult {
25
38
  outcome: ReplaceOutcome;
26
39
  landedRunAttempt: number;
40
+ publication: InsightPublicationIdentity;
41
+ }
42
+ export declare class InsightPublicationError extends Error {
43
+ readonly code: 'publication_identity_conflict' | 'publication_identity_unverified';
44
+ constructor(code: 'publication_identity_conflict' | 'publication_identity_unverified');
27
45
  }
46
+ /** Only ingest references these columns; do not mask unrelated missing-column failures. */
47
+ export declare function isMissingInsightPublicationSchema(error: unknown): boolean;
28
48
  /**
29
- * Replay-safe replace of the board for (meta.site_id, meta.run_date).
30
- * - 'duplicate': meta.event_id already present in content_insight_runs.event_id → no-op.
31
- * - 'stale': an equal-or-higher run_attempt already landed for (site_id, run_date) → no-op
32
- * (HMAC authenticates the sender; run_attempt is the monotonic replay guard).
33
- * - 'applied': DELETE the existing board scoped by (site_id, run_date), bulk-insert rows
34
- * (mint id, run_id = meta.run_id, beat from payload, created_at = unixepoch()),
35
- * upsert the run row.
36
- * Dismissals are untouched — they live in their own table keyed (site_id, intent_key).
49
+ * Every eligibility read, guarded write and identity read executes in ONE D1 batch.
50
+ * The run table stays unchanged until the final mutation, so every DELETE/INSERT
51
+ * evaluates the same predicate against the same transaction state. D1 rolls back
52
+ * the entire batch on any failure. Dismissals are never touched.
37
53
  *
38
- * The INSERT carries 16 columns (id, site_id, run_id, run_date, desk, suggestion_type,
39
- * signal_type, is_best_bet, best_bet_rank, desk_rank, headline, evidence, brief,
40
- * intent_key, beat, created_at) matching migration 0016 column order.
54
+ * Current event IDs are immutable: exact replay is a no-op; divergent or legacy
55
+ * unverified reuse fails without writes. Once superseded, an old event has no
56
+ * historical dedupe promise; its original attempt remains stale.
41
57
  */
42
58
  export declare function replaceInsightsBoard(db: D1Database, payload: InsightsIngestPayload): Promise<ReplaceResult>;
43
59
  //# sourceMappingURL=content-insights.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights.d.ts","sourceRoot":"","sources":["../../src/engine/content-insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,KAAK,EACX,iBAAiB,EAEjB,0BAA0B,EAE1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK9D;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMvE;AAeD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAc9B;AAED,uGAAuG;AACvG,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,0BAA0B,EACtC,IAAI,EAAE,MAAM,GAAG,IAAI,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;AAC9D,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAmGxB"}
1
+ {"version":3,"file":"content-insights.d.ts","sourceRoot":"","sources":["../../src/engine/content-insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,KAAK,EACX,iBAAiB,EAEjB,0BAA0B,EAE1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK9D;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMvE;AAeD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAc9B;AAED,uGAAuG;AACvG,wBAAsB,cAAc,CACnC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,0BAA0B,EACtC,IAAI,EAAE,MAAM,GAAG,IAAI,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;AAE9D,wFAAwF;AACxF,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,yFAAyF;IACzF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,0BAA0B,CAAA;CACvC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,GAAG,iCAAiC;gBAAzE,IAAI,EAAE,+BAA+B,GAAG,iCAAiC;CAI9F;AAED,2FAA2F;AAC3F,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQzE;AAeD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAsIxB"}
@@ -1,3 +1,4 @@
1
+ import { canonicalJsonSha256 } from './publication-receipt/canonical-json.js';
1
2
  /** True when an Insights read/write depends on a table missing from an older schema. */
2
3
  export function isMissingInsightsTable(error) {
3
4
  return (error instanceof Error &&
@@ -57,73 +58,121 @@ export async function undismissInsight(db, siteId, intentKey) {
57
58
  .bind(siteId, intentKey)
58
59
  .run();
59
60
  }
61
+ export class InsightPublicationError extends Error {
62
+ code;
63
+ constructor(code) {
64
+ super(code);
65
+ this.code = code;
66
+ this.name = 'InsightPublicationError';
67
+ }
68
+ }
69
+ /** Only ingest references these columns; do not mask unrelated missing-column failures. */
70
+ export function isMissingInsightPublicationSchema(error) {
71
+ return (isMissingInsightsTable(error) ||
72
+ (error instanceof Error &&
73
+ /(?:no such table: content_insight_runs\b|no such column:\s*(?:publication_run_id|payload_sha256)\b|table\s+content_insight_runs\s+has no column named\s+(?:publication_run_id|payload_sha256)\b)/i.test(error.message)));
74
+ }
75
+ const publicationColumns = `event_id, site_id, run_date, run_attempt,
76
+ publication_run_id, content_hash, payload_sha256`;
60
77
  /**
61
- * Replay-safe replace of the board for (meta.site_id, meta.run_date).
62
- * - 'duplicate': meta.event_id already present in content_insight_runs.event_id → no-op.
63
- * - 'stale': an equal-or-higher run_attempt already landed for (site_id, run_date) → no-op
64
- * (HMAC authenticates the sender; run_attempt is the monotonic replay guard).
65
- * - 'applied': DELETE the existing board scoped by (site_id, run_date), bulk-insert rows
66
- * (mint id, run_id = meta.run_id, beat from payload, created_at = unixepoch()),
67
- * upsert the run row.
68
- * Dismissals are untouched — they live in their own table keyed (site_id, intent_key).
78
+ * Every eligibility read, guarded write and identity read executes in ONE D1 batch.
79
+ * The run table stays unchanged until the final mutation, so every DELETE/INSERT
80
+ * evaluates the same predicate against the same transaction state. D1 rolls back
81
+ * the entire batch on any failure. Dismissals are never touched.
69
82
  *
70
- * The INSERT carries 16 columns (id, site_id, run_id, run_date, desk, suggestion_type,
71
- * signal_type, is_best_bet, best_bet_rank, desk_rank, headline, evidence, brief,
72
- * intent_key, beat, created_at) matching migration 0016 column order.
83
+ * Current event IDs are immutable: exact replay is a no-op; divergent or legacy
84
+ * unverified reuse fails without writes. Once superseded, an old event has no
85
+ * historical dedupe promise; its original attempt remains stale.
73
86
  */
74
87
  export async function replaceInsightsBoard(db, payload) {
75
88
  const { meta, rows } = payload;
76
- // 1) event_id dedupe (mirrors foundry_callback_events).
77
- const dupEvent = await db
78
- .prepare('SELECT id FROM content_insight_runs WHERE event_id = ? LIMIT 1')
79
- .bind(meta.event_id)
80
- .first();
81
- if (dupEvent)
82
- return { outcome: 'duplicate', landedRunAttempt: meta.run_attempt };
83
- // 2) stale-replay guard: reject equal-or-lower run_attempt for (site_id, run_date).
84
- const existing = await db
85
- .prepare('SELECT id, run_attempt FROM content_insight_runs WHERE site_id = ? AND run_date = ? LIMIT 1')
86
- .bind(meta.site_id, meta.run_date)
87
- .first();
88
- if (existing && meta.run_attempt <= existing.run_attempt) {
89
- return { outcome: 'stale', landedRunAttempt: existing.run_attempt };
90
- }
89
+ const payloadSha256 = await canonicalJsonSha256(payload);
91
90
  const now = Math.floor(Date.now() / 1000);
92
- // 3) Scoped replace + bulk insert + run upsert in one D1 batch.
91
+ const eligible = `NOT EXISTS (SELECT 1 FROM content_insight_runs WHERE event_id = ?)
92
+ AND NOT EXISTS (SELECT 1 FROM content_insight_runs
93
+ WHERE site_id = ? AND run_date = ? AND run_attempt >= ?)`;
94
+ const eligibilityBindings = [meta.event_id, meta.site_id, meta.run_date, meta.run_attempt];
95
+ const currentPublication = db
96
+ .prepare(`SELECT ${publicationColumns} FROM content_insight_runs
97
+ WHERE site_id = ? AND run_date = ?`)
98
+ .bind(meta.site_id, meta.run_date);
93
99
  const statements = [
94
100
  db
95
- .prepare('DELETE FROM content_insights WHERE site_id = ? AND run_date = ?')
96
- .bind(meta.site_id, meta.run_date),
101
+ .prepare(`SELECT ${publicationColumns} FROM content_insight_runs WHERE event_id = ? LIMIT 2`)
102
+ .bind(meta.event_id),
103
+ currentPublication,
104
+ db
105
+ .prepare(`DELETE FROM content_insights WHERE site_id = ? AND run_date = ? AND ${eligible}`)
106
+ .bind(meta.site_id, meta.run_date, ...eligibilityBindings),
97
107
  ];
98
108
  for (const row of rows) {
99
- // 16 columns: id, site_id, run_id, run_date, desk, suggestion_type, signal_type,
100
- // is_best_bet, best_bet_rank, desk_rank, headline, evidence, brief,
101
- // intent_key, beat, created_at
102
109
  statements.push(db
103
110
  .prepare(`INSERT INTO content_insights
104
- (id, site_id, run_id, run_date, desk, suggestion_type, signal_type, is_best_bet,
105
- best_bet_rank, desk_rank, headline, evidence, brief, intent_key, beat, created_at)
106
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
107
- .bind(crypto.randomUUID(), row.site_id, meta.run_id, row.run_date, row.desk, row.suggestion_type, row.signal_type, row.is_best_bet, row.best_bet_rank, row.desk_rank, row.headline, JSON.stringify(row.evidence), JSON.stringify(row.brief), row.intent_key, row.beat, now));
111
+ (id, site_id, run_id, run_date, desk, suggestion_type, signal_type, is_best_bet,
112
+ best_bet_rank, desk_rank, headline, evidence, brief, intent_key, beat, created_at)
113
+ SELECT ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? WHERE ${eligible}`)
114
+ .bind(crypto.randomUUID(), row.site_id, meta.run_id, row.run_date, row.desk, row.suggestion_type, row.signal_type, row.is_best_bet, row.best_bet_rank, row.desk_rank, row.headline, JSON.stringify(row.evidence), JSON.stringify(row.brief), row.intent_key, row.beat, now, ...eligibilityBindings));
108
115
  }
109
- // Upsert the run row keyed on UNIQUE (site_id, run_date).
116
+ // This MUST be the final mutation: preceding row writes share its eligibility.
110
117
  statements.push(db
111
118
  .prepare(`INSERT INTO content_insight_runs
112
- (id, site_id, run_date, status, event_id, run_attempt, generated_at, content_hash,
113
- demand_count, opportunity_count, started_at, completed_at, error)
114
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)
115
- ON CONFLICT(site_id, run_date) DO UPDATE SET
116
- status = excluded.status,
117
- event_id = excluded.event_id,
118
- run_attempt = excluded.run_attempt,
119
- generated_at = excluded.generated_at,
120
- content_hash = excluded.content_hash,
121
- demand_count = excluded.demand_count,
122
- opportunity_count = excluded.opportunity_count,
123
- completed_at = excluded.completed_at,
124
- error = excluded.error`)
125
- .bind(existing?.id ?? crypto.randomUUID(), meta.site_id, meta.run_date, meta.status, meta.event_id, meta.run_attempt, meta.generated_at, meta.content_hash, meta.counts.demand_count, meta.counts.opportunity_count, now, meta.status === 'completed' || meta.status === 'partial' ? now : null, meta.error ?? null));
126
- await db.batch(statements);
127
- return { outcome: 'applied', landedRunAttempt: meta.run_attempt };
119
+ (id, site_id, run_date, status, event_id, run_attempt, generated_at, content_hash,
120
+ demand_count, opportunity_count, started_at, completed_at, error,
121
+ publication_run_id, payload_sha256)
122
+ SELECT ?,?,?,?,?,?,?,?,?,?,?,?,?,?,? WHERE ${eligible}
123
+ ON CONFLICT(site_id, run_date) DO UPDATE SET
124
+ status = excluded.status,
125
+ event_id = excluded.event_id,
126
+ run_attempt = excluded.run_attempt,
127
+ generated_at = excluded.generated_at,
128
+ content_hash = excluded.content_hash,
129
+ demand_count = excluded.demand_count,
130
+ opportunity_count = excluded.opportunity_count,
131
+ completed_at = excluded.completed_at,
132
+ error = excluded.error,
133
+ publication_run_id = excluded.publication_run_id,
134
+ payload_sha256 = excluded.payload_sha256`)
135
+ .bind(crypto.randomUUID(), meta.site_id, meta.run_date, meta.status, meta.event_id, meta.run_attempt, meta.generated_at, meta.content_hash, meta.counts.demand_count, meta.counts.opportunity_count, now, meta.status === 'completed' || meta.status === 'partial' ? now : null, meta.error ?? null, meta.run_id, payloadSha256, ...eligibilityBindings), currentPublication);
136
+ const results = await db.batch(statements);
137
+ const events = (results[0].results ?? []);
138
+ const previous = results[1].results?.[0];
139
+ if (events.length > 0) {
140
+ const event = events[0];
141
+ if (events.length !== 1 ||
142
+ event.site_id !== meta.site_id ||
143
+ event.run_date !== meta.run_date ||
144
+ event.run_attempt !== meta.run_attempt ||
145
+ event.content_hash !== meta.content_hash ||
146
+ (event.publication_run_id !== null && event.publication_run_id !== meta.run_id)) {
147
+ throw new InsightPublicationError('publication_identity_conflict');
148
+ }
149
+ if (event.payload_sha256 === null || event.publication_run_id === null) {
150
+ throw new InsightPublicationError('publication_identity_unverified');
151
+ }
152
+ if (event.payload_sha256 !== payloadSha256) {
153
+ throw new InsightPublicationError('publication_identity_conflict');
154
+ }
155
+ }
156
+ const committed = results[results.length - 1].results?.[0];
157
+ if (!committed)
158
+ throw new Error('Missing committed insight publication');
159
+ return {
160
+ outcome: events.length
161
+ ? 'duplicate'
162
+ : previous && previous.run_attempt >= meta.run_attempt
163
+ ? 'stale'
164
+ : 'applied',
165
+ landedRunAttempt: committed.run_attempt,
166
+ publication: {
167
+ eventId: committed.event_id,
168
+ siteId: committed.site_id,
169
+ runDate: committed.run_date,
170
+ runAttempt: committed.run_attempt,
171
+ runId: committed.publication_run_id,
172
+ contentHash: committed.content_hash,
173
+ payloadSha256: committed.payload_sha256,
174
+ verified: committed.payload_sha256 !== null && committed.publication_run_id !== null,
175
+ },
176
+ };
128
177
  }
129
178
  //# sourceMappingURL=content-insights.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights.js","sourceRoot":"","sources":["../../src/engine/content-insights.ts"],"names":[],"mappings":"AASA,wFAAwF;AACxF,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACpD,OAAO,CACN,KAAK,YAAY,KAAK;QACtB,mEAAmE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACvF,CAAA;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC7D,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3C,OAAO,iIAAiI,CAAC,IAAI,CAC5I,KAAK,CAAC,OAAO,CACb,CAAA;AACF,CAAC;AAOD,SAAS,SAAS,CAAC,GAAkB;IACpC,OAAO;QACN,GAAG,GAAG;QACN,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAoB;QACrD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAiB;KAC5C,CAAA;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,EAAc,EACd,MAAc,EACd,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,EAAE;SACrB,OAAO,CACP;;;;;;kFAM+E,CAC/E;SACA,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;SACrB,GAAG,EAAiB,CAAA;IACtB,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,EAAc,EACd,MAAc,EACd,SAAiB,EACjB,WAA0B,EAC1B,UAAsC,EACtC,IAAmB;IAEnB,MAAM,EAAE;SACN,OAAO,CACP;;wCAEqC,CACrC;SACA,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC;SACtD,GAAG,EAAE,CAAA;AACR,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,EAAc,EACd,MAAc,EACd,SAAiB;IAEjB,MAAM,EAAE;SACN,OAAO,CAAC,6EAA6E,CAAC;SACtF,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;SACvB,GAAG,EAAE,CAAA;AACR,CAAC;AAQD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,EAAc,EACd,OAA8B;IAE9B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAE9B,wDAAwD;IACxD,MAAM,QAAQ,GAAG,MAAM,EAAE;SACvB,OAAO,CAAC,gEAAgE,CAAC;SACzE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SACnB,KAAK,EAAkB,CAAA;IACzB,IAAI,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAA;IAEjF,oFAAoF;IACpF,MAAM,QAAQ,GAAG,MAAM,EAAE;SACvB,OAAO,CACP,6FAA6F,CAC7F;SACA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;SACjC,KAAK,EAAuC,CAAA;IAC9C,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAA;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAEzC,gEAAgE;IAChE,MAAM,UAAU,GAAG;QAClB,EAAE;aACA,OAAO,CAAC,iEAAiE,CAAC;aAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;KACnC,CAAA;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,iFAAiF;QACjF,oEAAoE;QACpE,+BAA+B;QAC/B,UAAU,CAAC,IAAI,CACd,EAAE;aACA,OAAO,CACP;;;+CAG0C,CAC1C;aACA,IAAI,CACJ,MAAM,CAAC,UAAU,EAAE,EACnB,GAAG,CAAC,OAAO,EACX,IAAI,CAAC,MAAM,EACX,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,eAAe,EACnB,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,aAAa,EACjB,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,QAAQ,EACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EACzB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,IAAI,EACR,GAAG,CACH,CACF,CAAA;IACF,CAAC;IACD,0DAA0D;IAC1D,UAAU,CAAC,IAAI,CACd,EAAE;SACA,OAAO,CACP;;;;;;;;;;;;;8BAa0B,CAC1B;SACA,IAAI,CACJ,QAAQ,EAAE,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,EACnC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAC7B,GAAG,EACH,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EACrE,IAAI,CAAC,KAAK,IAAI,IAAI,CAClB,CACF,CAAA;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC1B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAA;AAClE,CAAC"}
1
+ {"version":3,"file":"content-insights.js","sourceRoot":"","sources":["../../src/engine/content-insights.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights.d.ts","sourceRoot":"","sources":["../../src/routes/content-insights.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAQ,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAkDtD,MAAM,WAAW,0BAA2B,SAAQ,cAAc;IACjE,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,0FAA0F;IAC1F,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3C,6FAA6F;IAC7F,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,0EAA0E;IAC1E,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/C,iFAAiF;IACjF,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C;;;;;;;OAOG;IACH,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACpD;AAiBD,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,0BAA0B,GAChC,4BAA4B,CA2I9B"}
1
+ {"version":3,"file":"content-insights.d.ts","sourceRoot":"","sources":["../../src/routes/content-insights.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAQ,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAkDtD,MAAM,WAAW,0BAA2B,SAAQ,cAAc;IACjE,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,0FAA0F;IAC1F,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3C,6FAA6F;IAC7F,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,0EAA0E;IAC1E,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/C,iFAAiF;IACjF,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C;;;;;;;OAOG;IACH,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACpD;AAiBD,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,0BAA0B,GAChC,4BAA4B,CA8I9B"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { dismissInsight, isMissingInsightDismissalSchema, isMissingInsightsTable, listInsightBoard, replaceInsightsBoard, undismissInsight, } from '../engine/content-insights.js';
2
+ import { dismissInsight, InsightPublicationError, isMissingInsightDismissalSchema, isMissingInsightPublicationSchema, isMissingInsightsTable, listInsightBoard, replaceInsightsBoard, undismissInsight, } from '../engine/content-insights.js';
3
3
  import { verifyHmac } from '../engine/foundry-dispatch.js';
4
4
  import { InsightsIngestPayloadSchema } from '../schema/insights-ingest.js';
5
5
  import { InsightDismissalReasonCodeSchema } from '../schema/types.js';
@@ -153,11 +153,14 @@ export function createContentInsightsRoutes(config) {
153
153
  ok: true,
154
154
  outcome: result.outcome,
155
155
  landedRunAttempt: result.landedRunAttempt,
156
+ publication: result.publication,
156
157
  });
157
158
  }
158
159
  catch (error) {
159
- if (isMissingInsightsTable(error))
160
+ if (isMissingInsightPublicationSchema(error))
160
161
  return json({ error: 'schema_not_ready' }, 409);
162
+ if (error instanceof InsightPublicationError)
163
+ return json({ error: error.code }, 409);
161
164
  throw error;
162
165
  }
163
166
  },
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights.js","sourceRoot":"","sources":["../../src/routes/content-insights.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-insights.js","sourceRoot":"","sources":["../../src/routes/content-insights.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACN,cAAc,EACd,uBAAuB,EACvB,+BAA+B,EAC/B,iCAAiC,EACjC,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAA;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAqB,MAAM,cAAc,CAAA;AACtD,OAAO,EACN,wBAAwB,IAAI,iCAAiC,EAC7D,0BAA0B,GAC1B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,aAAa,GAAG,CAAC;KACrB,MAAM,CAAC;IACP,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,UAAU,EAAE,gCAAgC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,MAAM,EAAE,CAAA;AACV,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAElE,sFAAsF;AACtF,SAAS,cAAc,CAAC,GAAiB;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChD,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,mBAAmB,CACjC,GAAwC;IAExC,MAAM,GAAG,GAAG,GAAG,EAAE,2BAA2B,CAAA;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACvC,IACC,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,KAAK,QAAQ;QACvB,OAAQ,GAAyB,CAAC,GAAG,KAAK,UAAU,EACnD,CAAC;QACF,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAO,GAAkC,CAAC,GAAG,EAAE,CAAA;YAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAA;QAC1D,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAA;QACZ,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AA2BD;qEACqE;AACrE,MAAM,aAAa,GAAG,yDAAyD,CAAA;AAE/E;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG;;YAEnB,CAAA;AAEZ,MAAM,UAAU,2BAA2B,CAC1C,MAAkC;IAElC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,IAAI,SAAS,CAAA;IAEpD,OAAO;QACN,KAAK,CAAC,KAAK,CAAC,GAAG;YACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YACzD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;gBAChE,OAAO,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,sBAAsB,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAA;gBAClF,MAAM,KAAK,CAAA;YACZ,CAAC;QACF,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,GAAG;YAChB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YACzD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAClF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAClB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAChF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;YAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7E,OAAO,IAAI,CACV;oBACC,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,wDAAwD,CAAC,EAAE;iBAC7E,EACD,GAAG,CACH,CAAA;YACF,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,cAAc,CACnB,GAAG,CAAC,EAAE,EACN,MAAM,EACN,MAAM,CAAC,IAAI,CAAC,SAAS,EACrB,GAAG,CAAC,MAAM,IAAI,IAAI,EAClB,MAAM,CAAC,IAAI,CAAC,UAAU,EACtB,IAAI,CACJ,CAAA;gBACD,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,+BAA+B,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAA;gBAC3F,MAAM,KAAK,CAAA;YACZ,CAAC;QACF,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,GAAG;YAClB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YACzD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YACpF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAClB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAChF,IAAI,CAAC;gBACJ,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC7D,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,sBAAsB,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAA;gBAClF,MAAM,KAAK,CAAA;YACZ,CAAC;QACF,CAAC;QAED,0FAA0F;QAC1F,KAAK,CAAC,MAAM,CAAC,GAAG;YACf,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACrD,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,EAAE,GAAG,CAAC,CAAA;YAE7F,IAAI,OAAe,CAAA;YACnB,IAAI,CAAC;gBACJ,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;YACnC,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAA;YACtE,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;YAC9D,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAA;YAE5D,IAAI,GAAY,CAAA;YAChB,IAAI,CAAC;gBACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAA;YACjD,CAAC;YAED,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACzD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAChF,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC9D,OAAO,IAAI,CAAC;oBACX,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;oBACzC,WAAW,EAAE,MAAM,CAAC,WAAW;iBAC/B,CAAC,CAAA;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,iCAAiC,CAAC,KAAK,CAAC;oBAC3C,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAA;gBAChD,IAAI,KAAK,YAAY,uBAAuB;oBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;gBACrF,MAAM,KAAK,CAAA;YACZ,CAAC;QACF,CAAC;QAED,qEAAqE;QACrE,sEAAsE;QACtE,2DAA2D;QAC3D,KAAK,CAAC,cAAc,CAAC,GAAG;YACvB,MAAM,UAAU,GAAG,MAAM,iCAAiC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnE,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,GAAG,CAAC,CAAA;YAErF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC9C,GAAG,CAAC,OAAO,EACX,UAAU,EACV,GAAG,CAAC,MAAM,EACV,yBAAyB,CACzB,CAAA;YACD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YAEzB,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAClD,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,EAGzD,CAAA;YACJ,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAGnE,CAAA;YACJ,OAAO,IAAI,CAAC;gBACX,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,aAAa,IAAI,MAAM;gBAC7B,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,EAAE;gBACpC,QAAQ,EAAE,cAAc,CAAC,OAAO,IAAI,EAAE;aACtC,CAAC,CAAA;QACH,CAAC;KACD,CAAA;AACF,CAAC"}
@@ -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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"}
@@ -219,14 +219,26 @@ const ContentMetadataSchema = z
219
219
  // deploy until 0.8.8, because the masthead only rendered the top-level
220
220
  // 'Invalid request' and never the field message telling them what to change.
221
221
  //
222
- // Only the onboarded share host is claimed, and only the share-link shape:
223
- // https, no credentials, default port, /s/<token> with an optional /download.
224
- // Nextcloud's folder-listing "Copy link" appends ?dir=/ to a single-file share;
225
- // it carries nothing the download route needs, so it is dropped. Anything else
226
- // -- another host, another path, a non-URL -- is returned untouched for the
227
- // normal URL validation to accept or reject on its own terms.
222
+ // The direct form is `https://<host>/public.php/dav/files/<token>`. From 0.8.8
223
+ // to 0.8.17 this produced `/s/<token>/download` instead; on 2026-09-19 that URL
224
+ // began answering HEAD with a 303 to the dav form, which the Go ingest probe does
225
+ // not follow, so every Nextcloud-sourced video blocked at `media-probe-source`
226
+ // (KB incident-uk-video-prep-2026-09-19). Storing the dav form directly means the
227
+ // probe never meets a redirect. A URL already in the dav form is returned as it
228
+ // is, so the function is idempotent, and rows saved earlier with the old
229
+ // `/download` form are not rewritten by a save that does not touch the source.
230
+ //
231
+ // Only the onboarded share host is claimed, and only two shapes: https, no
232
+ // credentials, default port, and either /s/<token> (with an optional /download
233
+ // and trailing slash) or the dav form itself. Nextcloud's folder-listing "Copy
234
+ // link" appends ?dir=/ to a single-file share; it carries nothing the download
235
+ // route needs, so it is dropped. Any other query is a shape this does not know,
236
+ // so the value is returned untouched. Anything else -- another host, another
237
+ // path, a non-URL -- is likewise returned untouched for the normal URL
238
+ // validation to accept or reject on its own terms.
228
239
  const NEXTCLOUD_SHARE_HOSTS = ['drive.fulcrum-portal.com'];
229
- const NEXTCLOUD_SHARE_PATH_RE = /^\/s\/[A-Za-z0-9_-]+(?:\/download)?\/?$/;
240
+ const NEXTCLOUD_SHARE_PATH_RE = /^\/s\/([A-Za-z0-9_-]+)(?:\/download)?\/?$/;
241
+ const NEXTCLOUD_DIRECT_PATH_RE = /^\/public\.php\/dav\/files\/[A-Za-z0-9_-]+$/;
230
242
  export function normaliseNextcloudShareUrl(value) {
231
243
  let url;
232
244
  try {
@@ -235,21 +247,23 @@ export function normaliseNextcloudShareUrl(value) {
235
247
  catch {
236
248
  return value;
237
249
  }
250
+ const host = url.hostname.toLowerCase().replace(/\.$/, '');
238
251
  if (url.protocol !== 'https:' ||
239
252
  url.username ||
240
253
  url.password ||
241
254
  (url.port && url.port !== '443') ||
242
- !NEXTCLOUD_SHARE_HOSTS.includes(url.hostname.toLowerCase().replace(/\.$/, '')) ||
243
- !NEXTCLOUD_SHARE_PATH_RE.test(url.pathname)) {
255
+ !NEXTCLOUD_SHARE_HOSTS.includes(host) ||
256
+ url.hash) {
244
257
  return value;
245
258
  }
246
- if (url.searchParams.get('dir') !== null && url.searchParams.size === 1) {
247
- url.search = '';
248
- }
249
- if (!/\/download\/?$/.test(url.pathname)) {
250
- url.pathname = `${url.pathname.replace(/\/$/, '')}/download`;
259
+ const onlyDirQuery = url.search === '' || (url.searchParams.get('dir') !== null && url.searchParams.size === 1);
260
+ if (NEXTCLOUD_DIRECT_PATH_RE.test(url.pathname)) {
261
+ return url.search === '' ? value : onlyDirQuery ? `https://${host}${url.pathname}` : value;
251
262
  }
252
- return url.toString();
263
+ const share = NEXTCLOUD_SHARE_PATH_RE.exec(url.pathname);
264
+ if (!share || !onlyDirQuery)
265
+ return value;
266
+ return `https://${host}/public.php/dav/files/${share[1]}`;
253
267
  }
254
268
  // A Google Drive link is not run through the Nextcloud rewrite; it is kept as
255
269
  // the editor pasted it. The podcast schema accepts a valid Drive file link