Add revisioned decisions and scoped consultation lifecycle

This commit is contained in:
aiagent
2026-10-19 22:28:53 -07:00
parent 0fcfe1c024
commit 6e4178dc79
27 changed files with 1431 additions and 192 deletions
+18
View File
@@ -0,0 +1,18 @@
import type { Decision } from '@/lib/types'
export function decisionStatus(decision: Decision) {
return decision.status === 'decided' || decision.status === 'pending_verification' ? (decision.response ? 'pending_review' : 'open') : decision.status
}
export const decisionLabels = { open: '等待决定', pending_review: '等待检查', accepted: '已接受,待落实', completed: '已完成', needs_reconsideration: '需要重新考虑' }
export type DecisionDraft = { option: string | null; comment: string; revision: number; conflict: boolean; attempt?: { signature: string; key: string }; sending?: boolean }
export type ChatDraft = { text: string; sending: boolean; error: string; attempt?: { text: string; key: string } }
export function writable(decision: Decision) { return ['open', 'needs_reconsideration'].includes(decisionStatus(decision)) }
export function submissionBody(decision: Decision, draft: DecisionDraft) {
const revision = decision.revision ?? 1
if (!writable(decision) || draft.sending || draft.conflict || draft.revision !== revision) return null
if (draft.option && !decision.options.some(option => option.id === draft.option)) return null
if (!draft.option && !draft.comment.trim()) return null
return { expected_revision: revision, option_id: draft.option, comment: draft.comment }
}
export function confirmDraft(decision: Decision, draft: DecisionDraft) {
draft.revision = decision.revision ?? 1; draft.conflict = false; draft.option = null; draft.attempt = undefined
}