dsh-whalewing 0.2.2-rc.1.1 → 0.2.2-rc.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/COMPATIBILITY.md +1 -1
  2. package/EXTENDING.md +110 -11
  3. package/MAINTAINING.md +5 -3
  4. package/README.md +99 -26
  5. package/client.js +479 -107
  6. package/client.model-world.js +100 -33
  7. package/client.toolbox.js +7 -4
  8. package/content/experts/common.md +3 -0
  9. package/content/experts/manager.md +27 -11
  10. package/content/experts/testing.md +2 -0
  11. package/content/packs/.claude-plugin/marketplace.json +39 -0
  12. package/content/packs/feishu-office/.claude-plugin/plugin.json +20 -0
  13. package/content/packs/feishu-office/.mcp.json +12 -0
  14. package/content/packs/feishu-office/skills/feishu-minutes/SKILL.md +20 -0
  15. package/content/packs/feishu-office/skills/feishu-weekly/SKILL.md +25 -0
  16. package/content/packs/recording-notes/.claude-plugin/plugin.json +7 -0
  17. package/content/packs/recording-notes/.mcp.json +8 -0
  18. package/content/packs/recording-notes/skills/recording-archive/SKILL.md +22 -0
  19. package/content/packs/recording-notes/skills/recording-digest/SKILL.md +37 -0
  20. package/content/packs/trip-planner/.claude-plugin/plugin.json +21 -0
  21. package/content/packs/trip-planner/.mcp.json +17 -0
  22. package/content/packs/trip-planner/skills/trip-plan/SKILL.md +36 -0
  23. package/content/packs/web-search/.claude-plugin/plugin.json +21 -0
  24. package/content/packs/web-search/.mcp.json +13 -0
  25. package/content/packs/web-search/skills/search-tools/SKILL.md +23 -0
  26. package/content/skills/whalewing-knowledge/SKILL.md +4 -1
  27. package/content/skills/whalewing-news/SKILL.md +16 -4
  28. package/content/skills/whalewing-toolbox/SKILL.md +34 -0
  29. package/content/utilities/THIRD_PARTY_NOTICES.txt +1 -1
  30. package/content/utilities/audited-source.json +1 -1
  31. package/content/vault/00-/347/263/273/347/273/237//346/250/241/346/235/277//344/273/273/345/212/241/350/256/260/345/275/225/346/250/241/346/235/277.md +1 -1
  32. package/content/vault/00-/347/263/273/347/273/237//347/237/245/350/257/206/345/272/223/351/246/226/351/241/265.md +1 -0
  33. package/content/vault/00-/347/263/273/347/273/237//350/247/204/345/210/231//347/237/245/350/257/206/345/272/223/344/275/277/347/224/250/350/257/264/346/230/216.md +2 -1
  34. package/content/vault/00-/347/263/273/347/273/237//350/247/204/345/210/231//347/237/245/350/257/206/345/272/223/350/247/204/345/210/231.md +22 -10
  35. package/features/ai-web/catalog.js +41 -5
  36. package/features/ai-web/client-api.js +170 -18
  37. package/features/ai-web/client-presentation.js +18 -4
  38. package/features/ai-web/client.js +80 -3
  39. package/features/ai-web/view.js +178 -22
  40. package/features/assistant/client-api.js +53 -4
  41. package/features/assistant/client-presentation.js +59 -6
  42. package/features/assistant/client.js +86 -12
  43. package/features/assistant/dispatch-strip.js +51 -0
  44. package/features/assistant/dispatch.js +210 -0
  45. package/features/assistant/expert-edit.js +120 -0
  46. package/features/assistant/expert-schedule.js +102 -0
  47. package/features/assistant/handoff-view.js +86 -3
  48. package/features/assistant/handoff.js +25 -11
  49. package/features/assistant/host.js +4 -1
  50. package/features/automation/automation.js +45 -12
  51. package/features/automation/client-api.js +31 -7
  52. package/features/automation/client-presentation.js +31 -8
  53. package/features/automation/client.js +49 -13
  54. package/features/automation/contract.js +18 -6
  55. package/features/automation/extension-tasks.js +308 -0
  56. package/features/automation/host.js +64 -6
  57. package/features/automation/runs.js +3 -3
  58. package/features/cards/client-api.js +13 -1
  59. package/features/cards/client-presentation.js +30 -30
  60. package/features/cards/client.js +213 -108
  61. package/features/cards/contract.js +62 -9
  62. package/features/cards/highlights.js +105 -0
  63. package/features/cards/home-presentation.js +306 -0
  64. package/features/cards/home.js +280 -0
  65. package/features/cards/host.js +29 -1
  66. package/features/cards/library/reading.js +272 -0
  67. package/features/cards/locale/en.json +2 -2
  68. package/features/cards/locale/zh.json +2 -2
  69. package/features/cards/news-evidence.js +11 -5
  70. package/features/cards/news.js +105 -17
  71. package/features/cards/tips-model.js +3 -1
  72. package/features/cards/tips-presentation.js +10 -10
  73. package/features/cards/tips.js +7 -17
  74. package/features/cards/tool.js +6 -2
  75. package/features/cards/usage-tips.js +24 -0
  76. package/features/experts/client-api.js +18 -1
  77. package/features/experts/client-presentation.js +202 -12
  78. package/features/experts/client.js +194 -72
  79. package/features/experts/contract.js +13 -2
  80. package/features/experts/detail.js +92 -0
  81. package/features/experts/entries.js +29 -4
  82. package/features/experts/host.js +90 -6
  83. package/features/experts/memory.js +303 -0
  84. package/features/experts/roster.js +78 -0
  85. package/features/experts/team.js +137 -0
  86. package/features/experts/tool.js +59 -4
  87. package/features/index.js +10 -8
  88. package/features/knowledge/client-presentation.js +261 -30
  89. package/features/knowledge/client.js +490 -153
  90. package/features/knowledge/contract.js +12 -2
  91. package/features/knowledge/graph-settings.js +62 -0
  92. package/features/knowledge/host.js +1 -1
  93. package/features/knowledge/panes.js +125 -0
  94. package/features/knowledge/tool.js +20 -6
  95. package/features/model-world/client-api.js +18 -1
  96. package/features/model-world/client.js +2 -2
  97. package/features/model-world/contract.js +49 -1
  98. package/features/model-world/desk.js +251 -0
  99. package/features/model-world/host.js +33 -1
  100. package/features/model-world/model-world.js +2 -0
  101. package/features/skills/client-api.js +11 -1
  102. package/features/skills/client-presentation.js +76 -16
  103. package/features/skills/client.js +343 -143
  104. package/features/skills/contract.js +96 -3
  105. package/features/skills/host.js +176 -1
  106. package/features/skills/mcp-catalog.js +57 -0
  107. package/features/skills/mcp-views.js +190 -0
  108. package/features/skills/pack-views.js +189 -0
  109. package/features/skills/skill-views.js +270 -0
  110. package/features/skills/tool.js +5 -4
  111. package/features/toolbox/build.mjs +1 -1
  112. package/features/toolbox/client-api.js +87 -0
  113. package/features/toolbox/client.js +12 -5
  114. package/features/toolbox/contract.js +69 -0
  115. package/features/toolbox/guide.js +46 -0
  116. package/features/toolbox/handoff.js +64 -0
  117. package/features/toolbox/host.js +202 -3
  118. package/features/toolbox/jobs.js +221 -0
  119. package/features/toolbox/tool.js +134 -0
  120. package/index.js +76 -10
  121. package/locale/detail.en.md +27 -0
  122. package/locale/detail.zh.md +27 -0
  123. package/locale/en.json +2 -1
  124. package/locale/zh.json +2 -1
  125. package/package.json +4 -3
  126. package/src/extension-sources.js +152 -8
  127. package/src/extension-tasks.js +177 -0
  128. package/src/features.js +6 -2
  129. package/src/graph-canvas.js +204 -49
  130. package/src/graph-forces.js +7 -1
  131. package/src/graph-view.js +124 -0
  132. package/src/identity.js +36 -3
  133. package/src/internal-commands.js +6 -0
  134. package/src/mcp-servers.js +231 -0
  135. package/src/model-world-battle-kits.js +75 -0
  136. package/src/model-world-battle.js +1053 -0
  137. package/src/model-world-mine.js +164 -0
  138. package/src/model-world-pages.js +534 -0
  139. package/src/model-world-persona.js +27 -0
  140. package/src/model-world-probe.js +194 -0
  141. package/src/model-world-roster.js +8 -0
  142. package/src/model-world-style.js +79 -0
  143. package/src/model-world-view.js +31 -255
  144. package/src/news-gate.js +31 -12
  145. package/src/pack-market.js +221 -0
  146. package/src/plugin-packs.js +282 -0
  147. package/src/service.js +119 -3
  148. package/src/shell/clients.js +7 -4
  149. package/src/shell/common-presentation.js +68 -13
  150. package/src/shell/host-bridge.js +4 -0
  151. package/src/shell/index.js +12 -3
  152. package/src/shell/launcher.js +260 -0
  153. package/src/shell/presentation-content.js +10 -0
  154. package/src/shell/theme-presentation.js +39 -4
  155. package/src/shell/ui.js +15 -5
  156. package/src/shell/workbench.js +103 -12
  157. package/src/skill-files.js +33 -0
  158. package/src/skill-market.js +120 -0
  159. package/src/skill-provider.js +6 -1
  160. package/src/skill-scopes.js +67 -0
  161. package/src/skills.js +51 -1
  162. package/src/sortable.js +111 -0
  163. package/src/utilities/README.md +10 -6
  164. package/src/utilities/ai-web-faces.js +18 -0
  165. package/src/utilities/catalog.js +2 -3
  166. package/src/utilities/model-specs.js +60 -0
  167. package/src/utilities/office-tasks.js +3 -2
  168. package/src/utilities/pdf.js +2 -86
  169. package/src/utilities/recipes.js +147 -0
  170. package/src/utilities/views.js +130 -52
  171. package/src/utilities/worker.js +1 -1
  172. package/src/utilities/workshop-exec.js +141 -0
  173. package/src/utilities/workshop.js +571 -0
  174. package/src/vault.js +80 -26
  175. package/src/workbench-contract.js +6 -2
  176. package/content/utilities/NotoSansSC-Regular.otf +0 -0
