Skip to content

Releases: 398894496-arch/TDHarness-coding

TDHarness 2026.10.19

Choose a tag to compare

@github-actions github-actions released this 19 Oct 08:08
82c65fc

员工端模型配置坏了会自己修好(no adapter registered for provider "office")

  • TDH 现场:两名员工(从 10-13、10-14 起)每一轮都报 no adapter registered for provider "office",选择器显示 office/grok-4.7 和「没有可用的模型」。另一名员工用同一版客户端、连同一个网关一切正常;其中一人今天重装了最新客户端仍然报错。
  • 原因(本机复现):员工电脑本机的模型配置(desk-home\profiles\web\cordis.patch.yml)里 llm-pi-ai 写进了内核不认的内容,例如模型档位写成 none: none(xAI 新模型 grok-4.3 有 none 档,内核只认 off)。整份配置校验失败,llm-pi-ai 启动不起来,一个路由都注册不了。设置服务只能修改运行中的插件,所以员工端每次启动做的模型同步都被拒绝(异常被吞掉了),自己永远好不了;重装客户端会保留这份配置。
  • 现在 company-shell 启动后会检查公司模型路由。没注册上时:从网关重新取模型列表,把配置文件里的 llm-pi-ai 改成只有 office(xAI 的 none 写成 off: none,其他行原样保留),旧文件存成 cordis.patch.yml.broken-<时间>(最多留 3 份),再对一个正常运行的条目做一次空编辑,让内核按文件重新加载所有插件。不用重启,员工打开就能用。结果记在同目录的 model-heal.log;改完仍然不行时如实记 healed=false,不再做别的改动。
  • 实测(本机工作台连客户真实网关):放进 none: none 后复现出完全相同的报错,选择器也显示 office/grok-4.7;装上修复后启动约 8 秒自动修好,会话标题和回复都正常;正常的工作台重启后不做任何改动。
  • 新增 scripts/prove-model-heal.js(进 CI,两个平台):正常时不动、坏了能修好并保留其他行、修了还不好时如实上报、没模型或没有 llm 服务时不动、备份最多 3 份,管理员「应用」那条路照旧保留其他路由。

TDHarness 2026.10.14

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:23
16e6b3c

生成的图可以「局部修改」:在图上涂出要改的地方,只改那一块

  • 对话里的图片(AI 生成的、员工自己贴的)悬停时右上角出现「局部修改」。点开是标注画布:画笔、框选、橡皮、撤销、清空,写上「改成什么」后点「开始修改」。改完可以按住对比原图、再改一次、在结果上继续改;「保存并放进输入框」把新图存进 artifacts/(<原名>-edit-<时间>.png),同时放进输入框,可以接着让 agent 用它生视频或再改。
  • xAI 的改图接口(/v1/images/edits)没有蒙版参数,只能整张图加一句话改,没涂的地方也可能被改。所以精准只能在画布这边保证:
    • 只把标注区域连同四周一圈留边裁下来送去改(小标注至少 256 像素,留足上下文);
    • 实测 xAI 会把输出对齐到标准比例(送 600×380 回 1280×800,指定 3:2 回 1248×832),所以裁剪框扩到最接近的标准比例并把比例一起传过去,缩回来不变形;图里放不下任何标准比例时(标注几乎占满一张比例少见的图),裁片四周补边凑成标准比例,改完切掉补边,不拉伸;
    • 改回来的裁片按标注以外区域的均值逐通道校正整体色调,再按标注形状向外羽化几像素贴回原图。羽化边以外的像素与原图逐像素相同。
  • 实测(本机工作台连客户服务器的真实网关):9:16 的原图涂掉两栋楼改成宝塔,24 秒;改动像素占整图 2.74%,全部在涂抹区域加羽化边以内,以外的差异像素为 0。另测了去掉水面落叶(17 秒)、补边路径(800×960 整张改雪景,补成 3:4 送出,29 秒)、员工自己贴的图、画布上的每个按钮和快捷键。
  • 裁片用 JPEG 送:PNG 大几倍,员工在外面经中转连回公司时会超过 170 秒的上限(实测 2048 像素的 PNG 裁片经中转失败,同样内容在服务器上直接调 20–38 秒)。最长边超过 1500 像素才要 2k。
  • 服务端是 company-grok-media 新开的两个口:/company/media/region-edit(只收 data: 图片,转给网关 /images,带个人令牌,不认识的比例丢掉)和 /company/media/region-save(只收 PNG,只写会话工作目录的 artifacts/,名字只留字母数字和 - _)。不读、不写工作区以外的路径。
  • 新增 scripts/prove-region-edit.js(进 CI,两个平台):随机 20000 组标注检查裁剪框不出图、盖住标注、送出画布是精确标准比例、裁片在画布内;标注外框、色调校正、文件名;两扇门对着一个假网关:转发内容、各种拒绝(没写说明、不是图片、说明太长、请求超过 30MB、坏 JSON、方法不对)都不会打到网关,网关报错原样转达,保存只落在 artifacts/。打过站点补丁的那份(TDH_REGION_PLUGIN= 指向安装包里的)也跑通。

