@morlay/dsh-session-mode 0.0.6 → 0.0.8

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/README.md CHANGED
@@ -2,12 +2,15 @@
2
2
 
3
3
  **模式 = agent preset 的会话级扩展**:每个模式给这个会话加六样东西——一段 persona、两组按名收窄的名单(工具与技能
4
4
  各自允许哪些、另外禁掉哪些)、一份 policy 名单(哪些上游裁决规则生效)、instruction / 技能目录 / 动态快照三个开关,
5
- 外加可选的默认模型。模式**不绑 preset**:行清单(工具 / 命令 / 压缩 / 委派)由会话挂着
5
+ 外加可选的默认模型。模式**不限制 preset**:行清单(工具 / 命令 / 压缩 / 委派)由会话挂着
6
6
  的那份 preset 提供,本部署用官方 shipped `standard`(registry 的默认由官方 web-app 给,我们不覆盖);
7
- `config.modes.<id>.preset` 是可选声明,写了才会在切模式时把 preset 切过去。模式清单与默认值就是本行的 `config.modes`:真源在
7
+ `config.modes.<id>.presetsOnly` 是可选的白名单,留空就是不限制、切模式不换 preset,写了才把当前那份落进名单
8
+ (已经在名单里就不动,否则换成名单第一个)。模式清单与默认值就是本行的 `config.modes`:真源在
8
9
  [`src/mode-sources.ts`](./src/mode-sources.ts),行 config 由 [`src/rows.ts`](./src/rows.ts) 渲染;**模式不是 Cordis
9
10
  子树**,选择落成会话事实(`session-mode/selected` 事件 + `sessionMode` 投影)。会话里选模式走本包 client 半的 chip
10
- 与 `GET/POST /session-mode`,且只在**空白会话**成立。
11
+ 与 `GET/POST /session-mode`,且只在**空白会话**成立。本部署三个模式:`coding`(完整编码 Agent)、`chat`
12
+ (只提问与联网)、`noop`(**原样模式**:一份什么都不加的扩展——persona 空、名单全空、三个开关走默认,装配结果与
13
+ "没有模式"时一致;想按上游默认跑、或排查扩展干扰时的对照档)。
11
14
 
12
15
  **按会话收口也在这个包里**([`src/scope.ts`](./src/scope.ts),模式行内部持有、不发布服务):工具目录与