package/COMPATIBILITY.md CHANGED
@@ -15,7 +15,7 @@ DSH 已内置定时服务,鲸翼的定时任务和每日资讯直接使用它
15
15
  | 专家入口 | 新会话首页没有专家按钮,专家选择在输入框左侧,选好后立即生效 |
16
16
  | 专家专属模型 | 不切换,专家跟随会话当前模型 |
17
17
  | 专家绑定 MCP | 不能单独绑定,专家使用 DSH 里启用的全部 MCP |
18
- | AI 网页 | 在名为「AI 网页」的会话右侧内置浏览器里打开,不铺满工作台;回到 AI 网页页签时同样标“正在用”,“继续使用”回到那个会话里的网页。这个会话不发消息,DSH 侧栏把没发过消息的会话一律显示为“新会话”,切走后也不在侧栏列出 |
18
+ | AI 网页 | 在名为「AI 网页」的会话右侧内置浏览器里打开,不铺满工作台;回到 AI 网页页签时同样标“正在用”,“继续使用”回到那个会话里的网页。这个会话不发消息,DSH 侧栏把没发过消息的会话一律显示为“新会话”,切走后也不在侧栏列出。提问台一次发给几家时,在这个会话右侧依次打开,前两家并排两栏(窗口不够宽时 DSH 自己退回同一栏的标签);“再复制问题”“贴进来”在这个会话开始页“返回鲸翼”旁边 |
19
19
  | 小鲸助手 | 照常对话,引用资料不在侧栏预览 |
20
20
 
21
21
  ## 升级说明