Grok 令牌续不上期时说清楚原因

  • 现场:服务器重启后出网代理只放行了少数域名,auth.x.ai 被重置,Grok 订阅令牌到期后一直续期失败。员工看到的却是「This server has no Grok key or subscription」,像是没配置。网关也不记续期为什么失败。
  • 现在续期失败会记下原因(GW_XAI_RENEW_FAIL 连不上 auth.x.ai ECONNRESET 或令牌端点的错误码),员工请求 grok 模型时收到 gateway_grok_renew_failed:「Grok 订阅登录已过期,服务器续期没成功(原因)。多半是服务器连不上 x.ai……网络恢复后会自动续上」。生图生视频的门同样带上这句。其他厂商的模型不受影响。
  • scripts/prove-gw-auth.js 加两种情况:令牌端点连不上、令牌端点答 400 invalid_grant。

TDHarness 2026.10.12

Choose a tag to compare

@github-actions github-actions released this 13 Oct 07:29
3ba270b

Windows 登录:电脑上还连着旧的共享盘账号时,不再挂错账号

  • TDH 现场实测:一名员工的电脑在 Windows 里还留着一条用公共账号 dshshare 连服务器的连接(资源管理器浏览服务器时留下的 IPC$ 一类)。他登录时服务器给了个人账号 smb-<login>,个人目录随即只授权给这个账号;客户端用个人账号 net use 时,Windows 因为「同一台服务器只能用一套账号」直接报系统错误 1219,根本没去服务器认证(服务器上这个个人账号的登录记录是空的)。原来的代码不看 net use 的结果,旧连接能打开共享盘根目录就当挂好了,个人目录打不开,员工看到 company-workspace-missing,或者赶上权限刚切换时看到 desk-lease-acquire company-workspace-missing;资源管理器里打开个人目录提示没有权限。
  • 挂盘逻辑移到 server/ShareMount.cs(和 AppHost.cs 一起编进 TDHarness.exe):
    • 挂之前列出本会话里连到这台服务器的所有连接(盘符、IPC$、别的共享),全部拆掉,不再只拆 Z: 和共享盘本身;
    • 看 net use 的退出码和系统错误号。遇到 1219(资源管理器开着窗口会马上连回去)就再拆一次重试,最多 3 次;密码错、账号停用、网络不通不重试;
    • 关掉 net.exe 的标准输入:缺密码时它会停下来等输入,原来要白等 20 秒;
    • 密码不进日志,日志只记 share-netuse try= rc= err= dropped=。
  • 还是没挂上自己的账号时,登录页在原错误码后面补一句能照做的话:1219 提示关掉打开公司盘的窗口、注销 Windows 再登录;其他错误带上 net-<错误号>。错误码本身不变,维护手册里的条目照旧能查。
  • 新增 scripts/prove-share-mount.ps1(进 Windows CI):用服务器同一个 .NET 4 csc 编译 ShareMount.cs;检查中英文 net use 列表和错误号的解析;再用临时共享和两个临时本地账号 A、B 复现现场:先以 A 连着服务器(IPC$ 和一个盘符),旧挂法以 B 挂盘必须报 1219、而共享盘根目录照样能开(旧代码就是因此当成挂好了,证明能复现),新挂法必须 net use 成功、打开 B 的目录、A 的旧连接全部拆掉。测试用的是本机共享,Windows 对本机回环连接按当前用户授权,不按 A,所以「A 打不开 B 的目录」这一步在这里测不了,TDH 服务器上的实际记录已经证明(旧连接在的时候个人账号一次都没认证过);密码错只试一次、报自己的错误号。-ParseOnly 只编译和解析,可在正式服务器上跑。
  • 服务器端无改动,不用重跑安装。发布:在服务器上更新仓库文件后运行 server\publish-site-update.ps1 -BumpMark,员工下次打开时按提示更新。

