bengali-lkc / src /lib /types.ts
saifulislamoni's picture
Deploy Bengali LKC
d1cda0b
Raw
History Blame Contribute Delete
5.97 kB
/* ------------------------------------------------------------------ */
/* Lexical data model (UKC LMF schema, per SRS §2) */
/* ------------------------------------------------------------------ */
export type POS = "n" | "v" | "a" | "r";
export type SenseRelType = "derivation" | "antonym" | "metonym";
export type SynsetRelType =
| "hypernym"
| "mero_part"
| "mero_substance"
| "mero_member"
| "attribute";
export interface SenseRelation {
relType: SenseRelType;
target: string; // ben-sen{integer}
}
export interface SynsetRelation {
relType: SynsetRelType;
target: string; // ben-syn{integer}
}
export interface Sense {
id: string; // ben-sen{integer}
synset: string; // ben-syn{integer}
relations?: SenseRelation[];
}
export interface LexicalEntry {
id: string; // ben-word-{pos}{integer}
lemma: string;
pos: POS;
senses: Sense[];
}
export interface SynsetDefinition {
language: "ben" | "eng";
text: string;
}
export interface Synset {
id: string; // ben-syn{integer}
ili: string; // {offset}-{pos}
pos: POS;
lexicalized: boolean;
definition?: SynsetDefinition;
relations?: SynsetRelation[];
}
export interface LexiconMeta {
id: string;
label: string;
language: string;
email: string;
license: string;
version: string;
source: string;
description: string;
publisher: string;
}
/* ------------------------------------------------------------------ */
/* Roles and access control (SRS §3) */
/* ------------------------------------------------------------------ */
export type Role =
| "PLATFORM_ARCHITECT"
| "SYSTEM_MODERATOR"
| "CONTRIBUTOR"
| "LEXICAL_EDITOR"
| "CHIEF_LEXICAL_EDITOR"
| "ARBITRATION_CURATOR";
export interface User {
id: string;
username: string;
name: string;
role: Role;
email: string;
active: boolean;
suspended: boolean;
joinedAt: string; // ISO date
}
export interface AccessToken {
id: string; // UUID
userId: string;
role: Role;
token: string; // demo token string
issuedBy: string;
issuedAt: string;
expiresAt: string;
revoked: boolean;
}
export interface Session {
userId: string;
username: string;
name: string;
role: Role;
}
/* ------------------------------------------------------------------ */
/* Entry lifecycle (SRS §5) */
/* ------------------------------------------------------------------ */
export type EntryState =
| "DRAFT"
| "PENDING_REVIEW"
| "UNDER_REVIEW"
| "FLAGGED"
| "C_FLAGGED"
| "EDITOR_APPROVED"
| "ARBITRATION"
| "VALIDATED"
| "REJECTED";
export interface StateTransition {
from: EntryState | null;
to: EntryState;
actorId: string;
actorRole: Role | "SYSTEM";
timestamp: string;
comment?: string;
}
/** A crowdsourced submission moving through the validation pipeline. */
export interface Submission {
id: string; // sub-{n}
state: EntryState;
contributorId: string;
createdAt: string;
updatedAt: string;
assignedTo?: string; // reviewer user id
/* proposed lexical payload (Quick Input form, SRS §6.2) */
writtenForm: string;
pos: POS;
synsetAction: "link" | "create";
synsetId?: string; // when linking to existing synset
iliCode?: string; // when creating a new synset
definitionLanguage?: "ben" | "eng";
definitionText?: string;
senseRelations: SenseRelation[];
synsetRelations: SynsetRelation[];
reviewerNote?: string; // contributor's note for reviewers
/* review trail */
history: StateTransition[];
editorComment?: string; // latest FLAG comment
cleComment?: string; // latest C_FLAG note
rejectionReason?: string;
validatedBy?: string;
validatedAt?: string;
}
/* ------------------------------------------------------------------ */
/* Arbitration (SRS §7.6) */
/* ------------------------------------------------------------------ */
export type ArbitrationStatus =
| "RESPONSE_WINDOW"
| "ACTIVE"
| "TIE_PENDING"
| "RESOLVED";
export type ArbitrationVerdictOption =
| "APPROVE_CLAIMANT"
| "APPROVE_ACCUSED"
| "REJECT";
export interface ArbitrationVote {
curatorId: string;
verdict: ArbitrationVerdictOption;
rationale: string;
correctionNote?: string;
votedAt: string;
}
export interface ArbitrationCase {
id: string; // case-{n}
submissionId: string;
claimantId: string;
accusedId: string;
disputeType: "DISPUTE_REJECTION" | "DISPUTE_FLAG" | "ESCALATION";
disputeNote: string;
counterClaim?: string;
openedAt: string;
responseDeadline: string;
status: ArbitrationStatus;
votes: ArbitrationVote[];
excludedCuratorIds: string[]; // conflict-of-interest rule
finalVerdict?: ArbitrationVerdictOption;
verdictBy?: "PANEL" | "TIE_BREAK";
tieBrokenBy?: string;
resolvedAt?: string;
correctionApplied?: boolean;
correctionNote?: string;
}
/* ------------------------------------------------------------------ */
/* Audit + configuration (SRS §3.2, §4, §5.3) */
/* ------------------------------------------------------------------ */
export interface AuditEvent {
id: string;
timestamp: string;
actorId: string;
actorRole: Role | "SYSTEM";
action: string;
targetType:
| "SUBMISSION"
| "USER"
| "TOKEN"
| "EXPORT"
| "CONFIG"
| "ARBITRATION"
| "AUTH";
targetId?: string;
detail?: string;
}
export interface SystemConfig {
maxEntriesPerSession: number;
maxEntriesPerDay: number;
suspensionThreshold: number;
minSubmissionSeconds: number;
anomalyThresholdPerHour: number;
ipRequestsPerMinute: number;
sessionTimeoutMinutes: number;
captchaEnabled: boolean;
honeypotEnabled: boolean;
captchaScoreThreshold: number;
}
export interface ExportRecord {
id: string;
timestamp: string;
actorId: string;
entryCount: number;
synsetCount: number;
sha256: string;
config: string;
}