Files
ttstd-infinite-canvas/backend/internal/model/models.go
dlh 35dee568c9 feat(create): 创作对话文本模式接入 text-replay 持久化与回放
把后端既有但未接线的 text-replay 能力在前端打通:前端直连模型生成正文时,
把生成过程/结果持久化到后端任务,支持刷新重放与任务中心可见。

后端(最小配套,text-replay 本为前端自管设计):
- 新增 TaskStatusTextReplay 任务状态:不排入 worker 队列、不计费、不执行,
  仅作为正文增量(text-deltas)的存储容器;
- CreateTask 识别 input.replay=true 的请求,走 createTextReplayTask 轻量创建;
- 新增 POST /tasks/:id/text-replay-complete: 写入最终正文、置为 succeeded、
  触发 text-deltas 归并,使 queryTaskTextReplay 能读到 finalText。

前端:
- 新增 creation-text-replay.ts 发布器: start 建任务、publish 节流上报增量、
  finish 存最终全文,失败静默降级不阻塞生成;
- create 文本模式生成时接入发布器,正文流不经展示改动、额外持久化到后端。

测试: 新增 isTextReplayTaskRequest 纯函数测(本地)、text-replay 闭环仓测
(建任务后写增量 -> complete -> succeeded + finalText,CI/cgo 验证)。
build/vet/tsc 全绿。
2026-08-19 22:04:41 +08:00

157 lines
6.6 KiB
Go

