Skip to content
dsh.fish
Bundle

@dsh-portable/interactive-learning

Interactive Learning mode and native learning activities for DeepSeek Harness

Source
wsnxxxs
stars
1 stars
License
MIT
Updated
Updated 5 days ago

Readme

# DeepSeek Harness Interactive Learning

[English](README.en.md)

`@dsh-portable/interactive-learning` 为 DeepSeek Harness 增加一个由用户显式选择的
`learning` Agent preset。Standard、Code、Minimal 与 Cordis 的工具 schema 和
standing prompt 保持不变。

## 架构

- 包根提供 `learningActivities` Host broker,并为 `learning/state` 注册严格校验所需的
  session event 类型。必须在恢复持久化 session 之前导入 bootstrap;它不注册任何模型可见工具。
- `./agent` 只由 Learning preset 挂载,初始模型目录包含紧凑的
  `learning_visual_select`、静默的 `learning_state_update` 和可选的
  `learning_checkpoint_select`。standing policy 只来自
  一个规范 TypeScript 源,不再由 Skill 复制维护。
- preset 同时保留附件续读、Skill 加载和 `web_search`。Web 搜索为当前或争议主题提供
  有来源的解释,但不会因此加入 shell、编辑或自动化工具。
- `./client` 在对话流中原位渲染 visual 与可选 checkpoint;state update 明确为空
  视图。V1/V2 活动和 V3 visual 仍保留只读回放。
- `./protocol` 维护封闭、版本化的声明式协议。
- `preset/learning/skills/interactive-teaching` 按需提供更细的教学判断。

普通对话仍是默认路径。图表是普通回答里的可操作插图,不会接管用户回合。唯一的
主动等待是 reflective pause:只有当学习者的回答会改变下一教学动作时,才使用兼容
旧协议命名的 checkpoint 工具,并在一次结果后结束。

## Learn intent 与首轮路由

系统先区分“建立理解”和普通任务,再选择首轮形状。`what is X`、裸概念名、ELI5/初学者
请求、持续混淆或生疏、先修知识与学习路径,以及 quiz/flashcards/study guide 请求都属于
learn intent;编码实现/调试、直接计算、个人排障、翻译改写、新闻或事实查询、资源推荐和
观点判断留在普通任务路径。当前或有争议主题在用户要结构化理解时仍属于 learn intent,
并会先通过 Web 搜索取得来源。裸概念先做一次改变路线的校准;定义、明确的混淆和清晰目标
直接讲最小必要概念,明确请求的学习资料则直接生成。

学习片段开启后,短回答、继续困惑、压力表达和追问会继承当前片段,不再被当作新的
首轮请求重新分类。明确切换任务/主题、reset、完成或结束性确认会关闭片段并恢复普通
路由。刷新或进程恢复后,只要持久状态中仍有未完成目标,即使进程内 route cache 已清空,
短回答仍会继续原学习片段。

## 非阻塞学习流程

1. 助手先用普通文本解释真正缺失的概念。
2. 只有当操控参数确实能帮助理解时,才调用一次 `learning_visual`,传入安全的
   声明式图表。selector 选定的教学目的及 learner action/question 会进入下一步的
   kind-specific 工具说明,不会在选择后丢失。
3. 参数流式传输期间,工具调用所在位置显示正在准备的视觉标题,而不是一句笼统的
   等待提示。
4. 校验后立刻返回 `visual-result@4`。不会创建 lesson token、pending question、
   提交按钮、Reveal 调用或五分钟用户等待。结果区分 `ready` 与 `unavailable`:
   当前组合若没有 Learning Client,视觉不会渲染,助手改用普通文字讲清同一件事,
   并且不会提到学习者看不到的图;未渲染的视觉也不会被记成一次已发生的教学动作。
5. 图表在工具调用所在位置渲染;会话刷新或结果回放后仍可操作。
6. 助手继续解释关键现象,并在有必要时用普通文本问一个自然问题;学习者下一回合
   直接通过正常输入框回答。

这条链路移除了旧 Question → Reveal 双工具结构。旧结构会天然重复轮次,并让模型
回合在等待用户期间一直处于运行状态。周围文字仍须自洽,因此 Client 无法渲染时
只会失去增强图,而不会卡住模型或用户。

## Session-scoped LearnerState

Learning 只为当前 session 保存一份小型、暂定的教学状态:当前目标、已展示的先验、
误解或缺口、由 learner evidence 推导的支架需求、急迫/真正卡住的证据、评估语境、
带表示方式和失败原因的有界 failed-move 历史,以及独立完成(含新情境迁移)的证据。
learner evidence 可以是 `correct`、`partial`、`incorrect` 或未知;partial 不会被当成掌握。

