@morlay/dsh-session-mode 0.0.1-alpha.4
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.
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/cordis.patch.yml +69 -0
- package/dist/client.cjs +1008 -0
- package/dist/client.d.cts +210 -0
- package/dist/client.d.mts +210 -0
- package/dist/index.d.cts +129 -0
- package/dist/index.d.mts +129 -0
- package/dist/index.mjs +368 -0
- package/dist/shared-ChCbbJa8.mjs +14 -0
- package/dist/shared-FNWe-_rS.d.cts +106 -0
- package/dist/shared-FNWe-_rS.d.mts +106 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +108 -0
- package/src/client/ModelDefaultsCard.styles.ts +134 -0
- package/src/client/ModelDefaultsCard.tsx +233 -0
- package/src/client/SessionModeLabel.module.css +24 -0
- package/src/client/SessionModeLabel.tsx +44 -0
- package/src/client/SessionModeSeat.module.css +74 -0
- package/src/client/SessionModeSeat.tsx +109 -0
- package/src/client/api.ts +45 -0
- package/src/client/index.ts +142 -0
- package/src/client/locales.ts +88 -0
- package/src/client/model-defaults-card-controller.ts +408 -0
- package/src/client/use-roster.ts +30 -0
- package/src/index.ts +425 -0
- package/src/modes.ts +184 -0
- package/src/persona.ts +44 -0
- package/src/shared.ts +36 -0
- package/tool/modes.ts +85 -0
- package/tool/patch.ts +91 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 morlay
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# @morlay/dsh-session-mode
|
|
2
|
+
|
|
3
|
+
会话模式:`coding` 与 `chat` 各是**一份数据**——一段提示词(persona)、一组能力开关与一个**角色**
|
|
4
|
+
(`role`:谁可以用它);各模式的**默认模型**是同一份 config 顶层的 `models`。本包把它按会话应用到会话自己的
|
|
5
|
+
作用域上,并提供页面上的选择面(会话里的切换 chip 与设置页那张卡片)。**模式不是 Cordis 子树**:官方 agent preset 那一整套在装配层被
|
|
6
|
+
关掉,禁哪些行归 [`@morlay/dsh-profile`](../dsh-profile/README.md)(真源 `tool/patch.ts` 的 `PATCH_ROWS`),
|
|
7
|
+
本包不复述清单。
|
|
8
|
+
|
|
9
|
+
`cordis.patch.yml` 是这里唯一装配的东西:两行。
|
|
10
|
+
|
|
11
|
+
| 行 | 是什么 |
|
|
12
|
+
| ------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `session-mode` | 模式清单、默认模式与各模式的默认模型(`config.modes` / `config.default` / `config.models`)+ 按会话应用 persona + 清单与切换的 HTTP 路由 |
|
|
14
|
+
| `context-assembler-scope` | [`@morlay/dsh-context-assembler/scope`](../../context/dsh-context-assembler/README.md):按会话收口 |
|
|
15
|
+
|
|
16
|
+
工具行、注入通道与压缩都不在这里——它们由各自的 bundle 在 profile 平面装一次(`dsh.profile.bundles` 里的
|
|
17
|
+
[`@morlay/dsh-agent-toolkit`](../dsh-agent-toolkit/README.md) 与
|
|
18
|
+
[`@morlay/dsh-context-assembler`](../../context/dsh-context-assembler/README.md))。
|
|
19
|
+
|
|
20
|
+
## 一个模式是什么
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
- id: session-mode
|
|
24
|
+
name: "@morlay/dsh-session-mode"
|
|
25
|
+
config:
|
|
26
|
+
default: coding
|
|
27
|
+
models: # 各模式的默认模型(顶层;键必须是 modes 里的 id)
|
|
28
|
+
chat: { provider: ollama, model: deepseek-v4.1-flash, reasoningEffort: high }
|
|
29
|
+
modes:
|
|
30
|
+
chat:
|
|
31
|
+
name: 对话模式
|
|
32
|
+
description: 只做对话:提问与联网(搜索、抓取)三件工具,不注入系统提示词、工作区指令与技能目录。
|
|
33
|
+
role: [main]
|
|
34
|
+
persona:
|
|
35
|
+
prefix: 你是一个助手。……
|
|
36
|
+
allowTools: [ask_user_question, web_search, web_fetch]
|
|
37
|
+
instructions: false
|
|
38
|
+
runtimeContext: false
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
| 字段 | 落到哪 |
|
|
42
|
+
| ---------------------- | -------------------------------------------------------------------------------------------- |
|
|
43
|
+
| `name` / `description` | 选择器与头部标签的文案(HTTP 清单里给页面) |
|
|
44
|
+
| `role` | 归谁用:`main` 进用户选择器,`subagent` 表示可作为子代理的 mode(候选集);缺省 `["main"]` |
|
|
45
|
+
| `persona` | 装配前注册到**该 agent 的 scope**(`deployment:persona-prefix` / `-suffix`,遮蔽部署级那层) |
|
|
46
|
+
| `allowTools` | `context-assembler-scope` 收口:模型目录、`tool:<名字>` 说明、执行层 guard |
|
|
47
|
+
| `instructions` | 同上:`false` 表示这个会话不要任何 instruction 类注入(工作区指令、技能目录、用法正文) |
|
|
48
|
+
| `runtimeContext` | 同上:`false` 表示不要动态快照(文件沙箱策略、审批策略) |
|
|
49
|
+
|
|
50
|
+
顶层还有个 `models`(**不在模式里**):键是模式 id,值是那个模式的默认模型——`provider` / `model` /
|
|
51
|
+
`reasoningEffort?`,不写就跟全局 `agent-default-model`。它是 config 的 **volatile** 字段,设置页那张卡片
|
|
52
|
+
编辑的就是它;用户在卡片里写的值叠在装配层这份之上(清空 = 回到装配层)。
|
|
53
|
+
|
|
54
|
+
模式名与说明是数据、不做语言翻译(`tool/modes.ts` 里只有中文)——取舍如此,不是漂移。
|
|
55
|
+
|
|
56
|
+
`models` 为什么在顶层、不在模式里:设置面只编辑 volatile 字段、且只认固定路径(dict 内部一律 blocked)。
|
|
57
|
+
判据与取舍见 [ADR 模式默认模型搬到顶层 volatile](./.agents/adrs/20260925-模式默认模型搬到顶层volatile.md)。
|
|
58
|
+
|
|
59
|
+
**自定义就是改这份 config**:profile 的用户 patch 层可以整体改写 `config.modes`,也可以只给某个模式换提示词或
|
|
60
|
+
白名单——不需要任何插件行。默认模式(`default`)也在这里:它与模式清单是同一个事实的两半。装配期的判据
|
|
61
|
+
(默认模式必须在清单里、每个模式至少给一个工具)由 `modes.ts` 的 `configProblem` 兜住,写错直接拒绝装载。
|
|
62
|
+
|
|
63
|
+
## 会话与模式
|
|
64
|
+
|
|
65
|
+
- 新会话用 `config.default`;`agent/created` 时把模式应用到该 agent(persona + 收口),早于它的第一次装配。
|
|
66
|
+
- 会话可以**在空白窗口里**换模式:`select` 记一条 session 事件(`session-mode/selected`)并立刻重新应用。
|
|
67
|
+
跑过 turn 之后拒绝——那段历史是在旧模式的工具与提示词下产生的,改了它,日志与实际装配就对不上。
|
|
68
|
+
- 当前模式读的是 session 投影 `sessionMode`(`null` 表示没选过):恢复与 fork 都据此重建,页面也从会话列表
|
|
69
|
+
里直接读到它。
|
|
70
|
+
- **子代理继承父的模式**:子代理是新会话,创建时(`agent/created`)取父当前模式并写进子会话日志——继承也是
|
|
71
|
+
一条会话事实,恢复与 fork 照样能重建。父不在场时回落部署默认。继承**不看 `role`**:`subagent` 角色声明的
|
|
72
|
+
是"可被指定"的候选,不是继承白名单。
|
|
73
|
+
|
|
74
|
+
## 角色与默认模型
|
|
75
|
+
|
|
76
|
+
- **角色**:`main` = 用户侧可选(选择器与 `select` 只认它);`subagent` = 可作为子代理 mode 的候选。
|
|
77
|
+
「按角色指派 mode」还没做——子代理现在只有"继承父"与预留的服务接缝
|
|
78
|
+
(`ctx.sessionModes.applyTo(agent, mode)` / `modesFor("subagent")`)。
|
|
79
|
+
- **默认模型**:`config.models[<模式 id>]` 只在会话**尚无模型事实**时接管请求路由(投影 `modelSelection`
|
|
80
|
+
没有 `pending`、`requestHeader()` 还没落);一旦用户选过模型或会话跑过请求,就不再插手。它是**配置事实**,
|
|
81
|
+
不写会话事件——重启后仍由 config 决定,与用户在设置里做的那条会话级选择(`model/selection`)是两件事。
|
|
82
|
+
读的是 volatile **引用**(`config.models.get()`):设置页保存只换引用里的值,这行不重挂。
|
|
83
|
+
|
|
84
|
+
## 页面上的两个位置
|
|
85
|
+
|
|
86
|
+
| 槽位 | 呈现 |
|
|
87
|
+
| ------------------------------------- | ------------------------------------------- |
|
|
88
|
+
| `conversation.hero.agentPreset` | 新会话屏幕的顶部占位:chip 点开就是切换列表 |
|
|
89
|
+
| `conversation.session.header.actions` | 会话头部的只读模式标签 |
|
|
90
|
+
|
|
91
|
+
这两块都由本包的 `./client` 出口提供(与 host 半同包、同一次构建);清单与切换走 HTTP 路由
|
|
92
|
+
`GET/POST /session-mode`,当前值走上面那条投影。
|
|
93
|
+
|
|
94
|
+
设置页还有一个面:**本行**的配置入口 `plugins.row.config`(key `@morlay/dsh-session-mode#session-mode`),每个模式一行
|
|
95
|
+
「默认模型」——provider / model / 思考档位,外加"恢复默认"。它编辑的是 `config.models`(配置事实),不是
|
|
96
|
+
模式清单(装配数据)。两条读取从外面注入:清单走 `GET /session-mode`,模型目录走
|
|
97
|
+
`ctx.remote.session.modelCatalog()`。保存是 staged 的一次 `mutate`:
|
|
98
|
+
|
|
99
|
+
| 手势 | 写 |
|
|
100
|
+
| ---------------- | --------------------------------------------------------------- |
|
|
101
|
+
| 给某个模式选模型 | `{ op: 'set', path: ['models', <模式 id>], value: {…} }` |
|
|
102
|
+
| 恢复默认 | `{ op: 'unset', path: ['models', <模式 id>] }`(回到装配层那份) |
|
|
103
|
+
|
|
104
|
+
官方 `@deepseek-ai/dsh-client-ui-agent-preset` 带来的第三个面(设置页那份 roster 面板)不做——模式清单是装配
|
|
105
|
+
配置,改它不需要页面。
|
|
106
|
+
|
|
107
|
+
## 文档
|
|
108
|
+
|
|
109
|
+
- 设计与取舍:[设计 会话模式](./.agents/designs/20260924-会话模式.md)、
|
|
110
|
+
[ADR 模式默认模型搬到顶层 volatile](./.agents/adrs/20260925-模式默认模型搬到顶层volatile.md)、
|
|
111
|
+
[ADR 模式的角色与默认模型](./.agents/adrs/20260923-模式角色与默认模型.md)、
|
|
112
|
+
[ADR 模式不再是 Cordis 子树](./.agents/adrs/20260924-模式不再是cordis子树.md)
|
|
113
|
+
- 验证判据:[本包规范 how-to-verify](./.agents/standards/how-to-verify.md)
|
|
114
|
+
- 形态沿革(已作废):[ADR preset 改用上游声明式行](./.agents/adrs/20260922-preset改用上游声明式行.md)、
|
|
115
|
+
[ADR 通道与注入行按模式 isolate 装配](./.agents/adrs/20260922-通道与注入行按模式isolate装配.md)、
|
|
116
|
+
[设计 预设生成与装配](./.agents/designs/20260917-预设生成与装配.md)
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 本文件由 packages/profile/dsh-session-mode/tool/patch.ts 生成,请勿手工编辑
|
|
2
|
+
- insert:
|
|
3
|
+
- id: session-mode
|
|
4
|
+
name: "@morlay/dsh-session-mode"
|
|
5
|
+
config:
|
|
6
|
+
default: coding
|
|
7
|
+
modes:
|
|
8
|
+
coding:
|
|
9
|
+
name: 编码模式
|
|
10
|
+
description: 功能完整的编码 Agent:文件、Shell、检索、联网等工具常驻,其余用法说明按需加载。
|
|
11
|
+
role:
|
|
12
|
+
- main
|
|
13
|
+
- subagent
|
|
14
|
+
persona:
|
|
15
|
+
prefix: |-
|
|
16
|
+
你是一个经验丰富的编程专家,YAGNI 是你的编程哲学,PDCA 是你的行为规范。
|
|
17
|
+
全程用中文(专有名词除外),包括但不限于思考,回答,工具描述,subagent 提示词;思考不要陷入重复循环,一旦循环立即退出;思考聚焦需求理解与方案设计,不预演具体代码实现,正确性由验证环节确认。
|
|
18
|
+
suffix: 你的工作目录在 `{{cwd}}`
|
|
19
|
+
allowTools:
|
|
20
|
+
- ask_user_question
|
|
21
|
+
- subagent
|
|
22
|
+
- subagent_fork
|
|
23
|
+
- list_subagent_models
|
|
24
|
+
- workflow
|
|
25
|
+
- todo_write
|
|
26
|
+
- exit_plan_mode
|
|
27
|
+
- get_goal
|
|
28
|
+
- create_goal
|
|
29
|
+
- update_goal
|
|
30
|
+
- present
|
|
31
|
+
- read
|
|
32
|
+
- write
|
|
33
|
+
- edit
|
|
34
|
+
- glob
|
|
35
|
+
- grep
|
|
36
|
+
- read_image
|
|
37
|
+
- bash
|
|
38
|
+
- pwsh
|
|
39
|
+
- job_output
|
|
40
|
+
- job_list
|
|
41
|
+
- job_kill
|
|
42
|
+
- skill
|
|
43
|
+
- spawn_teammate
|
|
44
|
+
- send_message
|
|
45
|
+
- list_agents
|
|
46
|
+
- wait_agent
|
|
47
|
+
- interrupt_agent
|
|
48
|
+
- team_task_create
|
|
49
|
+
- team_task_list
|
|
50
|
+
- team_task_get
|
|
51
|
+
- team_task_update
|
|
52
|
+
- web_fetch
|
|
53
|
+
- web_search
|
|
54
|
+
chat:
|
|
55
|
+
name: 对话模式
|
|
56
|
+
description: 只做对话:提问与联网(搜索、抓取)三件工具,不注入系统提示词、工作区指令与技能目录。
|
|
57
|
+
role:
|
|
58
|
+
- main
|
|
59
|
+
persona:
|
|
60
|
+
prefix: 你是一个助手。全程用中文(专有名词除外),包括但不限于思考,回答,工具描述;思考不要陷入重复循环,一旦循环立即退出。
|
|
61
|
+
allowTools:
|
|
62
|
+
- ask_user_question
|
|
63
|
+
- web_search
|
|
64
|
+
- web_fetch
|
|
65
|
+
instructions: false
|
|
66
|
+
runtimeContext: false
|
|
67
|
+
models: {}
|
|
68
|
+
- id: context-assembler-scope
|
|
69
|
+
name: "@morlay/dsh-context-assembler/scope"
|