Files
Agent-System/web/src/lib/commentPolicy.ts
T
weichen 2e56ba9719 feat(docgov): complete review lifecycle gaps for lock/notify/comment/reopen
Defer locked-period supplements to a pending ledger, route duty-holder
notifications, persist stage-scoped comments, and prefer Approver for reopen.
2026-09-25 20:08:56 +00:00

43 lines
1.4 KiB
TypeScript

import type { UserRole } from '../types/docgov';
export type CommentAuthorRole = 'reviewer' | 'approver' | 'author';
export type DocLifecycleState = 'drafting' | 'reviewing' | 'approving' | 'approved' | string;
/** Stage-scoped comment matrix (viewer always read-only). */
export function canAddBlockComment(
role: UserRole | string,
state: DocLifecycleState = 'drafting',
): boolean {
if (role === 'viewer' || role === 'system') {
return role === 'system';
}
switch (state) {
case 'drafting':
return role === 'author' || role === 'reviewer';
case 'reviewing':
return role === 'reviewer' || role === 'author';
case 'approving':
return role === 'approver' || role === 'reviewer';
case 'approved':
return false;
default:
return role === 'author' || role === 'reviewer' || role === 'approver';
}
}
/** Persist author role as-is when author comments; otherwise reviewer/approver. */
export function resolveCommentAuthorRole(role: UserRole | string): CommentAuthorRole | null {
if (role === 'approver') return 'approver';
if (role === 'reviewer') return 'reviewer';
if (role === 'author') return 'author';
return null;
}
export function canResolveComment(
role: UserRole | string,
state: DocLifecycleState,
): boolean {
if (role === 'reviewer') return true;
return role === 'author' && state === 'drafting';
}