生产链路是显式且可审计的:

1. 普通 learner message 仍进入正常会话。只有具体观察会实质改变下一教学动作时,
   模型才可调用内部 `learning_state_update`,不能机械地每轮调用。
2. visual 完成与 checkpoint 终态只写入 Host 能确定观察到的事实。仅“提交”只证明发生
   了 learner action,绝不自动代表正确、独立、取得进展或掌握。
3. 每次有效更新都会把去除 session identity 的严格完整快照追加为
   `learning/state` 事件。宿主必须在恢复 session 之前导入 bootstrap,确保事件类型已
   注册;刷新和 resume 之后仍会正常 fold 和校验快照。
4. 每个后续 model step 前,动态 prompt context 都会重新 fold 持久事件,并生成
   100–300 token 的有界 tentative summary。

快照不携带 session id。刷新和 resume 会 fold 同一日志;fork 会把继承快照重新绑定
到新 identity,之后各自独立变化。Reset 追加清空后的新 revision,因此旧异步结果
不能复活之前的状态;dispose 只清理进程内 fold cache。这不是跨会话用户画像、人格或
“学习风格”分类,也不是长期掌握度。普通消息中的自称掌握不会自动变成证据;但当学习者
明确纠正这项暂定状态时,`correct` 会尊重其 `mastery` 修正并保留用户纠正来源。低置信度
证据可以帮助选择支架,但不能自动提升 mastery;只有置信度足够、正确且独立的 learner
evidence 才可以。中等及以上置信度、正确且独立的完整解释或实现
尝试可以结束当前教学片段,但 mastery 仍保持 `emerging`;自动推断时只有明确的新情境
迁移证据才可提升为 `transfer`。如果学习者只是明确要求停止被提问,纠正时将 `phase` 和
`nextMove` 设为 `complete` 即可,不要伪造 transfer 证据。

## Session 内学习路线

多数学习片段不需要路线:一个概念、一次直接回答或一处纠正本身就是完整的。只有当
目标确实跨越几个互相依赖的步骤时(多章节材料、有真实先修的过程、学习者自己提出
的多部分目标),才会记录一条路线。

路线随 LearnerState 存活于当前 session,同样是可修订的假设而不是契约:

- 最多 6 个步骤,状态只有 `pending`、`active`、`evidenced`,任何时刻至多一个
  `active`。
- 步骤只能由学习者产生的证据推进,不能因为"讲过了"就标记完成。
- 修订路线会保留同一步骤 id 上已经取得的 `evidenced`,不会抹掉已证明的进展。
- 注入模型的上下文只包含目标和当前这一步,不列出整张清单——路线因此无法被当成
  待办事项逐条推进。
- 已展示迁移,或中等及以上置信度的完整解释/实现尝试,即结束该学习片段,无论路线还剩几步;
  未走完的路线永远不是继续的理由。
- reset 会连同路线一起清空。

## 可选 Reflective Pause(兼容 checkpoint protocol v1)

`dsh-learning/checkpoint@1` 只用于会实质改变下一教学动作的预测、解释、对比、设计选择、
调试诊断、边界情况或迁移应用。它不是默认输入路径,也不能变成每轮 Continue 仪式。

- 每个 session 最多一个 pending checkpoint;每个 model step 最多一个不同 checkpoint。
- 五种封闭类型为 `free_text`、`single_choice`、`numeric`、`prediction` 和
  `code_slot`。单选结果传稳定 option id,label 只负责展示。
- 卡片标题显示这次要求的认知动作(预测、解释、对比、迁移或尝试),而不是“检查点”这类内部机制标签——标准策略本就禁止把普通回合标注成机制名称。
- pending payload 只能包含当前 prompt、context、expected evidence、无答案 options
  和自洽 fallback;正确答案、评分 rubric、solution 与未来步骤都会被拒绝。
- 终态保持 `submitted`、`skipped`、`cancelled`。新的非提交结果还会区分学习者主动
  skip/cancel 与 Client 不可用、timeout、Host/provider failure;旧的无 reason v1
  receipt 仍可读取。刷新恢复同一 wait 和 draft;call 与 receipt 重放幂等,冲突复用
  则 fail closed。
- Skip、Cancel、timeout、renderer failure 或无 rich Client 都会恢复普通对话;不会再
  产生 Reveal、animation、Continue 或第二次等待。

## 语义 Visual Protocol v4

`dsh-learning/visual@4` 会先按概念语义选择可信的原生渲染器:

