Files
Agent-System/deploy/postgres/migrations/2026-09-11-freeform-documents.sql
T
WeiCHEN 1fc7d0d01f feat(export): 实现单次智能体回复导出、私密文档保存与隐私防泄露全套闭环 (Phase 0 - Phase 2)
- Phase 0: 实现服务端回复导出策略矩阵引擎 (replyexport.EvaluatePolicy)、数据库迁移 (2026-09-11-message-export-policy.sql)、SSE done 事件挂载与能力探测 API
- Phase 1: 构建前端 ReplyDocumentIR 语法树解析与渲染管道,支持 Markdown / DOCX 文件下载及带格式富文本剪贴板复制
- Phase 2: 实现私密自由文档 (freeform_documents) 领域服务、PostgreSQL 乐观锁版本管理、ACL 隐私隔离、一键共享与右侧栏编辑联动
- 专项修复:
  1. 修复后台 API 路由注册并加入双向拉取同步,确保私密保存实时进入我的私密列表
  2. 实现轻量回复专属 DOCX 生成与静默下载逻辑 (downloadDocxReply)
  3. 将 LaTeX 公式转为标准 MathML 矢量标记,支持粘贴到 Microsoft Word / WPS 自动识别为原生公式
2026-09-13 02:50:21 +00:00

55 lines
2.5 KiB
SQL

-- 2026-09-11-freeform-documents.sql
-- 支持单条回复“保存到我的私密”及自由文档(Freeform Document)独立生命周期管理
CREATE TABLE IF NOT EXISTS freeform_documents (
doc_id VARCHAR(64) PRIMARY KEY,
project_id INT NOT NULL,
owner_user_id INT NOT NULL,
source_message_id BIGINT REFERENCES chat_messages(id) ON DELETE SET NULL,
source_content_sha256 VARCHAR(64) NOT NULL DEFAULT '',
title VARCHAR(255) NOT NULL,
governance_mode VARCHAR(32) NOT NULL DEFAULT 'freeform',
space VARCHAR(32) NOT NULL DEFAULT 'my_private',
current_version_id INT NOT NULL DEFAULT 1,
current_sha256 VARCHAR(64) NOT NULL DEFAULT '',
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
deleted_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT chk_freeform_space CHECK (space IN ('my_private', 'project_shared', 'trash')),
CONSTRAINT chk_freeform_gov_mode CHECK (governance_mode = 'freeform')
);
CREATE TABLE IF NOT EXISTS freeform_document_versions (
id BIGSERIAL PRIMARY KEY,
doc_id VARCHAR(64) NOT NULL REFERENCES freeform_documents(doc_id) ON DELETE CASCADE,
version_no INT NOT NULL,
content_sha256 VARCHAR(64) NOT NULL,
content_markdown TEXT NOT NULL,
created_by INT NOT NULL,
change_summary VARCHAR(255) NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT uq_freeform_doc_version UNIQUE (doc_id, version_no)
);
CREATE TABLE IF NOT EXISTS document_access_audit (
id BIGSERIAL PRIMARY KEY,
doc_id VARCHAR(64) NOT NULL,
user_id INT NOT NULL,
action VARCHAR(64) NOT NULL,
success BOOLEAN NOT NULL DEFAULT TRUE,
ip_address VARCHAR(64) NOT NULL DEFAULT '',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 索引与检索加速
CREATE INDEX IF NOT EXISTS idx_freeform_docs_owner_space ON freeform_documents (owner_user_id, space) WHERE is_deleted = FALSE;
CREATE INDEX IF NOT EXISTS idx_freeform_docs_project_space ON freeform_documents (project_id, space) WHERE is_deleted = FALSE;
CREATE INDEX IF NOT EXISTS idx_freeform_docs_source_msg ON freeform_documents (source_message_id);
CREATE INDEX IF NOT EXISTS idx_doc_access_audit_lookup ON document_access_audit (doc_id, user_id, created_at DESC);
-- 同一用户针对同一消息生成私密文档的幂等唯一索引
CREATE UNIQUE INDEX IF NOT EXISTS uq_freeform_user_source_message
ON freeform_documents (owner_user_id, source_message_id)
WHERE is_deleted = FALSE AND source_message_id IS NOT NULL;