TDHarness 2026.10.11.12

Choose a tag to compare

@github-actions github-actions released this 12 Oct 02:37
32b6079

Windows 工作台:对话跟人走的几处问题一起修好,desk-lease.js 两个平台合成一份

  • 同步 Mac 上后来加的修复(company-lease-catalog-follows-pin-v1):共享盘慢、本机又没拉到对话时,侧栏目录不再指到本机那份空副本。Windows 原来会这样,员工看到的就是空侧栏。同步后两份 desk-lease.js 逐字节相同,合并为 desk/pack/common/desk-lease.js。
  • 在真实 Windows 上跑 desk-lease 自检,又发现两处只在 Windows 上出问题的代码:
    • 会话日志 zstd 改用 Node 解码。原来改写会话日志里的 cwd、检查日志是否损坏,都调用外部 zstd 命令,Windows 上没有(大多数 Mac 上也没有)。结果是换电脑后,压缩的对话 cwd 没有改到新路径,坏文件也不会被清理。数对话轮数用的是 Node,但只解了第一帧;会话日志是多帧追加写的,所以轮数偏少,比较两份副本哪份更全时会判错,这一点两个平台都受影响。现在按 zstd 帧格式逐帧解码,不再依赖外部命令。用本机 399 个真实会话日志(其中 373 个是多帧)对比 zstd -dc,结果全部一致;截断的文件会报错,不会只返回一部分。
    • Windows 上复制文件没有 cp 命令。共享盘慢时,「把目录和对话镜像到本机」在 Windows 上一次也没成功过。现在改用 Node 子进程复制,保留文件时间,到时限仍可被结束;Mac 照旧用 cp。
  • 自检本身也会碰真实数据,这个问题是这次在 TDH 服务器上跑自检时暴露的:roamRoot 在 Windows 上会改用本机的 D:\dsh\company,自检里有一个用例因此读写了服务器上管理员真实的工作台目录。它把两个工作区和 48 个会话目录的路径改成了临时目录,会话头里的 cwd 也一起改了。
    • 处理:先完整备份,再用工作台的 remap 按管理员记录的真实路径改回。核对结果:文件数前后一致(110);工作区、会话目录、12 个会话日志都已改回原路径,并且都能完整解码。
    • 自检现在把本机公司根目录换成一个不存在的临时路径,只在临时目录里单独验证 Windows 的服务器分支。在服务器上复跑时,自检前后对 D:\dsh\company 的快照完全一致。
  • desk-lease 自检进 CI,Linux 和 Windows 都跑;这也是它第一次在 Windows 上完整通过。

TDHarness 2026.10.11.11

Choose a tag to compare

@github-actions github-actions released this 12 Oct 01:30
6df41d5