- `plot`:函数、数据、概率、柱形以及其他定量关系;
- `node_link`:神经网络层、树、流程、因果关系与连接拓扑;
- `scene_2d`:几何、向量、力与带标注的空间示意;
- `relation`:对比、矩阵、分类以及集合关系;
- `timeline`:历史事件、发现过程、阶段和年代;
- `formula_steps`:公式推导、代数变换与逐步证明;
- `study_map`:带章节/页码锚点、先修关系和概念角色的参考材料导览;
- `recall_deck`:带提示和揭示的主动回忆卡片;揭示及 mastered/review
  操作会保留本地回放状态,并在 Host 桥接可用时记录为当前会话内、未验证的学习者观察。
  重置卡组只清除本地标记,不会删除 Host 观察记录;
- `data_table`:可排序、筛选、选择、标记异常并与小型图表联动的类型化记录;
- `state_transition`:带当前状态、触发事件、条件和动作的状态变化;
- `sequence_buffer`:离散槽位、索引、指针、范围及逐步快照;
- `sequence_diagram`:参与者生命线之间按顺序发生的同步、异步和返回消息;
- `code_trace`:代码行、变量、调用栈、输出与循环迭代的声明式回放;
- `field_2d`:标量热力、等高线和向量场;
- `causal_loop`:带正负影响、延迟以及增强环/调节环的反馈系统。

任一类型都可加入仅聚焦已声明 id 的本地步骤序列。交互只用于探索,不会接管普通
对话输入框。渲染器提供可见标题、键盘可访问的对象检查、响应式布局、结构化文字
替代和局部错误边界。`state_transition`、`sequence_buffer` 与 `code_trace` 还可以
携带紧凑的专属步骤快照,让状态、指针、变量和调用栈真正随步骤变化。

`plot` 支持可选的有界滑块、静态散点、折线、柱、计算曲线、稳定坐标轴及参数指标;
当“改变参数”不是教学目标时不会强行加入滑块。单纯回忆公式应直接给公式;用户要求
网络结构时则必须显示节点和真实连线,不能再用一条曲线或 Markdown 字符画代替。

当用户附带整份文档、PDF、讲义或多份材料时,系统先保留真实章节与页码/标题锚点,
按需要用 `study_map` 给出可导航总览,再逐个概念选用更具体的视觉组件。不会把整份
材料压成一张巨型关系图,也不会未经请求就机械转换成卡片。

曲线使用封闭的递归数学 AST。叶节点为 `constant`、`variable`;二元运算为 `add`、
`sub`、`mul`、`div`、`pow`、`min`、`max`;一元运算包含三角函数 `sin`、`cos`、
`tan`、`atan`,激活函数 `relu`、`leaky_relu`、`step`、数值稳定的 `sigmoid`,
概率函数 `normpdf`,以及基础函数 `neg`、`abs`、`sqrt`、`exp`、`log`、`floor`、
`ceil`。`leaky_relu` 的负半轴斜率固定为 0.01,`step` 在零点切换,`normpdf`
表示标准正态密度;其他均值和标准差可用算术节点组合。曲线可引用 `x` 与已声明参数;指标只能引用
参数,不能引用 `x`。

模型 schema 与运行时 parser 共享相同的表达式深度限制。未知字段、未声明变量、
非有限数值、无效引用、过大载荷和非法范围都会被拒绝。模型提供的 HTML、Markdown
图、SVG 标记或 JavaScript 永远不会执行。

通过 schema 校验的载荷一定会渲染成对应图形,不会退化成 Markdown、描述文字或
错误框。如果某条曲线在声明的坐标范围内没有任何取值(例如负数域上的 `log`、
`sqrt`,或整条曲线落在 y 轴范围之外),图表仍然照常绘制,并在空白处说明当前
坐标范围内没有可显示的数值,同时在图例中标出该系列,而不是留给学习者一个看
起来坏掉的空框。

V3 参数图与 V1/V2 活动仅为历史回放保留,Learning preset 不再向模型暴露它们的
旧工具。历史工具结果若失败,会明确显示错误和文字降级内容,不再伪装成一张灰色的
“已完成”活动。

## 设计系统与可访问性

所有学习界面共用一套设计令牌,声明在 `src/client/tokens.module.css` 的
`[data-learning-scope]` 上。两个 CSS Module 会被编译成各自独立的 `<style>`
标签,无法通过 class 共享样式,因此共享值以自定义属性的形式继承下去;每个根
组件通过 `learningScope` 加上该属性即可加入同一套标准。

令牌覆盖字号阶、间距阶、圆角、层级阴影、控件尺寸、动效时长,以及唯一的主色、
语义色板与焦点环。两份样式表因此不再出现裸字号、裸圆角或直接引用的主机别名。
每个主机别名在令牌层内都带降级值,主题若缺少某个别名,界面会退化为可用颜色而
不是失效声明。