13
16
  `tool:<工具名>` section 按同一份合成结果过滤、执行层 guard 挂在该 agent 的 ctx 上(同一份 guard 也按名拒 `skill`
@@ -16,6 +19,11 @@
16
19
  `agent/pre-step` 上**丢掉官方两条注入面**(工作区指令、技能目录)。取舍见
17
20
  [设计 抑制官方注入面](./.agents/designs/20260929-抑制官方注入面.md)。
18
21
 
22
+ 这三个开关管的是**每步请求里额外塞进去的文本**(不是工具本身,工具可见性归 `allowTools` / `denyTools`):
23
+ `instructions` = 官方 `agent-instructions` 的每步注入(`AGENTS.md` 之类的工作区指令)加本通道自己的降级注入;
24
+ `skills` = 官方 `tool-skill` 的**技能目录**(那份 `- 名字: 说明` 列表,`skill` 工具本身照旧可见);`runtimeContext` =
25
+ 两条动态快照(文件沙箱策略、审批策略)。
26
+
19
27
  本包不装配任何行:装配入口在 [`@morlay/session-mode-profile`](../../bundles/session-mode-profile/README.md)
20
28
  (它插 `session-mode`、通道、工具说明与 subagent 那几行)。
21
29
 
@@ -50,27 +58,37 @@
50
58
  skills: false # 显式丢掉官方技能目录的注入;**本部署不写这一项**——推导已给出同一个值(见下)
51
59
  runtimeContext: false # 动态快照(沙箱策略、审批策略)
52
60
  defaultModel: { provider: ollama, model: deepseek-v4.1-flash, reasoningEffort: high }
53
- # preset: standard # 可选:写了才会在切模式时把 preset 切过去(不写 = 保持会话当前那份)
61
+ # presetsOnly: [standard, minimal] # 可选白名单:切模式时把会话的 preset 落进名单(已在名单里就不动,否则换成第一个);不写 = 不限制
54
62
  ```
55
63
 
64
+ 页面上改这份配置有两个入口(读写都是同一份 `config.modes`):插件管理页里**本 bundle 的详情页**
65
+ (`plugins.bundle.config`,key 是 bundle 包名)——"新会话的默认模式 + 每个模式一张可折叠卡片",卡片里按六组分
66
+ 字段,支持增删模式(`noop` 不给删);以及这一行自己的**行配置页**(`plugins.row.config`,key
67
+ `@morlay/session-mode-profile#session-mode`,由通用 schema 表单按 volatile 字段自动生成,是行式的结构视图)。
68
+ 两处都是暂存式写入(改完点保存,唯一的写盘点),改动等 Loader 重挂这一行才对**新会话**生效。形态与取舍见
69
+ [设计 bundle 配置页](./.agents/designs/20261002-bundle配置页.md)。
70
+
56
71
  `skills` **不写就由这个模式自己的工具名单推导**:`(allowTools 留空 ? 全部 : allowTools) − denyTools` 里含 `skill`
57
- 就要技能目录(`allowTools` 留空即"全部",所以只有 `denyTools` 能把它推成 `false`)。本部署两个模式都不写它:
58
- `coding` 留空名单 → `true`,`chat` 的三件里没有 `skill` → `false`。要"工具收窄但目录照旧列"就显式写 `skills: true`。
72
+ 就要技能目录(`allowTools` 留空即"全部",所以只有 `denyTools` 能把它推成 `false`)。本部署三个模式都不写它:
73
+ `coding` 与 `noop` 留空名单 → `true`,`chat` 的三件里没有 `skill` → `false`。要"工具收窄但目录照旧列"就显式写
74
+ `skills: true`。
59
75
 
60
76
  技能名单(`allowSkills` / `denySkills`)收的是**技能名**,与工具名单同一套合成规则(`allowSkills` 留空 = 不设收窄,
61
- 两份同时命中时 deny 优先),收窄落在两处:`skill-catalog` 那条消息(正文里 ``- `<名字>`: <说明>`` 那几行与它
62
- `source.entries` 里的结构化名单**一起**删)与 `skill` 工具的**调用参数**(拒的是它这次要加载的那一件,工具本身的
63
- 可见性仍归 `allowTools`)。**不碰注册表**:技能照旧注册着,收的是"模型看到什么、能加载什么"。本部署用它收官方
64
- Office 面——那三件技能由桌面宿主代码 `ctx.plugin` 挂载(不是 entry 行,profile 层停不掉),于是 `coding` 按名排除
65
- 它们,`load_workspace_dependencies` 那件工具同样进 `denyTools`。
77
+ 两份同时命中时 deny 优先),收窄落在两处:`skill-catalog` 那条消息的**正文**(删掉 ``- `<名字>`: <说明>`` 那几行;
78
+ `source.entries` 是官方发布的记录、也是官方判"目录变没变"的输入,**不动它**)与 `skill` 工具的**调用参数**(拒的是
79
+ 它这次要加载的那一件,工具本身的可见性仍归 `allowTools`)。**不碰注册表**:技能照旧注册着,收的是"模型看到什么、
80
+ 能加载什么"。本部署用它收官方 Office 面——那三件技能由桌面宿主代码 `ctx.plugin` 挂载(不是 entry 行,profile 层
81
+ 停不掉),于是 `coding` 按名排除它们,`load_workspace_dependencies` 那件工具同样进 `denyTools`。
66
82
 
67
83
  代价与失效方式:正文删行认的是官方渲染形状(``- `<名字>`:`` 行首)。上游改了这个形状时那**一条目录消息整条不动**