package model
import (
"time"
)
type TaskStatus string
type ProviderCancelStatus string
type SessionStatus string
type UserRole string
type UserStatus string
type ChannelScope string
type ChannelInterfaceType string
type ApiCallStatus string
type ResourceStatus string
type BillingStatus string
type CreditLedgerType string
type RedeemCodeStatus string
type AnnouncementStatus string
type AnnouncementLevel string
type ProjectStatus string
type ProjectUnitKind string
type ProjectUnitStatus string
type AssetCategory string
type AssetVersionStatus string
type WorkflowStatus string
type WorkflowStepStatus string
// AdminAuditEvent 只允许追加,用于还原管理员写操作,禁止作为可编辑业务状态使用。
type AdminAuditEvent struct {
ID string `json:"id" gorm:"primaryKey;size:36"`
ActorUserID string `json:"actorUserId" gorm:"index;size:36"`
Action string `json:"action" gorm:"index;size:80"`
TargetType string `json:"targetType" gorm:"index;size:40"`
TargetID string `json:"targetId" gorm:"index;size:160"`
Summary string `json:"summary" gorm:"size:500"`
MetadataJSON string `json:"metadataJson" gorm:"type:text"`
CreatedAt time.Time `json:"createdAt" gorm:"index"`
}
const (
TaskStatusQueued TaskStatus = "queued"
TaskStatusRunning TaskStatus = "running"
TaskStatusSucceeded TaskStatus = "succeeded"
TaskStatusFailed TaskStatus = "failed"
TaskStatusCancelled TaskStatus = "cancelled"
// text_replay 任务是前端自管、不经过 worker 队列的文本生成存档容器:
// 前端直连模型流式生成,把增量 POST 到 /tasks/:id/text-deltas 存档,
// 完成后调用 /tasks/:id/text-replay-complete 归并为最终正文。
TaskStatusTextReplay TaskStatus = "text_replay"
SessionStatusActive SessionStatus = "active"
SessionStatusCompleted SessionStatus = "completed"
SessionStatusFailed SessionStatus = "failed"
UserRoleAdmin UserRole = "admin"
UserRoleUser UserRole = "user"
UserStatusActive UserStatus = "active"
UserStatusDisabled UserStatus = "disabled"
ChannelScopeSystem ChannelScope = "system"
ChannelScopeUser ChannelScope = "user"
ChannelInterfaceChatCompletion ChannelInterfaceType = "chat-completion"
ChannelInterfaceOpenAIResponse ChannelInterfaceType = "openai-response"
ChannelInterfaceOpenAIImage ChannelInterfaceType = "openai-image"
ChannelInterfaceGrokImage ChannelInterfaceType = "grok-image"
ChannelInterfaceVolcengineArkImage ChannelInterfaceType = "volcengine-ark-image"
ChannelInterfaceVolcengineJiMengImage ChannelInterfaceType = "volcengine-jimeng-image"
ChannelInterfaceGeminiImage ChannelInterfaceType = "gemini-image"
ChannelInterfaceOpenAIAudio ChannelInterfaceType = "openai-audio"
ChannelInterfaceAsyncAudio ChannelInterfaceType = "async-audio"
ChannelInterfaceNewAPIVideo ChannelInterfaceType = "newapi"
ChannelInterfaceNewAPIChannel1 ChannelInterfaceType = "newapi-channel-1"
ChannelInterfaceNewAPIChannel2 ChannelInterfaceType = "newapi-channel-2"
ChannelInterfaceXAIVideo ChannelInterfaceType = "xai-video"
ChannelInterfaceVolcengineArkVideo ChannelInterfaceType = "volcengine-ark-video"
ChannelInterfaceVolcengineJiMengVideo ChannelInterfaceType = "volcengine-jimeng-video"
ChannelInterfaceGeminiVeo ChannelInterfaceType = "gemini-veo"
ChannelInterfaceNovitaVideo ChannelInterfaceType = "novita-video"
ApiCallStatusSucceeded ApiCallStatus = "succeeded"
ApiCallStatusFailed ApiCallStatus = "failed"
ResourceStatusPending ResourceStatus = "pending"
ResourceStatusReady ResourceStatus = "ready"
ResourceStatusFailed ResourceStatus = "failed"
ResourceStatusDeleted ResourceStatus = "deleted"
BillingStatusReserved BillingStatus = "reserved"
BillingStatusRunning BillingStatus = "running"
BillingStatusSettled BillingStatus = "settled"
BillingStatusRefunded BillingStatus = "refunded"
BillingStatusUncertain BillingStatus = "uncertain"
ProviderCancelStatusRequested ProviderCancelStatus = "requested"
ProviderCancelStatusConfirmed ProviderCancelStatus = "confirmed"
ProviderCancelStatusUncertain ProviderCancelStatus = "uncertain"
CreditLedgerRedeem CreditLedgerType = "redeem"
CreditLedgerAdminGrant CreditLedgerType = "admin_grant"
CreditLedgerReserve CreditLedgerType = "reserve"
CreditLedgerConsume CreditLedgerType = "consume"
CreditLedgerRefund CreditLedgerType = "refund"
CreditLedgerAdminAdjust CreditLedgerType = "admin_adjustment"
CreditLedgerSignupBonus CreditLedgerType = "signup_bonus"
CreditLedgerCheckinBonus CreditLedgerType = "checkin_bonus"
RedeemCodeUnused RedeemCodeStatus = "unused"
RedeemCodeRedeemed RedeemCodeStatus = "redeemed"
RedeemCodeDisabled RedeemCodeStatus = "disabled"
AnnouncementStatusActive AnnouncementStatus = "active"
AnnouncementStatusClosed AnnouncementStatus = "closed"
AnnouncementLevelInfo AnnouncementLevel = "info"
AnnouncementLevelSuccess AnnouncementLevel = "success"
AnnouncementLevelWarning AnnouncementLevel = "warning"
AnnouncementLevelCritical AnnouncementLevel = "critical"
ProjectStatusActive ProjectStatus = "active"
ProjectStatusArchived ProjectStatus = "archived"
ProjectUnitKindChapter ProjectUnitKind = "chapter"
ProjectUnitKindEpisode ProjectUnitKind = "episode"
ProjectUnitStatusDraft ProjectUnitStatus = "draft"
ProjectUnitStatusReady ProjectUnitStatus = "ready"
ProjectUnitStatusCompleted ProjectUnitStatus = "completed"
AssetCategoryCharacter AssetCategory = "character"
AssetCategoryEnvironment AssetCategory = "environment"
AssetCategoryWardrobe AssetCategory = "wardrobe"
AssetCategoryProp AssetCategory = "prop"
AssetCategoryWeapon AssetCategory = "weapon"
AssetCategoryStyle AssetCategory = "style"
AssetCategoryOther AssetCategory = "other"
AssetVersionStatusDraft AssetVersionStatus = "draft"
AssetVersionStatusReview AssetVersionStatus = "review"
AssetVersionStatusConfirmed AssetVersionStatus = "confirmed"
AssetVersionStatusArchived AssetVersionStatus = "archived"
WorkflowStatusActive WorkflowStatus = "active"
WorkflowStatusCompleted WorkflowStatus = "completed"
WorkflowStatusFailed WorkflowStatus = "failed"
WorkflowStepStatusPending WorkflowStepStatus = "pending"
WorkflowStepStatusReady WorkflowStepStatus = "ready"
WorkflowStepStatusRunning WorkflowStepStatus = "running"
WorkflowStepStatusReview WorkflowStepStatus = "review"
WorkflowStepStatusCompleted WorkflowStepStatus = "completed"
WorkflowStepStatusFailed WorkflowStepStatus = "failed"
WorkflowStepStatusSkipped WorkflowStepStatus = "skipped"
)