工作台剩下的自有部分也进了仓库;去掉安装包里另一家公司的其余痕迹

  • desk/pack/:包根目录里我们自己写的文件也成了源码——启动脚本、共享盘挂载、desk-lease.js(一人一桌、对话跟人走)、自检/修复/更新检查、Mac 登录、公司技能(skills/)、工作台 profile(agent 人设、工具、桌面控制)、Mac preset。分 common/、win/、mac/ 三处,取自模板原文;Windows 脚本保持原来的 CRLF。overlay-zip 把它们和插件一起放进安装包,技能目录整体替换(模板里嵌套的旧副本 skills/skills/ 随之去掉),沿用模板原有的文件权限。

  • 用真实模板逐文件比较:覆盖后与覆盖前相比,插件之外只有下面这些有意改动的文件不同,其余逐字节相同,权限位没有变化。

  • 还在每个站点上的另一家公司的东西,这次都去掉了:

    • 员工 agent 的人设里写着「Company map only: 橙池 / TheDiva」;
    • company-knowledge 技能的触发词里有「橙池, orangecity」;
    • 两个技能里写着维护者本人的「fe1 本机 Obsidian」,还有「分层和老板个人第二大脑一样」;
    • desk-lease.js 的自检用例用维护者的路径和登录名(改成 /Users/x/、emp-alice,两个平台的自检都通过);
    • kernel-watch.js 里还有一处写成分开参数的开发机路径,上一版的检查没抓到,现在也读 TDH_MAINTAINER_REPO;
    • 办公室服务器的主机名写死在两处:desk-lease.js 判断 Mac 是否走 Tailscale 中继,mac-mount-company.sh 判断是否在公司 tailnet 上。这不只是露了名字,在其他站点这两个判断永远不成立。现在按本站地址认服务器:Tailscale IP、MagicDNS 名或主机名(7 个用例);
    • 测试数据里有办公室真实员工的登录名(desk-lease.js 和 server/desk_lease.py 的自检),已换成 alice / bob;
    • 安装程序 TDHarness-Setup.exe 和 TDHarness.exe 的文件属性写着 "The Diva",图标是那家公司的。改为 TDHarness,换了中性的「TDH」图标(server/tdharness.ico)。新建的快捷方式直接用 exe 自带的图标。老安装的快捷方式仍指向 the-diva.ico,所以包里保留这个文件名,内容换成产品图标。安装程序升到 1.0.16。
  • dsh-bridge-browser 其实是 dsh-browser 的 bridge 包(MIT),只加了我们的 ensure-extension.js;已补上它的许可证并注明来源。NOTICE 补上了模板里另外三个第三方组件(dsh-artifact、DSH-better-sidebar、dsh-browser 扩展,均为 MIT)。

  • prove-desk-source.py 现在也检查 desk/pack:

    • 语法:JS 用 node --check,shell 用 bash -n;
    • 两种安装包的覆盖;
    • 站点补丁在源码里命中 17 个文件(原来 5 个)。

    另外对全仓库检查这家公司的名字和品牌,唯一放行的是兼容用的图标文件名。故意加回「橙池」、把 exe 属性改回 "The Diva"、写坏 start.command,检查都会失败。

  • prove-client-boot.sh 补上了发版时的封条步骤和工作台自己的 tree-check,原来少这一步,tree-check 在本地没法通过。实测:用新源码做出的 Mac 安装包解压、准备 home、tree-check 都通过;kernel 试启动页面返回 200,165 个插件全部加载。

  • 每晚的内核 canary 之前一次都没跑成:upstream-canary.yml 的一个步骤名里带了冒号,整个文件 YAML 解析失败。GitHub 不执行它,只在每次 push 时留下一个红叉。已修复,CI 增加「所有 workflow 文件都能解析」这一步。

  • 仍不在仓库里的自有部分:Mac 启动器 TDHarness(编译好的 Swift 程序)。办公室仓库里的两份 Swift 源码都对不上这个二进制,没法证明哪份是它的源码,所以这次不收。

TDHarness 2026.10.11.10

Choose a tag to compare

@github-actions github-actions released this 12 Oct 00:40
600ef14

