Feat/3.0.0 beta1 - #2382
Merged
Merged
Conversation
一张表有两条创建路径:新装走 `SQLModel.metadata.create_all()`,按模型声明发出 `DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`;升级走建表的那个 revision,而其中几个把 update_time 写成裸 `CURRENT_TIMESTAMP` 或干脆不写默认值。 同一个版本因此在不同环境行为不同 —— 升级来的 MySQL 库悄悄丢了 ON UPDATE 那一半, 新装库、以及所有达梦库(开机触发器覆盖全部 update_time 列)则保留着。 linsight_skill 正是被这个坑到的:f035 建表时没写默认值,行落库带 NULL update_time,技能列表按该列排序把刚导入的技能推到最后一页。 - 新增 revision `update_time_default_align`:遍历模型 metadata 找出声明了 UPDATE_TIME_SERVER_DEFAULT 的表,比对 information_schema,只 ALTER 真正漂移的 列(当前为 linsight_skill / knowledge_document / knowledge_document_version / knowledge_space_tag_library),保持 nullable 与列类型不变。达梦靠开机触发器已有 等价语义、SQLite 无此子句,两者直接跳过。MySQL 改 ON UPDATE 会重建表,文档串里 写明了大库的代价。 - `dialect_helpers.is_update_time_server_default()`:让迁移与测试不必 import 私有标记类。 - 测试守两侧:模型必须继续声明共享默认值(有意用裸默认值的 4 张表登记在 `_PLAIN_DEFAULT_TABLES`),迁移必须只针对声明了它的表、且拼进 ALTER 的标识符 先过形状校验。 - alembic AGENTS.md 补规则一条 + pre-merge checklist 一项。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`AddSourceDropdown` 展开面板上的 `z-[220]` 是它还装在 `CreateChannelDrawer` (Sheet,`z-50`)里时留下的 —— 在 Sheet 内部这个数字被局部层叠上下文关住,无害。 创建频道后来改成独立整页(`ChannelSettingsPage`),Drawer 被删掉,面板成了页面的 直接后代,220 就暴露到根层叠上下文,反过来压过了两个本该盖住它的层: - `useConfirm` 的 AlertDialog(`z-[110]`):公众号链接识别失败弹的「返回修改」 被面板挡住半边,遮罩也只暗了面板以外的区域。 - 门户 tooltip(`Tooltip2` 默认 `z-50`):面板里「公众号链接」那条 hover 引导 (白卡片 + 复制链接示意图,约 294px 高)整块沉到面板底下,只从面板上边缘漏出一条。 改成页面级下拉该有的量级:面板 `z-20`,抓取队列下拉 `z-30`(保持原本在面板之上的 关系),面板内底栏 `z-[221]` → `z-10`(面板自己是层叠上下文,只需压过面板内的兄弟 节点),队列失败项 tooltip 的 `z-[260]` 删掉回落默认 `z-50`(那是为了压过 230 才加的)。 面板处补了注释写明它必须待在 tooltip / 模态层之下 —— 这个值历史上已经被从 100 抬到 220 一次。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`WechatLinkHint` 只有一个 Radix Tooltip 入口,而 Radix Tooltip 在触屏上是够不到的
—— 想打开它的那一下 tap,同时也是关闭它的那一下(Trigger 的 pointerdown 直接
handleClose)。手机和触摸一体机上,这段「点文章右上角『···』→ 复制链接」的引导因此
等于不存在,而它恰恰是"信息源没搜到、只能贴链接"时唯一的自救说明。
- 按输入类型分叉,而不是按视口宽度:有 fine pointer 走原来的 hover Tooltip,
其余一律走 tap 打开的 Popover,卡片内容(引导图 + 说明文案)两端共用一份。
触摸一体机可以很宽、PC 窗口可以很窄,视口宽度判不出这件事。
- 新增 `useFinePointer`,媒体查询与 tailwind 的 `fine-pointer` / `coarse-pointer`
变体同源。`usePrefersMobileLayout` 的注释里本来就写着这类判断要交给专门的 hook,
只是那个 hook 一直没有。
- 触屏的 trigger 换成真正的 `<button>` 并加下划线:没有 hover 态时,一段蓝字没有
任何东西表明它可点。`py-1 -my-1` 只扩触摸热区、不改行框。
- 两处调用点在 H5 断点下解除 `whitespace-nowrap`:整句不换行要 ~520px,手机上会把
可点的那半句推到横向滚动条外面 —— 引导可达之前,得先看得见。
- `Popover` 补 `PopoverArrow` 导出,让两端卡片的箭头一致。
`WechatLinkHint` 顺势拆到自己的文件:AddSourceDropdown 加完这些已经 633 行,
超了 600 行上限;拆完 528 + 109,且新组件只深引 `useLocalize` / `useFinePointer`,
不再经过 `~/hooks` 桶(桶会拖进 ESM-only 的 filenamify,jest 直接加载不了)。
测试守住两种 affordance:fine pointer 下没有 button、coarse pointer 下 tap 能拿到
带引导图与说明的 popover;顺带守 `{{link}}` 占位符还在(丢了就没有 trigger 可点)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
「每人最多建多少个知识空间」此前是硬编码 `_MAX_SPACE_PER_USER = 30`,压在角色配额闸 后面:把 `quota_config.knowledge_space` 调小有效,调大或设 -1 无效,走到 30 照样被 18001 拦。管理后台的角色弹窗也从来没有这一项——只有文件上传、创建频道、加入知识空间三项。 同时配额侧的计数是 `SELECT COUNT(*) FROM knowledge WHERE user_id=?`,没有 type 过滤, 把旧的文档知识库(0)、QA(1) 和工作台上传至今仍在惰性创建的 type=2 私有库全算进了"知识空间" 额度。手上老知识库多的用户,会在「我的知识空间」只有几个的情况下就被判超限。 - 计数改走 ORM(`_count_knowledge_space`):只数 `type=3`。user 维度排除部门空间—— 批量建部门空间时 `user_id` 会被改写成操作人,不排除的话超管建一批就把自己额度打爆, `exclude_department_spaces` 这个开关存在的唯一原因就是它;tenant 维度保留,部门空间 实打实占租户容量。不走 raw 模板是因为 `type` 在 DM8 是保留字,`text()` 无法跨方言加引号。 - `bypass_tenant_filter()` 是必需而非防御:单表 `select(func.count(...))` 会被租户监听器 的 `get_final_froms()` 路径命中(`column_descriptions` 那条对 count 不触发),把调用方 租户 AND 到显式 `tenant_id` 上,令 `_aggregate_root_usage` 跨子租户聚合恒返 0 —— 失败 方向是少算,配额永不触发,属于静默 fail-open。隔离由显式谓词承担,比监听器的 IN-list 更严。 - 闸口收敛成 `_assert_space_creation_quota()`,照 f84eacf 对 18032 的先例用 `get_effective_quota` 而不是 `check_quota`:后者走租户链、在 Root 上按活跃子租户数扇出 COUNT,而这条闸同时挂在 F050 预授权的 6 个 GET 上,其中 `search_departments` / `list_users` 是随搜索框敲键触发的。保留领域错误码 18001,仅去掉 Msg 里写死的 "30"。 - 默认上限 30 → 50。存量角色不需要迁移:`quota_config` 缺该键时按 DEFAULT_ROLE_QUOTA 兜底。 - 管理后台角色弹窗新增该项(默认 50,不加表格列)。配额区抽成 `roleQuotaConfig.ts` 纯函数 + `RoleQuotaFields.tsx` 受控子组件,Roles.tsx 1012 → 873 行并脱离 `@ts-strict-ignore`; 脱掉后暴露的两个真错误一并修了(API 层把 `quota_config` 声明成 `Record<string, number>`, 而里面本就塞着 boolean 的 menu_approval 标志)。 - `buildEditSnapshot` 的 11 个交替 boolean/string 位置参数改成 options 对象:顺序写错照样 过类型检查,只会静默弄坏「未保存」提示,而加一项配额就得改全部 5 个调用点。 - client 侧无需改动:`useEffectiveQuota` 早已把 `knowledge_space` 当一等公民,后端一变即生效。 测试钉住核心回归点(角色配额调到 100 时第 51 个能建)、口径(编译 SQL 断言 type 过滤与 部门空间的按维度取舍)、以及 bypass 存在性——后者一旦被删就是 fail-open,单测抓不到监听器 行为,只能守住"确实进了 bypass"。`test_f017_ac_integration` 的 AC-10 守卫从断模板字符串 改成断编译后的 SQL,没有跟着模板一起删掉。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`KnowledgeSpaceListNotSupportedError`(10992) 随 visible-ids-first 那次重构进来 (`knowledge.py:419` 真的会抛:`/api/v1/knowledge` 只列文档/QA 知识库,传知识空间 类型时显式拒绝,好让超管和普通用户看到同一个错误),但三份 api_errors 都没有文案, `pnpm check-i18n` 因此一直红——它守的正是"后端新错误码必须三语齐备"。 文案按用户能做什么来写,不照搬后端那句面向调用方的 "use the knowledge-space endpoints instead":普通用户看不懂端点,只需要知道该去知识空间页面看。 改的是 SSOT(packages/locales/src/api_errors),产物由 `node scripts/build.mjs` 生成,未手改。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`node_modules/` 带尾斜杠只匹配目录。在 worktree 里把依赖软链到另一个检出 (`ln -s .../node_modules`)时,git 看到的是一个 symlink 文件,规则不匹配, `git add -A` 就会把它当普通文件提交进来——本次开发中已经踩过一次,三条软链 混进了提交,靠 amend 才摘掉。 去掉尾斜杠后两种形态都覆盖。`/node_modules`(仅根层级那条)保持原样,它约束的 是位置而不是类型,与本次问题无关。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
简要描述做了什么改动。
Why
为什么需要这个改动?
How
实现方式、设计决策(如有)。
Test
Related