package/EXTENDING.md CHANGED
@@ -36,11 +36,13 @@ export function apply(ctx) {
36
36
  | `id` | 必填,字母开头的小写短横线标识,最长 80 字符;所有扩展之间唯一。内置 id 即使功能关闭也保留,不能占用 |
37
37
  | `api` | 必填整数,当前为 `1` |
38
38
  | `package` | 必填,当前扩展的完整包名,最长 214 字符 |
39
- | `skills` | 可选,最多 100 个技能目录的绝对路径;可用 `fileURLToPath(new URL('./skills/example/', import.meta.url))` 构造。目录可以是一项技能(里面有 `SKILL.md`),也可以是放多项技能的上一级目录(`<目录>/<技能名>/SKILL.md`);DSH 会监听目录变化,扩展往里增删技能不用重新登记。目录写成短文件名、经过联接或符号链接都行,鲸翼按真实路径比较。这些技能在鲸翼技能库的“扩展”一组里只读显示。关闭扩展后退出技能来源,文件不删 |
40
- | `tab` | 可选,仅含 `placement: 'end'`、`keepAlive: true`、`icon`。不需要的字段省略,不传 `false` 或其他扩展字段 |
39
+ | `skills` | 可选,最多 100 个技能目录的绝对路径;可用 `fileURLToPath(new URL('./skills/example/', import.meta.url))` 构造。目录可以是一项技能(里面有 `SKILL.md`),也可以是放多项技能的上一级目录(`<目录>/<技能名>/SKILL.md`);DSH 会监听目录变化,扩展往里增删技能不用重新登记。目录写成短文件名、经过联接或符号链接都行,鲸翼按真实路径比较。这些技能在鲸翼「技能中心」页“我的”里单列一组(组名是扩展登记的来源名,没有就用包名),默认只读;要让维护人在鲸翼里改,再登记[技能来源](#技能来源)。关闭扩展后退出技能来源,文件不删 |
40
+ | `tab` | 可选,仅含 `placement: 'end'`、`keepAlive: true`、`icon`、`group`、`summary`。不需要的字段省略,不传 `false` 或其他扩展字段 |
41
41
  | `tab.icon` | 可选,最多 65536 字符的单色 SVG 字符串,按 16px 蒙版显示并随文字颜色变化,不作为页面 HTML 插入 |
42
+ | `tab.group` | 可选,页签在“全部功能”里放进哪一组:`'work'`(做事)、`'knowledge'`(积累)、`'office'`(办公)、`'news'`(资讯)。不写就单独放在“扩展”一组 |
43
+ | `tab.summary` | 可选,`{ zh, en }`,中文最多 40 字、英文最多 80 字符:“全部功能”里名字下面那句用途,员工搜功能时也按它找 |
42
44
 
43
- `placement: 'end'` 把页签放到靠右组;`keepAlive: true` 在第一次打开后保留已挂载组件,切页签不会卸载。它不保留关闭扩展、关闭工作台或页面刷新后的内存状态。图标与保活信息只在 Host `tab` 中声明,不重复写进插槽选项。
45
+ 页头只放员工钉住的常用页签:扩展的页签装上后先出现在“全部功能”里,员工从那里打开时页头临时多一个页签,员工钉住后才常驻页头;没有让扩展自己上页头的字段。页签第一次出现时鲸翼在右上角提示一次,提示里能直接钉上;员工没打开过的标“新装的”。`placement: 'end'` 把页签放到最右一组并常驻(不能钉也不能取下),只留给所有人都要用的入口,普通功能不要用;`keepAlive: true` 在第一次打开后保留已挂载组件,切页签不会卸载。它不保留关闭扩展、关闭工作台或页面刷新后的内存状态。图标与保活信息只在 Host `tab` 中声明,不重复写进插槽选项。
44
46
 
45
47
  重复或保留 id 抛 `FEATURE_CONFLICT`;不支持的接口版本抛 `FEATURE_API`;非法字段或格式触发输入校验。本行加载失败,原生插件页显示原因,修正扩展后重新启用;不要捕获后伪装登记成功。
46
48
 
@@ -61,9 +63,9 @@ if (result.notes.length) {
61
63
  - 这两个接口只读。写知识应让模型通过 `whalewing_knowledge` 工具,遵守知识库原有规则;不公开知识库或配置写入接口。
62
64
  - 外部插件与其他 DSH 插件处于同一运行环境,这不是权限沙箱。扩展自行声明和管理自己的文件、服务与外部调用,不把内部对象访问当作 v1 能力。
63
65
 
64
- ## Host:专家来源与知识来源
66
+ ## Host:专家来源、知识来源与技能来源
65
67
 
66
- 扩展可以把自己的专家放进“专家团队”、把自己的笔记放进知识搜索,和员工自己的专家、个人知识一起用,界面上标来源名。两个方法都要在 `features.register` 之后、用同一个 `ctx`(或其子插件)调用;每个功能各至多登记一个专家来源、一个知识来源。来源内容只在内存里,鲸翼不另存一份;扩展关闭、卸载、或鲸翼总开关关闭时自动撤销,扩展重开后重新登记即可。没有任何扩展登记来源时,鲸翼的专家列表、知识搜索和阅读结果与没有这两个接口时完全一样。
68
+ 扩展可以把自己的专家放进“专家团队”、把自己的笔记放进知识搜索、让维护人在「技能中心」页改自己的技能,和员工自己的专家、个人知识、个人技能一起用,界面上标来源名。三个方法都要在 `features.register` 之后、用同一个 `ctx`(或其子插件)调用;每个功能各至多登记一个专家来源、一个知识来源、一个技能来源。来源内容只在内存里,鲸翼不另存一份;扩展关闭、卸载、或鲸翼总开关关闭时自动撤销,扩展重开后重新登记即可。没有任何扩展登记来源时,鲸翼的专家列表、知识搜索和阅读结果与没有这两个接口时完全一样。
67
69
 
68
70
  `label` 是来源名,两种语言都要给:`{ zh, en }`,中文最长 24 字、英文最长 40 字,界面按 DSH 当前语言取一份。
69
71
 
@@ -91,27 +93,53 @@ source.dispose(); // 可选:提前撤销;扩展卸载时会自动撤销
91
93
  | `readOnly` | 可选,`true` 时员工只能查看 |
92
94
 
93
95
  一个列表最多 200 位。来源专家不绑定模型和 MCP(那是员工本机的配置),选它开会话时跟随系统默认模型。
94
- - **员工看到的**:卡片上标来源名,排在员工自己的专家后面;能被选来开会话、被小鲸转交任务,模型工具 `whalewing_experts` 也读得到。“…”菜单里:可改的是“编辑专家”,只读的(`readOnly` 或没给 `save`)是“查看专家”;都有“复制为我的专家”,复制出来的是员工自己的普通专家。删除和恢复原版不在鲸翼里做。
96
+ - **员工看到的**:在“专家团队”的专家库里单独一组,组名是来源名,排在员工自己的专家后面;名字旁标来源名,员工“选用”后进左栏的在用专家。能被选来开会话、被小鲸转交任务,模型工具 `whalewing_experts` 也读得到。专家团队页就是这些专家的入口,扩展自己的页面不用再列一遍。中间一栏标题行的“…”菜单里:可改的是“编辑专家”,只读的(`readOnly` 或没给 `save`)是“查看专家”;都有“复制为我的专家”,复制出来的是员工自己的普通专家。删除和恢复原版不在鲸翼里做。
95
97
  - **保存**:员工在编辑抽屉点“保存修改”,鲸翼校验后调 `save({ id, expectedRevision, expert: { name, description, avatar, prompt, skills } }, { signal })`。`id` 是扩展自己的 id;`avatar` 已按鲸翼头像规则规范成 PNG。扩展要自己保存(比如交给服务端),成功后返回保存后的那一条(字段同上,`id` 不变、`revision` 比 `expectedRevision` 大),鲸翼立即用它替换列表里的这一条;之后扩展照常可以再 `set`。保存失败就抛错,带 `code`(大写字母、数字、下划线)时原样交给界面,比如版本对不上抛 `CONFLICT`;没有 `code` 时报 `EXPERT_SOURCE_SAVE`。员工取消或超时时 `signal` 会中止。
96
98
  - **撤销和变化**:来源撤销后它的专家从列表消失;已经选了它的会话再发消息时报 `EXPERT_SOURCE_CLOSED`(来源已关闭),来源还在但列表里没有这一位时报 `EXPERT_DELETED`,和员工删掉专家走同一条提示,不自动换专家。撤销后再调 `set` 报 `FEATURE_CLOSED`;保存途中扩展被关掉,这次结果不采用,报 `EXPERT_SOURCE_CLOSED`。
97
99
 
98
100
  ### 知识来源
99
101
 
100
102
  ```js
101
- const dispose = ctx.whalewing.knowledge.registerSource(ctx, {
103
+ const source = ctx.whalewing.knowledge.registerSource(ctx, {
102
104
  label: { zh: '团队', en: 'Team' },
103
105
  search: async (query, { signal }) => ({ notes: [{ path, title, excerpt, hash }], total, truncated }),
104
- read: async (path, { signal }) => ({ path, content, hash, absolutePath }), // absolutePath 可选
106
+ read: async (path, { signal }) => ({ path, content, hash, absolutePath, editable }), // absolutePath、editable 可选
107
+ // 下面三项可选(0.2.2-rc.1.2 起):
108
+ list: async ({ signal }) => ({ spaces: [{ id, name, group, note, editable, notes: [{ path, title }] }] }),
109
+ save: async ({ path, content, expectedHash }, { signal }) => ({ path, hash }),
110
+ submit: async ({ space, target, from, content }, { signal }) => ({ applied, message }),
105
111
  });
112
+ source(); // 撤销(返回值仍是撤销函数,老写法 `const dispose = …; dispose()` 照旧能用)
113
+ source.changed(); // 知识空间或笔记清单变了(比如同步完),知识积累页重读 list
106
114
  ```
107
115
 
108
116
  - **路径**:扩展用自己的相对路径(正斜杠分隔、以 `.md` 结尾、不带盘符和 `..`,最长 230)。鲸翼里显示和传递的是 `@<功能 id>/<路径>`,个人知识库的路径不会这样开头。
109
117
  - **搜索**:员工在知识页搜索、模型用 `whalewing_knowledge` 搜索时,鲸翼先搜个人知识,再按同一查询问每个知识来源,结果跟在个人结果后面,标来源名、只读。空查询只列个人笔记,不问来源。`search` 返回最多 500 条,`title` 最长 200 字,`excerpt` 最长 2000 字(显示前 240 字),`hash` 最长 128 字;每个来源最多采用知识库“单次结果上限”那么多条。每个来源限时 8 秒;出错、超时或格式不对只在结果里加一条说明(`sourceIssues`,界面右上角提示),个人结果和其它来源照常。
110
- - **阅读**:打开来源笔记时调 `read(path)`,返回的 `path` 必须和请求的一样,`content` 不超过单篇笔记大小上限。阅读区显示正文和属性,标只读;链接不在个人知识的关系里,不解析,也没有反链;来源笔记不进目录树和关系图谱。写入、删除、恢复一律拒收(`EXTENSION_NOTE_READ_ONLY`),按来源笔记打开图谱报 `EXTENSION_NOTE_GRAPH`。`read` 抛错时带 `code` 原样交给界面,否则报 `EXTENSION_NOTE_READ`。
118
+ - **阅读**:打开来源笔记时调 `read(path)`,返回的 `path` 必须和请求的一样,`content` 不超过单篇笔记大小上限。阅读区显示正文和属性,标只读;链接不在个人知识的关系里,不解析,也没有反链;来源笔记不进自己的目录树和关系图谱(给了 `list` 时在知识库切换里单独浏览)。写入、删除、恢复一律拒收(`EXTENSION_NOTE_READ_ONLY`),按来源笔记打开图谱报 `EXTENSION_NOTE_GRAPH`。`read` 抛错时带 `code` 原样交给界面,否则报 `EXTENSION_NOTE_READ`。
111
119
  - **引用给小鲸助手**:员工可以勾选来源笔记提问。来源要在 `read` 里给出本机文件的绝对路径 `absolutePath`(比如扩展的本地缓存),小鲸才能打开原文核对;没有时这篇报 `EXTENSION_NOTE_LOCAL`,请员工取消选择。
112
120
  - **范围**:扩展自己调用的 `ctx.whalewing.knowledge.search/read` 仍然只碰个人知识,读来源笔记报 `EXTENSION_NOTE_PLUGIN`。
121
+ - **知识空间(list)**:给了 `list` 的来源会出现在知识积累页左下角的知识库切换里,员工能像看自己的第二大脑一样一层层展开、打开、勾选后问小鲸。每个空间:`id`(字母、数字、点、下划线、连字符,最长 64,同一来源里不能重复)、`name`(菜单里的名字,最长 60)、可选 `group`(分组标题,最长 40,相邻的同组空间归在一个标题下)、可选 `note`(一行说明,最长 120,比如挂在哪一层)、可选 `editable`(员工能不能维护,要同时给了 `save` 才算数)、`notes`(这个空间里的全部笔记,每篇的路径必须以 `空间id/` 开头,鲸翼按路径里的文件夹排成目录;最多 5000 篇,最多 200 个空间)。菜单按给出的顺序排,所以扩展自己决定先后,比如企业版按组织树从员工所在的那一层往上排。每个来源限时 8 秒,出错、超时或格式不对只在右上角说明,不影响别的来源和自己的知识。鲸翼在打开知识积累、点刷新、扩展登记或撤销、扩展调 `source.changed()` 时重读。
122
+ - **维护(save)**:`read` 返回 `editable: true` 且来源给了 `save` 的笔记,员工在知识积累里能改;在能维护的空间里点“新建笔记”,新笔记也建在这个空间里(路径 `@功能id/空间id/日期 新笔记.md`,员工可以改)。员工点保存时鲸翼调 `save({ path, content, expectedHash }, { signal })`:`path` 是扩展自己的相对路径,`expectedHash` 是员工开始改时读到的 `hash`,新建时是空串。扩展要自己保存(比如交给服务端),成功后返回同一个 `path` 和保存后的 `hash`;鲸翼随后用 `read` 读回,读回的 `hash` 必须和它一样,否则按冲突处理(草稿留着,员工重新读取)。保存失败就抛错,带 `code` 时原样交给界面(比如 `CONFLICT`、`FORBIDDEN`),没有时报 `EXTENSION_NOTE_SAVE`。模型不能改来源笔记;删除和恢复一律不经过鲸翼,报 `EXTENSION_NOTE_READ_ONLY`。
123
+ - **交给团队(submit)**:给了 `submit` 时,员工自己的笔记在“更多操作”里多一项“提交到「来源名」…”,右侧抽屉里选一个知识空间(`list` 列出的那些)、写放到空间里的哪个位置(相对路径,默认是原文件名)。鲸翼读出这篇现在的正文,调 `submit({ space, target, from, content }, { signal })`:`from` 是个人知识库里的路径,只给扩展记录用,扩展拿不到别的个人笔记。返回 `applied`(是不是已经直接放进去了)和可选的 `message`(最长 240,显示在右上角;不给时鲸翼写“已放进团队的知识空间”或“已提交,等负责人审核”)。失败抛错,带 `code` 时原样交给界面,没有时报 `EXTENSION_NOTE_SUBMIT`。个人知识库不会有任何改动。
113
124
  - **撤销**:来源撤销后搜索不再问它,打开它的笔记报 `EXTENSION_SOURCE_CLOSED`;搜索等它回结果时被撤销,结果不采用并加一条说明。
114
125
 
126
+ ### 技能来源
127
+
128
+ ```js
129
+ const source = ctx.whalewing.skills.registerSource(ctx, {
130
+ label: { zh: '团队', en: 'Team' },
131
+ save: async ({ name, content, expectedHash }, { signal }) => {}, // 可选
132
+ });
133
+ source.set([{ name: 'contract-review', editable: true, note: '销售部' }, { name: 'weekly-report', note: '全公司' }]);
134
+ source.dispose(); // 可选:提前撤销;扩展卸载时会自动撤销
135
+ ```
136
+
137
+ - **前提**:`features.register` 时带了 `skills` 技能目录;技能文件照旧放在这些目录里,由 DSH 发现和加载。技能来源只补三样:来源名、保存方法、每项能不能改和挂在哪一层。没带技能目录就登记,报 `EXTENSION_SOURCE_INPUT`。
138
+ - **`set(items)`** 整体替换说明,变了再调一次:`name` 是技能名(1–100 字),`editable: true` 表示员工能改,`note` 是挂在哪一层之类的一句话(1–40 字,显示在“类型”一列,如“团队 · 销售部”);最多 500 项,名字不能重复。没写进列表的技能照常显示、只读。
139
+ - **员工看到的**:技能中心页“我的”里这一组用来源名做组名;能改的状态写“可编辑”,详情抽屉底部有“编辑技能”,打开右侧抽屉改 SKILL.md 正文;其余只读,只有“关闭”。
140
+ - **保存**:员工点“保存修改”,鲸翼先核对他开始改时看到的正文没变(DSH 当前加载的那份,`expectedHash` 是它的 SHA-256),再调 `save({ name, content, expectedHash }, { signal })`。扩展自己保存(比如交给服务端,再更新本机技能目录里的文件);成功就正常返回,鲸翼先把员工保存的正文显示出来,DSH 发现新文件后以文件为准。失败就抛错:带 `code`(大写字母、数字、下划线)时原样交给界面,否则报 `SKILL_SOURCE_SAVE`;正文已在别处改过报 `CONFLICT`。员工取消或超时时 `signal` 会中止。
141
+ - **撤销**:来源撤销后这一组照常显示(技能目录还在),但都变成只读;保存途中扩展被关掉,这次结果不采用,报 `SKILL_SOURCE_CLOSED`。撤销后再调 `set` 报 `FEATURE_CLOSED`。
142
+
115
143
  ### 登记的错误
116
144
 
117
145
  | 错误码 | 什么时候 |
@@ -144,6 +172,76 @@ name.dispose(); // 可选:提前撤销;扩展关闭、卸载或鲸翼
144
172
  | `ASSISTANT_NAME_INPUT` | 名字为空、超过 16 个字、带换行或控制字符、不是字符串 |
145
173
  | `FEATURE_CLOSED` | 撤销后还调 `set` |
146
174
 
175
+ ## Host:定时任务
176
+
177
+ 扩展可以登记自己的定时任务(0.2.2-rc.1.2 起),比如企业版每天把员工前一天的工作内容沉淀进团队知识。鲸翼在 DSH 定时服务里建好、默认打开,员工在鲸翼「定时任务」页能暂停和恢复。和来源一样,要在 `features.register` 之后用同一个 `ctx`(或其子插件)调用:
178
+
179
+ ```js
180
+ const task = ctx.whalewing.schedule.registerTask(ctx, {
181
+ id: 'daily-digest',
182
+ title: '团队沉淀',
183
+ description: '每天把前一天和工作有关的内容沉淀进团队知识', // 可选,给员工看
184
+ daily: { time: '02:00' }, // 北京时间;也可以 weekly: { time: '02:00', weekdays: [1, 3, 5] }
185
+ prompt: '……', // 每次运行交给模型的说明
186
+ readSessions: true, // 可选:允许这个任务按天读员工的对话
187
+ onStatus: status => {}, // 可选:{ state: 'waiting' | 'active' | 'paused', reason? }
188
+ onRun: run => {}, // 可选:{ scheduledAt, deliveredAt, status, reply }
189
+ });
190
+ task.status(); // 现在的状态,和 onStatus 收到的一样
191
+ task.set({ title: '团队沉淀', daily: { time: '03:00' }, prompt: '……', readSessions: true }); // 整体替换,不含 id 和回调
192
+ await task.remove(); // 彻底撤掉(比如员工退出团队):删掉 DSH 里的任务
193
+ task.dispose(); // 可选:只撤销本次登记;扩展关闭、卸载或鲸翼总开关关闭时自动撤销
194
+ ```
195
+
196
+ | 字段 | 要求 |
197
+ | --- | --- |
198
+ | `id` | 必填,小写字母、数字和夹在中间的单个连字符,最长 40;同一扩展里不能重复。鲸翼里记作 `<功能 id>/<id>` |
199
+ | `title` | 必填,一行 1–40 字,定时任务页上的名字 |
200
+ | `description` | 可选,1–240 字,详情里给员工看的说明;模型看不到 |
201
+ | `daily` / `weekly` | 二选一。`time` 是北京时间 24 小时制 `HH:MM`;`weekdays` 是 1(周一)到 7(周日),不重复 |
202
+ | `prompt` | 必填,1–16000 字,每次运行交给模型的说明;员工在页面上看不到 |
203
+ | `readSessions` | 可选,`true` 时任务能按天读员工的对话,见下面[读会话](#读会话) |
204
+ | `onStatus`、`onRun` | 可选函数;回调出错不影响鲸翼 |
205
+
206
+ 一个扩展最多登记 10 个任务。
207
+
208
+ - **建在哪里**:第一次登记时,鲸翼在“鲸翼定时任务”工作区建一个任务会话、认领成这个扩展的任务,再在 DSH 定时服务里建任务、投递到这个会话;每次运行用员工的默认模型,会产生费用。还没配默认模型或定时服务没就绪时状态是 `waiting`,`reason` 写原因,配好后重启 DSH 或员工打开定时任务页时再建。以后每次 DSH 启动扩展照常登记,鲸翼认得是同一个任务,不另建;名字、时间或说明和 DSH 里的不一样时照着改,员工的暂停不动。
209
+ - **员工看到的**:「定时任务」页里这个任务标来源名(同一扩展登记过专家、知识或技能来源时用来源名,没有用包名),详情显示 `description` 和“名字、时间和说明由「来源名」维护”,读会话的任务另写“会读你某时以后的对话,暂停期间的不读”。员工只能暂停、恢复、打开任务会话、看执行记录;不能改名字、时间和说明,扩展开着时也不能取消。
210
+ - **开关告诉扩展**:建好后 `onStatus({ state: 'active' })`,员工暂停、恢复后分别是 `paused`、`active`,只在变了时调用。在 DSH 自己的「自动化任务」里暂停的,下次扩展登记或员工打开定时任务页时才对上,那段时间的对话也不会被扣掉。
211
+ - **运行结果**:每次运行结束后调 `onRun({ scheduledAt, deliveredAt, status, reply })`。`status` 和定时任务页一样:`completed`(完成)、`error`(出错)、`interrupted`(被打断)、`incomplete`(输出写满)、`skipped`(跳过)、`unknown`(读不到结果);`reply` 是模型这次最后说的话,最长 2000 字,没有是空串;`scheduledAt` 读不到时是 `null`。同一次只报一次;扩展关着时跑完或被跳过的,等扩展下次登记后补报。“没东西可传”“失败原因”这类细节,让模型在最后一句话里写清,或者调扩展自己的工具。
212
+ - **扩展关闭或卸载**:登记撤销,但 DSH 里的任务、任务会话和记录都保留——DSH 关机时扩展也会被关闭,鲸翼分不清,删掉会丢掉员工的暂停选择和开机后的补跑。到点时登记它的扩展没打开,鲸翼先等最多 60 秒(DSH 刚启动补投错过的那次时,扩展往往还在加载),等不到就跳过这次,在任务会话里留一句“登记这个任务的扩展没有打开,本次没有运行”,和每日阅读关闭时的每日资讯一样;页面上这个任务写“所属扩展已关闭”,这时员工可以取消它。重新打开扩展后照常运行,不补跑关着的那几次。要彻底撤掉(比如员工退出团队)调 `task.remove()`,卸载扩展前也先调它,否则任务留在页面上等员工取消。鲸翼总开关关闭后运行门也退出,DSH 仍会按时把说明发给模型。
213
+ - **交给服务端**:要让模型把结果交出去,扩展自己往 DSH 注册模型工具,在 `prompt` 里写清怎么用;工具不调原生审批就不弹审批,半夜没人点也能跑完。
214
+
215
+ ### 读会话
216
+
217
+ `readSessions: true` 的任务,模型能用 `whalewing_knowledge` 的三个动作按北京时间一天一天读员工的对话。鲸翼在 `prompt` 后面接一段说明告诉模型怎么读,扩展的说明里不用再写。
218
+
219
+ | 动作 | 做什么 |
220
+ | --- | --- |
221
+ | `day_sources` | 返回还没处理的日子 `pending`(从登记那天到昨天,最早的在前;今天还没过完不算),和某一天(`date`,默认最早没处理的那天)有对话的普通会话;一批最多看 40 个会话,`hasMore` 时带上返回的 `after` 接着列 |
222
+ | `day_read` | 读一个会话 `date` 那天的对话原文(员工和助手说的话,不含工具结果和附件);一页放不下时 `hasMore`,带 `afterSeq: throughSeq` 接着读 |
223
+ | `day_done` | 标记 `date` 那天做完了,只能标最早没处理的那天;标了就不再出现在 `pending` 里 |
224
+
225
+ - 只读得到任务第一次登记以后的对话;员工在鲸翼页面上暂停的那段时间的对话不读。扩展 `remove()` 后再登记,从新登记那一刻算起。
226
+ - 子代理会话、任何定时任务自己的会话(包括这个任务)都不读,只读 DSH 的普通会话。
227
+ - 进度只记在这个任务自己那里,不碰每日记忆的整理进度,也不写个人知识库;三个动作都不弹审批。
228
+ - 一天一篇的写法:说明里写“先用 day_sources 看最早没处理的那天,读完那天的会话写一篇交给服务端,交成功了再 day_done,接着处理下一天”。关机几天也会按天补上。
229
+
230
+ ### 登记和读会话的错误
231
+
232
+ | 错误码 | 什么时候 |
233
+ | --- | --- |
234
+ | `FEATURE_CALLER` | 还没用这个 `ctx` 登记功能就登记任务 |
235
+ | `EXTENSION_TASK_INPUT` | 字段不符合上面的要求;`set` 带了 `id` 或回调 |
236
+ | `EXTENSION_TASK_CONFLICT` | 同一扩展重复登记同一个 `id`(改内容用 `set`),或这个任务正在删除 |
237
+ | `EXTENSION_TASK_LIMIT` | 一个扩展超过 10 个任务 |
238
+ | `FEATURE_CLOSED` | 撤销后还调 `set` 或 `remove` |
239
+ | `SCHEDULE_DISABLED` | `remove` 时鲸翼的定时任务功能或 DSH 定时服务还没就绪,任务没删 |
240
+ | `TASK_SESSIONS` | 不在允许读会话的扩展任务里调 `day_sources`、`day_read`、`day_done` |
241
+ | `EXTENSION_TASK_CLOSED` | 读会话时登记它的扩展没打开 |
242
+ | `TASK_DAY` | 日期格式不对,或不在登记那天到昨天之间 |
243
+ | `TASK_DAY_ORDER` | `day_done` 没按顺序标,或没有还没处理的日子 |
244
+
147
245
  ## 浏览器:登记页签
148
246
 
149
247
  客户端通过 DSH 模块工厂加载,React 从工厂的 `require('react')` 取得,构建时标为 external,不打入另一份 React。模板已给出完整构建入口。
@@ -163,7 +261,7 @@ export function apply(ctx) {
163
261
 
164
262
  Host 的 `inject: ['whalewing']` 是必需依赖,缺席时原生行等待。浏览器不同:顶层入口不要强依赖 `whalewingWorkbench`,在 `apply` 内用不等待返回值的 `ctx.inject` 建立子作用域;所有依赖鲸翼的插槽、监听和服务访问放在该 `scope` 下。服务出现时加载、消失时撤销,再出现时重新加载。DSH 启动检查要求浏览器入口已激活;把顶层入口留在等待会阻断整个页面。`dsh.client.immediately` 只影响预取,不能代替这项生命周期处理。
165
263
 
166
- `id` 必须与有效 Host 登记相同;内置顺序为 10–80,外部建议从 100 起。每个扩展至多提供一个匹配页签;同 id 的原始 slot 重复时,即使 priority 不同也不选取其中一个。Client 提前加载、Host 失败或尚无有效完整登记时,页签不取得工作台操作资格。不要用可填写的 slot `registrant` 充当包身份。列表型插槽只承载 `id/order/label` 等原生字段;不要往里面塞 `keepAlive/placement/icon`。功能可只有 Host 而无页签:鲸翼详情的扩展区仍按登记的包名读取原生标题,并提供「打开」。
264
+ `id` 必须与有效 Host 登记相同;内置顺序为 10–80,外部建议从 100 起。`order` 决定页签在“全部功能”同一组里的先后;钉到页头以后的顺序由员工自己排。每个扩展至多提供一个匹配页签;同 id 的原始 slot 重复时,即使 priority 不同也不选取其中一个。Client 提前加载、Host 失败或尚无有效完整登记时,页签不取得工作台操作资格。不要用可填写的 slot `registrant` 充当包身份。列表型插槽只承载 `id/order/label` 等原生字段;不要往里面塞 `keepAlive/placement/icon/group/summary`。功能可只有 Host 而无页签:鲸翼详情的扩展区仍按登记的包名读取原生标题,并提供「打开」。
167
265
 
168
266
  `MyView` 接收 `active` 和 `workbench`。`active` 为当前页签是否选中,隐藏的保活页签应暂停只在可见时运行的动画或任务。`props.workbench` 在本次有效登记期间是绑定本页签的稳定对象,方法不会误登记到另一个正在显示的页签。特别是 `guardLeave/onRefresh` 只在它上面调用,不在根 `ctx.whalewingWorkbench` 调用。同 id 卸载重开、登记或视图替换、真实连接重建时旧对象失效,旧保活组件被卸载;不要把它缓存到新实例或用旧回调继续操作助手和其它页签。
169
267
 
@@ -176,6 +274,7 @@ Host 的 `inject: ['whalewing']` 是必需依赖,缺席时原生行等待。
176
274
  | `guardLeave(fn)` | 登记离页提示,`fn()` 返回文字或空值;返回撤销函数。它提示但不阻止导航,不是保存或确认机制。需要确认的删除/放弃操作使用 `ConfirmDialog` |
177
275
  | `onRefresh(fn)` | 登记本页签的页头刷新动作,返回撤销函数;没有登记就不显示刷新按钮。刷新实现自行调用 `run`、处理错误,不假定它自动串行执行 |
178
276
  | `openTab(id)` | 打开已有页签;不存在或工作台忙碌时不切换 |
277
+ | `setAttention({ tone, label })` | 在本页签上标一个小点,提醒员工回来看:`tone` 为 `busy`(处理中,蓝)、`done`(做好了,绿)、`failed`(没做成,红),`label` 是读屏和悬停说的话;页签没钉在页头时点标在“全部功能”按钮上。传 `null` 去掉,页签撤下时自动去掉。只在员工不在这一页时用,回来就去掉(2026-11-14 起) |
179
278
  | `manageFeatures()` | 打开 DSH 插件页的鲸翼详情;当前环境无导航服务时无动作 |
180
279
  | `explainError(error, extraGuide?)` | 返回错误说明文字;`extraGuide` 为 `{ [code]: '说明文字' }`,匹配时覆盖通用说明 |
181
280
  | `assistant.open(prompt, { paths }?)` | 打开小鲸助手并带提问、知识库笔记路径;不是直接发模型请求 |
@@ -256,7 +355,7 @@ useEffect(() => {
256
355
  ### 卸载一个独立扩展
257
356
 
258
357
  1. 查询当前 profile、实际包名、来源和原生行;检查有哪些其它插件依赖它。按实际对象操作,不凭显示名模糊删除。
259
- 2. 查明扩展创建的原生计划、外部作业或持久队列。用户选择停止/删除,或明确交接保留;用实际支持的原生接口操作,按原 taskId/sessionId 读回。当前接口没有暂停能力时不虚构暂停,未知结果先查原对象。
358
+ 2. 查明扩展创建的原生计划、外部作业或持久队列。用户选择停止/删除,或明确交接保留;用实际支持的原生接口操作,按原 taskId/sessionId 读回。当前接口没有暂停能力时不虚构暂停,未知结果先查原对象。用 `ctx.whalewing.schedule.registerTask` 登记的任务,卸载前由扩展调 `task.remove()`,否则任务留在定时任务页上、到点跳过,等员工取消。
260
359
  3. 默认保留数据。用户要求清数据时,在业务服务仍可用时按下一节执行;失败保留真实状态,不声称彻底移除。
261
360
  4. 使用 DSH 原生“卸载”或实际 `plugin_manager.remove_bundle`。`stop-profile` 表示需要先停止对应 DSH,再按原生提示通过外部 CLI 处理;`bundle-in-use` 先处理仍在使用它的原生行。其它失败保留原诊断,不直接删 pnpm 或 profile 目录掩盖失败。
262
361
  5. 分别核验安装记录、原生行、Host 登记、Client 页签、技能来源、旧操作范围、计时器/Worker/监听/网络以及持久任务。只看到页签消失不算卸载完成;外部已经接受的副作用不因取消等待自动回滚。
package/MAINTAINING.md CHANGED
@@ -32,7 +32,7 @@ DSH 原生会话 / 插件管理 / 工具审批 / 定时 / 存储
32
32
 
33
33
  - 每项功能自己解释业务请求和结果、身份与恢复、草稿、专属视图、文案和错误。不要把日报期次、模型分页、专家选择或资讯创建规则重新放进共享浏览器层。
34
34
  - `src/shell/host-bridge.js` 只接原生服务和共用机制;会话身份校验、创建回执丢失后的恢复及投影只有一套实现。`src/shell/workbench-session.js` 持工作台会话。组合入口只接线,不建设万能业务 API 或转发兼容壳。
35
- - 跨领域合作使用窄接口:专家目录供助手读取;知识把笔记路径交给助手;助手与 AI 网页共用呈现租约;定时领域持任务身份与待确认记录,Cards 提供创建前纯校验和资讯提交适配器。关闭 Cards 撤销适配器,保留待确认身份;不改用途、不补造另一个会话。
35
+ - 跨领域合作使用窄接口:专家目录供助手读取;知识把笔记路径交给助手;助手与 AI 网页共用呈现租约;AI 网页经知识的客户端读《关于我》和笔记、把员工贴回的回答写进收件箱;定时领域持任务身份与待确认记录,Cards 提供创建前纯校验和资讯提交适配器。关闭 Cards 撤销适配器,保留待确认身份;不改用途、不补造另一个会话。
36
36
  - 输入的纯校验在创建会话等副作用之前完成。已经进入原生写入的操作等待真实结果,再从原身份核验;取消等待不代表未写入。浏览器用户创建和 Cards 默认任务初始化有不同的入口及持久化责任,不因步骤相像而合并。
37
37
  - 共享 UI 组件只持呈现规则;各领域的 `client-presentation.js` 持自己的文案、错误和样式。迁移时核对词条值与 CSS 顺序,不以拆文件改变界面。
38
38
  - AI 网页的 `contract.js` 只持纯请求、结果和存储校验;目录数据、React 视图和浏览器交互分别持有。Host 导入协议时不加载 DOM 或 React。共享知识和技能等已有业务服务不按文件大小强拆。
@@ -58,6 +58,8 @@ AI 的 revision/CAS、头像和容量仍归 AI;Cards 的迁移、receipt、日
58
58
 
59
59
  `dependencies` 是用户安装鲸翼时 pnpm 要下载的全部内容,只放服务端(Host 与 `fork` 启动的子进程)运行时真正 import 的包;浏览器端用的第三方包构建时已打进 `client*.js`,写在 `devDependencies`。构建按实际 import 核对,多写、漏写都拒收;新增 `fork` 子进程入口要登记在 `scripts/build.mjs` 的 `processEntries`。电子书导入用的 PDF.js 由 `node scripts/vendor-pdfjs.mjs` 从开发依赖 `pdfjs-dist` 原样拷进 `features/cards/library/pdfjs`(只拷文字提取用得到的部分,不带原生画布程序 `@napi-rs/canvas`),升级 `pdfjs-dist` 后重新运行并提交,`tests/library-pdfjs.test.mjs` 逐文件核对指纹。
60
60
 
61
+ DSH「插件」页的鲸翼详情最上面显示的介绍不是 README:`locale/zh.json`、`locale/en.json` 的 `meta.detail` 指向 `locale/detail.zh.md`、`locale/detail.en.md`(DSH 按界面语言读 `locale/<语言>.json`,读不到 `meta.detail` 的语言最后用英文那份;都没有才显示整份 README)。路径相对包根目录,文件要随包分发:指向的文件不存在时详情页报错,不会退回 README。文档里的原始 HTML 会被去掉,相对链接只显示成文字,图片限包内的 PNG、JPEG、GIF、WebP、AVIF、SVG。功能有增减或改名时,这两份和 README 一起改。
62
+
61
63
  生成文件包括根 `client.js`、各 `client.*.js`、`cordis.patch.yml` 和内置图标,修改其来源后重建,不手改产物。主入口最后写入只减少观察到半成品的机会,不等于多文件原子发布。
62
64
 
63
65
  入口用原生 `__ModuleLoader__.load({ id, factory })`,分块以相同包 id 和各自 `chunk` 注册同步工厂,通过 `require.async('./client.<功能>.js')` 获取;版本及成功缓存归平台,不自建下载器、跨块 ESM 依赖或永久失败缓存。入口与全部浏览器脚本总字节受既有基线约束;验证冷首屏、首次及重复访问、失败重试、取消与迟到响应,真实页面另核对 Worker 和模型目录。
@@ -96,7 +98,7 @@ li[data-plugin-row="include:whalewing"], section[data-plugin-rows]:has(li[data-p
96
98
 
97
99
  ## 修改与验证
98
100
 
99
- 测试按改动范围分档(2026-10-28 和用户定下):只改一个功能内部的,跑这个功能的单元测试和它那一个功能测试文件就可以提交;改了几个功能共用的部分(外壳、报错翻译、共用控件、功能测试的公共工具、构建)的,提交前全跑一次 `npm test` 和 `npm run test:e2e`;发版前一定全跑,再跑一次 `npm run test:perf`(机器空闲时),在隔离环境实装一次安装包,并请用户在桌面版点一遍重点改动。全跑大约 6 分钟(2026-10-29 在 24 核机器上:单元测试约 1.5 分钟,其中一条要真实等到点、单独就占 1 分钟;功能测试约 4 分钟;性能检查几秒)。
101
+ 测试按改动范围分档(2026-10-28 和用户定下):只改一个功能内部的,跑这个功能的单元测试和它那一个功能测试文件就可以提交;改了几个功能共用的部分(外壳、报错翻译、共用控件、功能测试的公共工具、构建)的,提交前全跑一次 `npm test` 和 `npm run test:e2e`;发版前一定全跑,再跑一次 `npm run test:perf`(不用等机器空闲:员工真用电脑时总开着别的程序,照平常的样子跑、照样要过,2026-11-14 用户定),在隔离环境实装一次安装包,并请用户在桌面版点一遍重点改动。全跑大约 6 分钟(2026-10-29 在 24 核机器上:单元测试约 1.5 分钟,其中一条要真实等到点、单独就占 1 分钟;功能测试约 4 分钟;性能检查几秒)。
100
102
 
101
103
  测试统一由 `scripts/run-tests.mjs` 启动(2026-10-29 和用户定下,别的电脑配置更差也要能跑):
102
104
  - **不卡电脑**:测试进程降到“低于正常”优先级,它开的子进程(测试文件、临时 DSH、无头浏览器)跟着降;单元测试默认只用一半的核,功能测试 8 核以上 2 个文件并行、以下 1 个。`WHALEWING_TEST_CONCURRENCY` 可改并行数。
@@ -127,7 +129,7 @@ npm test
127
129
  1. 确认准确功能、仍在使用的 profile、数据和持久任务。先停止或交接任务并核验原 taskId/sessionId,用户需要清数据时先通过对应业务入口处理。
128
130
  2. 从组成清单核对 Host/Client 静态接线、跨领域接口、导出、files、依赖、分块、Worker、技能、文案样式、资源许可、测试和说明。共享资源仍有消费者时保留。
129
131
  3. 将实现及专属消费者整体移除并重建;旧入口和产物一并退出,不留空转的兼容壳。
130
- 4. Cards 特别注意:关闭时核心 news-gate 会跳过资讯;卸载核心后 gate 也退出,原生持久计划仍可能投递。先核对并处理计划,再决定移除保护和身份解析。
132
+ 4. Cards 特别注意:关闭时核心 news-gate 会跳过资讯;卸载核心后 gate 也退出,原生持久计划仍可能投递。先核对并处理计划,再决定移除保护和身份解析。扩展登记的定时任务同样由这个门在扩展没打开时跳过。
131
133
  5. 验证其余全部功能、原生冷启动、开关、卸载重装、数据处理与公开扩展接口。回滚源码与生成物为同一组合,不覆盖用户其它改动。
132
134
 
133
135
  公开发布前单独确认版本、兼容范围、固定来源、分发文件和许可,验证实际分发产物的安装、启用、冷启动和卸载。`link:` 成功不替代分发包验收,开发回归不等于已经发布。
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "在 DSH 中使用可配置专家、个人知识库与小鲸助手,管理个人技能、定时任务、每日资讯、本地办公工坊与模型世界。"
2
+ description: "鲸翼:DSH 超级个体工作台。小鲸当总管的专家团队、本机知识库、技能与 MCP、定时任务,以及 AI 网页、办公工坊、每日阅读和模型世界。"
3
3
  kind: "package-bundle"
4
4
  ---
5
5
 
@@ -10,69 +10,142 @@ kind: "package-bundle"
10
10
  </picture>
11
11
  </p>
12
12
 
13
- # 鲸翼 DSH 插件
13
+ # 鲸翼 WhaleWing
14
14
 
15
15
  > 鲸翼 · DSH 超级个体工作台 —— 积厚培风,扶摇九万里
16
16
 
17
- DSH 超级个体工作台:选专家直接干活,经验沉淀到个人知识库,常用办公处理在本机完成。
17
+ 鲸翼是 DeepSeek Harness(DSH)的开源插件,在 DSH 里加一个个人工作台:事情交给小鲸和专家去做,做过的事沉淀进自己的知识库,常用的办公处理在这台电脑上完成。模型用你在 DSH 里配好的;知识、技能和配置都存在本机,不上传。
18
18
 
19
19
  名字取自《庄子·逍遥游》:“北冥有鱼,其名为鲲……化而为鸟,其名为鹏。”DSH 是那条鲸,鲸翼给它装上鹏的翅膀。知识沉淀、技能复用、专家团队都是托起翅膀的风:“风之积也不厚,则其负大翼也无力。”标志“鲸尾为翼”的说明见 [art/brand](art/brand/README.md)。
20
20
 
21
21
  ## 功能
22
22
 
23
- | 功能 | 内容 |
24
- |---|---|
25
- | 专家团队 | 10 位内置专家(小鲸助手、产品、设计、研发、测试、运维、数据、研究、写作、运营),另有 10 份专家模板(售前、实施、财务、法务、翻译、课程、视频编导、招聘、学习教练、效率教练)一键添加,也可以导入模板文件或新增自己的专家,配置提示词、模型、技能、MCP 和头像;每位专家都有一份完整的岗位说明(使命、底线、工作流程、交付模板、自检清单);内置专家你改过的部分会保留,没改的部分随插件升级,原版有更新时会提示并可以恢复原版;每位专家默认带上对口的专业技能:鲸翼自写的写作、设计、编码、排查、代码审查、数据分析、调研、视觉物料、汇报演示等,以及收录的 76 项社区开源技能(来自 obra/superpowers、mattpocock/skills、wshobson/agents、phuryn/pm-skills、coreyhaines31/marketingskills、zarazhangrui/frontend-slides、Addy Osmani、Obsidian、ui-ux-pro-max 等) |
26
- | 小鲸助手 | 停靠在页面右侧或悬浮,随时对话;事情该交给专家时,小鲸为那位专家新建任务并把交接说明放进输入框,你看过再发;也能帮你管理鲸翼的功能和扩展 |
27
- | 个人知识 | 你自己的第二大脑,存在本机 Markdown 知识库里:首次使用自动建好目录、规则、笔记模板、关于我等三篇关于自己的笔记和 Obsidian 视图;支持阅读编辑、关系图谱和文风检查,笔记可引用到对话 |
28
- | 技能成长 | 管理系统技能与个人技能,可按来源筛选和查找;和小鲸一起从知识里提炼新技能,来源笔记变了会标“待复核”,技能照常可用 |
29
- | 定时任务 | 每日记忆(每天把对话写成日记和任务记录)、每周思考(每周写周记和“待你决定”)这两个默认打开,还有每日资讯和自建任务,到点自动执行;运行用你在 DSH 配的模型 |
30
- | AI 网页 | 在 DSH 内置浏览器里打开 DeepSeek、豆包、Kimi、ChatGPT 等官方网页,按国内、海外分组,可自行添加;回到鲸翼时标出正在用的那个 |
31
- | 办公工坊 | 44 项本地文件处理:格式转换、PDF、表格、图片(含打码、去水印)、文字、音视频、二维码,文件可以直接拖进来,不上传 |
32
- | 知识卡片 | 本地书架(EPUB、TXT、PDF、MOBI、AZW3、DOCX 等),首页接着读最多两本常看书;每日 AI 使用技巧(可按年月日翻看历史)和每天 08:00 的资讯简报 |
33
- | 模型世界 | 18 家厂商的模型图鉴、发布时间线、实力榜和角色对决;原创立绘可以点开看大图、保存(带水印,不能商用) |
23
+ | 功能 | 做什么 | 类别 |
24
+ |---|---|---|
25
+ | [专家团队](#专家团队和小鲸助手) | 10 位内置专家各管一摊,每位有自己的记忆;可以用模板或自己新建 | 基础 |
26
+ | [小鲸助手](#专家团队和小鲸助手) | 总管:把事派给合适的专家、跟到做完、向你汇报 | 基础 |
27
+ | [知识积累](#知识积累) | 你自己的第二大脑:本机 Markdown 知识库、关系图谱、每日记忆和每周思考 | 基础 |
28
+ | [技能中心](#技能中心) | 管专家能用的技能、MCP 和插件包,随包带 94 项技能 | 基础 |
29
+ | [定时任务](#定时任务) | 到点自动做的事,可以交给某位专家 | 基础 |
30
+ | [AI 网页](#ai-网页) | 按要做的事找 AI 网站,一个问题带着背景发给几家,回答存回知识库 | 可选 |
31
+ | [办公工坊](#办公工坊) | 文件交给小鲸,在本机处理,44 项功能项 | 可选 |
32
+ | [每日阅读](#每日阅读) | 每天一期:今日资讯、今日一招、接着读和回顾;能存进收件箱、能划线 | 可选 |
33
+ | [模型世界](#模型世界) | 自己的模型成绩和花费、实力榜、角色图鉴、对决和模型测智 | 可选 |
34
34
 
35
- 界面跟随 DSH 的浅色、深色主题和你装的皮肤(例如皮肤中心的半透明主题),鲸翼不自己铺底色,只在卡片边缘加一些水纹、回纹之类的小点缀。
35
+ 四项可选功能默认开启,可以在 DSH「插件」页的鲸翼详情里单独关闭;关闭后数据保留,重新开启继续使用。
36
+
37
+ ### 专家团队和小鲸助手
38
+
39
+ - **小鲸当总管**:大多数时候只需要跟小鲸说话。小事它自己做;专业的活找到合适的专家派过去,你批准后专家马上开工,派工卡片上看得到正在做、在等你审批还是做完了,小鲸核对交付后向你汇报。没有合适的专家、又是长期要做的事,小鲸提议新建一位,你同意后由它来建。
40
+ - **10 位内置专家**:小鲸助手、产品、设计、研发、测试、运维、数据、研究、写作、运营。每位有一份完整的岗位说明(使命、底线、工作流程、交付模板、自检清单)和默认绑定的专业技能。
41
+ - **自己的专家**:10 份模板(售前、实施、财务、法务、翻译、课程、视频编导、招聘、学习教练、效率教练)一键添加,也可以导入模板文件或新建,配置提示词、模型、技能、MCP 和头像。内置专家你改过的部分保留,没改的部分随插件升级;原版有更新时会提示,可以恢复原版。
42
+ - **专家记忆**:每位专家一篇记忆笔记,记你定下的规矩和手上的进度,存在知识库里,可以直接改;开工时还会带上《关于我》里你写的“我是谁”“怎样和我协作”。
43
+ - **专家团队页**:左边是在用的专家,中间是选中那位的任务对话(可以切换任务、就地开新任务)或专家库,小鲸可以停靠在右侧。能查找、筛选,点名字看专家的概况、记忆和定时任务。
44
+ - **小鲸在哪都能用**:平时是右下角一个气泡,点开后悬浮或停靠;重开 DSH 后对话接着上次。小鲸也能帮你管理鲸翼的功能和扩展。
45
+ - **随包技能**:每位专家默认带上对口的专业技能,包括鲸翼自写的写作、设计、编码、排查、代码审查、数据分析、调研、视觉物料、汇报演示等,以及收录的 76 项社区开源技能(来自 obra/superpowers、mattpocock/skills、wshobson/agents、phuryn/pm-skills、coreyhaines31/marketingskills、zarazhangrui/frontend-slides、Addy Osmani、Obsidian、ui-ux-pro-max 等)。
46
+
47
+ ### 知识积累
48
+
49
+ - **第二大脑**:一个存在本机的 Markdown 知识库。首次使用自动建好目录、规则、笔记模板、《关于我》等三篇关于自己的笔记和 Obsidian 视图。
50
+ - **阅读和编辑**:左栏找文件和搜索,中间用页签打开笔记,右栏看目录、反链、出链、标签、属性和局部图谱;`Ctrl O` 快速切换到任意一篇。
51
+ - **关系图谱**:画出全部笔记之间的联系,可以设置显示哪些、按层上色、样子和排布,还能按建立日期播放“看它长出来”。
52
+ - **自动积累**:每日记忆把当天的对话写成日记和任务记录,每周思考写周记和“待你决定”(见[定时任务](#定时任务))。笔记可以引用到和小鲸的对话里,也带文风检查。
53
+ - **团队知识**:装了提供团队知识的扩展(比如鲸翼企业版)时,左下角能切换到团队的知识空间,自己的笔记能提交到团队。
54
+
55
+ ### 技能中心
56
+
57
+ 技能、MCP、插件包三类,各有「我的」和「发现」两面。
58
+
59
+ - **技能**:「我的」按个人、共用、团队、插件包、内置和各项目分类;可以新建、上传、编辑,改系统技能另存为个人修改、随时恢复原件。「发现」接 skills.sh,预览后安装。
60
+ - **MCP**:在鲸翼里填表添加,用 DSH 自带的 MCP 客户端连接,密钥存进 DSH 的凭据库。「发现」里有 22 个核对过的常用 MCP(地图出行、办公协作、文档知识、录音会议、搜索资料、浏览器与图表、开发设计),配置预填好,只需填密钥,每个都写了推荐给哪几位专家用(所有专家和小鲸都能用,不用绑)。
61
+ - **插件包**:照 Claude 插件包格式,一个包装一组技能和 MCP,一次装好,一起停用和卸载。随鲸翼带 4 个精选包(录音进第二大脑、出行规划、飞书办公、联网搜索),也可以上传 `.zip` 或添加 GitHub 上的插件包市场。
62
+
63
+ ### 定时任务
64
+
65
+ - **每日记忆**(每天 01:00)和**每周思考**(每周一 07:00)默认打开;每日阅读开启时还有每天 08:00 的**每日资讯**。
66
+ - **自建任务**:填名称、工作指令和时间规则(一次、每隔一段时间、每天、每周或 cron),可以交给某位专家,运行时带上这位专家的岗位说明、技能和记忆。
67
+ - 每个任务看得到下次时间、上次结果和执行记录,可以暂停和恢复。运行用你在 DSH 配的模型;关机时不执行,开机后补最近一次。
68
+
69
+ ### AI 网页
36
70
 
37
- AI 网页、办公工坊、知识卡片、模型世界是可选功能,默认开启,可以在 DSH「插件」页的鲸翼详情里单独关闭;关闭后数据保留,重新开启继续使用。
71
+ - **按事找**:选“写东西、查资料、读长文、做 PPT、画图、做视频、写代码”,只列拿手这件事的 AI 网站。内置 15 个入口(聊天 10 个,画图、视频、搜索、读资料的单项工具 5 个),可以自己添加。
72
+ - **提问台**:问题写一次,带上《关于我》和最多 5 篇笔记,发给最多 4 家;内容放进剪贴板后依次打开,窗口够宽时前两家并排。鲸翼不替你在网页里输入或发送。
73
+ - **带回来**:在网页里复制要留的回答,点“贴进来”存进知识积累的收件箱,记上问的什么、哪家答的。
74
+
75
+ ### 办公工坊
76
+
77
+ - 把文件拖进来、粘贴截图,或者把文件夹路径贴进输入框读出来勾选,说要什么结果,交给小鲸:小鲸挑功能项、填好设置,文件在这台电脑上处理,不上传、不覆盖原件。步骤列出来可以点开看,做过的步骤能自己调整后重做。
78
+ - 44 项功能项分 7 类:格式转换、PDF 处理、表格处理、图片处理、文字处理、音视频、二维码;知道要用哪一项时,在“全部功能项”里自己点;窗口能收起到页头,切到别的页签照常做完,做好了会提示。
79
+ - 做好的事记在“最近做过”里,换个文件就能照原样再做一遍,直接交给功能项,不经过小鲸。
80
+ - 在和小鲸的对话里说要处理文件,会转到办公工坊来做,对话里发的附件一起带过来。
81
+
82
+ ### 每日阅读
83
+
84
+ 首页每天一期,一屏看完:左边今日资讯,右边今日一招、接着读、回顾。
85
+
86
+ - **今日资讯**:每天 08:00 一期,头条一条加快讯几条,每条一行标题配一条一手来源链接;关注的领域和订阅来源可以自己改。阅读设置里开着“按我的情况来挑”时,模型会读知识积累里的《关于我》,把和你有关的排前面;周一多一页上周回顾。
87
+ - **存一条**:资讯和技巧都能存进知识积累的收件箱,存的时候写一句为什么存。
88
+ - **今日一招**:每天一条能照着做的 AI 使用技巧,可以“让小鲸试一下”(放进小鲸的输入框,自己发),也可以按年月日翻看往期;旁边每天一条鲸翼自己的用法。
89
+ - **接着读**:导入 EPUB、TXT、PDF、MOBI、AZW3、DOCX 等格式的书,只存在本机;首页接着读最多两本常看书。读书时选中一句话就能划线,还能写一句自己的话(记进知识积累里这本书的来源笔记,原文不进知识库)。
90
+ - **回顾**:划过的线在第 1、7、30 天各回到首页一次。
91
+
92
+ ### 模型世界
93
+
94
+ - **我的模型**:读 DSH 里配好的模型,对上评测成绩和官网价,按天记用量、估算花费;可以开个对话试用,或确认后设成 DSH 的默认模型。
95
+ - **实力榜、新模型**:按综合实力和分项排序筛选,按月看新发布的型号;任意几个模型可以放在一起比。
96
+ - **角色图鉴和对决**:19 位原创立绘角色,可以点开看大图、保存(带水印,不能商用);对决里每位按自己的职业出招,胜负只看综合实力。
97
+ - **模型测智**:用社区常用的六道题测自己配的模型,每次现换题面并带口令,提示可能的预制答案和掺水。
98
+
99
+ ### 页头和全部功能
100
+
101
+ 页头只放钉住的常用页签,默认是专家团队、知识积累、技能中心、定时任务、办公工坊,模型世界固定在最右。其余功能在“全部功能”里,按做事、积累、办公、资讯分组,可以钉到页头或取下、调整顺序;按 `Ctrl K`(苹果电脑 `Command K`)用名字或用途搜索后直接打开。打开一个没钉住的功能,页头临时多一个虚线框的页签,可以直接钉住或关掉。窗口变窄时放不下的页签收进“更多”。钉了哪些、怎么排记在这台电脑上。扩展装上后先出现在“全部功能”里,不占页头。
102
+
103
+ 界面跟随 DSH 的浅色、深色主题和你装的皮肤(例如皮肤中心的半透明主题),鲸翼不自己铺底色,只在卡片边缘加一些水纹、回纹之类的小点缀。
38
104
 
39
105
  ## 安装
40
106
 
41
- 当前版本 0.2.2-rc.1.1(预发布,还在打磨,适配 DSH `0.2.2-rc.1`)。版本号去掉最后一段就是适配的 DSH 版本,最后一段是鲸翼自己的更新序号:`0.2.1-rc.5.1` 就是适配 DSH `0.2.1-rc.5` 的第 1 版;换 DSH 版本时从 1 重新数,所以最后一段是 1 的版本,都是适配官方最新 DSH 的那一版。
107
+ 当前版本 0.2.2-rc.1.3(预发布,还在打磨,适配 DSH `0.2.2-rc.1`)。版本号去掉最后一段就是适配的 DSH 版本,最后一段是鲸翼自己的更新序号:`0.2.1-rc.5.1` 就是适配 DSH `0.2.1-rc.5` 的第 1 版;换 DSH 版本时从 1 重新数,所以最后一段是 1 的版本,都是适配官方最新 DSH 的那一版。
42
108
 
43
109
  在 DSH 里打开「插件 → 添加插件」,填:
44
110
 
45
111
  ```text
46
- dsh-whalewing@0.2.2-rc.1.1
112
+ dsh-whalewing@0.2.2-rc.1.3
47
113
  ```
48
114
 
49
115
  DSH 从 npm 下载安装,不用连 GitHub;官方源连不上会自动换国内镜像,也可以在安装窗口里选“中国大陆镜像源”。安装窗口右侧的「安装源」如果显示的是公司或学校的内网源,DSH 只问这一个源、不会自动换;内网源没有同步鲸翼时会报“无法连接插件源”,把「安装源」改成“中国大陆镜像源”或“npm 官方源”再装。`@` 后面的版本号要带上:只填 `dsh-whalewing` 时,新版本发布满一天才会被选中。
50
116
 
51
117
  装不上时有两个备用办法,装上的插件完全一样:
52
118
 
53
- - **安装包**:从 [Releases](https://github.com/gwen-liu/whalewing/releases) 下载 `dsh-whalewing-0.2.2-rc.1.1.tgz`,在「添加插件」里填这个文件在本机的绝对路径。
54
- - **GitHub 地址**:填 `github:gwen-liu/whalewing#v0.2.2-rc.1.1`,`#` 后面是版本标签,换成别的标签或提交即可装对应版本;不带 `#` 会装开发主线上的最新代码,不保证稳定。这种方式要先连上 GitHub、再下载整个源码包,DSH 连 GitHub 超过 5 秒就判失败,国内网络下常常装不上。
119
+ - **安装包**:从 [Releases](https://github.com/gwen-liu/whalewing/releases) 下载 `dsh-whalewing-0.2.2-rc.1.3.tgz`,在「添加插件」里填这个文件在本机的绝对路径。
120
+ - **GitHub 地址**:填 `github:gwen-liu/whalewing#v0.2.2-rc.1.3`,`#` 后面是版本标签,换成别的标签或提交即可装对应版本;不带 `#` 会装开发主线上的最新代码,不保证稳定。这种方式要先连上 GitHub、再下载整个源码包,DSH 连 GitHub 超过 5 秒就判失败,国内网络下常常装不上。
55
121
 
56
- `0.2.2-rc.1.1` 需要 DSH `0.2.2-rc.1`;用别的 DSH 版本的,到 [Releases](https://github.com/gwen-liu/whalewing/releases) 选版本号以那个 DSH 版本开头的最新一版(`0.2.1-rc.3.2` 之前的版本没有发到 npm,用安装包或 GitHub 地址安装)。DSH 只认插件声明的版本,升级 DSH 后旧版鲸翼不会加载,在「插件」页显示为 `dsh-whalewing`、标着“异常”,旧版的检查更新也用不了。已经装了鲸翼的,在「添加插件」里填新版本的安装包地址(如 `https://registry.npmmirror.com/dsh-whalewing/-/dsh-whalewing-0.2.2-rc.1.1.tgz`)原地换新版,不用卸载,数据和设置都在,重启 DSH 后生效。原版 DSH 即可使用,与定制版的个别体验差异和从旧版升级的方法见[兼容与升级](COMPATIBILITY.md)。
122
+ `0.2.2-rc.1.3` 需要 DSH `0.2.2-rc.1`;用别的 DSH 版本的,到 [Releases](https://github.com/gwen-liu/whalewing/releases) 选版本号以那个 DSH 版本开头的最新一版(`0.2.1-rc.3.2` 之前的版本没有发到 npm,用安装包或 GitHub 地址安装)。DSH 只认插件声明的版本,升级 DSH 后旧版鲸翼不会加载,在「插件」页显示为 `dsh-whalewing`、标着“异常”,旧版的检查更新也用不了。已经装了鲸翼的,在「添加插件」里填新版本的安装包地址(如 `https://registry.npmmirror.com/dsh-whalewing/-/dsh-whalewing-0.2.2-rc.1.3.tgz`)原地换新版,不用卸载,数据和设置都在,重启 DSH 后生效。原版 DSH 即可使用,与定制版的个别体验差异和从旧版升级的方法见[兼容与升级](COMPATIBILITY.md)。
57
123
 
58
- **更新**:`0.2.1-rc.5.4` 起,在 DSH「插件」→ 鲸翼的详情页(或鲸翼页头的“…”)点“检查更新”:已是最新就什么都不改;有新版本会弹出确认,点“更新”原地装好,不用卸载,数据和设置都在,重启 DSH 后生效。DSH 0.2.2 起,按包名装的鲸翼在详情页上方还有 DSH 自己的「版本」区块,它只把正式版当作可更新,鲸翼的版本都算预发布,不会提示鲸翼有新版本,请用鲸翼的“检查更新”。更早的版本可以在「添加插件」里填新版本的安装包地址(如 `https://registry.npmmirror.com/dsh-whalewing/-/dsh-whalewing-0.2.2-rc.1.1.tgz`)原地更新;只填包名会被 DSH 拦下、要求先卸载。
124
+ **更新**:`0.2.1-rc.5.4` 起,在 DSH「插件」→ 鲸翼的详情页(或鲸翼页头的“…”)点“检查更新”:已是最新就什么都不改;有新版本会弹出确认,点“更新”原地装好,不用卸载,数据和设置都在,重启 DSH 后生效。DSH 0.2.2 起,按包名装的鲸翼在详情页上方还有 DSH 自己的「版本」区块,它只把正式版当作可更新,鲸翼的版本都算预发布,不会提示鲸翼有新版本,请用鲸翼的“检查更新”。更早的版本可以在「添加插件」里填新版本的安装包地址(如 `https://registry.npmmirror.com/dsh-whalewing/-/dsh-whalewing-0.2.2-rc.1.3.tgz`)原地更新;只填包名会被 DSH 拦下、要求先卸载。
59
125
 
60
126
  ## 扩展
61
127
 
62
- 可以给鲸翼开发自己的扩展(依赖鲸翼的独立组合包),不需要改鲸翼源码:从[起步模板](examples/feature-starter/README.md)或[保存状态模板](examples/stateful-feature/README.md)开始,接口和安装、卸载流程见 [EXTENDING.md](EXTENDING.md)。
128
+ 可以给鲸翼开发自己的扩展(依赖鲸翼的独立组合包),不需要改鲸翼源码:从[起步模板](examples/feature-starter/README.md)或[保存状态模板](examples/stateful-feature/README.md)开始,接口和安装、卸载流程见 [EXTENDING.md](EXTENDING.md)。扩展可以加自己的功能页,也可以向专家团队、知识积累、技能中心和定时任务提供专家、知识、技能和任务。
63
129
 
64
130
  ## 数据存放
65
131
 
66
132
  | 内容 | 位置 |
67
133
  |---|---|
68
134
  | 个人知识库 | 插件配置 `vaultRoot`;Windows 默认在 DSH 安装目录同级的 `whalewing-vault` |
69
- | 专家配置、技能、定时任务 | DSH 当前 profile 的存储 |
135
+ | 专家记忆 | 个人知识库里的 `00-系统/专家记忆/`,一位专家一篇,可以直接改、删 |
136
+ | 专家配置、定时任务、派工记录、MCP 定义 | DSH 当前 profile 的存储 |
137
+ | 技能、插件包 | 用户目录 `~/.dsh/skills`;系统技能和插件包在其中的 `.system/whalewing` |
138
+ | MCP 密钥 | DSH 的凭据文件 `~/.dsh/.credentials.yaml`,鲸翼不另存 |
70
139
  | AI 网页入口、每日资讯 | profile 目录下 `whalewing-ai-web`、`whalewing-news` |
71
140
  | 书架 | profile 目录下 `whalewing-library`;只存导入或下载的书的阅读副本,不上传 |
72
141
  | 定时任务执行目录 | DSH 数据目录下 `whalewing-tasks`(侧栏“鲸翼定时任务”) |
142
+ | 办公工坊的会话目录 | DSH 数据目录下 `whalewing-toolbox`(侧栏“鲸翼办公工坊”);处理结果在你点“保存”后才写进你选的文件夹 |
73
143
  | 模型数据快照 | profile 目录下 `cache/whalewing-model-world`;点「更新数据」才联网获取 |
144
+ | 模型用量账本、手动对应、测智记录 | profile 目录下 `whalewing-model-world`;只在本机,不上传 |
145
+
146
+ 停用、升级或替换插件都不会删除这些数据。插件升级时知识库的规则和模板换成新版,你改过的原件另存在知识库的 `.whalewing/replaced/` 下;笔记不动。
74
147
 
75
- 停用、升级或替换插件都不会删除这些数据;插件升级时,知识库里你改过的规则和模板保持原样,笔记不动。
148
+ 联网的只有你主动触发或已启用的动作:模型对话、资讯订阅抓取、模型数据更新、AI 网页、技能市场和插件包市场、MCP 连接、在线书目下载、检查更新。
76
149
 
77
150
  ## 模型世界的数据
78
151
 
@@ -82,7 +155,7 @@ DSH 从 npm 下载安装,不用连 GitHub;官方源连不上会自动换国
82
155
 
83
156
  ## 使用限制
84
157
 
85
- 办公工坊在浏览器里本地处理:单文件 25 MB、总量 100 MB、PDF 200 页、音视频 30 分钟以内;扫描件 PDF 不做文字识别。Word 转 PDF 和 PDF 水印只内置常用简繁体字,生僻字显示为方框,结果里会列出来。
158
+ 办公工坊在浏览器里本地处理:单文件 25 MB、总量 100 MB、PDF 200 页、音视频 30 分钟以内;扫描件 PDF 不做文字识别。小鲸默认只看文件名、大小、页数和表头,你要求时才读内容。Office 转 PDF 用 DSH 自带的转换;PDF 水印只内置常用简繁体字,含生僻字时处理前提示换字。保存用 DSH 自带的另存为(网页版是下载)。
86
159
 
87
160
  ## 开发
88
161