Skip to content
dsh.fish
Bundle

dayreel

Dayreel: turn a day of work into a content doc + daily report, then a narrated summary video. Two skills (dayreel-content, dayreel-render) and tools (fetch_today_recap, fetch_session_detail, dayreel_report, dayreel_render, dayreel_status).

Source
peikuo
License
MIT
Updated
Updated 2 days ago

Readme

# dayreel

[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 社区插件:把你一天流经 dsh 的工作轨迹,做成一份设计感日报 + 一段带旁白的总结视频。全 TypeScript/Node 栈,无 Python 依赖。

```sh
dsh plugin add github:peikuo/dayreel
```

装好后在 Web UI 里说「生成今天的日报」即可,详细步骤见[安装](#安装bundle-方式)。按 Harness 的[组合包(bundle)](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.zh.md)规范分发(dsh plugin add github:peikuo/dayreel#<sha> 可锁定版本)。

## 组成

- 两个 runtime skill:
  - `dayreel-content`:调工具收集跨会话事实,写内容文档(工作主线 IR + 当日元数据),并从中确定性渲染出 HTML/Markdown 日报
  - `dayreel-render`:把内容文档确定性投影成 typed 场景,渲染成 mp4,并持续播报进度
- 模型工具:
  - 读日志:`fetch_today_recap`(跨 workspace 当日会话摘要,含按各会话实际模型的费用估算)、`fetch_session_detail`(单会话按日钻取)
  - 产出:`dayreel_report`(日报 HTML+MD,支持 `force` 修订重生成)、`dayreel_render`(异步启动视频渲染)、`dayreel_status`(轮询进度,完成后返回可播放 URL)

数据来源分两层:默认读**折叠表层**(compaction 后的会话摘要,便宜);当摘要缺细节时按需钻取单会话。**会话摘要方案只覆盖今天与昨天**——更早的日期属于日志深挖(Tier 2:时间切片→子代理生成 IR→汇总),数据量和成本都很大,未实现;请求更早的日期会被工具直接拒绝。渲染产物通过同一 `webServer` 以 `/dayreel/*` 路由提供(Range 支持,可拖动进度条)。

GUI 内嵌播放器:客户端半区(随本 bundle 一起加载)为 `dayreel_status` 工具注册了内嵌 `<video>` 播放器卡片,渲染完成后视频直接出现在工具调用行里,无需复制 URL。

## 安装(bundle 方式)

```sh
# 本地路径安装(add 时 pnpm 会运行 prepare,构建 lib/)
dsh plugin --profile demo add ./dayreel

# 从 GitHub 安装(需要构建授权,见下)
dsh plugin --profile demo add github:peikuo/dayreel
```

首次使用会初始化 profile(`@deepseek-ai/dsh-base` 作为第一个组合包)。验证层再启动:

```sh
dsh --profile demo --dump-config   # 应看到 "# == dayreel" 层
dsh --profile demo
```

### 从 GitHub 安装的构建授权

git 安装拉取的是源码,pnpm ≥10 默认拒绝运行 `prepare`。第一次 `add` 失败时,把 pnpm 打印的包键加进该 profile 的 `pnpm-workspace.yaml`:

```yaml
allowBuilds:
  dayreel: true
```

然后重新 `add`。只对源码可信的包授权,并锁定 commit(`github:peikuo/dayreel#<sha>`)。

## 省成本:生成模型选路与记忆

日报的撰写/渲染不需要旗舰模型。`dayreel_author` 工具由插件执行选路(不依赖模型自觉),**菜单就是你环境里配置的 LLM 目录**——运行时经 `ctx.llm` 枚举(`listProviders` × `listModels`,与 Web 模型选择器同源),dayreel 不维护任何路由副本,你增删模型无需改插件配置。插件侧只有两个引用型可选项:

```yaml
- id: dayreel
  name: dayreel
  config:
    fork: true                       # 可选:用 fork 后端(继承当前对话上下文);默认 spawn
    defaultModel: deepseek-v4-flash  # 可选:model id 或 provider/model,排菜单首位+无交互时兜底
```

选路规则:用户口头点名 → `agent` 参数(模型 id 或 provider/model,支持唯一前缀)直接路由;有记住的偏好 → 直接用,零打断;目录里只有一个模型 → 直接用,零打断;否则弹窗两问(选哪个模型 + 是否记住)。选"记住"后偏好写在插件输出目录的 `preferences.json`(存 `{provider, model}` 对;删掉该文件即遗忘)。headless/无交互服务时不弹窗,直接用 `defaultModel`(缺省用目录第一项)并在结果里注明。目录里已不存在的过期偏好会被忽略并重新询问。

`fork: true` 时子代理**继承当前对话的完整历史**(截至上一个完整 turn);spawn 则靠任务内嵌指引 + 自己调 `fetch_today_recap` 收集。两种 in-process 子代理共享本进程组合,都能调用 dayreel 的读取工具。注意:跨模型前缀缓存不会命中,fork 重放历史按目标模型空闲价计费;外部 CLI 子代理(codex 等)调不了这些工具,不做生成后端。GLM 等 OpenAI 兼容路由按 [llm-pi-ai 的接法](https://github.com/deepseek-ai/deepseek-harness)配好后会自动出现在菜单里。

## 使用

在 GUI 里对模型说:「生成今天的总结视频」。预期流程:

1. 模型加载 `dayreel-content` skill → 调 `fetch_today_recap` 拿跨会话当日摘要(当前对话自动排除)→ 需要细节时按需 `fetch_session_detail` → 写内容文档 → `dayreel_report` 出日报(修订/换风格传 `force: true`)
2. 用户要看视频 → 模型加载 `dayreel-render` skill → `dayreel_render`(插件把内容文档确定性投影成场景)
3. 模型循环调用 `dayreel_status` 播报进度(旁白 i/n → Remotion %),直到完成
4. 完成后模型给出可播放 URL(`http://127.0.0.1:<port>/dayreel/<日期>/<序号>/recap.mp4`)和本地路径
5. 用户看完后的反馈(对话中回复)会被插件**被动记录**到 `output/feedback/<jobId>.jsonl`,并据此进入修订模式(`force: true` 重生成)

## 依赖

| 依赖 | 用途 | 说明 |
|---|---|---|
| msedge-tts | 旁白 TTS(纯 Node,微软 Edge 语音,免费免 key) | 包自带依赖,`pnpm install` |
| Remotion + ffmpeg | 渲染视频 | `cd remotion && pnpm install`(ffmpeg 需在 PATH) |

> `assets/bgm/` 的背景音乐由 AI(Gemini)生成,项目持有使用与分发权利,随 bundle 一并提供。

> `remotion/` 渲染子项目的依赖不会随 bundle 安装;在已安装的 checkout 里首次渲染前,需手动 `cd remotion && pnpm install`。

## 开发

```sh
pnpm install        # 安装构建依赖(esbuild)
pnpm run build      # esbuild 打包 src/ → lib/index.js(prepare 也会做)
```

快速迭代可直接用 `--patch` 加载 TS 入口(harness 源码环境支持):

```sh
pnpm dsh web --patch /abs/path/to/dayreel/src/index.ts
```

## 演示(占位数据)

不读任何真实会话,用一份**显式标注「演示占位」**的示例内容文档走完渲染链路(铁律 1/1.5:演示数据必须标注,不得冒充真实日报):

```sh
pnpm run build
pnpm demo                 # 三套版式日报各出一份,打印路径
pnpm demo report newspaper # 单出指定版式
pnpm demo video            # 渲染演示视频(需 cd remotion && pnpm install,ffmpeg 在 PATH;TTS 走网络)
```

示例文档在 `src/demo-doc.ts`:标题与摘要带【演示占位】标注,日期固定 `2000-01-01`(产物与真实日报天然分目录),`test/demo-doc.spec.ts` 守卫标注不被移除。

## 输出示例

产物根目录:已安装进 DSH profile 时为 `$DSH_HOME/dayreel/`(dsh 启动时设置该环境变量);源码 checkout / 演示运行为包内 `output/`(gitignored,已设 `DSH_HOME` 时除外):

```
output/
  2026-08-17/
    01/
      progress.json         ← dayreel_status 轮询的进度文件
      audio/scene-0.mp3     ← 每段旁白的 TTS 音频
      props.json            ← Remotion 渲染参数
      recap.mp4             ← 成品视频(经 /dayreel/* 提供)
```

Install

dsh plugin --profile web add github:peikuo/dayreel

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source