桌面插件的源码进了仓库

  • desk/plugins/:工作台自己的 11 个插件(company-shell、联网搜索、生图生视频、浏览器桥、桌面控制和几个小修正),都是不用编译的 ES 模块,仓库里的就是员工在跑的。第一次提交原样取自安装包模板;模板里的两个第三方插件(dsh-artifact、DSH-better-sidebar,MIT)没有收进来;更早的历史在维护者的私有仓库里。说明见 desk/README.md。

  • 仓库里的源码现在是正本:装机和每次发版都先用 site-cs.py overlay-zip 把它放进安装包(一个插件在包里有两份,两处都换),写入本站地址,再打站点补丁。以后改插件只要改源码再发版,不用重打 400MB 的模板。

  • 去掉了只属于一家公司的内容。之前每家公司的工作台里都带着维护者自己公司的东西:

    • 侧栏和首页的三个品牌位显示 THE DIVA 的标识;
    • 人员列表打开的一瞬间先显示那家公司的人(后来被真实名单替换);
    • 公司地图里写着那家公司的名字和品牌;
    • 两处别名里有那家公司的登录名;
    • Mac 上的维护按钮写死了某个人的目录。

    现在品牌位改成站点可配置:站点补丁填 SITE_BRAND_* 就显示站点自己的标识,不填则显示文字「TDHarness」。示例名单清空,装机时 site-cs.py 照旧写入本站的种子管理员。公司地图只留产品词。维护按钮改为读 TDH_MAINTAINER_REPO。

  • 新增 scripts/prove-desk-source.py(进 CI)检查四件事:每个文件都能解析;源码里没有任何一家公司的名字、品牌、内网或 Tailscale 地址、维护者路径、登录名或密钥;每个站点补丁在源码里都还找得到锚点,而且重复打不会再改;overlay-zip 换掉了两处的旧文件、写进了站点地址、没有动别的东西。故意加回「THE DIVA」、改坏一个补丁锚点,都会让检查失败。

  • 实测:用这份源码替换插件后的 Mac 安装包在本机试启动通过(页面 200,165 个插件全部加载)。截图确认品牌位显示文字「TDHarness」。第一版用文字代替图片时出现过黑块(原来的样式是用背景色配图片蒙版),已改用单独的标记。

TDHarness 2026.10.11.9

Choose a tag to compare

@github-actions github-actions released this 11 Oct 10:17
1cc366f

全新安装的内核页能用了

  • 之前:服务器本机工作台的内核页(下载、试启动、切换内核)要用 D:\dsh\runtime 里的一套工具,但这些工具只有某个站点当年用一次性脚本放进去过,装机脚本不放。全新安装的服务器上,内核页会提示「服务器缺少 ps-runner.mjs」。
  • 现在:setup-server.ps1 每次运行都把 ps-runner.mjs、win-kernel-plug-lan.ps1、win-kernel-cutover-lan.ps1、kernel-selftest.mjs 和打补丁脚本(放在 runtime\kernel-patch\)更新到仓库里的版本;runtime\dsh-kernel.yml(站点当前用的内核和回滚目标)只在不存在时按 kernel.yml 写一次,之后由内核页维护。
  • 打补丁脚本换成工作台安装包实际在用的完整版:公开仓原来只有编程子集,少了工作台需要的 8 个补丁,包括设置模块的导出兼容、子代理只注册一次、本机网页登录跳过 cookie、模型页顶部的额度栏、填了 DeepSeek 钥匙后按钥匙列出可用模型等。用公开仓的旧版打出来的新内核,试启动会失败。补丁内容里没有密钥、地址或人名。--only 子集照旧,只装内核的路径不受影响。员工电脑上去掉"创作"预设的 strip-creative-preset.ps1 也一起放进来,去掉了里面写死的用户路径。
  • prove-patches.js 跟着补上了新增补丁的目标文件和 0.1.7 之后的预设位置;Markdown 插槽补丁只适用于 0.1.2 到 0.1.6 之前的内核,检查也按这个范围来。
  • 实测(TDH 服务器,用新的打补丁脚本跑内核页的下载流程,不切换):0.2.1-alpha.1 打了 16 个补丁,试启动通过(页面 200,165 个插件全部加载);上游的 0.2.1-alpha.2 补丁打得上,但试启动失败(页面和插件加载不了),内核页会拒绝切换到它。测试用的目录已删除,站点在用的内核没有变。

TDHarness 2026.10.11.8

Choose a tag to compare

@github-actions github-actions released this 11 Oct 09:36
762976d

