@happyvertical/smrt-content 0.39.11 → 0.39.13
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/AGENTS.md +1 -1
- package/README.md +18 -4
- package/dist/chunks/content-transparency-Bh6axaZj.js.map +1 -1
- package/dist/content-governance.d.ts +1 -1
- package/dist/content-governance.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/manifest.json +35 -35
- package/dist/smrt-knowledge.json +6 -6
- package/package.json +14 -14
package/AGENTS.md
CHANGED
|
@@ -8,7 +8,7 @@ STI content management with governance workflows, contribution intake, AI review
|
|
|
8
8
|
- **Article**, **ContentDocument**, **Mirror**: STI subclasses — all share `contents` table via `_meta_type`
|
|
9
9
|
- **ContentReview**: AI review result tied to a governance policy. Fields: `contentId`, `policyKey`, `kind`, `status` (accepted/flagged/rejected), `findings`, `fingerprint`, `metadata`
|
|
10
10
|
- **ContentCorrection**: Post-publication change record. Fields: `contentId`, `type` (correction/retraction/update/clarification), `summary`, `note`, `status`, `metadata`
|
|
11
|
-
- **ContentVersion**: Content snapshot. Fields: `contentId`, `kind` (publication/
|
|
11
|
+
- **ContentVersion**: Content snapshot. Fields: `contentId`, `kind` (manual/draft/review/publication/correction/auto-generated), `versionNumber`, `summary`, `metadata` (includes `transparency` for publication versions)
|
|
12
12
|
- **ContentReference**: Junction model for content-to-content links (`content_references` table). Nullable `targetVersion` pins a citation to a specific `ContentVersion.version` for drift detection.
|
|
13
13
|
- **ContentGovernancePolicy**: Persisted review policy (key, label, kind, instructions)
|
|
14
14
|
- **ContentGovernanceProfile**: Persisted review profile (key, label, requirements array)
|
package/README.md
CHANGED
|
@@ -174,8 +174,15 @@ are created automatically when governed content is published.
|
|
|
174
174
|
```typescript
|
|
175
175
|
// Manual version snapshot
|
|
176
176
|
await article.mutateVersionAction({
|
|
177
|
-
kind: '
|
|
178
|
-
summary: '
|
|
177
|
+
kind: 'manual',
|
|
178
|
+
summary: 'Before the editorial rewrite.',
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Snapshot created by an ingestion or generation worker
|
|
182
|
+
await article.mutateVersionAction({
|
|
183
|
+
kind: 'auto-generated',
|
|
184
|
+
summary: 'Planning asset extracted.',
|
|
185
|
+
metadata: { source: 'planning-asset-ingestion' },
|
|
179
186
|
});
|
|
180
187
|
|
|
181
188
|
// List version history
|
|
@@ -185,6 +192,13 @@ const versions = await article.listVersions();
|
|
|
185
192
|
await versions.restoreIntoContent(versionId);
|
|
186
193
|
```
|
|
187
194
|
|
|
195
|
+
#### Migrating automated producers
|
|
196
|
+
|
|
197
|
+
Automated producers should use `kind: 'auto-generated'` instead of encoding
|
|
198
|
+
generation as `kind: 'draft'` plus `metadata.generated = 'auto'`. Keep
|
|
199
|
+
source-specific metadata such as `metadata.source` when it provides useful
|
|
200
|
+
provenance.
|
|
201
|
+
|
|
188
202
|
### References & Drift Detection
|
|
189
203
|
|
|
190
204
|
References are `(source_id, target_id)` edges between Content rows. They can
|
|
@@ -503,7 +517,7 @@ thumbnail selection, and save payload behavior as the package editors.
|
|
|
503
517
|
| `ContentReference` | Junction model for content-to-content links; nullable `targetVersion` pins citation-time `ContentVersion.version` for drift detection |
|
|
504
518
|
| `ContentReview` | AI review result tied to a governance policy |
|
|
505
519
|
| `ContentCorrection` | Post-publication correction record |
|
|
506
|
-
| `ContentVersion` | Content snapshot with kind (`'publication'`, `'
|
|
520
|
+
| `ContentVersion` | Content snapshot with kind (`'manual'`, `'draft'`, `'review'`, `'publication'`, `'correction'`, or `'auto-generated'`) and transparency metadata |
|
|
507
521
|
| `ContentContribution` | Held inbound submission with approval, rejection, withdrawal, and promotion actions |
|
|
508
522
|
| `ContentContributions` | Contribution collection with web intake, email ingestion, inbox, and contributor views |
|
|
509
523
|
| `ContentContributionType` | Persisted contribution-type override for app-defined intake rules and promotion mapping |
|
|
@@ -561,7 +575,7 @@ thumbnail selection, and save payload behavior as the package editors.
|
|
|
561
575
|
| `ContentReviewResult` | AI review output with findings |
|
|
562
576
|
| `ContentReviewFinding` | Individual issue from a review |
|
|
563
577
|
| `ContentCorrectionType` | `'correction' \| 'retraction' \| 'update' \| 'clarification'` |
|
|
564
|
-
| `ContentVersionKind` | `'publication' \| '
|
|
578
|
+
| `ContentVersionKind` | `'manual' \| 'draft' \| 'review' \| 'publication' \| 'correction' \| 'auto-generated'` |
|
|
565
579
|
| `ContentTransparencyData` | Full transparency report data shape |
|
|
566
580
|
| `ContentPublishReadinessState` | Profile evaluation result |
|
|
567
581
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-transparency-Bh6axaZj.js","names":[],"sources":["../../src/content-governance.ts","../../src/content-transparency.ts"],"sourcesContent":["import type { Fact, FactContentRelationship } from '@happyvertical/smrt-facts';\nimport {\n getCurrentTenant,\n isSuperAdminBypass,\n isSystemContext,\n isTenancyEnabled,\n} from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type { Content } from './content';\n\nexport type ContentReviewKind = 'facts' | 'safety' | 'custom';\n\nexport type ContentReviewStatus =\n | 'pending'\n | 'passed'\n | 'flagged'\n | 'failed'\n | 'waived';\n\nexport type ContentReviewSeverity = 'info' | 'warning' | 'error';\n\nexport type ContentVersionKind =\n | 'manual'\n | 'draft'\n | 'review'\n | 'publication'\n | 'correction';\n\nexport type ContentCorrectionType = 'fact' | 'safety' | 'copy' | 'custom';\n\nexport type ContentCorrectionStatus = 'draft' | 'published' | 'retracted';\n\nexport interface ContentReviewFinding {\n severity: ContentReviewSeverity;\n title: string;\n detail: string;\n factId?: string;\n quote?: string;\n suggestedChange?: string;\n ruleId?: string;\n}\n\nexport interface ContentReviewResult {\n status: ContentReviewStatus;\n summary: string;\n findings: ContentReviewFinding[];\n}\n\nexport interface ContentReviewRequirement {\n policyKey: string;\n label?: string;\n blocking?: boolean;\n acceptedStatuses?: ContentReviewStatus[];\n}\n\nexport interface ContentReviewProfileEvaluationItem {\n kind: ContentReviewKind;\n policyKey: string;\n label: string;\n blocking: boolean;\n acceptedStatuses: ContentReviewStatus[];\n missing: boolean;\n stale: boolean;\n executed: boolean;\n satisfied: boolean;\n latestReviewId: string | null;\n latestStatus: ContentReviewStatus | null;\n latestSummary: string | null;\n}\n\nexport interface ContentReviewProfileEvaluation {\n profileKey: string;\n ready: boolean;\n complete: boolean;\n requirements: ContentReviewProfileEvaluationItem[];\n}\n\nexport interface ContentReviewPolicyDefinition {\n key: string;\n label: string;\n kind: ContentReviewKind;\n instructions: string;\n enabled?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceProfileDefinition {\n key: string;\n label: string;\n description?: string;\n enabled?: boolean;\n requirements: ContentReviewRequirement[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceAssignmentDefinition {\n key?: string;\n label?: string;\n contentType: string;\n contentVariant?: string | null;\n enabled?: boolean;\n factLinkingEnabled?: boolean;\n transparencyEnabled?: boolean;\n publicationProfileKey?: string | null;\n correctionProfileKey?: string | null;\n enforcePublishReadiness?: boolean;\n defaultFactRelationship?: FactContentRelationship;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceConfig {\n policies: ContentReviewPolicyDefinition[];\n profiles: ContentGovernanceProfileDefinition[];\n assignments: ContentGovernanceAssignmentDefinition[];\n}\n\nexport interface PersistedContentGovernancePolicyRecord\n extends ContentReviewPolicyDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceProfileRecord\n extends ContentGovernanceProfileDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceAssignmentRecord\n extends ContentGovernanceAssignmentDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceDefinitions {\n policies: PersistedContentGovernancePolicyRecord[];\n profiles: PersistedContentGovernanceProfileRecord[];\n assignments: PersistedContentGovernanceAssignmentRecord[];\n}\n\nexport interface ResolvedContentGovernance {\n isGoverned: boolean;\n factLinkingEnabled: boolean;\n transparencyEnabled: boolean;\n publicationProfileKey: string | null;\n correctionProfileKey: string | null;\n enforcePublishReadiness: boolean;\n defaultFactRelationship: FactContentRelationship;\n reviewPolicies: ContentReviewPolicyDefinition[];\n availableProfiles: ContentGovernanceProfileDefinition[];\n assignment: ContentGovernanceAssignmentDefinition | null;\n}\n\nexport interface ContentGovernanceState extends ResolvedContentGovernance {\n reviewProfiles: ContentReviewProfileEvaluation[];\n}\n\nexport interface CreateContentVersionOptions {\n kind?: ContentVersionKind;\n summary?: string;\n metadata?: Record<string, unknown>;\n snapshot?: Record<string, unknown>;\n}\n\nexport interface RunContentReviewOptions {\n kind?: ContentReviewKind;\n policyKey?: string;\n reviewer?: string;\n instructions?: string;\n facts?: Fact[];\n factIds?: string[];\n metadata?: Record<string, unknown>;\n createVersion?: boolean;\n}\n\nexport interface IssueContentCorrectionOptions {\n correctionType?: ContentCorrectionType;\n factId?: string;\n correctedFactText?: string;\n summary: string;\n incorrectText?: string;\n correctedText?: string;\n publicNote?: string;\n metadata?: Record<string, unknown>;\n createVersion?: boolean;\n publish?: boolean;\n}\n\nexport interface BuildContentReviewPromptOptions {\n kind: ContentReviewKind;\n content: Pick<\n Content,\n | 'id'\n | 'type'\n | 'status'\n | 'state'\n | 'title'\n | 'description'\n | 'body'\n | 'author'\n | 'publish_date'\n >;\n facts?: Fact[];\n policy?: ContentReviewPolicyDefinition | null;\n customInstructions?: string;\n}\n\nexport interface ResolveContentGovernanceOptions {\n contentType?: string | null;\n contentVariant?: string | null;\n db?: DatabaseInterface | null;\n tenantId?: string | null;\n}\n\nconst DEFAULT_FACT_RELATIONSHIP: FactContentRelationship = 'supports';\n\nconst DEFAULT_REVIEW_POLICIES: ContentReviewPolicyDefinition[] = [\n {\n key: 'facts',\n label: 'Facts Review',\n kind: 'facts',\n instructions: [\n 'Compare the draft copy against the supplied facts only.',\n 'Flag contradictions, unsupported claims, stale claims, and places where the copy should cite or qualify a statement.',\n 'Do not invent missing facts. If the draft makes a claim that is not supported by the provided facts, flag it clearly.',\n ].join(' '),\n enabled: true,\n },\n {\n key: 'safety',\n label: 'Safety Review',\n kind: 'safety',\n instructions: [\n 'Review the content for legal, reputational, and user-safety risks.',\n 'At minimum, check for defamation risk, privacy leaks, unverified allegations, unsafe instructions, and medical, legal, or financial claims that need qualification.',\n 'Flag content that should be softened, attributed, removed, or escalated for human review.',\n ].join(' '),\n enabled: true,\n },\n];\n\nconst DEFAULT_REVIEW_PROFILES: ContentGovernanceProfileDefinition[] = [\n {\n key: 'publication',\n label: 'Publication',\n description: 'Default publication-time editorial checks.',\n enabled: true,\n requirements: [\n {\n policyKey: 'safety',\n label: 'Safety Review',\n blocking: false,\n },\n {\n policyKey: 'facts',\n label: 'Facts Review',\n blocking: false,\n },\n ],\n },\n {\n key: 'correction',\n label: 'Correction',\n description: 'Default correction-time editorial checks.',\n enabled: true,\n requirements: [\n {\n policyKey: 'safety',\n label: 'Safety Review',\n blocking: false,\n },\n ],\n },\n];\n\nconst DEFAULT_CONTENT_GOVERNANCE_CONFIG: ContentGovernanceConfig = {\n policies: DEFAULT_REVIEW_POLICIES.map(clonePolicyDefinition),\n profiles: DEFAULT_REVIEW_PROFILES.map(cloneProfileDefinition),\n assignments: [],\n};\n\nlet governanceConfig: ContentGovernanceConfig = cloneGovernanceConfig(\n DEFAULT_CONTENT_GOVERNANCE_CONFIG,\n);\n// Process-global by design: apps are expected to configure governance once at\n// startup and use persisted records for runtime admin overrides.\n\nfunction cloneReviewRequirement(\n requirement: ContentReviewRequirement,\n): ContentReviewRequirement {\n return {\n ...requirement,\n acceptedStatuses: requirement.acceptedStatuses\n ? [...requirement.acceptedStatuses]\n : undefined,\n };\n}\n\nfunction normalizePolicyDefinition(\n policy: ContentReviewPolicyDefinition,\n): ContentReviewPolicyDefinition {\n return {\n key: policy.key,\n label: policy.label || policy.key,\n kind: policy.kind || getFallbackPolicyKind(policy.key),\n instructions: policy.instructions || '',\n enabled: policy.enabled !== false,\n metadata: policy.metadata ? { ...policy.metadata } : undefined,\n };\n}\n\nfunction clonePolicyDefinition(\n policy: ContentReviewPolicyDefinition,\n): ContentReviewPolicyDefinition {\n return normalizePolicyDefinition(policy);\n}\n\nfunction normalizeProfileDefinition(\n profile: ContentGovernanceProfileDefinition,\n): ContentGovernanceProfileDefinition {\n return {\n key: profile.key,\n label: profile.label || profile.key,\n description: profile.description || '',\n enabled: profile.enabled !== false,\n requirements: Array.isArray(profile.requirements)\n ? profile.requirements.map(cloneReviewRequirement)\n : [],\n metadata: profile.metadata ? { ...profile.metadata } : undefined,\n };\n}\n\nfunction cloneProfileDefinition(\n profile: ContentGovernanceProfileDefinition,\n): ContentGovernanceProfileDefinition {\n return normalizeProfileDefinition(profile);\n}\n\nexport function buildContentGovernanceAssignmentKey(\n contentType: string,\n contentVariant?: string | null,\n): string {\n return `${contentType || ''}::${contentVariant || ''}`;\n}\n\nfunction normalizeAssignmentDefinition(\n assignment: ContentGovernanceAssignmentDefinition,\n): ContentGovernanceAssignmentDefinition {\n return {\n key:\n assignment.key ||\n buildContentGovernanceAssignmentKey(\n assignment.contentType,\n assignment.contentVariant,\n ),\n label: assignment.label || '',\n contentType: assignment.contentType,\n contentVariant: assignment.contentVariant || '',\n enabled: assignment.enabled !== false,\n factLinkingEnabled: assignment.factLinkingEnabled === true,\n transparencyEnabled: assignment.transparencyEnabled === true,\n publicationProfileKey: assignment.publicationProfileKey || null,\n correctionProfileKey: assignment.correctionProfileKey || null,\n enforcePublishReadiness: assignment.enforcePublishReadiness === true,\n defaultFactRelationship:\n assignment.defaultFactRelationship || DEFAULT_FACT_RELATIONSHIP,\n metadata: assignment.metadata ? { ...assignment.metadata } : undefined,\n };\n}\n\nfunction cloneAssignmentDefinition(\n assignment: ContentGovernanceAssignmentDefinition,\n): ContentGovernanceAssignmentDefinition {\n return normalizeAssignmentDefinition(assignment);\n}\n\nfunction cloneGovernanceConfig(\n config: ContentGovernanceConfig,\n): ContentGovernanceConfig {\n return {\n policies: config.policies.map(clonePolicyDefinition),\n profiles: config.profiles.map(cloneProfileDefinition),\n assignments: config.assignments.map(cloneAssignmentDefinition),\n };\n}\n\nfunction mergeByKey<T extends { key?: string }>(\n previous: T[],\n next: T[],\n normalize: (value: T) => T,\n): T[] {\n const merged = new Map<string, T>();\n\n for (const value of previous) {\n const normalized = normalize(value);\n if (normalized.key) {\n merged.set(normalized.key, normalized);\n }\n }\n\n for (const value of next) {\n const normalized = normalize(value);\n if (normalized.key) {\n merged.set(normalized.key, normalized);\n }\n }\n\n return [...merged.values()];\n}\n\nexport function getFallbackPolicyKind(key: string): ContentReviewKind {\n if (key === 'facts') {\n return 'facts';\n }\n\n if (key === 'safety') {\n return 'safety';\n }\n\n return 'custom';\n}\n\nfunction getPolicyMap(\n policies: ContentReviewPolicyDefinition[],\n): Map<string, ContentReviewPolicyDefinition> {\n return new Map(\n policies.map((policy) => {\n const normalized = normalizePolicyDefinition(policy);\n return [normalized.key, normalized];\n }),\n );\n}\n\nfunction getProfileMap(\n profiles: ContentGovernanceProfileDefinition[],\n): Map<string, ContentGovernanceProfileDefinition> {\n return new Map(\n profiles.map((profile) => {\n const normalized = normalizeProfileDefinition(profile);\n return [normalized.key, normalized];\n }),\n );\n}\n\nfunction isMissingGovernanceTableError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message : String(error || 'Unknown error');\n\n return (\n message.includes(\"Run 'smrt db:migrate'\") ||\n /no such table/i.test(message) ||\n /does not exist/i.test(message)\n );\n}\n\nfunction getRowTimestamp(\n row: Record<string, unknown>,\n primaryKey: 'createdAt' | 'updatedAt',\n): string | null {\n const snakeCaseKey = primaryKey === 'createdAt' ? 'created_at' : 'updated_at';\n const value = row[primaryKey] ?? row[snakeCaseKey];\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction getRowTenantId(row: Record<string, unknown>): string | null {\n const value = row.tenantId ?? row.tenant_id ?? null;\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction getRowString(\n row: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n }\n return null;\n}\n\nfunction safeParseJSONObject(value: unknown): Record<string, unknown> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return { ...(value as Record<string, unknown>) };\n }\n\n try {\n const parsed = JSON.parse(String(value));\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? { ...(parsed as Record<string, unknown>) }\n : {};\n } catch {\n return {};\n }\n}\n\nfunction safeParseJSONArray<T>(value: unknown, mapEntry: (entry: T) => T): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => mapEntry(entry as T));\n }\n\n try {\n const parsed = JSON.parse(String(value));\n return Array.isArray(parsed)\n ? parsed.map((entry) => mapEntry(entry as T))\n : [];\n } catch {\n return [];\n }\n}\n\nfunction resolveGovernanceTenantFilter(\n tenantId: string | null | undefined,\n): string | null | undefined {\n if (tenantId !== undefined) {\n return tenantId;\n }\n\n if (isSystemContext() || isSuperAdminBypass()) {\n return undefined;\n }\n\n const currentTenant = getCurrentTenant();\n if (currentTenant?.tenantId) {\n return currentTenant.tenantId;\n }\n\n return isTenancyEnabled() ? null : undefined;\n}\n\nfunction mapPersistedPolicyRow(\n row: Record<string, unknown>,\n): PersistedContentGovernancePolicyRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizePolicyDefinition({\n key: String(row.key || ''),\n label: String(row.label || row.key || ''),\n kind: (row.kind ||\n getFallbackPolicyKind(String(row.key || ''))) as ContentReviewKind,\n instructions: String(row.instructions || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nfunction mapPersistedProfileRow(\n row: Record<string, unknown>,\n): PersistedContentGovernanceProfileRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizeProfileDefinition({\n key: String(row.key || ''),\n label: String(row.label || row.key || ''),\n description: String(row.description || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n requirements: safeParseJSONArray<ContentReviewRequirement>(\n row.requirements,\n cloneReviewRequirement,\n ),\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nfunction mapPersistedAssignmentRow(\n row: Record<string, unknown>,\n): PersistedContentGovernanceAssignmentRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizeAssignmentDefinition({\n key: String(row.key || ''),\n label: String(row.label || ''),\n contentType: String(row.contentType || row.content_type || ''),\n contentVariant: String(row.contentVariant || row.content_variant || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n factLinkingEnabled:\n row.factLinkingEnabled === true ||\n row.fact_linking_enabled === true ||\n row.fact_linking_enabled === 1,\n transparencyEnabled:\n row.transparencyEnabled === true ||\n row.transparency_enabled === true ||\n row.transparency_enabled === 1,\n publicationProfileKey: getRowString(\n row,\n 'publicationProfileKey',\n 'publication_profile_key',\n ),\n correctionProfileKey: getRowString(\n row,\n 'correctionProfileKey',\n 'correction_profile_key',\n ),\n enforcePublishReadiness:\n row.enforcePublishReadiness === true ||\n row.enforce_publish_readiness === true ||\n row.enforce_publish_readiness === 1,\n // The relationship is stored as a string; trust the persisted value and\n // fall back to the default when absent.\n defaultFactRelationship:\n (getRowString(\n row,\n 'defaultFactRelationship',\n 'default_fact_relationship',\n ) as FactContentRelationship | null) || DEFAULT_FACT_RELATIONSHIP,\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nexport async function loadPersistedContentGovernanceDefinitions(\n options: { db?: DatabaseInterface | null; tenantId?: string | null } = {},\n): Promise<PersistedContentGovernanceDefinitions> {\n const { db } = options;\n if (!db) {\n return {\n policies: [],\n profiles: [],\n assignments: [],\n };\n }\n\n try {\n const tenantId = resolveGovernanceTenantFilter(options.tenantId);\n const listGovernanceRows = async (tableName: string) => {\n const byCreatedAt = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n ): number =>\n String(a.created_at || a.createdAt || '').localeCompare(\n String(b.created_at || b.createdAt || ''),\n );\n const sortRows = (rows: Record<string, unknown>[]) =>\n rows.sort(byCreatedAt);\n\n if (tenantId === undefined) {\n return sortRows(\n (await db.list(tableName, {})) as Record<string, unknown>[],\n );\n }\n\n if (tenantId === null) {\n return sortRows(\n (await db.list(tableName, {\n tenant_id: null,\n })) as Record<string, unknown>[],\n );\n }\n\n const [globalRows, tenantRows] = await Promise.all([\n db.list(tableName, { tenant_id: null }) as Promise<\n Record<string, unknown>[]\n >,\n db.list(tableName, { tenant_id: tenantId }) as Promise<\n Record<string, unknown>[]\n >,\n ]);\n\n return [...sortRows(globalRows), ...sortRows(tenantRows)];\n };\n const [policyRows, profileRows, assignmentRows] = await Promise.all([\n listGovernanceRows('content_governance_policies'),\n listGovernanceRows('content_governance_profiles'),\n listGovernanceRows('content_governance_assignments'),\n ]);\n\n return {\n policies: policyRows.map((row: Record<string, unknown>) =>\n mapPersistedPolicyRow(row),\n ),\n profiles: profileRows.map((row: Record<string, unknown>) =>\n mapPersistedProfileRow(row),\n ),\n assignments: assignmentRows.map((row: Record<string, unknown>) =>\n mapPersistedAssignmentRow(row),\n ),\n };\n } catch (error) {\n if (isMissingGovernanceTableError(error)) {\n return {\n policies: [],\n profiles: [],\n assignments: [],\n };\n }\n throw error;\n }\n}\n\nfunction resolveAssignmentDefinition(\n assignments: ContentGovernanceAssignmentDefinition[],\n options: Pick<\n ResolveContentGovernanceOptions,\n 'contentType' | 'contentVariant'\n >,\n): ContentGovernanceAssignmentDefinition | null {\n if (!options.contentType) {\n return null;\n }\n\n const exactMatch =\n assignments.find(\n (assignment) =>\n assignment.contentType === options.contentType &&\n (assignment.contentVariant || '') === (options.contentVariant || ''),\n ) || null;\n\n if (exactMatch) {\n return cloneAssignmentDefinition(exactMatch);\n }\n\n const typeOnlyMatch =\n assignments.find(\n (assignment) =>\n assignment.contentType === options.contentType &&\n !assignment.contentVariant,\n ) || null;\n\n return typeOnlyMatch ? cloneAssignmentDefinition(typeOnlyMatch) : null;\n}\n\nfunction buildResolvedGovernance(\n config: ContentGovernanceConfig,\n assignment: ContentGovernanceAssignmentDefinition | null,\n): ResolvedContentGovernance {\n const normalizedAssignment = assignment\n ? normalizeAssignmentDefinition(assignment)\n : null;\n if (normalizedAssignment?.enabled !== true) {\n return {\n isGoverned: false,\n factLinkingEnabled: false,\n transparencyEnabled: false,\n publicationProfileKey: null,\n correctionProfileKey: null,\n enforcePublishReadiness: false,\n defaultFactRelationship: DEFAULT_FACT_RELATIONSHIP,\n reviewPolicies: config.policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false),\n availableProfiles: config.profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false),\n assignment: normalizedAssignment,\n };\n }\n\n return {\n isGoverned: true,\n factLinkingEnabled: normalizedAssignment.factLinkingEnabled === true,\n transparencyEnabled: normalizedAssignment.transparencyEnabled === true,\n publicationProfileKey: normalizedAssignment.publicationProfileKey || null,\n correctionProfileKey: normalizedAssignment.correctionProfileKey || null,\n enforcePublishReadiness:\n normalizedAssignment.enforcePublishReadiness === true,\n defaultFactRelationship:\n normalizedAssignment.defaultFactRelationship || DEFAULT_FACT_RELATIONSHIP,\n reviewPolicies: config.policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false),\n availableProfiles: config.profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false),\n assignment: normalizedAssignment,\n };\n}\n\nfunction normalizeStatus(status: unknown): ContentReviewStatus {\n switch (status) {\n case 'pending':\n case 'passed':\n case 'flagged':\n case 'failed':\n case 'waived':\n return status;\n default:\n return 'flagged';\n }\n}\n\nfunction normalizeSeverity(severity: unknown): ContentReviewSeverity {\n switch (severity) {\n case 'info':\n case 'warning':\n case 'error':\n return severity;\n default:\n return 'warning';\n }\n}\n\nfunction extractJSONObject(raw: string): string | null {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start === -1 || end === -1 || end <= start) {\n return null;\n }\n return raw.slice(start, end + 1);\n}\n\nexport function getContentGovernanceConfig(): ContentGovernanceConfig {\n return cloneGovernanceConfig(governanceConfig);\n}\n\nexport function getStaticContentGovernanceConfig(): ContentGovernanceConfig {\n return cloneGovernanceConfig(governanceConfig);\n}\n\nexport function configureContentGovernance(\n config: Partial<ContentGovernanceConfig>,\n): ContentGovernanceConfig {\n governanceConfig = {\n policies: config.policies\n ? mergeByKey(\n governanceConfig.policies,\n config.policies,\n normalizePolicyDefinition,\n )\n : governanceConfig.policies.map(clonePolicyDefinition),\n profiles: config.profiles\n ? mergeByKey(\n governanceConfig.profiles,\n config.profiles,\n normalizeProfileDefinition,\n )\n : governanceConfig.profiles.map(cloneProfileDefinition),\n assignments: config.assignments\n ? mergeByKey(\n governanceConfig.assignments,\n config.assignments,\n normalizeAssignmentDefinition,\n )\n : governanceConfig.assignments.map(cloneAssignmentDefinition),\n };\n\n return getContentGovernanceConfig();\n}\n\nexport function resetContentGovernanceConfig(): ContentGovernanceConfig {\n governanceConfig = cloneGovernanceConfig(DEFAULT_CONTENT_GOVERNANCE_CONFIG);\n return getContentGovernanceConfig();\n}\n\nexport async function getEffectiveContentGovernanceConfig(\n options: { db?: DatabaseInterface | null; tenantId?: string | null } = {},\n): Promise<ContentGovernanceConfig> {\n const persisted = await loadPersistedContentGovernanceDefinitions({\n db: options.db,\n tenantId: options.tenantId,\n });\n\n return {\n policies: mergeByKey(\n governanceConfig.policies,\n persisted.policies,\n normalizePolicyDefinition,\n ),\n profiles: mergeByKey(\n governanceConfig.profiles,\n persisted.profiles,\n normalizeProfileDefinition,\n ),\n assignments: mergeByKey(\n governanceConfig.assignments,\n persisted.assignments,\n normalizeAssignmentDefinition,\n ),\n };\n}\n\nexport function hasStaticContentGovernancePolicy(key: string): boolean {\n return getPolicyMap(governanceConfig.policies).has(key);\n}\n\nexport function hasStaticContentGovernanceProfile(key: string): boolean {\n return getProfileMap(governanceConfig.profiles).has(key);\n}\n\nexport function getContentReviewPolicy(\n policyKey: string,\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewPolicyDefinition | null {\n return getPolicyMap(policies).get(policyKey) || null;\n}\n\nexport function getContentReviewKind(\n policyKey: string,\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewKind {\n const configuredKind = getPolicyMap(policies).get(policyKey)?.kind;\n return configuredKind || getFallbackPolicyKind(policyKey);\n}\n\nexport function getContentReviewProfile(\n profileKey: string,\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): ContentGovernanceProfileDefinition | null {\n return getProfileMap(profiles).get(profileKey) || null;\n}\n\nexport function getContentReviewProfileKeys(\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): string[] {\n return profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false)\n .map((profile) => profile.key);\n}\n\nexport function getContentReviewPolicies(\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewPolicyDefinition[] {\n return policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false);\n}\n\nexport function getContentReviewRequirements(\n profileKey: string,\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): ContentReviewRequirement[] {\n const profile = getContentReviewProfile(profileKey, profiles);\n return profile?.requirements.map(cloneReviewRequirement) || [];\n}\n\nexport function getAcceptedContentReviewStatuses(\n requirement: Pick<ContentReviewRequirement, 'acceptedStatuses'>,\n): ContentReviewStatus[] {\n return requirement.acceptedStatuses && requirement.acceptedStatuses.length > 0\n ? [...requirement.acceptedStatuses]\n : ['passed', 'waived'];\n}\n\nexport function resolveConfiguredContentGovernance(\n options: Pick<\n ResolveContentGovernanceOptions,\n 'contentType' | 'contentVariant'\n >,\n): ResolvedContentGovernance {\n const assignment = resolveAssignmentDefinition(governanceConfig.assignments, {\n contentType: options.contentType,\n contentVariant: options.contentVariant,\n });\n\n return buildResolvedGovernance(governanceConfig, assignment);\n}\n\nexport async function resolveEffectiveContentGovernance(\n options: ResolveContentGovernanceOptions,\n): Promise<ResolvedContentGovernance> {\n const effectiveConfig = await getEffectiveContentGovernanceConfig({\n db: options.db,\n tenantId: options.tenantId,\n });\n const assignment = resolveAssignmentDefinition(effectiveConfig.assignments, {\n contentType: options.contentType,\n contentVariant: options.contentVariant,\n });\n\n return buildResolvedGovernance(effectiveConfig, assignment);\n}\n\nexport function buildContentReviewPrompt(\n options: BuildContentReviewPromptOptions,\n): string {\n const { kind, content, facts = [], policy, customInstructions } = options;\n\n const factLines =\n facts.length > 0\n ? facts\n .map(\n (fact) =>\n `- [${fact.id}] status=${fact.status}; confidence=${fact.confidence}; sources=${fact.sourceCount}; text=${fact.textRefined}`,\n )\n .join('\\n')\n : 'No facts were supplied for this review.';\n\n const policyText =\n customInstructions?.trim() ||\n policy?.instructions ||\n getContentReviewPolicy(kind)?.instructions ||\n '';\n\n return `You are a structured editorial reviewer.\n\nReturn ONLY valid JSON with this shape:\n{\n \"status\": \"passed\" | \"flagged\" | \"failed\" | \"waived\",\n \"summary\": \"short summary\",\n \"findings\": [\n {\n \"severity\": \"info\" | \"warning\" | \"error\",\n \"title\": \"short title\",\n \"detail\": \"what is wrong and why\",\n \"factId\": \"optional fact id\",\n \"quote\": \"optional quoted text from the draft\",\n \"suggestedChange\": \"optional suggested fix\",\n \"ruleId\": \"optional policy or rule id\"\n }\n ]\n}\n\nReview kind: ${kind}\nPolicy key: ${policy?.key || kind}\nReview instructions:\n${policyText}\n\nDraft content:\n- id: ${content.id ?? ''}\n- type: ${content.type ?? ''}\n- status: ${content.status}\n- state: ${content.state}\n- author: ${content.author ?? ''}\n- publish_date: ${content.publish_date?.toISOString?.() ?? ''}\n\nTitle:\n${content.title}\n\nDescription:\n${content.description ?? ''}\n\nBody:\n${content.body}\n\nRelevant facts:\n${factLines}`;\n}\n\nexport function parseContentReviewResponse(raw: string): ContentReviewResult {\n const normalizedRaw = raw.trim();\n const jsonCandidate = extractJSONObject(normalizedRaw);\n\n if (jsonCandidate) {\n try {\n const parsed = JSON.parse(jsonCandidate) as {\n status?: unknown;\n summary?: unknown;\n findings?: unknown;\n };\n const findings = Array.isArray(parsed.findings)\n ? parsed.findings.map((rawFinding): ContentReviewFinding => {\n const finding =\n rawFinding && typeof rawFinding === 'object'\n ? (rawFinding as Record<string, unknown>)\n : {};\n return {\n severity: normalizeSeverity(finding.severity),\n title: String(finding.title || 'Review finding'),\n detail: String(finding.detail || ''),\n factId:\n typeof finding.factId === 'string' ? finding.factId : undefined,\n quote:\n typeof finding.quote === 'string' ? finding.quote : undefined,\n suggestedChange:\n typeof finding.suggestedChange === 'string'\n ? finding.suggestedChange\n : undefined,\n ruleId:\n typeof finding.ruleId === 'string' ? finding.ruleId : undefined,\n };\n })\n : [];\n\n return {\n status: normalizeStatus(parsed.status),\n summary: String(parsed.summary || normalizedRaw || 'Review completed'),\n findings,\n };\n } catch {\n // Fall through to a normalized fallback result.\n }\n }\n\n return {\n status: 'flagged',\n summary: normalizedRaw || 'Review completed without structured output.',\n findings: normalizedRaw\n ? [\n {\n severity: 'warning',\n title: 'Unstructured review output',\n detail: normalizedRaw,\n },\n ]\n : [],\n };\n}\n","export interface ContentTransparencyGeneration {\n aiAssisted: boolean;\n publicPrompt: string | null;\n model: string | null;\n}\n\nexport interface ContentTransparencySource {\n id: string | null;\n sourceType: string | null;\n sourceUrl: string | null;\n sourceTitle: string | null;\n credibility: number | null;\n extractedAt: string | null;\n metadata: Record<string, unknown>;\n}\n\nexport interface ContentTransparencyFact {\n id: string | null;\n textRaw?: string | null;\n textRefined?: string | null;\n status?: string | null;\n domain?: string | null;\n confidence?: number | null;\n sourceCount?: number | null;\n metadata?: Record<string, unknown>;\n relationship?: string | null;\n linkMetadata?: Record<string, unknown>;\n usedInArticle?: boolean;\n sources?: ContentTransparencySource[];\n}\n\nexport interface ContentTransparencyReference {\n id: string | null;\n title: string | null;\n url: string | null;\n originalUrl: string | null;\n type: string | null;\n source: string | null;\n usedFactIds: string[];\n extractedFacts: ContentTransparencyFact[];\n}\n\nexport interface ContentTransparencyPublicationVersion {\n id: string | null;\n version: number | null;\n kind: string | null;\n summary: string;\n createdAt: string | null;\n}\n\nexport interface ContentTransparencyVersionHistoryItem {\n id: string | null;\n version: number | null;\n kind: string | null;\n summary: string;\n createdAt: string | null;\n provenance: Record<string, unknown>;\n}\n\n/**\n * Serialized review record carried in a transparency snapshot. Only the fields\n * consumers read are named; the index signature preserves the remaining\n * serialized properties.\n */\nexport interface ContentTransparencyReview {\n id?: string | null;\n kind?: string | null;\n policyKey?: string | null;\n status?: string | null;\n summary?: string | null;\n createdAt?: string | null;\n [key: string]: unknown;\n}\n\n/**\n * Serialized review-profile evaluation carried in a transparency snapshot.\n */\nexport interface ContentTransparencyReviewProfile {\n profileKey?: string | null;\n [key: string]: unknown;\n}\n\n/**\n * Serialized correction record carried in a transparency snapshot.\n */\nexport interface ContentTransparencyCorrection {\n id?: string | null;\n summary?: string | null;\n publicNote?: string | null;\n publishedAt?: string | null;\n [key: string]: unknown;\n}\n\nexport interface ContentTransparencyData {\n generatedAt: string | null;\n snapshotKind: 'preview' | 'published';\n contentId: string | null;\n currentContentStatus: string | null;\n publicationProfileKey: string;\n publicationVersion: ContentTransparencyPublicationVersion | null;\n generation: ContentTransparencyGeneration;\n factsUsed: ContentTransparencyFact[];\n linkedFacts: ContentTransparencyFact[];\n otherExtractedFacts: ContentTransparencyFact[];\n references: ContentTransparencyReference[];\n reviews: ContentTransparencyReview[];\n reviewProfiles: ContentTransparencyReviewProfile[];\n corrections: ContentTransparencyCorrection[];\n versionHistory: ContentTransparencyVersionHistoryItem[];\n}\n\nfunction asObject(\n value: unknown,\n fallback: Record<string, unknown> = {},\n): Record<string, unknown> {\n return value && typeof value === 'object'\n ? { ...(value as Record<string, unknown>) }\n : fallback;\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction asNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction asArray<T>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nfunction normalizeGeneration(value: unknown): ContentTransparencyGeneration {\n const generation = asObject(value);\n return {\n aiAssisted: Boolean(generation.aiAssisted),\n publicPrompt: asString(generation.publicPrompt),\n model: asString(generation.model),\n };\n}\n\nfunction normalizeFact(value: unknown): ContentTransparencyFact {\n const fact = asObject(value);\n return {\n ...fact,\n id: asString(fact.id),\n relationship: asString(fact.relationship),\n linkMetadata: asObject(fact.linkMetadata),\n usedInArticle: Boolean(fact.usedInArticle),\n sources: asArray<unknown>(fact.sources).map(normalizeSource),\n };\n}\n\nfunction normalizeSource(value: unknown): ContentTransparencySource {\n const source = asObject(value);\n return {\n id: asString(source.id),\n sourceType: asString(source.sourceType),\n sourceUrl: asString(source.sourceUrl),\n sourceTitle: asString(source.sourceTitle),\n credibility: asNumber(source.credibility),\n extractedAt: asString(source.extractedAt),\n metadata: asObject(source.metadata),\n };\n}\n\nfunction normalizeReference(value: unknown): ContentTransparencyReference {\n const reference = asObject(value);\n return {\n id: asString(reference.id),\n title: asString(reference.title),\n url: asString(reference.url),\n originalUrl: asString(reference.originalUrl),\n type: asString(reference.type),\n source: asString(reference.source),\n usedFactIds: asArray<string>(reference.usedFactIds).filter(Boolean),\n extractedFacts: asArray<unknown>(reference.extractedFacts).map(\n normalizeFact,\n ),\n };\n}\n\nfunction normalizePublicationVersion(\n value: unknown,\n): ContentTransparencyPublicationVersion | null {\n const publicationVersion = asObject(value);\n if (!publicationVersion.id && publicationVersion.version === undefined) {\n return null;\n }\n\n return {\n id: asString(publicationVersion.id),\n version: asNumber(publicationVersion.version),\n kind: asString(publicationVersion.kind),\n summary:\n typeof publicationVersion.summary === 'string'\n ? publicationVersion.summary\n : '',\n createdAt: asString(publicationVersion.createdAt),\n };\n}\n\nfunction normalizeVersionHistoryItem(\n value: unknown,\n): ContentTransparencyVersionHistoryItem {\n const version = asObject(value);\n return {\n id: asString(version.id),\n version: asNumber(version.version),\n kind: asString(version.kind),\n summary: typeof version.summary === 'string' ? version.summary : '',\n createdAt: asString(version.createdAt),\n provenance: asObject(version.provenance),\n };\n}\n\nfunction dedupeFacts(facts: ContentTransparencyFact[]) {\n const byKey = new Map<string, ContentTransparencyFact>();\n\n for (const fact of facts) {\n // Collapse effectively empty facts into a single placeholder bucket rather\n // than rendering duplicate blank entries in the public transparency view.\n const key =\n fact.id ||\n fact.textRefined ||\n fact.textRaw ||\n JSON.stringify(fact.metadata || {});\n if (!key) {\n continue;\n }\n\n byKey.set(key, fact);\n }\n\n return [...byKey.values()];\n}\n\nexport function normalizeContentTransparency(\n value: unknown,\n defaults: Partial<ContentTransparencyData> = {},\n): ContentTransparencyData {\n const snapshot = asObject(value);\n const references = asArray<unknown>(snapshot.references).map(\n normalizeReference,\n );\n const linkedFacts = asArray<unknown>(snapshot.linkedFacts).map(normalizeFact);\n const factsUsed =\n asArray<unknown>(snapshot.factsUsed).length > 0\n ? asArray<unknown>(snapshot.factsUsed).map(normalizeFact)\n : linkedFacts.filter((fact) => fact.usedInArticle);\n const otherExtractedFacts =\n asArray<unknown>(snapshot.otherExtractedFacts).length > 0\n ? asArray<unknown>(snapshot.otherExtractedFacts).map(normalizeFact)\n : dedupeFacts(\n references.flatMap((reference) =>\n reference.extractedFacts.filter((fact) => !fact.usedInArticle),\n ),\n );\n\n return {\n generatedAt: asString(snapshot.generatedAt) ?? defaults.generatedAt ?? null,\n snapshotKind:\n snapshot.snapshotKind === 'published'\n ? 'published'\n : defaults.snapshotKind || 'preview',\n contentId: asString(snapshot.contentId) ?? defaults.contentId ?? null,\n currentContentStatus:\n asString(snapshot.currentContentStatus) ??\n defaults.currentContentStatus ??\n null,\n publicationProfileKey:\n asString(snapshot.publicationProfileKey) ??\n asString(snapshot.publicationReviewProfileKey) ??\n defaults.publicationProfileKey ??\n 'publication',\n publicationVersion:\n normalizePublicationVersion(snapshot.publicationVersion) ??\n defaults.publicationVersion ??\n null,\n generation: normalizeGeneration(\n snapshot.generation ?? defaults.generation ?? {},\n ),\n factsUsed,\n linkedFacts,\n otherExtractedFacts,\n references,\n reviews: asArray<ContentTransparencyReview>(snapshot.reviews),\n reviewProfiles: asArray<ContentTransparencyReviewProfile>(\n snapshot.reviewProfiles,\n ),\n corrections: asArray<ContentTransparencyCorrection>(snapshot.corrections),\n versionHistory: asArray<unknown>(snapshot.versionHistory).map(\n normalizeVersionHistoryItem,\n ),\n };\n}\n"],"mappings":";;AA4NA,IAAM,4BAAqD;AA6D3D,IAAM,oCAA6D;CACjE,UAAU,CA3DV;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,cAAc;GACZ;GACA;GACA;EACF,CAAA,CAAE,KAAK,GAAG;EACV,SAAS;CACX,GACA;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,cAAc;GACZ;GACA;GACA;EACF,CAAA,CAAE,KAAK,GAAG;EACV,SAAS;CACX,CAsCU,CAAA,CAAwB,IAAI,qBAAqB;CAC3D,UAAU,CAnCV;EACE,KAAK;EACL,OAAO;EACP,aAAa;EACb,SAAS;EACT,cAAc,CACZ;GACE,WAAW;GACX,OAAO;GACP,UAAU;EACZ,GACA;GACE,WAAW;GACX,OAAO;GACP,UAAU;EACZ,CACF;CACF,GACA;EACE,KAAK;EACL,OAAO;EACP,aAAa;EACb,SAAS;EACT,cAAc,CACZ;GACE,WAAW;GACX,OAAO;GACP,UAAU;EACZ,CACF;CACF,CAKU,CAAA,CAAwB,IAAI,sBAAsB;CAC5D,aAAa,CAAC;AAChB;AAEA,IAAI,mBAA4C,sBAC9C,iCACF;AAIA,SAAS,uBACP,aAC0B;CAC1B,OAAO;EACL,GAAG;EACH,kBAAkB,YAAY,mBAC1B,CAAC,GAAG,YAAY,gBAAgB,IAChC,KAAA;CACN;AACF;AAEA,SAAS,0BACP,QAC+B;CAC/B,OAAO;EACL,KAAK,OAAO;EACZ,OAAO,OAAO,SAAS,OAAO;EAC9B,MAAM,OAAO,QAAQ,sBAAsB,OAAO,GAAG;EACrD,cAAc,OAAO,gBAAgB;EACrC,SAAS,OAAO,YAAY;EAC5B,UAAU,OAAO,WAAW,EAAE,GAAG,OAAO,SAAS,IAAI,KAAA;CACvD;AACF;AAEA,SAAS,sBACP,QAC+B;CAC/B,OAAO,0BAA0B,MAAM;AACzC;AAEA,SAAS,2BACP,SACoC;CACpC,OAAO;EACL,KAAK,QAAQ;EACb,OAAO,QAAQ,SAAS,QAAQ;EAChC,aAAa,QAAQ,eAAe;EACpC,SAAS,QAAQ,YAAY;EAC7B,cAAc,MAAM,QAAQ,QAAQ,YAAY,IAC5C,QAAQ,aAAa,IAAI,sBAAsB,IAC/C,CAAC;EACL,UAAU,QAAQ,WAAW,EAAE,GAAG,QAAQ,SAAS,IAAI,KAAA;CACzD;AACF;AAEA,SAAS,uBACP,SACoC;CACpC,OAAO,2BAA2B,OAAO;AAC3C;AAEO,SAAS,oCACd,aACA,gBACQ;CACR,OAAO,GAAG,eAAe,GAAE,IAAK,kBAAkB;AACpD;AAEA,SAAS,8BACP,YACuC;CACvC,OAAO;EACL,KACE,WAAW,OACX,oCACE,WAAW,aACX,WAAW,cACb;EACF,OAAO,WAAW,SAAS;EAC3B,aAAa,WAAW;EACxB,gBAAgB,WAAW,kBAAkB;EAC7C,SAAS,WAAW,YAAY;EAChC,oBAAoB,WAAW,uBAAuB;EACtD,qBAAqB,WAAW,wBAAwB;EACxD,uBAAuB,WAAW,yBAAyB;EAC3D,sBAAsB,WAAW,wBAAwB;EACzD,yBAAyB,WAAW,4BAA4B;EAChE,yBACE,WAAW,2BAA2B;EACxC,UAAU,WAAW,WAAW,EAAE,GAAG,WAAW,SAAS,IAAI,KAAA;CAC/D;AACF;AAEA,SAAS,0BACP,YACuC;CACvC,OAAO,8BAA8B,UAAU;AACjD;AAEA,SAAS,sBACP,QACyB;CACzB,OAAO;EACL,UAAU,OAAO,SAAS,IAAI,qBAAqB;EACnD,UAAU,OAAO,SAAS,IAAI,sBAAsB;EACpD,aAAa,OAAO,YAAY,IAAI,yBAAyB;CAC/D;AACF;AAEA,SAAS,WACP,UACA,MACA,WACK;CACL,MAAM,yBAAS,IAAI,IAAe;CAElC,KAAA,MAAW,SAAS,UAAU;EAC5B,MAAM,aAAa,UAAU,KAAK;EAClC,IAAI,WAAW,KACb,OAAO,IAAI,WAAW,KAAK,UAAU;CAEzC;CAEA,KAAA,MAAW,SAAS,MAAM;EACxB,MAAM,aAAa,UAAU,KAAK;EAClC,IAAI,WAAW,KACb,OAAO,IAAI,WAAW,KAAK,UAAU;CAEzC;CAEA,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEO,SAAS,sBAAsB,KAAgC;CACpE,IAAI,QAAQ,SACV,OAAO;CAGT,IAAI,QAAQ,UACV,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,aACP,UAC4C;CAC5C,OAAO,IAAI,IACT,SAAS,KAAK,WAAW;EACvB,MAAM,aAAa,0BAA0B,MAAM;EACnD,OAAO,CAAC,WAAW,KAAK,UAAU;CACpC,CAAC,CACH;AACF;AAEA,SAAS,cACP,UACiD;CACjD,OAAO,IAAI,IACT,SAAS,KAAK,YAAY;EACxB,MAAM,aAAa,2BAA2B,OAAO;EACrD,OAAO,CAAC,WAAW,KAAK,UAAU;CACpC,CAAC,CACH;AACF;AAEA,SAAS,8BAA8B,OAAyB;CAC9D,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;CAE1E,OACE,QAAQ,SAAS,uBAAuB,KACxC,iBAAiB,KAAK,OAAO,KAC7B,kBAAkB,KAAK,OAAO;AAElC;AAEA,SAAS,gBACP,KACA,YACe;CACf,MAAM,eAAe,eAAe,cAAc,eAAe;CACjE,MAAM,QAAQ,IAAI,eAAe,IAAI;CACrC,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,eAAe,KAA6C;CACnE,MAAM,QAAQ,IAAI,YAAY,IAAI,aAAa;CAC/C,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,aACP,KAAA,GACG,MACY;CACf,KAAA,MAAW,OAAO,MAAM;EACtB,MAAM,QAAQ,IAAI;EAClB,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAC9C,OAAO;CAEX;CACA,OAAO;AACT;AAEA,SAAS,oBAAoB,OAAyC;CACpE,IAAI,CAAC,OACH,OAAO,CAAC;CAGV,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GACnD,OAAO,EAAE,GAAI,MAAkC;CAGjD,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,OAAO,KAAK,CAAC;EACvC,OAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAChE,EAAE,GAAI,OAAmC,IACzC,CAAC;CACP,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,mBAAsB,OAAgB,UAAgC;CAC7E,IAAI,CAAC,OACH,OAAO,CAAC;CAGV,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAK,UAAU,SAAS,KAAU,CAAC;CAGlD,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,OAAO,KAAK,CAAC;EACvC,OAAO,MAAM,QAAQ,MAAM,IACvB,OAAO,KAAK,UAAU,SAAS,KAAU,CAAC,IAC1C,CAAC;CACP,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,8BACP,UAC2B;CAC3B,IAAI,aAAa,KAAA,GACf,OAAO;CAGT,IAAI,gBAAgB,KAAK,mBAAmB,GAC1C;CAGF,MAAM,gBAAgB,iBAAiB;CACvC,IAAI,eAAe,UACjB,OAAO,cAAc;CAGvB,OAAO,iBAAiB,IAAI,OAAO,KAAA;AACrC;AAEA,SAAS,sBACP,KACwC;CACxC,OAAO;EACL,IAAI,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK,KAAA;EAC1C,UAAU,eAAe,GAAG;EAC5B,WAAW,gBAAgB,KAAK,WAAW;EAC3C,WAAW,gBAAgB,KAAK,WAAW;EAC3C,GAAG,0BAA0B;GAC3B,KAAK,OAAO,IAAI,OAAO,EAAE;GACzB,OAAO,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE;GACxC,MAAO,IAAI,QACT,sBAAsB,OAAO,IAAI,OAAO,EAAE,CAAC;GAC7C,cAAc,OAAO,IAAI,gBAAgB,EAAE;GAC3C,SAAS,IAAI,YAAY,SAAS,IAAI,YAAY;GAClD,UAAU,oBAAoB,IAAI,QAAQ;EAC5C,CAAC;CACH;AACF;AAEA,SAAS,uBACP,KACyC;CACzC,OAAO;EACL,IAAI,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK,KAAA;EAC1C,UAAU,eAAe,GAAG;EAC5B,WAAW,gBAAgB,KAAK,WAAW;EAC3C,WAAW,gBAAgB,KAAK,WAAW;EAC3C,GAAG,2BAA2B;GAC5B,KAAK,OAAO,IAAI,OAAO,EAAE;GACzB,OAAO,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE;GACxC,aAAa,OAAO,IAAI,eAAe,EAAE;GACzC,SAAS,IAAI,YAAY,SAAS,IAAI,YAAY;GAClD,cAAc,mBACZ,IAAI,cACJ,sBACF;GACA,UAAU,oBAAoB,IAAI,QAAQ;EAC5C,CAAC;CACH;AACF;AAEA,SAAS,0BACP,KAC4C;CAC5C,OAAO;EACL,IAAI,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK,KAAA;EAC1C,UAAU,eAAe,GAAG;EAC5B,WAAW,gBAAgB,KAAK,WAAW;EAC3C,WAAW,gBAAgB,KAAK,WAAW;EAC3C,GAAG,8BAA8B;GAC/B,KAAK,OAAO,IAAI,OAAO,EAAE;GACzB,OAAO,OAAO,IAAI,SAAS,EAAE;GAC7B,aAAa,OAAO,IAAI,eAAe,IAAI,gBAAgB,EAAE;GAC7D,gBAAgB,OAAO,IAAI,kBAAkB,IAAI,mBAAmB,EAAE;GACtE,SAAS,IAAI,YAAY,SAAS,IAAI,YAAY;GAClD,oBACE,IAAI,uBAAuB,QAC3B,IAAI,yBAAyB,QAC7B,IAAI,yBAAyB;GAC/B,qBACE,IAAI,wBAAwB,QAC5B,IAAI,yBAAyB,QAC7B,IAAI,yBAAyB;GAC/B,uBAAuB,aACrB,KACA,yBACA,yBACF;GACA,sBAAsB,aACpB,KACA,wBACA,wBACF;GACA,yBACE,IAAI,4BAA4B,QAChC,IAAI,8BAA8B,QAClC,IAAI,8BAA8B;GAGpC,yBACG,aACC,KACA,2BACA,2BACF,KAAwC;GAC1C,UAAU,oBAAoB,IAAI,QAAQ;EAC5C,CAAC;CACH;AACF;AAEA,eAAsB,0CACpB,UAAuE,CAAC,GACxB;CAChD,MAAM,EAAE,OAAO;CACf,IAAI,CAAC,IACH,OAAO;EACL,UAAU,CAAC;EACX,UAAU,CAAC;EACX,aAAa,CAAC;CAChB;CAGF,IAAI;EACF,MAAM,WAAW,8BAA8B,QAAQ,QAAQ;EAC/D,MAAM,qBAAqB,OAAO,cAAsB;GACtD,MAAM,eACJ,GACA,MAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAA,CAAE,cACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAC1C;GACF,MAAM,YAAY,SAChB,KAAK,KAAK,WAAW;GAEvB,IAAI,aAAa,KAAA,GACf,OAAO,SACJ,MAAM,GAAG,KAAK,WAAW,CAAC,CAAC,CAC9B;GAGF,IAAI,aAAa,MACf,OAAO,SACJ,MAAM,GAAG,KAAK,WAAW,EACxB,WAAW,KACb,CAAC,CACH;GAGF,MAAM,CAAC,YAAY,cAAc,MAAM,QAAQ,IAAI,CACjD,GAAG,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC,GAGtC,GAAG,KAAK,WAAW,EAAE,WAAW,SAAS,CAAC,CAG5C,CAAC;GAED,OAAO,CAAC,GAAG,SAAS,UAAU,GAAG,GAAG,SAAS,UAAU,CAAC;EAC1D;EACA,MAAM,CAAC,YAAY,aAAa,kBAAkB,MAAM,QAAQ,IAAI;GAClE,mBAAmB,6BAA6B;GAChD,mBAAmB,6BAA6B;GAChD,mBAAmB,gCAAgC;EACrD,CAAC;EAED,OAAO;GACL,UAAU,WAAW,KAAK,QACxB,sBAAsB,GAAG,CAC3B;GACA,UAAU,YAAY,KAAK,QACzB,uBAAuB,GAAG,CAC5B;GACA,aAAa,eAAe,KAAK,QAC/B,0BAA0B,GAAG,CAC/B;EACF;CACF,SAAS,OAAO;EACd,IAAI,8BAA8B,KAAK,GACrC,OAAO;GACL,UAAU,CAAC;GACX,UAAU,CAAC;GACX,aAAa,CAAC;EAChB;EAEF,MAAM;CACR;AACF;AAEA,SAAS,4BACP,aACA,SAI8C;CAC9C,IAAI,CAAC,QAAQ,aACX,OAAO;CAGT,MAAM,aACJ,YAAY,MACT,eACC,WAAW,gBAAgB,QAAQ,gBAClC,WAAW,kBAAkB,SAAS,QAAQ,kBAAkB,GACrE,KAAK;CAEP,IAAI,YACF,OAAO,0BAA0B,UAAU;CAG7C,MAAM,gBACJ,YAAY,MACT,eACC,WAAW,gBAAgB,QAAQ,eACnC,CAAC,WAAW,cAChB,KAAK;CAEP,OAAO,gBAAgB,0BAA0B,aAAa,IAAI;AACpE;AAEA,SAAS,wBACP,QACA,YAC2B;CAC3B,MAAM,uBAAuB,aACzB,8BAA8B,UAAU,IACxC;CACJ,IAAI,sBAAsB,YAAY,MACpC,OAAO;EACL,YAAY;EACZ,oBAAoB;EACpB,qBAAqB;EACrB,uBAAuB;EACvB,sBAAsB;EACtB,yBAAyB;EACzB,yBAAyB;EACzB,gBAAgB,OAAO,SACpB,IAAI,qBAAqB,CAAA,CACzB,QAAQ,WAAW,OAAO,YAAY,KAAK;EAC9C,mBAAmB,OAAO,SACvB,IAAI,sBAAsB,CAAA,CAC1B,QAAQ,YAAY,QAAQ,YAAY,KAAK;EAChD,YAAY;CACd;CAGF,OAAO;EACL,YAAY;EACZ,oBAAoB,qBAAqB,uBAAuB;EAChE,qBAAqB,qBAAqB,wBAAwB;EAClE,uBAAuB,qBAAqB,yBAAyB;EACrE,sBAAsB,qBAAqB,wBAAwB;EACnE,yBACE,qBAAqB,4BAA4B;EACnD,yBACE,qBAAqB,2BAA2B;EAClD,gBAAgB,OAAO,SACpB,IAAI,qBAAqB,CAAA,CACzB,QAAQ,WAAW,OAAO,YAAY,KAAK;EAC9C,mBAAmB,OAAO,SACvB,IAAI,sBAAsB,CAAA,CAC1B,QAAQ,YAAY,QAAQ,YAAY,KAAK;EAChD,YAAY;CACd;AACF;AAEA,SAAS,gBAAgB,QAAsC;CAC7D,QAAQ,QAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,kBAAkB,UAA0C;CACnE,QAAQ,UAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,kBAAkB,KAA4B;CACrD,MAAM,QAAQ,IAAI,QAAQ,GAAG;CAC7B,MAAM,MAAM,IAAI,YAAY,GAAG;CAC/B,IAAI,UAAU,MAAM,QAAQ,MAAM,OAAO,OACvC,OAAO;CAET,OAAO,IAAI,MAAM,OAAO,MAAM,CAAC;AACjC;AAEO,SAAS,6BAAsD;CACpE,OAAO,sBAAsB,gBAAgB;AAC/C;AAMO,SAAS,2BACd,QACyB;CACzB,mBAAmB;EACjB,UAAU,OAAO,WACb,WACE,iBAAiB,UACjB,OAAO,UACP,yBACF,IACA,iBAAiB,SAAS,IAAI,qBAAqB;EACvD,UAAU,OAAO,WACb,WACE,iBAAiB,UACjB,OAAO,UACP,0BACF,IACA,iBAAiB,SAAS,IAAI,sBAAsB;EACxD,aAAa,OAAO,cAChB,WACE,iBAAiB,aACjB,OAAO,aACP,6BACF,IACA,iBAAiB,YAAY,IAAI,yBAAyB;CAChE;CAEA,OAAO,2BAA2B;AACpC;AAEO,SAAS,+BAAwD;CACtE,mBAAmB,sBAAsB,iCAAiC;CAC1E,OAAO,2BAA2B;AACpC;AAEA,eAAsB,oCACpB,UAAuE,CAAC,GACtC;CAClC,MAAM,YAAY,MAAM,0CAA0C;EAChE,IAAI,QAAQ;EACZ,UAAU,QAAQ;CACpB,CAAC;CAED,OAAO;EACL,UAAU,WACR,iBAAiB,UACjB,UAAU,UACV,yBACF;EACA,UAAU,WACR,iBAAiB,UACjB,UAAU,UACV,0BACF;EACA,aAAa,WACX,iBAAiB,aACjB,UAAU,aACV,6BACF;CACF;AACF;AAEO,SAAS,iCAAiC,KAAsB;CACrE,OAAO,aAAa,iBAAiB,QAAQ,CAAA,CAAE,IAAI,GAAG;AACxD;AAEO,SAAS,kCAAkC,KAAsB;CACtE,OAAO,cAAc,iBAAiB,QAAQ,CAAA,CAAE,IAAI,GAAG;AACzD;AAEO,SAAS,uBACd,WACA,WAA4C,iBAAiB,UACvB;CACtC,OAAO,aAAa,QAAQ,CAAA,CAAE,IAAI,SAAS,KAAK;AAClD;AAEO,SAAS,qBACd,WACA,WAA4C,iBAAiB,UAC1C;CAEnB,OADuB,aAAa,QAAQ,CAAA,CAAE,IAAI,SAAS,CAAA,EAAG,QACrC,sBAAsB,SAAS;AAC1D;AAEO,SAAS,wBACd,YACA,WAAiD,iBAAiB,UACvB;CAC3C,OAAO,cAAc,QAAQ,CAAA,CAAE,IAAI,UAAU,KAAK;AACpD;AAEO,SAAS,4BACd,WAAiD,iBAAiB,UACxD;CACV,OAAO,SACJ,IAAI,sBAAsB,CAAA,CAC1B,QAAQ,YAAY,QAAQ,YAAY,KAAK,CAAA,CAC7C,KAAK,YAAY,QAAQ,GAAG;AACjC;AAEO,SAAS,yBACd,WAA4C,iBAAiB,UAC5B;CACjC,OAAO,SACJ,IAAI,qBAAqB,CAAA,CACzB,QAAQ,WAAW,OAAO,YAAY,KAAK;AAChD;AAEO,SAAS,6BACd,YACA,WAAiD,iBAAiB,UACtC;CAE5B,OADgB,wBAAwB,YAAY,QAC7C,CAAA,EAAS,aAAa,IAAI,sBAAsB,KAAK,CAAC;AAC/D;AAEO,SAAS,iCACd,aACuB;CACvB,OAAO,YAAY,oBAAoB,YAAY,iBAAiB,SAAS,IACzE,CAAC,GAAG,YAAY,gBAAgB,IAChC,CAAC,UAAU,QAAQ;AACzB;AAEO,SAAS,mCACd,SAI2B;CAC3B,MAAM,aAAa,4BAA4B,iBAAiB,aAAa;EAC3E,aAAa,QAAQ;EACrB,gBAAgB,QAAQ;CAC1B,CAAC;CAED,OAAO,wBAAwB,kBAAkB,UAAU;AAC7D;AAEA,eAAsB,kCACpB,SACoC;CACpC,MAAM,kBAAkB,MAAM,oCAAoC;EAChE,IAAI,QAAQ;EACZ,UAAU,QAAQ;CACpB,CAAC;CAMD,OAAO,wBAAwB,iBALZ,4BAA4B,gBAAgB,aAAa;EAC1E,aAAa,QAAQ;EACrB,gBAAgB,QAAQ;CAC1B,CAEgD,CAAU;AAC5D;AAEO,SAAS,yBACd,SACQ;CACR,MAAM,EAAE,MAAM,SAAS,QAAQ,CAAC,GAAG,QAAQ,uBAAuB;CAElE,MAAM,YACJ,MAAM,SAAS,IACX,MACG,KACE,SACC,MAAM,KAAK,GAAE,WAAY,KAAK,OAAM,eAAgB,KAAK,WAAU,YAAa,KAAK,YAAW,SAAU,KAAK,aACnH,CAAA,CACC,KAAK,IAAI,IACZ;CAEN,MAAM,aACJ,oBAAoB,KAAK,KACzB,QAAQ,gBACR,uBAAuB,IAAI,CAAA,EAAG,gBAC9B;CAEF,OAAO;;;;;;;;;;;;;;;;;;;eAmBM,KAAI;cACL,QAAQ,OAAO,KAAI;;EAE/B,WAAU;;;QAGJ,QAAQ,MAAM,GAAE;UACd,QAAQ,QAAQ,GAAE;YAChB,QAAQ,OAAM;WACf,QAAQ,MAAK;YACZ,QAAQ,UAAU,GAAE;kBACd,QAAQ,cAAc,cAAc,KAAK,GAAE;;;EAG3D,QAAQ,MAAK;;;EAGb,QAAQ,eAAe,GAAE;;;EAGzB,QAAQ,KAAI;;;EAGZ;AACF;AAEO,SAAS,2BAA2B,KAAkC;CAC3E,MAAM,gBAAgB,IAAI,KAAK;CAC/B,MAAM,gBAAgB,kBAAkB,aAAa;CAErD,IAAI,eACF,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,aAAa;EAKvC,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,SAAS,KAAK,eAAqC;GACxD,MAAM,UACJ,cAAc,OAAO,eAAe,WAC/B,aACD,CAAC;GACP,OAAO;IACL,UAAU,kBAAkB,QAAQ,QAAQ;IAC5C,OAAO,OAAO,QAAQ,SAAS,gBAAgB;IAC/C,QAAQ,OAAO,QAAQ,UAAU,EAAE;IACnC,QACE,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA;IACxD,OACE,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,KAAA;IACtD,iBACE,OAAO,QAAQ,oBAAoB,WAC/B,QAAQ,kBACR,KAAA;IACN,QACE,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,KAAA;GAC1D;EACF,CAAC,IACD,CAAC;EAEL,OAAO;GACL,QAAQ,gBAAgB,OAAO,MAAM;GACrC,SAAS,OAAO,OAAO,WAAW,iBAAiB,kBAAkB;GACrE;EACF;CACF,QAAQ,CAER;CAGF,OAAO;EACL,QAAQ;EACR,SAAS,iBAAiB;EAC1B,UAAU,gBACN,CACE;GACE,UAAU;GACV,OAAO;GACP,QAAQ;EACV,CACF,IACA,CAAC;CACP;AACF;;;ACz+BA,SAAS,SACP,OACA,WAAoC,CAAC,GACZ;CACzB,OAAO,SAAS,OAAO,UAAU,WAC7B,EAAE,GAAI,MAAkC,IACxC;AACN;AAEA,SAAS,SAAS,OAA+B;CAC/C,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,SAAS,OAA+B;CAC/C,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,QAAW,OAAqB;CACvC,OAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEA,SAAS,oBAAoB,OAA+C;CAC1E,MAAM,aAAa,SAAS,KAAK;CACjC,OAAO;EACL,YAAY,QAAQ,WAAW,UAAU;EACzC,cAAc,SAAS,WAAW,YAAY;EAC9C,OAAO,SAAS,WAAW,KAAK;CAClC;AACF;AAEA,SAAS,cAAc,OAAyC;CAC9D,MAAM,OAAO,SAAS,KAAK;CAC3B,OAAO;EACL,GAAG;EACH,IAAI,SAAS,KAAK,EAAE;EACpB,cAAc,SAAS,KAAK,YAAY;EACxC,cAAc,SAAS,KAAK,YAAY;EACxC,eAAe,QAAQ,KAAK,aAAa;EACzC,SAAS,QAAiB,KAAK,OAAO,CAAA,CAAE,IAAI,eAAe;CAC7D;AACF;AAEA,SAAS,gBAAgB,OAA2C;CAClE,MAAM,SAAS,SAAS,KAAK;CAC7B,OAAO;EACL,IAAI,SAAS,OAAO,EAAE;EACtB,YAAY,SAAS,OAAO,UAAU;EACtC,WAAW,SAAS,OAAO,SAAS;EACpC,aAAa,SAAS,OAAO,WAAW;EACxC,aAAa,SAAS,OAAO,WAAW;EACxC,aAAa,SAAS,OAAO,WAAW;EACxC,UAAU,SAAS,OAAO,QAAQ;CACpC;AACF;AAEA,SAAS,mBAAmB,OAA8C;CACxE,MAAM,YAAY,SAAS,KAAK;CAChC,OAAO;EACL,IAAI,SAAS,UAAU,EAAE;EACzB,OAAO,SAAS,UAAU,KAAK;EAC/B,KAAK,SAAS,UAAU,GAAG;EAC3B,aAAa,SAAS,UAAU,WAAW;EAC3C,MAAM,SAAS,UAAU,IAAI;EAC7B,QAAQ,SAAS,UAAU,MAAM;EACjC,aAAa,QAAgB,UAAU,WAAW,CAAA,CAAE,OAAO,OAAO;EAClE,gBAAgB,QAAiB,UAAU,cAAc,CAAA,CAAE,IACzD,aACF;CACF;AACF;AAEA,SAAS,4BACP,OAC8C;CAC9C,MAAM,qBAAqB,SAAS,KAAK;CACzC,IAAI,CAAC,mBAAmB,MAAM,mBAAmB,YAAY,KAAA,GAC3D,OAAO;CAGT,OAAO;EACL,IAAI,SAAS,mBAAmB,EAAE;EAClC,SAAS,SAAS,mBAAmB,OAAO;EAC5C,MAAM,SAAS,mBAAmB,IAAI;EACtC,SACE,OAAO,mBAAmB,YAAY,WAClC,mBAAmB,UACnB;EACN,WAAW,SAAS,mBAAmB,SAAS;CAClD;AACF;AAEA,SAAS,4BACP,OACuC;CACvC,MAAM,UAAU,SAAS,KAAK;CAC9B,OAAO;EACL,IAAI,SAAS,QAAQ,EAAE;EACvB,SAAS,SAAS,QAAQ,OAAO;EACjC,MAAM,SAAS,QAAQ,IAAI;EAC3B,SAAS,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;EACjE,WAAW,SAAS,QAAQ,SAAS;EACrC,YAAY,SAAS,QAAQ,UAAU;CACzC;AACF;AAEA,SAAS,YAAY,OAAkC;CACrD,MAAM,wBAAQ,IAAI,IAAqC;CAEvD,KAAA,MAAW,QAAQ,OAAO;EAGxB,MAAM,MACJ,KAAK,MACL,KAAK,eACL,KAAK,WACL,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC;EACpC,IAAI,CAAC,KACH;EAGF,MAAM,IAAI,KAAK,IAAI;CACrB;CAEA,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC;AAC3B;AAEO,SAAS,6BACd,OACA,WAA6C,CAAC,GACrB;CACzB,MAAM,WAAW,SAAS,KAAK;CAC/B,MAAM,aAAa,QAAiB,SAAS,UAAU,CAAA,CAAE,IACvD,kBACF;CACA,MAAM,cAAc,QAAiB,SAAS,WAAW,CAAA,CAAE,IAAI,aAAa;CAC5E,MAAM,YACJ,QAAiB,SAAS,SAAS,CAAA,CAAE,SAAS,IAC1C,QAAiB,SAAS,SAAS,CAAA,CAAE,IAAI,aAAa,IACtD,YAAY,QAAQ,SAAS,KAAK,aAAa;CACrD,MAAM,sBACJ,QAAiB,SAAS,mBAAmB,CAAA,CAAE,SAAS,IACpD,QAAiB,SAAS,mBAAmB,CAAA,CAAE,IAAI,aAAa,IAChE,YACE,WAAW,SAAS,cAClB,UAAU,eAAe,QAAQ,SAAS,CAAC,KAAK,aAAa,CAC/D,CACF;CAEN,OAAO;EACL,aAAa,SAAS,SAAS,WAAW,KAAK,SAAS,eAAe;EACvE,cACE,SAAS,iBAAiB,cACtB,cACA,SAAS,gBAAgB;EAC/B,WAAW,SAAS,SAAS,SAAS,KAAK,SAAS,aAAa;EACjE,sBACE,SAAS,SAAS,oBAAoB,KACtC,SAAS,wBACT;EACF,uBACE,SAAS,SAAS,qBAAqB,KACvC,SAAS,SAAS,2BAA2B,KAC7C,SAAS,yBACT;EACF,oBACE,4BAA4B,SAAS,kBAAkB,KACvD,SAAS,sBACT;EACF,YAAY,oBACV,SAAS,cAAc,SAAS,cAAc,CAAC,CACjD;EACA;EACA;EACA;EACA;EACA,SAAS,QAAmC,SAAS,OAAO;EAC5D,gBAAgB,QACd,SAAS,cACX;EACA,aAAa,QAAuC,SAAS,WAAW;EACxE,gBAAgB,QAAiB,SAAS,cAAc,CAAA,CAAE,IACxD,2BACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"content-transparency-Bh6axaZj.js","names":[],"sources":["../../src/content-governance.ts","../../src/content-transparency.ts"],"sourcesContent":["import type { Fact, FactContentRelationship } from '@happyvertical/smrt-facts';\nimport {\n getCurrentTenant,\n isSuperAdminBypass,\n isSystemContext,\n isTenancyEnabled,\n} from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type { Content } from './content';\n\nexport type ContentReviewKind = 'facts' | 'safety' | 'custom';\n\nexport type ContentReviewStatus =\n | 'pending'\n | 'passed'\n | 'flagged'\n | 'failed'\n | 'waived';\n\nexport type ContentReviewSeverity = 'info' | 'warning' | 'error';\n\nexport type ContentVersionKind =\n | 'manual'\n | 'draft'\n | 'review'\n | 'publication'\n | 'correction'\n | 'auto-generated';\n\nexport type ContentCorrectionType = 'fact' | 'safety' | 'copy' | 'custom';\n\nexport type ContentCorrectionStatus = 'draft' | 'published' | 'retracted';\n\nexport interface ContentReviewFinding {\n severity: ContentReviewSeverity;\n title: string;\n detail: string;\n factId?: string;\n quote?: string;\n suggestedChange?: string;\n ruleId?: string;\n}\n\nexport interface ContentReviewResult {\n status: ContentReviewStatus;\n summary: string;\n findings: ContentReviewFinding[];\n}\n\nexport interface ContentReviewRequirement {\n policyKey: string;\n label?: string;\n blocking?: boolean;\n acceptedStatuses?: ContentReviewStatus[];\n}\n\nexport interface ContentReviewProfileEvaluationItem {\n kind: ContentReviewKind;\n policyKey: string;\n label: string;\n blocking: boolean;\n acceptedStatuses: ContentReviewStatus[];\n missing: boolean;\n stale: boolean;\n executed: boolean;\n satisfied: boolean;\n latestReviewId: string | null;\n latestStatus: ContentReviewStatus | null;\n latestSummary: string | null;\n}\n\nexport interface ContentReviewProfileEvaluation {\n profileKey: string;\n ready: boolean;\n complete: boolean;\n requirements: ContentReviewProfileEvaluationItem[];\n}\n\nexport interface ContentReviewPolicyDefinition {\n key: string;\n label: string;\n kind: ContentReviewKind;\n instructions: string;\n enabled?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceProfileDefinition {\n key: string;\n label: string;\n description?: string;\n enabled?: boolean;\n requirements: ContentReviewRequirement[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceAssignmentDefinition {\n key?: string;\n label?: string;\n contentType: string;\n contentVariant?: string | null;\n enabled?: boolean;\n factLinkingEnabled?: boolean;\n transparencyEnabled?: boolean;\n publicationProfileKey?: string | null;\n correctionProfileKey?: string | null;\n enforcePublishReadiness?: boolean;\n defaultFactRelationship?: FactContentRelationship;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContentGovernanceConfig {\n policies: ContentReviewPolicyDefinition[];\n profiles: ContentGovernanceProfileDefinition[];\n assignments: ContentGovernanceAssignmentDefinition[];\n}\n\nexport interface PersistedContentGovernancePolicyRecord\n extends ContentReviewPolicyDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceProfileRecord\n extends ContentGovernanceProfileDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceAssignmentRecord\n extends ContentGovernanceAssignmentDefinition {\n id?: string;\n tenantId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface PersistedContentGovernanceDefinitions {\n policies: PersistedContentGovernancePolicyRecord[];\n profiles: PersistedContentGovernanceProfileRecord[];\n assignments: PersistedContentGovernanceAssignmentRecord[];\n}\n\nexport interface ResolvedContentGovernance {\n isGoverned: boolean;\n factLinkingEnabled: boolean;\n transparencyEnabled: boolean;\n publicationProfileKey: string | null;\n correctionProfileKey: string | null;\n enforcePublishReadiness: boolean;\n defaultFactRelationship: FactContentRelationship;\n reviewPolicies: ContentReviewPolicyDefinition[];\n availableProfiles: ContentGovernanceProfileDefinition[];\n assignment: ContentGovernanceAssignmentDefinition | null;\n}\n\nexport interface ContentGovernanceState extends ResolvedContentGovernance {\n reviewProfiles: ContentReviewProfileEvaluation[];\n}\n\nexport interface CreateContentVersionOptions {\n kind?: ContentVersionKind;\n summary?: string;\n metadata?: Record<string, unknown>;\n snapshot?: Record<string, unknown>;\n}\n\nexport interface RunContentReviewOptions {\n kind?: ContentReviewKind;\n policyKey?: string;\n reviewer?: string;\n instructions?: string;\n facts?: Fact[];\n factIds?: string[];\n metadata?: Record<string, unknown>;\n createVersion?: boolean;\n}\n\nexport interface IssueContentCorrectionOptions {\n correctionType?: ContentCorrectionType;\n factId?: string;\n correctedFactText?: string;\n summary: string;\n incorrectText?: string;\n correctedText?: string;\n publicNote?: string;\n metadata?: Record<string, unknown>;\n createVersion?: boolean;\n publish?: boolean;\n}\n\nexport interface BuildContentReviewPromptOptions {\n kind: ContentReviewKind;\n content: Pick<\n Content,\n | 'id'\n | 'type'\n | 'status'\n | 'state'\n | 'title'\n | 'description'\n | 'body'\n | 'author'\n | 'publish_date'\n >;\n facts?: Fact[];\n policy?: ContentReviewPolicyDefinition | null;\n customInstructions?: string;\n}\n\nexport interface ResolveContentGovernanceOptions {\n contentType?: string | null;\n contentVariant?: string | null;\n db?: DatabaseInterface | null;\n tenantId?: string | null;\n}\n\nconst DEFAULT_FACT_RELATIONSHIP: FactContentRelationship = 'supports';\n\nconst DEFAULT_REVIEW_POLICIES: ContentReviewPolicyDefinition[] = [\n {\n key: 'facts',\n label: 'Facts Review',\n kind: 'facts',\n instructions: [\n 'Compare the draft copy against the supplied facts only.',\n 'Flag contradictions, unsupported claims, stale claims, and places where the copy should cite or qualify a statement.',\n 'Do not invent missing facts. If the draft makes a claim that is not supported by the provided facts, flag it clearly.',\n ].join(' '),\n enabled: true,\n },\n {\n key: 'safety',\n label: 'Safety Review',\n kind: 'safety',\n instructions: [\n 'Review the content for legal, reputational, and user-safety risks.',\n 'At minimum, check for defamation risk, privacy leaks, unverified allegations, unsafe instructions, and medical, legal, or financial claims that need qualification.',\n 'Flag content that should be softened, attributed, removed, or escalated for human review.',\n ].join(' '),\n enabled: true,\n },\n];\n\nconst DEFAULT_REVIEW_PROFILES: ContentGovernanceProfileDefinition[] = [\n {\n key: 'publication',\n label: 'Publication',\n description: 'Default publication-time editorial checks.',\n enabled: true,\n requirements: [\n {\n policyKey: 'safety',\n label: 'Safety Review',\n blocking: false,\n },\n {\n policyKey: 'facts',\n label: 'Facts Review',\n blocking: false,\n },\n ],\n },\n {\n key: 'correction',\n label: 'Correction',\n description: 'Default correction-time editorial checks.',\n enabled: true,\n requirements: [\n {\n policyKey: 'safety',\n label: 'Safety Review',\n blocking: false,\n },\n ],\n },\n];\n\nconst DEFAULT_CONTENT_GOVERNANCE_CONFIG: ContentGovernanceConfig = {\n policies: DEFAULT_REVIEW_POLICIES.map(clonePolicyDefinition),\n profiles: DEFAULT_REVIEW_PROFILES.map(cloneProfileDefinition),\n assignments: [],\n};\n\nlet governanceConfig: ContentGovernanceConfig = cloneGovernanceConfig(\n DEFAULT_CONTENT_GOVERNANCE_CONFIG,\n);\n// Process-global by design: apps are expected to configure governance once at\n// startup and use persisted records for runtime admin overrides.\n\nfunction cloneReviewRequirement(\n requirement: ContentReviewRequirement,\n): ContentReviewRequirement {\n return {\n ...requirement,\n acceptedStatuses: requirement.acceptedStatuses\n ? [...requirement.acceptedStatuses]\n : undefined,\n };\n}\n\nfunction normalizePolicyDefinition(\n policy: ContentReviewPolicyDefinition,\n): ContentReviewPolicyDefinition {\n return {\n key: policy.key,\n label: policy.label || policy.key,\n kind: policy.kind || getFallbackPolicyKind(policy.key),\n instructions: policy.instructions || '',\n enabled: policy.enabled !== false,\n metadata: policy.metadata ? { ...policy.metadata } : undefined,\n };\n}\n\nfunction clonePolicyDefinition(\n policy: ContentReviewPolicyDefinition,\n): ContentReviewPolicyDefinition {\n return normalizePolicyDefinition(policy);\n}\n\nfunction normalizeProfileDefinition(\n profile: ContentGovernanceProfileDefinition,\n): ContentGovernanceProfileDefinition {\n return {\n key: profile.key,\n label: profile.label || profile.key,\n description: profile.description || '',\n enabled: profile.enabled !== false,\n requirements: Array.isArray(profile.requirements)\n ? profile.requirements.map(cloneReviewRequirement)\n : [],\n metadata: profile.metadata ? { ...profile.metadata } : undefined,\n };\n}\n\nfunction cloneProfileDefinition(\n profile: ContentGovernanceProfileDefinition,\n): ContentGovernanceProfileDefinition {\n return normalizeProfileDefinition(profile);\n}\n\nexport function buildContentGovernanceAssignmentKey(\n contentType: string,\n contentVariant?: string | null,\n): string {\n return `${contentType || ''}::${contentVariant || ''}`;\n}\n\nfunction normalizeAssignmentDefinition(\n assignment: ContentGovernanceAssignmentDefinition,\n): ContentGovernanceAssignmentDefinition {\n return {\n key:\n assignment.key ||\n buildContentGovernanceAssignmentKey(\n assignment.contentType,\n assignment.contentVariant,\n ),\n label: assignment.label || '',\n contentType: assignment.contentType,\n contentVariant: assignment.contentVariant || '',\n enabled: assignment.enabled !== false,\n factLinkingEnabled: assignment.factLinkingEnabled === true,\n transparencyEnabled: assignment.transparencyEnabled === true,\n publicationProfileKey: assignment.publicationProfileKey || null,\n correctionProfileKey: assignment.correctionProfileKey || null,\n enforcePublishReadiness: assignment.enforcePublishReadiness === true,\n defaultFactRelationship:\n assignment.defaultFactRelationship || DEFAULT_FACT_RELATIONSHIP,\n metadata: assignment.metadata ? { ...assignment.metadata } : undefined,\n };\n}\n\nfunction cloneAssignmentDefinition(\n assignment: ContentGovernanceAssignmentDefinition,\n): ContentGovernanceAssignmentDefinition {\n return normalizeAssignmentDefinition(assignment);\n}\n\nfunction cloneGovernanceConfig(\n config: ContentGovernanceConfig,\n): ContentGovernanceConfig {\n return {\n policies: config.policies.map(clonePolicyDefinition),\n profiles: config.profiles.map(cloneProfileDefinition),\n assignments: config.assignments.map(cloneAssignmentDefinition),\n };\n}\n\nfunction mergeByKey<T extends { key?: string }>(\n previous: T[],\n next: T[],\n normalize: (value: T) => T,\n): T[] {\n const merged = new Map<string, T>();\n\n for (const value of previous) {\n const normalized = normalize(value);\n if (normalized.key) {\n merged.set(normalized.key, normalized);\n }\n }\n\n for (const value of next) {\n const normalized = normalize(value);\n if (normalized.key) {\n merged.set(normalized.key, normalized);\n }\n }\n\n return [...merged.values()];\n}\n\nexport function getFallbackPolicyKind(key: string): ContentReviewKind {\n if (key === 'facts') {\n return 'facts';\n }\n\n if (key === 'safety') {\n return 'safety';\n }\n\n return 'custom';\n}\n\nfunction getPolicyMap(\n policies: ContentReviewPolicyDefinition[],\n): Map<string, ContentReviewPolicyDefinition> {\n return new Map(\n policies.map((policy) => {\n const normalized = normalizePolicyDefinition(policy);\n return [normalized.key, normalized];\n }),\n );\n}\n\nfunction getProfileMap(\n profiles: ContentGovernanceProfileDefinition[],\n): Map<string, ContentGovernanceProfileDefinition> {\n return new Map(\n profiles.map((profile) => {\n const normalized = normalizeProfileDefinition(profile);\n return [normalized.key, normalized];\n }),\n );\n}\n\nfunction isMissingGovernanceTableError(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message : String(error || 'Unknown error');\n\n return (\n message.includes(\"Run 'smrt db:migrate'\") ||\n /no such table/i.test(message) ||\n /does not exist/i.test(message)\n );\n}\n\nfunction getRowTimestamp(\n row: Record<string, unknown>,\n primaryKey: 'createdAt' | 'updatedAt',\n): string | null {\n const snakeCaseKey = primaryKey === 'createdAt' ? 'created_at' : 'updated_at';\n const value = row[primaryKey] ?? row[snakeCaseKey];\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction getRowTenantId(row: Record<string, unknown>): string | null {\n const value = row.tenantId ?? row.tenant_id ?? null;\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction getRowString(\n row: Record<string, unknown>,\n ...keys: string[]\n): string | null {\n for (const key of keys) {\n const value = row[key];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n }\n return null;\n}\n\nfunction safeParseJSONObject(value: unknown): Record<string, unknown> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n return { ...(value as Record<string, unknown>) };\n }\n\n try {\n const parsed = JSON.parse(String(value));\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? { ...(parsed as Record<string, unknown>) }\n : {};\n } catch {\n return {};\n }\n}\n\nfunction safeParseJSONArray<T>(value: unknown, mapEntry: (entry: T) => T): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => mapEntry(entry as T));\n }\n\n try {\n const parsed = JSON.parse(String(value));\n return Array.isArray(parsed)\n ? parsed.map((entry) => mapEntry(entry as T))\n : [];\n } catch {\n return [];\n }\n}\n\nfunction resolveGovernanceTenantFilter(\n tenantId: string | null | undefined,\n): string | null | undefined {\n if (tenantId !== undefined) {\n return tenantId;\n }\n\n if (isSystemContext() || isSuperAdminBypass()) {\n return undefined;\n }\n\n const currentTenant = getCurrentTenant();\n if (currentTenant?.tenantId) {\n return currentTenant.tenantId;\n }\n\n return isTenancyEnabled() ? null : undefined;\n}\n\nfunction mapPersistedPolicyRow(\n row: Record<string, unknown>,\n): PersistedContentGovernancePolicyRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizePolicyDefinition({\n key: String(row.key || ''),\n label: String(row.label || row.key || ''),\n kind: (row.kind ||\n getFallbackPolicyKind(String(row.key || ''))) as ContentReviewKind,\n instructions: String(row.instructions || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nfunction mapPersistedProfileRow(\n row: Record<string, unknown>,\n): PersistedContentGovernanceProfileRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizeProfileDefinition({\n key: String(row.key || ''),\n label: String(row.label || row.key || ''),\n description: String(row.description || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n requirements: safeParseJSONArray<ContentReviewRequirement>(\n row.requirements,\n cloneReviewRequirement,\n ),\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nfunction mapPersistedAssignmentRow(\n row: Record<string, unknown>,\n): PersistedContentGovernanceAssignmentRecord {\n return {\n id: typeof row.id === 'string' ? row.id : undefined,\n tenantId: getRowTenantId(row),\n createdAt: getRowTimestamp(row, 'createdAt'),\n updatedAt: getRowTimestamp(row, 'updatedAt'),\n ...normalizeAssignmentDefinition({\n key: String(row.key || ''),\n label: String(row.label || ''),\n contentType: String(row.contentType || row.content_type || ''),\n contentVariant: String(row.contentVariant || row.content_variant || ''),\n enabled: row.enabled !== false && row.enabled !== 0,\n factLinkingEnabled:\n row.factLinkingEnabled === true ||\n row.fact_linking_enabled === true ||\n row.fact_linking_enabled === 1,\n transparencyEnabled:\n row.transparencyEnabled === true ||\n row.transparency_enabled === true ||\n row.transparency_enabled === 1,\n publicationProfileKey: getRowString(\n row,\n 'publicationProfileKey',\n 'publication_profile_key',\n ),\n correctionProfileKey: getRowString(\n row,\n 'correctionProfileKey',\n 'correction_profile_key',\n ),\n enforcePublishReadiness:\n row.enforcePublishReadiness === true ||\n row.enforce_publish_readiness === true ||\n row.enforce_publish_readiness === 1,\n // The relationship is stored as a string; trust the persisted value and\n // fall back to the default when absent.\n defaultFactRelationship:\n (getRowString(\n row,\n 'defaultFactRelationship',\n 'default_fact_relationship',\n ) as FactContentRelationship | null) || DEFAULT_FACT_RELATIONSHIP,\n metadata: safeParseJSONObject(row.metadata),\n }),\n };\n}\n\nexport async function loadPersistedContentGovernanceDefinitions(\n options: { db?: DatabaseInterface | null; tenantId?: string | null } = {},\n): Promise<PersistedContentGovernanceDefinitions> {\n const { db } = options;\n if (!db) {\n return {\n policies: [],\n profiles: [],\n assignments: [],\n };\n }\n\n try {\n const tenantId = resolveGovernanceTenantFilter(options.tenantId);\n const listGovernanceRows = async (tableName: string) => {\n const byCreatedAt = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n ): number =>\n String(a.created_at || a.createdAt || '').localeCompare(\n String(b.created_at || b.createdAt || ''),\n );\n const sortRows = (rows: Record<string, unknown>[]) =>\n rows.sort(byCreatedAt);\n\n if (tenantId === undefined) {\n return sortRows(\n (await db.list(tableName, {})) as Record<string, unknown>[],\n );\n }\n\n if (tenantId === null) {\n return sortRows(\n (await db.list(tableName, {\n tenant_id: null,\n })) as Record<string, unknown>[],\n );\n }\n\n const [globalRows, tenantRows] = await Promise.all([\n db.list(tableName, { tenant_id: null }) as Promise<\n Record<string, unknown>[]\n >,\n db.list(tableName, { tenant_id: tenantId }) as Promise<\n Record<string, unknown>[]\n >,\n ]);\n\n return [...sortRows(globalRows), ...sortRows(tenantRows)];\n };\n const [policyRows, profileRows, assignmentRows] = await Promise.all([\n listGovernanceRows('content_governance_policies'),\n listGovernanceRows('content_governance_profiles'),\n listGovernanceRows('content_governance_assignments'),\n ]);\n\n return {\n policies: policyRows.map((row: Record<string, unknown>) =>\n mapPersistedPolicyRow(row),\n ),\n profiles: profileRows.map((row: Record<string, unknown>) =>\n mapPersistedProfileRow(row),\n ),\n assignments: assignmentRows.map((row: Record<string, unknown>) =>\n mapPersistedAssignmentRow(row),\n ),\n };\n } catch (error) {\n if (isMissingGovernanceTableError(error)) {\n return {\n policies: [],\n profiles: [],\n assignments: [],\n };\n }\n throw error;\n }\n}\n\nfunction resolveAssignmentDefinition(\n assignments: ContentGovernanceAssignmentDefinition[],\n options: Pick<\n ResolveContentGovernanceOptions,\n 'contentType' | 'contentVariant'\n >,\n): ContentGovernanceAssignmentDefinition | null {\n if (!options.contentType) {\n return null;\n }\n\n const exactMatch =\n assignments.find(\n (assignment) =>\n assignment.contentType === options.contentType &&\n (assignment.contentVariant || '') === (options.contentVariant || ''),\n ) || null;\n\n if (exactMatch) {\n return cloneAssignmentDefinition(exactMatch);\n }\n\n const typeOnlyMatch =\n assignments.find(\n (assignment) =>\n assignment.contentType === options.contentType &&\n !assignment.contentVariant,\n ) || null;\n\n return typeOnlyMatch ? cloneAssignmentDefinition(typeOnlyMatch) : null;\n}\n\nfunction buildResolvedGovernance(\n config: ContentGovernanceConfig,\n assignment: ContentGovernanceAssignmentDefinition | null,\n): ResolvedContentGovernance {\n const normalizedAssignment = assignment\n ? normalizeAssignmentDefinition(assignment)\n : null;\n if (normalizedAssignment?.enabled !== true) {\n return {\n isGoverned: false,\n factLinkingEnabled: false,\n transparencyEnabled: false,\n publicationProfileKey: null,\n correctionProfileKey: null,\n enforcePublishReadiness: false,\n defaultFactRelationship: DEFAULT_FACT_RELATIONSHIP,\n reviewPolicies: config.policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false),\n availableProfiles: config.profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false),\n assignment: normalizedAssignment,\n };\n }\n\n return {\n isGoverned: true,\n factLinkingEnabled: normalizedAssignment.factLinkingEnabled === true,\n transparencyEnabled: normalizedAssignment.transparencyEnabled === true,\n publicationProfileKey: normalizedAssignment.publicationProfileKey || null,\n correctionProfileKey: normalizedAssignment.correctionProfileKey || null,\n enforcePublishReadiness:\n normalizedAssignment.enforcePublishReadiness === true,\n defaultFactRelationship:\n normalizedAssignment.defaultFactRelationship || DEFAULT_FACT_RELATIONSHIP,\n reviewPolicies: config.policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false),\n availableProfiles: config.profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false),\n assignment: normalizedAssignment,\n };\n}\n\nfunction normalizeStatus(status: unknown): ContentReviewStatus {\n switch (status) {\n case 'pending':\n case 'passed':\n case 'flagged':\n case 'failed':\n case 'waived':\n return status;\n default:\n return 'flagged';\n }\n}\n\nfunction normalizeSeverity(severity: unknown): ContentReviewSeverity {\n switch (severity) {\n case 'info':\n case 'warning':\n case 'error':\n return severity;\n default:\n return 'warning';\n }\n}\n\nfunction extractJSONObject(raw: string): string | null {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start === -1 || end === -1 || end <= start) {\n return null;\n }\n return raw.slice(start, end + 1);\n}\n\nexport function getContentGovernanceConfig(): ContentGovernanceConfig {\n return cloneGovernanceConfig(governanceConfig);\n}\n\nexport function getStaticContentGovernanceConfig(): ContentGovernanceConfig {\n return cloneGovernanceConfig(governanceConfig);\n}\n\nexport function configureContentGovernance(\n config: Partial<ContentGovernanceConfig>,\n): ContentGovernanceConfig {\n governanceConfig = {\n policies: config.policies\n ? mergeByKey(\n governanceConfig.policies,\n config.policies,\n normalizePolicyDefinition,\n )\n : governanceConfig.policies.map(clonePolicyDefinition),\n profiles: config.profiles\n ? mergeByKey(\n governanceConfig.profiles,\n config.profiles,\n normalizeProfileDefinition,\n )\n : governanceConfig.profiles.map(cloneProfileDefinition),\n assignments: config.assignments\n ? mergeByKey(\n governanceConfig.assignments,\n config.assignments,\n normalizeAssignmentDefinition,\n )\n : governanceConfig.assignments.map(cloneAssignmentDefinition),\n };\n\n return getContentGovernanceConfig();\n}\n\nexport function resetContentGovernanceConfig(): ContentGovernanceConfig {\n governanceConfig = cloneGovernanceConfig(DEFAULT_CONTENT_GOVERNANCE_CONFIG);\n return getContentGovernanceConfig();\n}\n\nexport async function getEffectiveContentGovernanceConfig(\n options: { db?: DatabaseInterface | null; tenantId?: string | null } = {},\n): Promise<ContentGovernanceConfig> {\n const persisted = await loadPersistedContentGovernanceDefinitions({\n db: options.db,\n tenantId: options.tenantId,\n });\n\n return {\n policies: mergeByKey(\n governanceConfig.policies,\n persisted.policies,\n normalizePolicyDefinition,\n ),\n profiles: mergeByKey(\n governanceConfig.profiles,\n persisted.profiles,\n normalizeProfileDefinition,\n ),\n assignments: mergeByKey(\n governanceConfig.assignments,\n persisted.assignments,\n normalizeAssignmentDefinition,\n ),\n };\n}\n\nexport function hasStaticContentGovernancePolicy(key: string): boolean {\n return getPolicyMap(governanceConfig.policies).has(key);\n}\n\nexport function hasStaticContentGovernanceProfile(key: string): boolean {\n return getProfileMap(governanceConfig.profiles).has(key);\n}\n\nexport function getContentReviewPolicy(\n policyKey: string,\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewPolicyDefinition | null {\n return getPolicyMap(policies).get(policyKey) || null;\n}\n\nexport function getContentReviewKind(\n policyKey: string,\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewKind {\n const configuredKind = getPolicyMap(policies).get(policyKey)?.kind;\n return configuredKind || getFallbackPolicyKind(policyKey);\n}\n\nexport function getContentReviewProfile(\n profileKey: string,\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): ContentGovernanceProfileDefinition | null {\n return getProfileMap(profiles).get(profileKey) || null;\n}\n\nexport function getContentReviewProfileKeys(\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): string[] {\n return profiles\n .map(cloneProfileDefinition)\n .filter((profile) => profile.enabled !== false)\n .map((profile) => profile.key);\n}\n\nexport function getContentReviewPolicies(\n policies: ContentReviewPolicyDefinition[] = governanceConfig.policies,\n): ContentReviewPolicyDefinition[] {\n return policies\n .map(clonePolicyDefinition)\n .filter((policy) => policy.enabled !== false);\n}\n\nexport function getContentReviewRequirements(\n profileKey: string,\n profiles: ContentGovernanceProfileDefinition[] = governanceConfig.profiles,\n): ContentReviewRequirement[] {\n const profile = getContentReviewProfile(profileKey, profiles);\n return profile?.requirements.map(cloneReviewRequirement) || [];\n}\n\nexport function getAcceptedContentReviewStatuses(\n requirement: Pick<ContentReviewRequirement, 'acceptedStatuses'>,\n): ContentReviewStatus[] {\n return requirement.acceptedStatuses && requirement.acceptedStatuses.length > 0\n ? [...requirement.acceptedStatuses]\n : ['passed', 'waived'];\n}\n\nexport function resolveConfiguredContentGovernance(\n options: Pick<\n ResolveContentGovernanceOptions,\n 'contentType' | 'contentVariant'\n >,\n): ResolvedContentGovernance {\n const assignment = resolveAssignmentDefinition(governanceConfig.assignments, {\n contentType: options.contentType,\n contentVariant: options.contentVariant,\n });\n\n return buildResolvedGovernance(governanceConfig, assignment);\n}\n\nexport async function resolveEffectiveContentGovernance(\n options: ResolveContentGovernanceOptions,\n): Promise<ResolvedContentGovernance> {\n const effectiveConfig = await getEffectiveContentGovernanceConfig({\n db: options.db,\n tenantId: options.tenantId,\n });\n const assignment = resolveAssignmentDefinition(effectiveConfig.assignments, {\n contentType: options.contentType,\n contentVariant: options.contentVariant,\n });\n\n return buildResolvedGovernance(effectiveConfig, assignment);\n}\n\nexport function buildContentReviewPrompt(\n options: BuildContentReviewPromptOptions,\n): string {\n const { kind, content, facts = [], policy, customInstructions } = options;\n\n const factLines =\n facts.length > 0\n ? facts\n .map(\n (fact) =>\n `- [${fact.id}] status=${fact.status}; confidence=${fact.confidence}; sources=${fact.sourceCount}; text=${fact.textRefined}`,\n )\n .join('\\n')\n : 'No facts were supplied for this review.';\n\n const policyText =\n customInstructions?.trim() ||\n policy?.instructions ||\n getContentReviewPolicy(kind)?.instructions ||\n '';\n\n return `You are a structured editorial reviewer.\n\nReturn ONLY valid JSON with this shape:\n{\n \"status\": \"passed\" | \"flagged\" | \"failed\" | \"waived\",\n \"summary\": \"short summary\",\n \"findings\": [\n {\n \"severity\": \"info\" | \"warning\" | \"error\",\n \"title\": \"short title\",\n \"detail\": \"what is wrong and why\",\n \"factId\": \"optional fact id\",\n \"quote\": \"optional quoted text from the draft\",\n \"suggestedChange\": \"optional suggested fix\",\n \"ruleId\": \"optional policy or rule id\"\n }\n ]\n}\n\nReview kind: ${kind}\nPolicy key: ${policy?.key || kind}\nReview instructions:\n${policyText}\n\nDraft content:\n- id: ${content.id ?? ''}\n- type: ${content.type ?? ''}\n- status: ${content.status}\n- state: ${content.state}\n- author: ${content.author ?? ''}\n- publish_date: ${content.publish_date?.toISOString?.() ?? ''}\n\nTitle:\n${content.title}\n\nDescription:\n${content.description ?? ''}\n\nBody:\n${content.body}\n\nRelevant facts:\n${factLines}`;\n}\n\nexport function parseContentReviewResponse(raw: string): ContentReviewResult {\n const normalizedRaw = raw.trim();\n const jsonCandidate = extractJSONObject(normalizedRaw);\n\n if (jsonCandidate) {\n try {\n const parsed = JSON.parse(jsonCandidate) as {\n status?: unknown;\n summary?: unknown;\n findings?: unknown;\n };\n const findings = Array.isArray(parsed.findings)\n ? parsed.findings.map((rawFinding): ContentReviewFinding => {\n const finding =\n rawFinding && typeof rawFinding === 'object'\n ? (rawFinding as Record<string, unknown>)\n : {};\n return {\n severity: normalizeSeverity(finding.severity),\n title: String(finding.title || 'Review finding'),\n detail: String(finding.detail || ''),\n factId:\n typeof finding.factId === 'string' ? finding.factId : undefined,\n quote:\n typeof finding.quote === 'string' ? finding.quote : undefined,\n suggestedChange:\n typeof finding.suggestedChange === 'string'\n ? finding.suggestedChange\n : undefined,\n ruleId:\n typeof finding.ruleId === 'string' ? finding.ruleId : undefined,\n };\n })\n : [];\n\n return {\n status: normalizeStatus(parsed.status),\n summary: String(parsed.summary || normalizedRaw || 'Review completed'),\n findings,\n };\n } catch {\n // Fall through to a normalized fallback result.\n }\n }\n\n return {\n status: 'flagged',\n summary: normalizedRaw || 'Review completed without structured output.',\n findings: normalizedRaw\n ? [\n {\n severity: 'warning',\n title: 'Unstructured review output',\n detail: normalizedRaw,\n },\n ]\n : [],\n };\n}\n","export interface ContentTransparencyGeneration {\n aiAssisted: boolean;\n publicPrompt: string | null;\n model: string | null;\n}\n\nexport interface ContentTransparencySource {\n id: string | null;\n sourceType: string | null;\n sourceUrl: string | null;\n sourceTitle: string | null;\n credibility: number | null;\n extractedAt: string | null;\n metadata: Record<string, unknown>;\n}\n\nexport interface ContentTransparencyFact {\n id: string | null;\n textRaw?: string | null;\n textRefined?: string | null;\n status?: string | null;\n domain?: string | null;\n confidence?: number | null;\n sourceCount?: number | null;\n metadata?: Record<string, unknown>;\n relationship?: string | null;\n linkMetadata?: Record<string, unknown>;\n usedInArticle?: boolean;\n sources?: ContentTransparencySource[];\n}\n\nexport interface ContentTransparencyReference {\n id: string | null;\n title: string | null;\n url: string | null;\n originalUrl: string | null;\n type: string | null;\n source: string | null;\n usedFactIds: string[];\n extractedFacts: ContentTransparencyFact[];\n}\n\nexport interface ContentTransparencyPublicationVersion {\n id: string | null;\n version: number | null;\n kind: string | null;\n summary: string;\n createdAt: string | null;\n}\n\nexport interface ContentTransparencyVersionHistoryItem {\n id: string | null;\n version: number | null;\n kind: string | null;\n summary: string;\n createdAt: string | null;\n provenance: Record<string, unknown>;\n}\n\n/**\n * Serialized review record carried in a transparency snapshot. Only the fields\n * consumers read are named; the index signature preserves the remaining\n * serialized properties.\n */\nexport interface ContentTransparencyReview {\n id?: string | null;\n kind?: string | null;\n policyKey?: string | null;\n status?: string | null;\n summary?: string | null;\n createdAt?: string | null;\n [key: string]: unknown;\n}\n\n/**\n * Serialized review-profile evaluation carried in a transparency snapshot.\n */\nexport interface ContentTransparencyReviewProfile {\n profileKey?: string | null;\n [key: string]: unknown;\n}\n\n/**\n * Serialized correction record carried in a transparency snapshot.\n */\nexport interface ContentTransparencyCorrection {\n id?: string | null;\n summary?: string | null;\n publicNote?: string | null;\n publishedAt?: string | null;\n [key: string]: unknown;\n}\n\nexport interface ContentTransparencyData {\n generatedAt: string | null;\n snapshotKind: 'preview' | 'published';\n contentId: string | null;\n currentContentStatus: string | null;\n publicationProfileKey: string;\n publicationVersion: ContentTransparencyPublicationVersion | null;\n generation: ContentTransparencyGeneration;\n factsUsed: ContentTransparencyFact[];\n linkedFacts: ContentTransparencyFact[];\n otherExtractedFacts: ContentTransparencyFact[];\n references: ContentTransparencyReference[];\n reviews: ContentTransparencyReview[];\n reviewProfiles: ContentTransparencyReviewProfile[];\n corrections: ContentTransparencyCorrection[];\n versionHistory: ContentTransparencyVersionHistoryItem[];\n}\n\nfunction asObject(\n value: unknown,\n fallback: Record<string, unknown> = {},\n): Record<string, unknown> {\n return value && typeof value === 'object'\n ? { ...(value as Record<string, unknown>) }\n : fallback;\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction asNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction asArray<T>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nfunction normalizeGeneration(value: unknown): ContentTransparencyGeneration {\n const generation = asObject(value);\n return {\n aiAssisted: Boolean(generation.aiAssisted),\n publicPrompt: asString(generation.publicPrompt),\n model: asString(generation.model),\n };\n}\n\nfunction normalizeFact(value: unknown): ContentTransparencyFact {\n const fact = asObject(value);\n return {\n ...fact,\n id: asString(fact.id),\n relationship: asString(fact.relationship),\n linkMetadata: asObject(fact.linkMetadata),\n usedInArticle: Boolean(fact.usedInArticle),\n sources: asArray<unknown>(fact.sources).map(normalizeSource),\n };\n}\n\nfunction normalizeSource(value: unknown): ContentTransparencySource {\n const source = asObject(value);\n return {\n id: asString(source.id),\n sourceType: asString(source.sourceType),\n sourceUrl: asString(source.sourceUrl),\n sourceTitle: asString(source.sourceTitle),\n credibility: asNumber(source.credibility),\n extractedAt: asString(source.extractedAt),\n metadata: asObject(source.metadata),\n };\n}\n\nfunction normalizeReference(value: unknown): ContentTransparencyReference {\n const reference = asObject(value);\n return {\n id: asString(reference.id),\n title: asString(reference.title),\n url: asString(reference.url),\n originalUrl: asString(reference.originalUrl),\n type: asString(reference.type),\n source: asString(reference.source),\n usedFactIds: asArray<string>(reference.usedFactIds).filter(Boolean),\n extractedFacts: asArray<unknown>(reference.extractedFacts).map(\n normalizeFact,\n ),\n };\n}\n\nfunction normalizePublicationVersion(\n value: unknown,\n): ContentTransparencyPublicationVersion | null {\n const publicationVersion = asObject(value);\n if (!publicationVersion.id && publicationVersion.version === undefined) {\n return null;\n }\n\n return {\n id: asString(publicationVersion.id),\n version: asNumber(publicationVersion.version),\n kind: asString(publicationVersion.kind),\n summary:\n typeof publicationVersion.summary === 'string'\n ? publicationVersion.summary\n : '',\n createdAt: asString(publicationVersion.createdAt),\n };\n}\n\nfunction normalizeVersionHistoryItem(\n value: unknown,\n): ContentTransparencyVersionHistoryItem {\n const version = asObject(value);\n return {\n id: asString(version.id),\n version: asNumber(version.version),\n kind: asString(version.kind),\n summary: typeof version.summary === 'string' ? version.summary : '',\n createdAt: asString(version.createdAt),\n provenance: asObject(version.provenance),\n };\n}\n\nfunction dedupeFacts(facts: ContentTransparencyFact[]) {\n const byKey = new Map<string, ContentTransparencyFact>();\n\n for (const fact of facts) {\n // Collapse effectively empty facts into a single placeholder bucket rather\n // than rendering duplicate blank entries in the public transparency view.\n const key =\n fact.id ||\n fact.textRefined ||\n fact.textRaw ||\n JSON.stringify(fact.metadata || {});\n if (!key) {\n continue;\n }\n\n byKey.set(key, fact);\n }\n\n return [...byKey.values()];\n}\n\nexport function normalizeContentTransparency(\n value: unknown,\n defaults: Partial<ContentTransparencyData> = {},\n): ContentTransparencyData {\n const snapshot = asObject(value);\n const references = asArray<unknown>(snapshot.references).map(\n normalizeReference,\n );\n const linkedFacts = asArray<unknown>(snapshot.linkedFacts).map(normalizeFact);\n const factsUsed =\n asArray<unknown>(snapshot.factsUsed).length > 0\n ? asArray<unknown>(snapshot.factsUsed).map(normalizeFact)\n : linkedFacts.filter((fact) => fact.usedInArticle);\n const otherExtractedFacts =\n asArray<unknown>(snapshot.otherExtractedFacts).length > 0\n ? asArray<unknown>(snapshot.otherExtractedFacts).map(normalizeFact)\n : dedupeFacts(\n references.flatMap((reference) =>\n reference.extractedFacts.filter((fact) => !fact.usedInArticle),\n ),\n );\n\n return {\n generatedAt: asString(snapshot.generatedAt) ?? defaults.generatedAt ?? null,\n snapshotKind:\n snapshot.snapshotKind === 'published'\n ? 'published'\n : defaults.snapshotKind || 'preview',\n contentId: asString(snapshot.contentId) ?? defaults.contentId ?? null,\n currentContentStatus:\n asString(snapshot.currentContentStatus) ??\n defaults.currentContentStatus ??\n null,\n publicationProfileKey:\n asString(snapshot.publicationProfileKey) ??\n asString(snapshot.publicationReviewProfileKey) ??\n defaults.publicationProfileKey ??\n 'publication',\n publicationVersion:\n normalizePublicationVersion(snapshot.publicationVersion) ??\n defaults.publicationVersion ??\n null,\n generation: normalizeGeneration(\n snapshot.generation ?? defaults.generation ?? {},\n ),\n factsUsed,\n linkedFacts,\n otherExtractedFacts,\n references,\n reviews: asArray<ContentTransparencyReview>(snapshot.reviews),\n reviewProfiles: asArray<ContentTransparencyReviewProfile>(\n snapshot.reviewProfiles,\n ),\n corrections: asArray<ContentTransparencyCorrection>(snapshot.corrections),\n versionHistory: asArray<unknown>(snapshot.versionHistory).map(\n normalizeVersionHistoryItem,\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { Content } from './content';
|
|
|
4
4
|
export type ContentReviewKind = 'facts' | 'safety' | 'custom';
|
|
5
5
|
export type ContentReviewStatus = 'pending' | 'passed' | 'flagged' | 'failed' | 'waived';
|
|
6
6
|
export type ContentReviewSeverity = 'info' | 'warning' | 'error';
|
|
7
|
-
export type ContentVersionKind = 'manual' | 'draft' | 'review' | 'publication' | 'correction';
|
|
7
|
+
export type ContentVersionKind = 'manual' | 'draft' | 'review' | 'publication' | 'correction' | 'auto-generated';
|
|
8
8
|
export type ContentCorrectionType = 'fact' | 'safety' | 'copy' | 'custom';
|
|
9
9
|
export type ContentCorrectionStatus = 'draft' | 'published' | 'retracted';
|
|
10
10
|
export interface ContentReviewFinding {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-governance.d.ts","sourceRoot":"","sources":["../src/content-governance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAO/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,aAAa,GACb,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"content-governance.d.ts","sourceRoot":"","sources":["../src/content-governance.ts"],"names":[],"mappings":"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"}
|