视觉渲染器面向键盘与辅助技术:

- 一张图形只占一个 Tab 停靠点。`node_link` 最多可声明 48 个节点与 160 条连线,
  `scene_2d` 最多 64 个图元;进入图形后用方向键在图元间移动,Home / End 跳到
  首尾,Enter 或 Space 选中。
- 图表探针的读数写入 `aria-live` 区域,键盘探查因此会被朗读;按 Escape 清除。
- 图形的可访问名称只是一句摘要,完整的结构化文字替代作为可读内容存在,便于逐
  条浏览而不是被当成一长串名称念出。
- 焦点环、动效时长与减弱动效偏好都由令牌层统一提供。

## 开发与验证

真实桌面/Web 运行时通过 package exports 读取 `lib`,因此源码修改后必须重新构建并
完整重启:

```powershell
pnpm install
pnpm run build
pnpm test
pnpm run check
pnpm run test:package:purity
pnpm run test:package
pnpm run pack:check
git diff --check
```

浏览器 fixture 直接读取源码组件,适合快速视觉检查:

```powershell
pnpm exec vite --config tests/browser/vite.config.mjs
```

打开 `http://127.0.0.1:41739/`。它覆盖 visual 回放,以及 checkpoint 的提交、跳过、
取消、刷新草稿和 session 隔离;但仍只是组件验收页,不能替代真实打包桌面 smoke,
页面自带的测试输入框也不能证明真实 Host composer 的生命周期。

无凭证离线教学评估使用手写 rubric fixture,只验证 grader 与协议不变量;它不是
“模型已经会教学”的真实行为证据:

```powershell
pnpm run eval
```

退役的 V2 Question → Reveal → animation → Continue 时序只保留为明确命名的
`gradeLegacyV2ReplayTranscript` 只读历史回放审计。默认 V4.1 eval 不会调用它,
也不会把双门时序当作当前教学成功标准。

`tests/model-canary.mts` 是单独标注、可选的真实模型 smoke,只验证一次非阻塞 visual
调用;它不是多轮教学质量结论,并需要 `DSH_CANARY_API_KEY`。真实模型结果必须保留
provenance,不能与 fixture 结果混报。

包级验证会构建产物、扫描已发布 JS/map 是否泄漏 checkout 或盘符绝对路径、创建真实
tarball、安装到干净临时 consumer、解析 Host/Agent/Client exports,并验证托管 preset
生命周期:

```powershell
pnpm run test:package:purity
pnpm run test:package
```

仓库提交了可直接安装的 `lib/` 构建产物。源码修改后必须重新构建并完整重启应用;
发布前还应运行正常 Windows 打包流程,不要使用 `--skip-build`。

## 安装

仓库当前为私有仓库,需要先让 Git 能访问它:

```powershell
gh auth setup-git
dsh plugin --profile web add git+https://github.com/wsnxxxs/deepseek-harness-interactive-learning.git
```

安装学习 preset:

```powershell
& "$env:USERPROFILE\.dsh\profiles\web\node_modules\.bin\dsh-learning-preset.cmd" install
```

在构造 Loader、agent loop 或恢复任何 configured session 之前,先导入 bootstrap:

```ts
import '@dsh-portable/interactive-learning/bootstrap'
```

重启 DeepSeek Harness,在新会话中选择“学习模式”。如果设置了 `DSH_HOME`,上面的路径
应改为 `$env:DSH_HOME\profiles\web\node_modules\.bin\dsh-learning-preset.cmd`。

## 更新和卸载

更新插件后,再运行一次 preset 安装命令即可同步内置内容;安装器会保留用户已经修改的
preset 文件。

卸载前先切换到其他模式,然后执行:

```powershell
& "$env:USERPROFILE\.dsh\profiles\web\node_modules\.bin\dsh-learning-preset.cmd" uninstall
dsh plugin --profile web remove @dsh-portable/interactive-learning
```

完成后重启 DeepSeek Harness。

## 兼容性

独立包面向当前 DeepSeek Harness kernel `0.1.0-rc.7`,开发依赖与 portable 集成使用同一
版本族。仓库自身的 Host 组成、Client 打包器和 `cordis.patch.yml` 仍按独立安装包目录布局维护。

暂不包含:任意可执行 widget、跨会话掌握度、间隔复习、知识图谱、LMS 适配,以及静默采集
滑块状态。如果精确参数值对下一步教学重要,应让学习者在普通回答里描述或引用它们。

## 许可证

MIT

Install

dsh plugin --profile web add github:wsnxxxs/deepseek-harness-interactive-learning

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