@heavybit/shared-lib 1.3.2 → 2.1.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/README.md +100 -0
- package/dist/cjs/common/errors.js +44 -5
- package/dist/cjs/common/errors.js.map +1 -1
- package/dist/cjs/common/phone.js +43 -10
- package/dist/cjs/common/phone.js.map +1 -1
- package/dist/cjs/common/response.js +78 -5
- package/dist/cjs/common/response.js.map +1 -1
- package/dist/cjs/config/index.js +1 -1
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/context/index.js +49 -0
- package/dist/cjs/context/index.js.map +1 -0
- package/dist/cjs/contracts/index.js +0 -2
- package/dist/cjs/contracts/index.js.map +1 -1
- package/dist/cjs/contracts/notification-dispatch.js +87 -63
- package/dist/cjs/contracts/notification-dispatch.js.map +1 -1
- package/dist/cjs/express/auth.js +44 -11
- package/dist/cjs/express/auth.js.map +1 -1
- package/dist/cjs/express/index.js +1 -0
- package/dist/cjs/express/index.js.map +1 -1
- package/dist/cjs/express/middleware.js +154 -34
- package/dist/cjs/express/middleware.js.map +1 -1
- package/dist/cjs/express/respond.js +47 -0
- package/dist/cjs/express/respond.js.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/logging/index.js +76 -40
- package/dist/cjs/logging/index.js.map +1 -1
- package/dist/cjs/logging/redact.js +117 -0
- package/dist/cjs/logging/redact.js.map +1 -0
- package/dist/cjs/messaging/index.js +1 -0
- package/dist/cjs/messaging/index.js.map +1 -1
- package/dist/cjs/messaging/staff-notifier.js +36 -44
- package/dist/cjs/messaging/staff-notifier.js.map +1 -1
- package/dist/cjs/messaging/staff-recipients.js +57 -0
- package/dist/cjs/messaging/staff-recipients.js.map +1 -0
- package/dist/cjs/validation/index.js +27 -3
- package/dist/cjs/validation/index.js.map +1 -1
- package/dist/esm/common/errors.js +42 -4
- package/dist/esm/common/errors.js.map +1 -1
- package/dist/esm/common/phone.js +43 -10
- package/dist/esm/common/phone.js.map +1 -1
- package/dist/esm/common/response.js +75 -5
- package/dist/esm/common/response.js.map +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/context/index.js +44 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/contracts/index.js +0 -2
- package/dist/esm/contracts/index.js.map +1 -1
- package/dist/esm/contracts/notification-dispatch.js +85 -62
- package/dist/esm/contracts/notification-dispatch.js.map +1 -1
- package/dist/esm/express/auth.js +45 -12
- package/dist/esm/express/auth.js.map +1 -1
- package/dist/esm/express/index.js +1 -0
- package/dist/esm/express/index.js.map +1 -1
- package/dist/esm/express/middleware.js +146 -27
- package/dist/esm/express/middleware.js.map +1 -1
- package/dist/esm/express/respond.js +42 -0
- package/dist/esm/express/respond.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logging/index.js +68 -39
- package/dist/esm/logging/index.js.map +1 -1
- package/dist/esm/logging/redact.js +110 -0
- package/dist/esm/logging/redact.js.map +1 -0
- package/dist/esm/messaging/index.js +1 -0
- package/dist/esm/messaging/index.js.map +1 -1
- package/dist/esm/messaging/staff-notifier.js +36 -43
- package/dist/esm/messaging/staff-notifier.js.map +1 -1
- package/dist/esm/messaging/staff-recipients.js +53 -0
- package/dist/esm/messaging/staff-recipients.js.map +1 -0
- package/dist/esm/validation/index.js +27 -2
- package/dist/esm/validation/index.js.map +1 -1
- package/dist/types/alerting/index.d.ts +1 -1
- package/dist/types/alerting/index.d.ts.map +1 -1
- package/dist/types/cache/index.d.ts +1 -1
- package/dist/types/cache/index.d.ts.map +1 -1
- package/dist/types/common/errors.d.ts +48 -7
- package/dist/types/common/errors.d.ts.map +1 -1
- package/dist/types/common/phone.d.ts +35 -6
- package/dist/types/common/phone.d.ts.map +1 -1
- package/dist/types/common/response.d.ts +66 -5
- package/dist/types/common/response.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +1 -1
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/context/index.d.ts +39 -0
- package/dist/types/context/index.d.ts.map +1 -0
- package/dist/types/contracts/index.d.ts +0 -2
- package/dist/types/contracts/index.d.ts.map +1 -1
- package/dist/types/contracts/notification-dispatch.d.ts +208 -90
- package/dist/types/contracts/notification-dispatch.d.ts.map +1 -1
- package/dist/types/express/auth.d.ts +42 -6
- package/dist/types/express/auth.d.ts.map +1 -1
- package/dist/types/express/index.d.ts +1 -0
- package/dist/types/express/index.d.ts.map +1 -1
- package/dist/types/express/middleware.d.ts +86 -7
- package/dist/types/express/middleware.d.ts.map +1 -1
- package/dist/types/express/respond.d.ts +41 -0
- package/dist/types/express/respond.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/logging/index.d.ts +30 -4
- package/dist/types/logging/index.d.ts.map +1 -1
- package/dist/types/logging/redact.d.ts +54 -0
- package/dist/types/logging/redact.d.ts.map +1 -0
- package/dist/types/messaging/index.d.ts +1 -0
- package/dist/types/messaging/index.d.ts.map +1 -1
- package/dist/types/messaging/staff-notifier.d.ts +67 -36
- package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
- package/dist/types/messaging/staff-recipients.d.ts +50 -0
- package/dist/types/messaging/staff-recipients.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +36 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/validation/index.d.ts +33 -2
- package/dist/types/validation/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/contracts/editorial-draft.js +0 -120
- package/dist/cjs/contracts/editorial-draft.js.map +0 -1
- package/dist/cjs/contracts/upload-import.js +0 -54
- package/dist/cjs/contracts/upload-import.js.map +0 -1
- package/dist/esm/contracts/editorial-draft.js +0 -117
- package/dist/esm/contracts/editorial-draft.js.map +0 -1
- package/dist/esm/contracts/upload-import.js +0 -51
- package/dist/esm/contracts/upload-import.js.map +0 -1
- package/dist/types/contracts/editorial-draft.d.ts +0 -610
- package/dist/types/contracts/editorial-draft.d.ts.map +0 -1
- package/dist/types/contracts/upload-import.d.ts +0 -96
- package/dist/types/contracts/upload-import.d.ts.map +0 -1
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.editorialDraftSubmitSchema = exports.FACT_KINDS = exports.QUALITY_GATE_NAMES = exports.GATE_VERDICTS = exports.DRAFT_RISKS = exports.DRAFT_SOURCE_ROLES = exports.EDITORIAL_DRAFT_LIMITS = exports.EDITORIAL_DRAFT_SUBMIT = void 0;
|
|
4
|
-
const zod_1 = require("zod");
|
|
5
|
-
const index_js_1 = require("../validation/index.js");
|
|
6
|
-
/**
|
|
7
|
-
* The newswire → editorial draft hand-off (design Appendix A.4 plus `paragraphFactIds` and
|
|
8
|
-
* `image.uploadId`, decision R14). newswire-service stages it through its outbox; editorial-service
|
|
9
|
-
* validates it with the same schema before creating the story. One contract for both sides.
|
|
10
|
-
*/
|
|
11
|
-
exports.EDITORIAL_DRAFT_SUBMIT = 'editorial:draft.submit';
|
|
12
|
-
/** Field limits of the contract (editorial's story columns). */
|
|
13
|
-
exports.EDITORIAL_DRAFT_LIMITS = {
|
|
14
|
-
headline: 200,
|
|
15
|
-
excerpt: 400,
|
|
16
|
-
tags: 6,
|
|
17
|
-
seoTitle: 70,
|
|
18
|
-
seoDescription: 170,
|
|
19
|
-
/** Reader-facing update note ("Updated with …"), shown under the article byline. */
|
|
20
|
-
updateNote: 300,
|
|
21
|
-
};
|
|
22
|
-
exports.DRAFT_SOURCE_ROLES = ['primary', 'corroborating'];
|
|
23
|
-
exports.DRAFT_RISKS = ['low', 'medium', 'high'];
|
|
24
|
-
exports.GATE_VERDICTS = ['pass', 'review', 'block'];
|
|
25
|
-
/**
|
|
26
|
-
* Every quality gate newswire runs on a draft, in design order. A submitted draft carries one result per
|
|
27
|
-
* gate; editorial treats a missing one as not passed (auto-publish never runs on an unchecked draft).
|
|
28
|
-
*/
|
|
29
|
-
exports.QUALITY_GATE_NAMES = [
|
|
30
|
-
'originality', 'grounding', 'quote_limits', 'corroboration', 'conflicts',
|
|
31
|
-
'sensitivity', 'category', 'freshness', 'duplicate_of_published', 'length_format',
|
|
32
|
-
];
|
|
33
|
-
exports.FACT_KINDS = ['event', 'person', 'date', 'place', 'number', 'quote', 'context'];
|
|
34
|
-
const text = zod_1.z.string().trim().min(1);
|
|
35
|
-
const httpsUrl = zod_1.z
|
|
36
|
-
.string()
|
|
37
|
-
.url()
|
|
38
|
-
.refine((u) => u.startsWith('https://'), 'Source URL must use https');
|
|
39
|
-
const draftSourceSchema = zod_1.z.object({
|
|
40
|
-
name: text.max(160),
|
|
41
|
-
url: httpsUrl,
|
|
42
|
-
publishedAt: zod_1.z.string().datetime({ offset: true }).optional(),
|
|
43
|
-
role: zod_1.z.enum(exports.DRAFT_SOURCE_ROLES),
|
|
44
|
-
});
|
|
45
|
-
const gateResultSchema = zod_1.z.object({
|
|
46
|
-
gate: text,
|
|
47
|
-
verdict: zod_1.z.enum(exports.GATE_VERDICTS),
|
|
48
|
-
reasons: zod_1.z.array(zod_1.z.string()),
|
|
49
|
-
metrics: zod_1.z.record(zod_1.z.string(), zod_1.z.number()).optional(),
|
|
50
|
-
});
|
|
51
|
-
const factSupportSchema = zod_1.z.object({ itemId: index_js_1.idSchema, paragraph: zod_1.z.number().int().min(1) });
|
|
52
|
-
const factSchema = zod_1.z.object({
|
|
53
|
-
id: text,
|
|
54
|
-
statement: text,
|
|
55
|
-
kind: zod_1.z.enum(exports.FACT_KINDS),
|
|
56
|
-
entities: zod_1.z.array(zod_1.z.string()),
|
|
57
|
-
supportedBy: zod_1.z.array(factSupportSchema).min(1),
|
|
58
|
-
conflictsWith: zod_1.z.array(zod_1.z.string()),
|
|
59
|
-
independentSources: zod_1.z.number().int().min(0),
|
|
60
|
-
});
|
|
61
|
-
const quoteSchema = factSupportSchema.extend({ text, speaker: text });
|
|
62
|
-
const conflictSchema = zod_1.z.object({ description: text, factIds: zod_1.z.array(zod_1.z.string()) });
|
|
63
|
-
exports.editorialDraftSubmitSchema = zod_1.z
|
|
64
|
-
.object({
|
|
65
|
-
draftId: index_js_1.idSchema,
|
|
66
|
-
clusterId: index_js_1.idSchema,
|
|
67
|
-
headline: text.max(exports.EDITORIAL_DRAFT_LIMITS.headline),
|
|
68
|
-
excerpt: text.max(exports.EDITORIAL_DRAFT_LIMITS.excerpt),
|
|
69
|
-
paragraphs: zod_1.z.array(text).min(1),
|
|
70
|
-
/** The fact-sheet fact ids each paragraph asserts (same length as `paragraphs`). */
|
|
71
|
-
paragraphFactIds: zod_1.z.array(zod_1.z.array(zod_1.z.string())),
|
|
72
|
-
category: text.max(60),
|
|
73
|
-
tags: zod_1.z.array(text.max(40)).max(exports.EDITORIAL_DRAFT_LIMITS.tags),
|
|
74
|
-
seo: zod_1.z.object({
|
|
75
|
-
title: text.max(exports.EDITORIAL_DRAFT_LIMITS.seoTitle),
|
|
76
|
-
description: text.max(exports.EDITORIAL_DRAFT_LIMITS.seoDescription),
|
|
77
|
-
}),
|
|
78
|
-
social: zod_1.z.object({ facebook: text, x: text, whatsapp: text, instagram: text }),
|
|
79
|
-
sources: zod_1.z.array(draftSourceSchema).min(1),
|
|
80
|
-
/** An imported or profile cover (upload-service id), or null when the draft has none. */
|
|
81
|
-
image: zod_1.z.object({ uploadId: index_js_1.idSchema, credit: text.max(160), alt: text.max(255) }).nullable(),
|
|
82
|
-
relatedProfileIds: zod_1.z.array(index_js_1.idSchema),
|
|
83
|
-
suggestedProfileIds: zod_1.z.array(index_js_1.idSchema),
|
|
84
|
-
review: zod_1.z.object({
|
|
85
|
-
confidence: zod_1.z.number().min(0).max(1),
|
|
86
|
-
risk: zod_1.z.enum(exports.DRAFT_RISKS),
|
|
87
|
-
riskReasons: zod_1.z.array(zod_1.z.string()),
|
|
88
|
-
gates: zod_1.z.array(gateResultSchema),
|
|
89
|
-
factSheet: zod_1.z.object({
|
|
90
|
-
facts: zod_1.z.array(factSchema),
|
|
91
|
-
quotes: zod_1.z.array(quoteSchema),
|
|
92
|
-
conflicts: zod_1.z.array(conflictSchema),
|
|
93
|
-
}),
|
|
94
|
-
/** Prompt slug → version used to produce the draft. */
|
|
95
|
-
promptVersions: zod_1.z.record(zod_1.z.string(), zod_1.z.number().int().positive()),
|
|
96
|
-
}),
|
|
97
|
-
/**
|
|
98
|
-
* Present when the draft updates a story editorial has already published (Phase 21.2): editorial
|
|
99
|
-
* stores it as a pending update on that story instead of creating a new one. Additive and optional.
|
|
100
|
-
*/
|
|
101
|
-
updateOf: zod_1.z
|
|
102
|
-
.object({ storyId: index_js_1.idSchema, note: text.max(exports.EDITORIAL_DRAFT_LIMITS.updateNote) })
|
|
103
|
-
.optional(),
|
|
104
|
-
})
|
|
105
|
-
.superRefine((draft, ctx) => {
|
|
106
|
-
if (draft.paragraphFactIds.length !== draft.paragraphs.length) {
|
|
107
|
-
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, path: ['paragraphFactIds'], message: 'Must have one entry per paragraph' });
|
|
108
|
-
}
|
|
109
|
-
const factIds = new Set(draft.review.factSheet.facts.map((f) => f.id));
|
|
110
|
-
draft.paragraphFactIds.forEach((ids, i) => {
|
|
111
|
-
for (const id of ids) {
|
|
112
|
-
if (!factIds.has(id))
|
|
113
|
-
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, path: ['paragraphFactIds', i], message: `Unknown fact id ${id}` });
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
if (draft.sources.filter((s) => s.role === 'primary').length !== 1) {
|
|
117
|
-
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, path: ['sources'], message: 'Exactly one source must be primary' });
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
//# sourceMappingURL=editorial-draft.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editorial-draft.js","sourceRoot":"","sources":["../../../src/contracts/editorial-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uploadImportFailedSchema = exports.uploadImportCompletedSchema = exports.uploadImportCommandSchema = exports.UPLOAD_IMPORT_LIMITS = exports.UPLOAD_IMPORT_POLICIES = exports.UPLOAD_IMPORT_EVENTS = exports.UPLOAD_IMPORT = void 0;
|
|
4
|
-
const zod_1 = require("zod");
|
|
5
|
-
const index_js_1 = require("../validation/index.js");
|
|
6
|
-
/**
|
|
7
|
-
* Licensed image import by URL (Newswire R5, decision R39). newswire-service (and later
|
|
8
|
-
* editorial-service) sends `upload:import`; upload-service fetches the file and answers with an
|
|
9
|
-
* `upload.import.completed` or `upload.import.failed` event. One contract for both sides.
|
|
10
|
-
*/
|
|
11
|
-
exports.UPLOAD_IMPORT = 'upload:import';
|
|
12
|
-
exports.UPLOAD_IMPORT_EVENTS = {
|
|
13
|
-
COMPLETED: 'upload.import.completed',
|
|
14
|
-
FAILED: 'upload.import.failed',
|
|
15
|
-
};
|
|
16
|
-
/** Upload policies an import may use. */
|
|
17
|
-
exports.UPLOAD_IMPORT_POLICIES = ['news_image'];
|
|
18
|
-
/** Field limits of the contract (upload-service's `uploads` columns). */
|
|
19
|
-
exports.UPLOAD_IMPORT_LIMITS = {
|
|
20
|
-
url: 2048,
|
|
21
|
-
ownerType: 50,
|
|
22
|
-
licenceHolder: 160,
|
|
23
|
-
licenceBasis: 255,
|
|
24
|
-
reason: 255,
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* `upload:import` data. The URL is only length-checked here: upload-service rejects a non-https or
|
|
28
|
-
* unsafe URL itself, so the sender hears about it through a `failed` event instead of a dead letter.
|
|
29
|
-
*/
|
|
30
|
-
exports.uploadImportCommandSchema = zod_1.z.object({
|
|
31
|
-
/** ULID the outcome event echoes back; upload-service is idempotent on it. */
|
|
32
|
-
importId: index_js_1.idSchema,
|
|
33
|
-
url: zod_1.z.string().min(1).max(exports.UPLOAD_IMPORT_LIMITS.url),
|
|
34
|
-
policy: zod_1.z.enum(exports.UPLOAD_IMPORT_POLICIES),
|
|
35
|
-
/** Echoed in the outcome only; the imported upload is a system row with no owner. */
|
|
36
|
-
ownerType: zod_1.z.string().min(1).max(exports.UPLOAD_IMPORT_LIMITS.ownerType),
|
|
37
|
-
ownerId: index_js_1.idSchema,
|
|
38
|
-
licence: zod_1.z.object({
|
|
39
|
-
holder: zod_1.z.string().trim().min(1).max(exports.UPLOAD_IMPORT_LIMITS.licenceHolder),
|
|
40
|
-
basis: zod_1.z.string().trim().min(1).max(exports.UPLOAD_IMPORT_LIMITS.licenceBasis),
|
|
41
|
-
}),
|
|
42
|
-
});
|
|
43
|
-
exports.uploadImportCompletedSchema = zod_1.z.object({
|
|
44
|
-
importId: index_js_1.idSchema,
|
|
45
|
-
uploadId: index_js_1.idSchema,
|
|
46
|
-
ownerType: zod_1.z.string().min(1).max(exports.UPLOAD_IMPORT_LIMITS.ownerType),
|
|
47
|
-
ownerId: index_js_1.idSchema,
|
|
48
|
-
});
|
|
49
|
-
/** `reason` is a machine code (`too_large`, `http_404`, …; see upload-service `ImportFailureReason`). */
|
|
50
|
-
exports.uploadImportFailedSchema = zod_1.z.object({
|
|
51
|
-
importId: index_js_1.idSchema,
|
|
52
|
-
reason: zod_1.z.string().min(1).max(exports.UPLOAD_IMPORT_LIMITS.reason),
|
|
53
|
-
});
|
|
54
|
-
//# sourceMappingURL=upload-import.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-import.js","sourceRoot":"","sources":["../../../src/contracts/upload-import.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,qDAAkD;AAElD;;;;GAIG;AACU,QAAA,aAAa,GAAG,eAAe,CAAC;AAEhC,QAAA,oBAAoB,GAAG;IAClC,SAAS,EAAE,yBAAyB;IACpC,MAAM,EAAE,sBAAsB;CACtB,CAAC;AAEX,yCAAyC;AAC5B,QAAA,sBAAsB,GAAG,CAAC,YAAY,CAAU,CAAC;AAG9D,yEAAyE;AAC5D,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,GAAG;IACjB,MAAM,EAAE,GAAG;CACH,CAAC;AAEX;;;GAGG;AACU,QAAA,yBAAyB,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,8EAA8E;IAC9E,QAAQ,EAAE,mBAAQ;IAClB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,GAAG,CAAC;IACpD,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,8BAAsB,CAAC;IACtC,qFAAqF;IACrF,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,mBAAQ;IACjB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,aAAa,CAAC;QACxE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,YAAY,CAAC;KACvE,CAAC;CACH,CAAC,CAAC;AAEU,QAAA,2BAA2B,GAAG,OAAC,CAAC,MAAM,CAAC;IAClD,QAAQ,EAAE,mBAAQ;IAClB,QAAQ,EAAE,mBAAQ;IAClB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,mBAAQ;CAClB,CAAC,CAAC;AAEH,yGAAyG;AAC5F,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,mBAAQ;IAClB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAAoB,CAAC,MAAM,CAAC;CAC3D,CAAC,CAAC"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { idSchema } from '../validation/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* The newswire → editorial draft hand-off (design Appendix A.4 plus `paragraphFactIds` and
|
|
5
|
-
* `image.uploadId`, decision R14). newswire-service stages it through its outbox; editorial-service
|
|
6
|
-
* validates it with the same schema before creating the story. One contract for both sides.
|
|
7
|
-
*/
|
|
8
|
-
export const EDITORIAL_DRAFT_SUBMIT = 'editorial:draft.submit';
|
|
9
|
-
/** Field limits of the contract (editorial's story columns). */
|
|
10
|
-
export const EDITORIAL_DRAFT_LIMITS = {
|
|
11
|
-
headline: 200,
|
|
12
|
-
excerpt: 400,
|
|
13
|
-
tags: 6,
|
|
14
|
-
seoTitle: 70,
|
|
15
|
-
seoDescription: 170,
|
|
16
|
-
/** Reader-facing update note ("Updated with …"), shown under the article byline. */
|
|
17
|
-
updateNote: 300,
|
|
18
|
-
};
|
|
19
|
-
export const DRAFT_SOURCE_ROLES = ['primary', 'corroborating'];
|
|
20
|
-
export const DRAFT_RISKS = ['low', 'medium', 'high'];
|
|
21
|
-
export const GATE_VERDICTS = ['pass', 'review', 'block'];
|
|
22
|
-
/**
|
|
23
|
-
* Every quality gate newswire runs on a draft, in design order. A submitted draft carries one result per
|
|
24
|
-
* gate; editorial treats a missing one as not passed (auto-publish never runs on an unchecked draft).
|
|
25
|
-
*/
|
|
26
|
-
export const QUALITY_GATE_NAMES = [
|
|
27
|
-
'originality', 'grounding', 'quote_limits', 'corroboration', 'conflicts',
|
|
28
|
-
'sensitivity', 'category', 'freshness', 'duplicate_of_published', 'length_format',
|
|
29
|
-
];
|
|
30
|
-
export const FACT_KINDS = ['event', 'person', 'date', 'place', 'number', 'quote', 'context'];
|
|
31
|
-
const text = z.string().trim().min(1);
|
|
32
|
-
const httpsUrl = z
|
|
33
|
-
.string()
|
|
34
|
-
.url()
|
|
35
|
-
.refine((u) => u.startsWith('https://'), 'Source URL must use https');
|
|
36
|
-
const draftSourceSchema = z.object({
|
|
37
|
-
name: text.max(160),
|
|
38
|
-
url: httpsUrl,
|
|
39
|
-
publishedAt: z.string().datetime({ offset: true }).optional(),
|
|
40
|
-
role: z.enum(DRAFT_SOURCE_ROLES),
|
|
41
|
-
});
|
|
42
|
-
const gateResultSchema = z.object({
|
|
43
|
-
gate: text,
|
|
44
|
-
verdict: z.enum(GATE_VERDICTS),
|
|
45
|
-
reasons: z.array(z.string()),
|
|
46
|
-
metrics: z.record(z.string(), z.number()).optional(),
|
|
47
|
-
});
|
|
48
|
-
const factSupportSchema = z.object({ itemId: idSchema, paragraph: z.number().int().min(1) });
|
|
49
|
-
const factSchema = z.object({
|
|
50
|
-
id: text,
|
|
51
|
-
statement: text,
|
|
52
|
-
kind: z.enum(FACT_KINDS),
|
|
53
|
-
entities: z.array(z.string()),
|
|
54
|
-
supportedBy: z.array(factSupportSchema).min(1),
|
|
55
|
-
conflictsWith: z.array(z.string()),
|
|
56
|
-
independentSources: z.number().int().min(0),
|
|
57
|
-
});
|
|
58
|
-
const quoteSchema = factSupportSchema.extend({ text, speaker: text });
|
|
59
|
-
const conflictSchema = z.object({ description: text, factIds: z.array(z.string()) });
|
|
60
|
-
export const editorialDraftSubmitSchema = z
|
|
61
|
-
.object({
|
|
62
|
-
draftId: idSchema,
|
|
63
|
-
clusterId: idSchema,
|
|
64
|
-
headline: text.max(EDITORIAL_DRAFT_LIMITS.headline),
|
|
65
|
-
excerpt: text.max(EDITORIAL_DRAFT_LIMITS.excerpt),
|
|
66
|
-
paragraphs: z.array(text).min(1),
|
|
67
|
-
/** The fact-sheet fact ids each paragraph asserts (same length as `paragraphs`). */
|
|
68
|
-
paragraphFactIds: z.array(z.array(z.string())),
|
|
69
|
-
category: text.max(60),
|
|
70
|
-
tags: z.array(text.max(40)).max(EDITORIAL_DRAFT_LIMITS.tags),
|
|
71
|
-
seo: z.object({
|
|
72
|
-
title: text.max(EDITORIAL_DRAFT_LIMITS.seoTitle),
|
|
73
|
-
description: text.max(EDITORIAL_DRAFT_LIMITS.seoDescription),
|
|
74
|
-
}),
|
|
75
|
-
social: z.object({ facebook: text, x: text, whatsapp: text, instagram: text }),
|
|
76
|
-
sources: z.array(draftSourceSchema).min(1),
|
|
77
|
-
/** An imported or profile cover (upload-service id), or null when the draft has none. */
|
|
78
|
-
image: z.object({ uploadId: idSchema, credit: text.max(160), alt: text.max(255) }).nullable(),
|
|
79
|
-
relatedProfileIds: z.array(idSchema),
|
|
80
|
-
suggestedProfileIds: z.array(idSchema),
|
|
81
|
-
review: z.object({
|
|
82
|
-
confidence: z.number().min(0).max(1),
|
|
83
|
-
risk: z.enum(DRAFT_RISKS),
|
|
84
|
-
riskReasons: z.array(z.string()),
|
|
85
|
-
gates: z.array(gateResultSchema),
|
|
86
|
-
factSheet: z.object({
|
|
87
|
-
facts: z.array(factSchema),
|
|
88
|
-
quotes: z.array(quoteSchema),
|
|
89
|
-
conflicts: z.array(conflictSchema),
|
|
90
|
-
}),
|
|
91
|
-
/** Prompt slug → version used to produce the draft. */
|
|
92
|
-
promptVersions: z.record(z.string(), z.number().int().positive()),
|
|
93
|
-
}),
|
|
94
|
-
/**
|
|
95
|
-
* Present when the draft updates a story editorial has already published (Phase 21.2): editorial
|
|
96
|
-
* stores it as a pending update on that story instead of creating a new one. Additive and optional.
|
|
97
|
-
*/
|
|
98
|
-
updateOf: z
|
|
99
|
-
.object({ storyId: idSchema, note: text.max(EDITORIAL_DRAFT_LIMITS.updateNote) })
|
|
100
|
-
.optional(),
|
|
101
|
-
})
|
|
102
|
-
.superRefine((draft, ctx) => {
|
|
103
|
-
if (draft.paragraphFactIds.length !== draft.paragraphs.length) {
|
|
104
|
-
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['paragraphFactIds'], message: 'Must have one entry per paragraph' });
|
|
105
|
-
}
|
|
106
|
-
const factIds = new Set(draft.review.factSheet.facts.map((f) => f.id));
|
|
107
|
-
draft.paragraphFactIds.forEach((ids, i) => {
|
|
108
|
-
for (const id of ids) {
|
|
109
|
-
if (!factIds.has(id))
|
|
110
|
-
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['paragraphFactIds', i], message: `Unknown fact id ${id}` });
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
if (draft.sources.filter((s) => s.role === 'primary').length !== 1) {
|
|
114
|
-
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ['sources'], message: 'Exactly one source must be primary' });
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
//# sourceMappingURL=editorial-draft.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editorial-draft.js","sourceRoot":"","sources":["../../../src/contracts/editorial-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { idSchema } from '../validation/index.js';
|
|
3
|
-
/**
|
|
4
|
-
* Licensed image import by URL (Newswire R5, decision R39). newswire-service (and later
|
|
5
|
-
* editorial-service) sends `upload:import`; upload-service fetches the file and answers with an
|
|
6
|
-
* `upload.import.completed` or `upload.import.failed` event. One contract for both sides.
|
|
7
|
-
*/
|
|
8
|
-
export const UPLOAD_IMPORT = 'upload:import';
|
|
9
|
-
export const UPLOAD_IMPORT_EVENTS = {
|
|
10
|
-
COMPLETED: 'upload.import.completed',
|
|
11
|
-
FAILED: 'upload.import.failed',
|
|
12
|
-
};
|
|
13
|
-
/** Upload policies an import may use. */
|
|
14
|
-
export const UPLOAD_IMPORT_POLICIES = ['news_image'];
|
|
15
|
-
/** Field limits of the contract (upload-service's `uploads` columns). */
|
|
16
|
-
export const UPLOAD_IMPORT_LIMITS = {
|
|
17
|
-
url: 2048,
|
|
18
|
-
ownerType: 50,
|
|
19
|
-
licenceHolder: 160,
|
|
20
|
-
licenceBasis: 255,
|
|
21
|
-
reason: 255,
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* `upload:import` data. The URL is only length-checked here: upload-service rejects a non-https or
|
|
25
|
-
* unsafe URL itself, so the sender hears about it through a `failed` event instead of a dead letter.
|
|
26
|
-
*/
|
|
27
|
-
export const uploadImportCommandSchema = z.object({
|
|
28
|
-
/** ULID the outcome event echoes back; upload-service is idempotent on it. */
|
|
29
|
-
importId: idSchema,
|
|
30
|
-
url: z.string().min(1).max(UPLOAD_IMPORT_LIMITS.url),
|
|
31
|
-
policy: z.enum(UPLOAD_IMPORT_POLICIES),
|
|
32
|
-
/** Echoed in the outcome only; the imported upload is a system row with no owner. */
|
|
33
|
-
ownerType: z.string().min(1).max(UPLOAD_IMPORT_LIMITS.ownerType),
|
|
34
|
-
ownerId: idSchema,
|
|
35
|
-
licence: z.object({
|
|
36
|
-
holder: z.string().trim().min(1).max(UPLOAD_IMPORT_LIMITS.licenceHolder),
|
|
37
|
-
basis: z.string().trim().min(1).max(UPLOAD_IMPORT_LIMITS.licenceBasis),
|
|
38
|
-
}),
|
|
39
|
-
});
|
|
40
|
-
export const uploadImportCompletedSchema = z.object({
|
|
41
|
-
importId: idSchema,
|
|
42
|
-
uploadId: idSchema,
|
|
43
|
-
ownerType: z.string().min(1).max(UPLOAD_IMPORT_LIMITS.ownerType),
|
|
44
|
-
ownerId: idSchema,
|
|
45
|
-
});
|
|
46
|
-
/** `reason` is a machine code (`too_large`, `http_404`, …; see upload-service `ImportFailureReason`). */
|
|
47
|
-
export const uploadImportFailedSchema = z.object({
|
|
48
|
-
importId: idSchema,
|
|
49
|
-
reason: z.string().min(1).max(UPLOAD_IMPORT_LIMITS.reason),
|
|
50
|
-
});
|
|
51
|
-
//# sourceMappingURL=upload-import.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-import.js","sourceRoot":"","sources":["../../../src/contracts/upload-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS,EAAE,yBAAyB;IACpC,MAAM,EAAE,sBAAsB;CACtB,CAAC;AAEX,yCAAyC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,YAAY,CAAU,CAAC;AAG9D,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,GAAG;IACjB,MAAM,EAAE,GAAG;CACH,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,8EAA8E;IAC9E,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC;IACpD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC;IACtC,qFAAqF;IACrF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,YAAY,CAAC;KACvE,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,QAAQ;CAClB,CAAC,CAAC;AAEH,yGAAyG;AACzG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC;CAC3D,CAAC,CAAC"}
|