共享盘权限脚本:上线当天在 TDH 服务器上发现的两个问题

  • (1) 改权限时原来的顺序是先 /reset、再授权、再切断继承,中间有一瞬间目录会继承 D 盘根目录的「登录用户都可修改」。dk 登录触发了一次重写,验证脚本正好在那一瞬间看到 dshshare 能写 runtime。现在改成用 .NET 一次性写入完整的权限列表,没有中间状态,写完再重置子项。(2) 以 SYSTEM 身份运行时(people-api 触发、夜间任务),Get-LocalGroupMember 返回空,runtime 和 brain 上逐个点名的本地管理员被去掉了,服务器上管理员的非提权程序(比如本机工作台的内核页)因此读不到。现在改用 ADSI 获取管理员;获取失败时保留原有的点名,绝不缩减。补的回归防护:CI 增加第 5 步,以 SYSTEM 身份运行一次,结果必须和管理员运行一致(改动为 0);验证脚本增加检查,每个本地管理员都必须在 runtime 和 brain 上被单独点名。TDH 服务器现在 218 项全部通过。

TDHarness 2026.10.11.7

Choose a tag to compare

@github-actions github-actions released this 11 Oct 09:29
c6f8949

第三方第六次复评列了 12 条建议,这一版做了其中 10 条;知识库部分借鉴了 DSH-KRouter 的做法。

守住已经修好的东西

  • CI 的 Windows 任务新增 scripts/prove-secure-folders-ci.ps1。它用临时目录和临时本地账号,按旧版装机的样子逐个文件给 Everyone 授权,先确认证明脚本会报错;然后执行收紧,证明必须通过,再执行一次改动必须为 0;再模拟有人重新加回 Everyone,证明必须再次报错,修复后恢复通过;最后模拟一个人从 dshshare 换成个人账号。以后有人再加一行 icacls /T,CI 会当场拦下。
  • secure-folders.ps1:发现目录上出现 Everyone、Authenticated Users 或 Users 时,连同下面的子项一起重置。之前只在第一次接管时这样做。
  • 共用账号 dshshare 的退场做成了收尾工具,和网关过渡期用的是同一套模式:smb-accounts.ps1 -Status 列出谁还没有个人账号、最近哪些电脑用 dshshare 连过(secure-folders.ps1 每次运行都会记到 runtime\dshshare-seen.json);-Finish 换掉密码并停用这个账号。只要还有人没有个人账号、72 小时内有人用过、或者记录还不满 72 小时,就拒绝收尾。TDH 服务器实测:22 人里 21 人还在用它,4 台电脑在线,-Finish 正确拒绝。
  • 网关只监听本机:gw-transition.ps1 -Finish 收尾时写入 GW_LISTEN=local 并重启网关,此后只监听 127.0.0.1,防火墙关着时局域网也连不上;全新安装在 TLS 就绪时直接这样配置。证明:prove-gw-auth.js 从本机局域网地址去连,必须被拒绝。
  • 新增夜间工作流 upstream-canary:每晚取上游已发布的最新内核(按版本号,不按 latest 标签,因为上游的 latest 落后于最新版),跑一遍打补丁的证明。上游改了锚点会当天报红,不会等到员工更新时才出问题。

安全上的取舍

  • 管理员不会再被人恶意锁死:同一账号 15 分钟失败 30 次就锁的规则,对这个账号 30 天内成功登录过的地址不生效(记录在 runtime\login-known.json);"同一地址"和"账号加地址"这两项限制照旧。局域网里有人从别处反复输错,管理员在自己常用的电脑上照样能登。证明:prove-people.py,去掉这条豁免后测试会失败。
  • 检索结果只当资料:客户端把 company_knowledge 的结果交给模型前先加一句说明,再用起止标记包起来(站点补丁 patch_kb_frame.py,@@kb-frame-v1);夜间提炼的提示词也写明,对话里引用的网页和文件内容只当素材,不照做、不转述其中的指令。

