@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 +1 -1
- package/dist/engine/content-insights.d.ts +27 -11
- package/dist/engine/content-insights.d.ts.map +1 -1
- package/dist/engine/content-insights.js +102 -53
- package/dist/engine/content-insights.js.map +1 -1
- package/dist/routes/content-insights.d.ts.map +1 -1
- package/dist/routes/content-insights.js +5 -2
- package/dist/routes/content-insights.js.map +1 -1
- package/dist/routes/content.d.ts.map +1 -1
- package/dist/routes/content.js +29 -15
- package/dist/routes/content.js.map +1 -1
- package/dist/schema/migrations.d.ts.map +1 -1
- package/dist/schema/migrations.js +7 -0
- package/dist/schema/migrations.js.map +1 -1
- package/dist/schema/types.d.ts +4 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js.map +1 -1
- package/migrations/0032_content_insight_publication_identity.sql +3 -0
- package/package.json +1 -1
- package/src/engine/content-insights.ts +142 -63
- package/src/routes/content-insights.ts +6 -1
- package/src/routes/content.ts +29 -15
- package/src/schema/migrations.ts +7 -0
- package/src/schema/types.ts +4 -1
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
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
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
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
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;
|
|
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
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
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
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
96
|
-
.bind(meta.
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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":"
|
|
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":"
|
|
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 (
|
|
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":"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"}
|
|
@@ -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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"}
|
package/dist/routes/content.js
CHANGED
|
@@ -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
|
-
//
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
//
|
|
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(
|
|
243
|
-
|
|
255
|
+
!NEXTCLOUD_SHARE_HOSTS.includes(host) ||
|
|
256
|
+
url.hash) {
|
|
244
257
|
return value;
|
|
245
258
|
}
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|