68
- (宁可多列一个名字,也不让正文与结构化名单分叉),并打一条点名告警——那是这条名单面唯一的失灵信号。技能名是模型
69
- 可见契约,跟着上游改名走。
84
+ (宁可多列一个名字,也不删错行),并打一条点名告警——那是这条名单面唯一的失灵信号。技能名是模型可见契约,跟着
85
+ 上游改名走。日志与页面读到的是官方那份**完整**结构化名单,收窄只在模型可见的正文上——这是刻意的:官方按那份名单
86
+ 的 digest 判目录要不要重发,改了它会每一步都重发一条目录。
70
87
 
71
88
  写错在装载时就拒绝:`default` 必须在清单里且声明 `main`、`role` 不能是空数组、`defaultModel` 要给全 `provider` 与
72
89
  `model`、`allowPolicies` / `denyPolicies` 里的名字必须是上游那两条 waterfall(`fs/write-intent` /
73
- `fs/edit-intent`)。改动等 Loader 重挂这一行生效,已运行会话不自动换定义。
90
+ `fs/edit-intent`)、退役的 `preset`(单个 preset 的旧写法)还配着值也拒绝——它已经换成 `presetsOnly`。改动等 Loader
91
+ 重挂这一行生效,已运行会话不自动换定义。
74
92
 
75
93
  四处别当成全能开关:`allowTools` **留空就是不设收窄**(用会话挂着的 preset 的全部工具),列了名单时那份 preset
76
94
  没有的工具会**自动跳过**(会话挂着官方 `minimal` 时 `chat` 一件都不剩);`instructions: false` 丢的是官方
@@ -78,7 +96,6 @@ Office 面——那三件技能由桌面宿主代码 `ctx.plugin` 挂载(不
78
96
  (结果被丢掉);开关为 `true`(或 `instructions` 缺省)时这条抑制**零干预**——官方那两行的注入节奏(首次、以及内容
79
97
  有变才注入的增量)照旧;`skills: false` 只丢官方目录的注入,`skill` 工具本身的可见性归 `allowTools`;`denyPolicies` 只改
80
98
  **上游那两条 waterfall** 上的裁决(`tool-fs` 的写 / 改与 `tool-str-replace-editor`),`bash` 之类自己写文件的通路
81
- 不经过它们。取舍见 [ADR 模式不绑定 preset](./.agents/adrs/20260929-模式不绑定preset.md)、
82
- [ADR allowTools 留空即不设收窄](./.agents/adrs/20260929-allowTools留空即不设收窄.md)、
99
+ 不经过它们。取舍见 [ADR 模式不绑定 preset](./.agents/adrs/20260929-模式不绑定preset.md)、[ADR allowTools 留空即不设收窄](./.agents/adrs/20260929-allowTools留空即不设收窄.md)、
83
100
  [设计 按模式的 policy 拦截](./.agents/designs/20260929-按模式的policy拦截.md) 与
84
101
  [设计 抑制官方注入面](./.agents/designs/20260929-抑制官方注入面.md)。
@@ -0,0 +1,21 @@
1
+ //#region src/shared.ts
2
+ const SESSION_MODE_PATH = "/session-mode";
3
+ const POLICY_NAMES = ["fs/write-intent", "fs/edit-intent"];
4
+ //#endregion
5
+ //#region src/catalog-remote.ts
6
+ const CATALOG_NS = "sessionModeCatalog";
7
+ const SESSION_MODE_CATALOG_REMOTE = {
8
+ package: "@morlay/dsh-session-mode",
9
+ descriptors: [{
10
+ id: "@morlay/dsh-session-mode#sessionModeCatalog/list",
11
+ service: CATALOG_NS,
12
+ namespace: CATALOG_NS,
13
+ method: "list",
14
+ implementation: "remoteExportList",
15
+ invocation: { kind: "direct" },
16
+ parameters: [],
17
+ result: { mode: "src-json" }
18
+ }]
19
+ };
20
+ //#endregion
21
+ export { SESSION_MODE_PATH as i, SESSION_MODE_CATALOG_REMOTE as n, POLICY_NAMES as r, CATALOG_NS as t };