知识库效果

  • 拒答:库里没有的问题返回空结果,不再拿一条弱相关的页面凑数(客户端只有在空结果时才会转去联网搜索)。用通用词表加库内已有的词把问题切成两字词;问题里库中根本没有的具体词,多于首条结果对上的具体词,或者首条结果覆盖不到问题里一半的具体词(三个以上时),就拒答。通用词表来自 jieba(MIT),和 DSH-KRouter 用的同一份(server/kb-lexicon.txt)。
  • 公司自己的同义词:在 _handbook\_company\同义词.txt 里一行写一组,例如 报销 = 核销, 报账。问题会同时用同义词去搜;原词在库里没有、同义词有的时候,只用同义词搜。
  • 新增评测 scripts/prove-kb-recall.js(进 CI):12 页手册,26 个有答案的问题、12 个库里没有答案的问题、1 个要靠同义词的问题。结果:首条正确 26/26,拒答 12/12,同义词命中。在办公室的真实数据上对比新旧两版:13 个正常问题的结果完全不变,原来答偏的「公司年会在哪里办」「咖啡机除垢周期」现在拒答。仍有漏网:「客户要退款怎么处理」这类问题,每个词在库里都有、只是不在同一处,仍会给出弱相关结果。

维护与上手

  • 新增 ARCHITECTURE.md:每个端口对应哪个服务、用哪份代码、监听哪里;服务器上每个文件存什么、谁能读、谁来写;共享盘的权限;应用层的权限;每个证明脚本证明什么。
  • 16 个只在过去某次站点迁移时用过的一次性脚本(land-*.ps1 等)移到 server/legacy/,并说明新安装不会运行它们。
  • 只装内核的 setup.sh / setup.ps1 结束时会明确提示:这里装的只是单机命令行内核,团队版要在 Windows 服务器上运行 setup-all.ps1(对应 issue #32 的误会)。

这次没做的:每晚加密备份(需要先定好备份放在哪台机器、密钥谁保管);把外部贡献者设为评审者(需要仓库所有者决定)。

TDHarness 2026.10.11.6

Choose a tag to compare

@github-actions github-actions released this 11 Oct 08:35
288f9d2

让第一次看到这个仓库的人(和 agent)能判断要不要用它

  • README 首屏:徽章(CI、版本、许可证),一张一览表,「适合谁 / 不适合谁」,成熟度(什么时候开始、几处在用、几位贡献者、CI 跑什么、内核版本和锁定方式),架构图(端口和各服务的关系),和 Open WebUI、LibreChat、Dify、RAGFlow、MaxKB、AnythingLLM 的对照(各自适合什么、可以一起用),已知局限。知识库那一大段挪到 docs/KNOWLEDGE.md。
  • 改正一句不准确的话:之前写「客户端只连这台服务器」,但浏览器操作用的是员工电脑自己的浏览器。现在写的是「模型调用和联网搜索只经过这台服务器」。
  • 新增 SECURITY.md:怎么私下报告漏洞(已打开 GitHub 的私密漏洞报告),保护了什么、怎么保护的,以及不防什么(员工本人、服务器管理员、提示注入、服务器被攻破、没有 SSO)。
  • docs/SERVER.md 新增「升级、备份、卸载」:升级四条命令;要备份的目录各存了什么、丢了会怎样(包括不在 D:\dsh 里的 Caddy TLS 根证书);换新机器怎么恢复。
  • scripts\wipe-tdh-server.ps1 改为默认只列出会删什么,加 -Yes 才真删;顺带删掉两个夜间任务和装机、登录时建的共享盘账号(之前会留下来)。
  • NOTICE.md 写明仓库里的二进制是什么、从哪来:caddy.exe 的版本和 SHA-256,两个客户端模板的 SHA-256、组成和许可证(补上了按 Apache-2.0 要求登记的 OpenCLI),以及模板由维护者构建、桌面插件的历史还不在这个仓库里。
  • 客户端包里的 NOTICE.txt 还是 9 月的旧内容(内核 0.1.1-rc.2、「只连 8450」、CompanyDesk.exe)。新增站点补丁 site-patches/patch_notice_txt.py(@@notice-v2),换成当前的组成、许可证,以及 BUILD.json 的用途说明(构建标识和每个文件的 SHA-256,用于提示更新和启动自检,不含个人信息)。下次发布带上。
  • GitHub 页面:话题去掉 coding-agents、sandbox,加上 self-hosted、on-premise、llm-gateway、knowledge-base 等;关掉空的 Wiki。