From 623aa0d3b7fbf202b26326a3ee0b98f066ee4717 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Sep 2026 13:53:33 +0800 Subject: [PATCH] chore(release): v0.2.0 version and changelog Co-Authored-By: Claude Sonnet 5 --- CHANGELOG.md | 59 ++++++++++++++++++++++++++++++++++++ apps/server/deno.json | 2 +- apps/web/package.json | 2 +- deno.json | 2 +- packages/adapters/deno.json | 2 +- packages/agent/deno.json | 2 +- packages/contracts/deno.json | 2 +- packages/db/deno.json | 2 +- packages/domain/deno.json | 2 +- packages/mapping/deno.json | 2 +- packages/tasks/deno.json | 2 +- packages/testkit/deno.json | 2 +- 12 files changed, 70 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d317c8..aa7de542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,65 @@ 版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。所有成员包(`apps/*`、`packages/*`)与根 `deno.json` 使用同一个版本号;`/api/v1/health` 与备份清单里的版本取自 `apps/server/deno.json`。 +## [0.2.0] - 2026-09-28 + +Agent 上游全覆盖与订阅登录、控制台信息架构重排、定时任务看板、全站文案第二轮审校。基线见 `docs/plan/08-v0.2-closeout.md`(W8-A)、`docs/design/{console-ia,pi-providers,agent-ui-reference}.md`、`docs/runbook/{schedules,agent}.md`。 + +### Agent + +- 全局入口:侧栏顶部常驻 Agent 入口(展开与折叠态均带活跃会话数角标);右下角悬浮按钮(带活跃计数、最新状态摘要),在 Agent 会话页与迷你坞展开时隐藏;`Ctrl/Cmd+J` 切换抽屉、`Esc` 关闭,打开即聚焦输入框;抽屉首屏给出随页面变化的快捷目标。 +- Agent 上游:新增 `pi_upstream` 表与 CRUD,一个上游 = 一个 pi provider(41 个内置之一,或 `openai-compatible` 自定义兼容端点,或 `fake`)+ 一份凭证;同一 provider 可建多个上游,各自独立凭证存储;`authKind` 分 `api_key` / `oauth` / `none`;默认上游可指定,`runAgent` 只从上游选模型。 +- 订阅登录:8 种(Anthropic Claude Pro/Max、OpenAI Codex、GitHub Copilot、xAI、Kimi Code、Meta Muse、OpenRouter、Radius),browser 与 device 两种交互,登录会话 15 分钟;条款提示只陈述事实(借用官方客户端身份、可能违反条款、有限流或封号风险)。 +- 设置页 Agent 分区:上游列表、新建向导(选 provider → 凭据与模型 → 登录 / 测试 / 设默认)、编辑抽屉(登录 / 重新登录 / 退出、测试、设默认、删除)。 +- 子会话:`agent.spawn` 派生子会话(独立 agent_run,同一 runAgent 任务),`agent.await` 取子会话状态与脱敏汇报;能力白名单继承父会话并取交集;并发上限 `maxConcurrent`、派生层数上限 `maxDepth`、单会话最多 10 个子会话;预算从父会话划拨;中止父会话递归取消未结束子会话。 +- `agent.await` 落定时挂起会话而不占 worker 槽:`drive` 返回 `suspended`,由 `waitForFact` 每 2 秒查一次子会话落定 / 超时 / 父会话取消,再以 `resumedAwaits` 重开会话续跑;单会话最多挂起 100 次。 +- 没有候选的待识别资源(无法解析,或候选为 0,或查询失败且自动复查已停)开 `identity_unresolved` 待处理事项:可手动指定 TMDB ID、选本地作品或忽略。 +- 旧 `settings.pi.provider / baseUrl / model / thinkingLevel / apiKeySecretRef` 弃用:schema 保留兼容旧数据,`PATCH /settings` 丢弃,设置分区不再展示;`runAgent` 没有上游直接失败并提示「未配置 Agent 上游」。 +- Agent 汇报里的下载链接改指向 `/console/downloads/:id`,不再经 `/console/tasks/:id` 404 探测再跳转。 + +### 控制台信息架构 + +- 侧栏改为 7 组 19 项(概览、资源、订阅、下载、整理、Agent、系统),按业务流程排列;新增"定时任务"入口。 +- 站点工作台合并快照与账号:详情页 4 个页签(整理视图 / 原站视图 / 快照与 Feed / 账号)。 +- 原"下载与任务"拆分为下载队列、下载计划、业务任务三页;订阅页"收录策略"页签独立为收录规则页。 +- 身份判定收口到待处理中心:身份页"待识别"改为只读,已进待处理的行标注跳转,判定动作只在待处理执行。 +- 设置页改为 9 个左侧分区(自动化、站点与账号、下载器、媒体库与目录、媒体服务器、元数据、Agent、API Key、账户与安全),用 URL hash 定位到分区与节;旧 `?tab=` 全部重定向到新分区 hash,`settingsPath()` 直接生成 `#分区[/节]`。 + +### 定时任务看板 + +- `scheduled_job` / `scheduled_job_run` 表驱动全部周期任务,worker(io 组)内唯一调度器按表调度(`pg_try_advisory_lock` 选出执行者);控制台"定时任务"页(`/console/schedules`)查看与调整。 +- 已登记 16 个任务,分 5 组(采集、下载、整理、维护、Agent);Agent 组含 3 个默认关闭的巡检(待处理巡检、下载诊断、订阅与站点周报)。 +- 模块自建计时器全部并入注册表:`pi.token_refresh`(上游登录刷新,维护组,10 分钟)与 `auth.cleanup`(登录会话清理,维护组,1 小时)改为 `registerScheduledJob`,模块里不再有 `setInterval`。 +- 支持立即执行、跳过本次、开关与周期自定义(`customized` 标记,改过之后再登记不覆盖,`PATCH {reset:true}` 恢复默认);自定义巡检可增删,内置任务只能停用。 +- 调度器中断恢复:新执行者拿到锁时,把上一个执行者留下的 `running` 状态改为 `failed`。 + +### 文案与术语 + +- 全站第二轮文案审校:控制台、设置、Agent、服务端消息统一术语表用词(待处理 / 待识别 / 整理记录 / 运行记录 / 凭证 / 子会话 / Agent 上游),精简说明文字、空态、确认按钮与 toast。 +- 内置 Agent 巡检的目标模板改短、改具体。 +- 实例(下载器 / 媒体服务器)CRUD 报错改用可读名词,不再显示表名。 +- 审计日志补 `pi_upstream` / 定时任务 / 持续授权相关动作的显示名。 +- 术语表新增:上游、订阅登录、凭证、定时任务、巡检、运行记录、子会话、停止、持续授权。 + +### 修复 + +- 设置页深链改用分区 hash 定位,不再依赖 `?tab=` 查询参数(旧链接仍可打开,经重定向落到新分区)。 +- Agent 汇报的下载任务链接直接指向下载详情页,不再先探测业务任务详情再判断是否为下载任务。 +- 生产容器静态 ffprobe 升级到 9.0.2;`.gitignore` 忽略 compose override 文件。 + +### 已知限制 + +完整清单见 `docs/plan/08-v0.2-closeout.md`"仍遗留"节。 + +- 41 个 provider 里只有 fake 与 OpenAI 兼容本地端点有自动化覆盖;8 种订阅登录只测了 fake 的 OAuth 状态机;Codex `_randomBytes` 在 Deno 下的行为待 spike(`docs/design/pi-providers.md`)。 +- `agent.spawn {await:true}` 仍在进程内轮询等待,占 worker 槽到超时;要挂起需要和 `agent.await` 相同的关闭会话 + 重放机制,但 spawn 是 replay=never,重放会得到"结果未知",需另行设计。 +- 子会话挂起期间父会话状态保持 `running`(避免被祖先会话的 `agent.await` 当成已落定);运行时长预算按每段 drive 计,不含挂起等待。 +- 查询失败但仍在自动复查期内的资源不开待识别事项,避免 TMDB 抖动刷屏,复查耗尽后才开。 +- 身份页"待识别"详情抽屉的提示句仍写"选择候选或忽略",未识别类(无候选)读起来不准确,留给下一轮文案。 +- 旧 `settings.pi` 字段只是弃用未删除,真正删除需要一次迁移清理里面的旧键。 +- 原站视图仍是占位(IA-1 遗留)。 +- 控制台账户弹层的二次验证(TOTP)开启时只显示密钥与 otpauth 链接,不渲染二维码。 + ## [0.1.0] - 2026-09-28 第一个可用版本:REQ v0.7 的 M0 + M1 纵切。全链路在没有真实 PT 账号的情况下用 mock(RSS / 站点 / TMDB / qBittorrent / Emby)验证。范围与验收依据见 `docs/plan/00-first-version-plan.md` §3.1 和 `docs/plan/04-v0.1-acceptance.md`。 diff --git a/apps/server/deno.json b/apps/server/deno.json index 60f68e11..1943301b 100644 --- a/apps/server/deno.json +++ b/apps/server/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/server", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/main.ts" }, "tasks": { "dev": "deno run -A --watch --env-file=../../.env src/main.ts", diff --git a/apps/web/package.json b/apps/web/package.json index 85775dd1..d024e865 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@umt/web", - "version": "0.1.0", + "version": "0.2.0", "private": true, "type": "module", "scripts": { diff --git a/deno.json b/deno.json index 4314baaa..7a7f87bb 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,5 @@ { - "version": "0.1.0", + "version": "0.2.0", "workspace": [ "./packages/adapters", "./packages/agent", diff --git a/packages/adapters/deno.json b/packages/adapters/deno.json index be377021..25c16a15 100644 --- a/packages/adapters/deno.json +++ b/packages/adapters/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/adapters", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts", "./fsworker": "./src/fs/fsworker.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/agent/deno.json b/packages/agent/deno.json index 881c2b48..5cb6e729 100644 --- a/packages/agent/deno.json +++ b/packages/agent/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/agent", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/contracts/deno.json b/packages/contracts/deno.json index f50d86fd..13d64616 100644 --- a/packages/contracts/deno.json +++ b/packages/contracts/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/contracts", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/db/deno.json b/packages/db/deno.json index 9d39563d..035edbf9 100644 --- a/packages/db/deno.json +++ b/packages/db/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/db", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/domain/deno.json b/packages/domain/deno.json index a89a7c10..af0bc7f3 100644 --- a/packages/domain/deno.json +++ b/packages/domain/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/domain", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/mapping/deno.json b/packages/mapping/deno.json index 40cae034..6b0d7880 100644 --- a/packages/mapping/deno.json +++ b/packages/mapping/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/mapping", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/tasks/deno.json b/packages/tasks/deno.json index 6a5104ac..1c9c04a1 100644 --- a/packages/tasks/deno.json +++ b/packages/tasks/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/tasks", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run", diff --git a/packages/testkit/deno.json b/packages/testkit/deno.json index 59c97e68..cd65156f 100644 --- a/packages/testkit/deno.json +++ b/packages/testkit/deno.json @@ -1,6 +1,6 @@ { "name": "@umt/testkit", - "version": "0.1.0", + "version": "0.2.0", "exports": { ".": "./src/index.ts" }, "tasks": { "test": "deno run -A npm:vitest run",