@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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { c as SessionModeModels, n as SessionModeRoster, s as SessionModeModel } from "./shared-FNWe-_rS.cjs";
|
|
2
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
3
|
+
import { SettingsFormScope, SettingsFormShell } from "@morlay/dsh-client-ui-primitives/client";
|
|
4
|
+
import { InjectFace, PropsLocale, PropsRuntime, TranslateNS } from "@deepseek-ai/dsh-client-ui-slots";
|
|
5
|
+
import { ModelProviderGroup } from "@deepseek-ai/dsh-api-remotes/client";
|
|
6
|
+
import { SnapshotStore } from "@deepseek-ai/dsh-client-store";
|
|
7
|
+
//#region src/client/locales.d.ts
|
|
8
|
+
declare const zh: {
|
|
9
|
+
seatHint: string;
|
|
10
|
+
headerHint: string;
|
|
11
|
+
noDescription: string;
|
|
12
|
+
switchRefused: string;
|
|
13
|
+
loadFailed: string;
|
|
14
|
+
cardTitle: string;
|
|
15
|
+
cardDescription: string;
|
|
16
|
+
defaultsTitle: string;
|
|
17
|
+
defaultsHint: string;
|
|
18
|
+
providerLabel: string;
|
|
19
|
+
modelLabel: string;
|
|
20
|
+
effortLabel: string;
|
|
21
|
+
inheritOption: string;
|
|
22
|
+
chooseModel: string;
|
|
23
|
+
effortDefaultOption: string;
|
|
24
|
+
staleOption: string;
|
|
25
|
+
overridden: string;
|
|
26
|
+
reset: string;
|
|
27
|
+
modelRequired: string;
|
|
28
|
+
readOnly: string;
|
|
29
|
+
unavailable: string;
|
|
30
|
+
save: string;
|
|
31
|
+
saving: string;
|
|
32
|
+
saveFailed: string;
|
|
33
|
+
rosterFailed: string;
|
|
34
|
+
directoryFailed: string;
|
|
35
|
+
directoryPartial: string;
|
|
36
|
+
};
|
|
37
|
+
type SessionModeLocaleKey = keyof typeof zh;
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/client/model-defaults-card-controller.d.ts
|
|
40
|
+
/** 本包 host 行 id:settings 的命名空间名与 `config` 的 volatile 字段都在它下面。 */
|
|
41
|
+
declare const SESSION_MODE_NS = "session-mode";
|
|
42
|
+
/** settings 里这一段的可编辑形状(`volatileForm` 从 schema 上挑出来的那几个字段)。 */
|
|
43
|
+
interface SessionModeSettings {
|
|
44
|
+
/** 各模式的默认模型;省略或空对象=一个都没配。 */
|
|
45
|
+
readonly models?: SessionModeModels;
|
|
46
|
+
}
|
|
47
|
+
/** 卡片要的那部分模型目录:可以选的 provider / model 分组,以及读失败的 provider 显示名。 */
|
|
48
|
+
interface ModelDirectory {
|
|
49
|
+
/** 目录里有模型的 provider(`ctx.remote.session.modelCatalog()` 的成功分组)。 */
|
|
50
|
+
readonly groups: readonly ModelProviderGroup[];
|
|
51
|
+
/** 目录里读失败的 provider 显示名(部分失败:其余分组照常可用)。 */
|
|
52
|
+
readonly failures: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
/** 卡片的两条外部读取(都注入进来,测试给假的即可,不需要真的 ctx / HTTP)。 */
|
|
55
|
+
interface ModelDefaultsSources {
|
|
56
|
+
/** 模式清单:`GET /session-mode`(列哪些模式各一行)。 */
|
|
57
|
+
roster(): Promise<SessionModeRoster>;
|
|
58
|
+
/** 模型目录:`ctx.remote.session.modelCatalog()`;拒绝与抛错对卡片是同一件事——读不到目录。 */
|
|
59
|
+
directory(): Promise<ModelDirectory>;
|
|
60
|
+
}
|
|
61
|
+
/** 一个模式一行:清单里的展示信息 + 当前值 + 草稿状态。 */
|
|
62
|
+
interface ModelDefaultsRow {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly description?: string;
|
|
66
|
+
/** 这一行当前显示的模型(草稿优先;草稿是"回到默认"时显示装配层那份);`undefined` = 跟全局默认。 */
|
|
67
|
+
readonly value?: SessionModeModel;
|
|
68
|
+
/** 保存之后这一行会不会留下用户层那一条(有就得给"恢复默认")。 */
|
|
69
|
+
readonly overridden: boolean;
|
|
70
|
+
/** 这一行有未保存的编辑。 */
|
|
71
|
+
readonly dirty: boolean;
|
|
72
|
+
/** 草稿不完整(选了 provider 没选 model):它阻止保存。 */
|
|
73
|
+
readonly invalid: boolean;
|
|
74
|
+
}
|
|
75
|
+
/** 卡片呈现的状态:表单壳 + 行 + 两条读取的落点。 */
|
|
76
|
+
interface ModelDefaultsCardState extends SettingsFormShell {
|
|
77
|
+
readonly rows: readonly ModelDefaultsRow[];
|
|
78
|
+
/** 目录里的 provider 分组(选择器的选项来源)。 */
|
|
79
|
+
readonly directory: readonly ModelProviderGroup[];
|
|
80
|
+
readonly rosterStatus: "loading" | "ready" | "error";
|
|
81
|
+
readonly directoryStatus: "loading" | "ready" | "error";
|
|
82
|
+
/** 部分失败:这些 provider 的目录没读到。 */
|
|
83
|
+
readonly directoryFailures: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
/** 槽位渲染器绑定的状态与动作。 */
|
|
86
|
+
interface ModelDefaultsCardFace {
|
|
87
|
+
hooks: {
|
|
88
|
+
modelDefaultsCard: SnapshotStore<ModelDefaultsCardState>;
|
|
89
|
+
};
|
|
90
|
+
/** 给某个模式换 provider;换 provider 会连 model 与档位一起清掉(档位是模型自带的)。 */
|
|
91
|
+
setProvider(modeId: string, provider: string): void;
|
|
92
|
+
/** 给某个模式选 model;新模型不认识旧档位时档位被清掉。 */
|
|
93
|
+
setModel(modeId: string, model: string): void;
|
|
94
|
+
/** 给某个模式选档位;空串=跟模型(provider)默认。 */
|
|
95
|
+
setEffort(modeId: string, effort: string): void;
|
|
96
|
+
/** 这一行回到装配层的值(清掉用户层那一条)。 */
|
|
97
|
+
resetMode(modeId: string): void;
|
|
98
|
+
/** 把全部草稿写成一次 `mutate`。 */
|
|
99
|
+
save(): void;
|
|
100
|
+
/** 丢掉全部草稿。 */
|
|
101
|
+
discard(): void;
|
|
102
|
+
}
|
|
103
|
+
/** 把一张动态映射编辑成一次设置的写。 */
|
|
104
|
+
declare class ModelDefaultsCardController {
|
|
105
|
+
private readonly scope;
|
|
106
|
+
private readonly sources;
|
|
107
|
+
private readonly store;
|
|
108
|
+
private readonly unsubscribe;
|
|
109
|
+
private readonly drafts;
|
|
110
|
+
private roster;
|
|
111
|
+
private rosterStatus;
|
|
112
|
+
private directory;
|
|
113
|
+
private directoryFailures;
|
|
114
|
+
private directoryStatus;
|
|
115
|
+
private saving;
|
|
116
|
+
private failed;
|
|
117
|
+
private disposed;
|
|
118
|
+
private saveGeneration;
|
|
119
|
+
/**
|
|
120
|
+
* @param scope - 本包 host 行(`session-mode`)的共享配置表单。
|
|
121
|
+
* @param sources - 模式清单与模型目录的两条读取。
|
|
122
|
+
*/
|
|
123
|
+
constructor(scope: SettingsFormScope<SessionModeSettings>, sources: ModelDefaultsSources);
|
|
124
|
+
/** 停止观察设置,并让晚到的写入结果不再落到状态上。 */
|
|
125
|
+
dispose(): void;
|
|
126
|
+
/**
|
|
127
|
+
* 把状态与动作绑到槽位渲染器上。
|
|
128
|
+
* @returns 快照与编辑、保存动作。
|
|
129
|
+
*/
|
|
130
|
+
inject(): ModelDefaultsCardFace;
|
|
131
|
+
/** 用户层有没有这一条。 */
|
|
132
|
+
private overridden;
|
|
133
|
+
/** 生效值(用户层叠在装配层上)。 */
|
|
134
|
+
private current;
|
|
135
|
+
/** 装配层那份(用户层清掉之后剩下的)。 */
|
|
136
|
+
private base;
|
|
137
|
+
/**
|
|
138
|
+
* 这一行现在的值:草稿优先,否则是生效值;草稿是"回到默认"时看装配层那份(它清掉的就是用户层)。
|
|
139
|
+
* 同一个值既是选择器显示的东西,也是下一次编辑的起点。
|
|
140
|
+
* @param modeId - 模式 id。
|
|
141
|
+
* @returns 这一行呈现的模型;`undefined` = 跟全局默认。
|
|
142
|
+
*/
|
|
143
|
+
private shown;
|
|
144
|
+
/**
|
|
145
|
+
* 这一行的草稿算不算一次真的编辑。
|
|
146
|
+
* @param modeId - 模式 id。
|
|
147
|
+
* @returns 保存会不会改变什么。
|
|
148
|
+
*/
|
|
149
|
+
private dirty;
|
|
150
|
+
/** 保存之后这一行会不会留下用户层那一条("已覆盖"与"恢复默认"都看它)。 */
|
|
151
|
+
private leavesOverride;
|
|
152
|
+
private setProvider;
|
|
153
|
+
private setModel;
|
|
154
|
+
private setEffort;
|
|
155
|
+
private stage;
|
|
156
|
+
private discard;
|
|
157
|
+
/** 可以编辑:这一行被服务到(`status: ready`)且文档接受写入。 */
|
|
158
|
+
private writable;
|
|
159
|
+
/** 这一次保存要写的 path op(按编辑顺序;没变的行不写)。 */
|
|
160
|
+
private plannedOps;
|
|
161
|
+
private save;
|
|
162
|
+
private loadRoster;
|
|
163
|
+
private loadDirectory;
|
|
164
|
+
/** 某个 provider 在目录里的模型。 */
|
|
165
|
+
private modelsOf;
|
|
166
|
+
/** 某个 provider + model 声明的档位(模型自带;没声明就是没有)。 */
|
|
167
|
+
private efforts;
|
|
168
|
+
private projection;
|
|
169
|
+
private publish;
|
|
170
|
+
}
|
|
171
|
+
//#endregion
|
|
172
|
+
//#region src/client/ModelDefaultsCard.d.ts
|
|
173
|
+
/** 槽位渲染器给卡片的 props:运行时面 + 卡片自己的注入面(`t` 由本包的 `inject` 面带进来)。 */
|
|
174
|
+
type ModelDefaultsCardProps = PropsRuntime<"plugins.row.config"> & InjectFace<ModelDefaultsCardFace & {
|
|
175
|
+
t: Translate;
|
|
176
|
+
}>;
|
|
177
|
+
/** 本页字典的读取器(命名空间的 key 由 `LocaleNamespaceMap` 合并声明给)。 */
|
|
178
|
+
type Translate = TranslateNS<"session-mode">;
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/client/SessionModeLabel.d.ts
|
|
181
|
+
/** 完整 props:头部动作槽位的运行时 props + 本包的字典。 */
|
|
182
|
+
type SessionModeLabelProps = PropsRuntime<"conversation.session.header.actions"> & PropsLocale<"session-mode">;
|
|
183
|
+
//#endregion
|
|
184
|
+
//#region src/client/SessionModeSeat.d.ts
|
|
185
|
+
/** 完整 props:hero 槽位的运行时 props + 本包的字典。 */
|
|
186
|
+
type SessionModeSeatProps = PropsRuntime<"conversation.hero.agentPreset"> & PropsLocale<"session-mode">;
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region src/client/index.d.ts
|
|
189
|
+
declare module "@deepseek-ai/dsh-client-ui-slots" {
|
|
190
|
+
interface LocaleNamespaceMap {
|
|
191
|
+
/** 模式选择面与设置卡片的文案。 */
|
|
192
|
+
"session-mode": SessionModeLocaleKey;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 本行的配置入口 key:`<bundle 包名>#<行 id>`。
|
|
197
|
+
*
|
|
198
|
+
* 页面侧由 `ui-plugin-manager` 的 `rowConfigKey(bundle, rowId)` 生成同一个串——bundle 是本包
|
|
199
|
+
* (`dsh.profile.bundles` 里那一项),行 id 是本包 patch 里插的 `session-mode`。
|
|
200
|
+
*/
|
|
201
|
+
declare const SESSION_MODE_ROW_CONFIG_KEY = "@morlay/dsh-session-mode#session-mode";
|
|
202
|
+
/** 需要的服务:槽位与字典(会话列表经槽位的标准 props 到达组件,不必自己 inject)。 */
|
|
203
|
+
declare const inject: string[];
|
|
204
|
+
/**
|
|
205
|
+
* 装上三个面。
|
|
206
|
+
* @param ctx - 浏览器插件上下文。
|
|
207
|
+
*/
|
|
208
|
+
declare function apply(ctx: Context): void;
|
|
209
|
+
//#endregion
|
|
210
|
+
export { ModelDefaultsCardController, type ModelDefaultsCardFace, type ModelDefaultsCardProps, type ModelDefaultsCardState, type ModelDefaultsRow, type ModelDefaultsSources, type ModelDirectory, SESSION_MODE_NS, SESSION_MODE_ROW_CONFIG_KEY, type SessionModeLabelProps, type SessionModeLocaleKey, type SessionModeSeatProps, type SessionModeSettings, apply, inject };
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { c as SessionModeModels, n as SessionModeRoster, s as SessionModeModel } from "./shared-FNWe-_rS.mjs";
|
|
2
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
3
|
+
import { SettingsFormScope, SettingsFormShell } from "@morlay/dsh-client-ui-primitives/client";
|
|
4
|
+
import { SnapshotStore } from "@deepseek-ai/dsh-client-store";
|
|
5
|
+
import { InjectFace, PropsLocale, PropsRuntime, TranslateNS } from "@deepseek-ai/dsh-client-ui-slots";
|
|
6
|
+
import { ModelProviderGroup } from "@deepseek-ai/dsh-api-remotes/client";
|
|
7
|
+
//#region src/client/locales.d.ts
|
|
8
|
+
declare const zh: {
|
|
9
|
+
seatHint: string;
|
|
10
|
+
headerHint: string;
|
|
11
|
+
noDescription: string;
|
|
12
|
+
switchRefused: string;
|
|
13
|
+
loadFailed: string;
|
|
14
|
+
cardTitle: string;
|
|
15
|
+
cardDescription: string;
|
|
16
|
+
defaultsTitle: string;
|
|
17
|
+
defaultsHint: string;
|
|
18
|
+
providerLabel: string;
|
|
19
|
+
modelLabel: string;
|
|
20
|
+
effortLabel: string;
|
|
21
|
+
inheritOption: string;
|
|
22
|
+
chooseModel: string;
|
|
23
|
+
effortDefaultOption: string;
|
|
24
|
+
staleOption: string;
|
|
25
|
+
overridden: string;
|
|
26
|
+
reset: string;
|
|
27
|
+
modelRequired: string;
|
|
28
|
+
readOnly: string;
|
|
29
|
+
unavailable: string;
|
|
30
|
+
save: string;
|
|
31
|
+
saving: string;
|
|
32
|
+
saveFailed: string;
|
|
33
|
+
rosterFailed: string;
|
|
34
|
+
directoryFailed: string;
|
|
35
|
+
directoryPartial: string;
|
|
36
|
+
};
|
|
37
|
+
type SessionModeLocaleKey = keyof typeof zh;
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/client/model-defaults-card-controller.d.ts
|
|
40
|
+
/** 本包 host 行 id:settings 的命名空间名与 `config` 的 volatile 字段都在它下面。 */
|
|
41
|
+
declare const SESSION_MODE_NS = "session-mode";
|
|
42
|
+
/** settings 里这一段的可编辑形状(`volatileForm` 从 schema 上挑出来的那几个字段)。 */
|
|
43
|
+
interface SessionModeSettings {
|
|
44
|
+
/** 各模式的默认模型;省略或空对象=一个都没配。 */
|
|
45
|
+
readonly models?: SessionModeModels;
|
|
46
|
+
}
|
|
47
|
+
/** 卡片要的那部分模型目录:可以选的 provider / model 分组,以及读失败的 provider 显示名。 */
|
|
48
|
+
interface ModelDirectory {
|
|
49
|
+
/** 目录里有模型的 provider(`ctx.remote.session.modelCatalog()` 的成功分组)。 */
|
|
50
|
+
readonly groups: readonly ModelProviderGroup[];
|
|
51
|
+
/** 目录里读失败的 provider 显示名(部分失败:其余分组照常可用)。 */
|
|
52
|
+
readonly failures: readonly string[];
|
|
53
|
+
}
|
|
54
|
+
/** 卡片的两条外部读取(都注入进来,测试给假的即可,不需要真的 ctx / HTTP)。 */
|
|
55
|
+
interface ModelDefaultsSources {
|
|
56
|
+
/** 模式清单:`GET /session-mode`(列哪些模式各一行)。 */
|
|
57
|
+
roster(): Promise<SessionModeRoster>;
|
|
58
|
+
/** 模型目录:`ctx.remote.session.modelCatalog()`;拒绝与抛错对卡片是同一件事——读不到目录。 */
|
|
59
|
+
directory(): Promise<ModelDirectory>;
|
|
60
|
+
}
|
|
61
|
+
/** 一个模式一行:清单里的展示信息 + 当前值 + 草稿状态。 */
|
|
62
|
+
interface ModelDefaultsRow {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly description?: string;
|
|
66
|
+
/** 这一行当前显示的模型(草稿优先;草稿是"回到默认"时显示装配层那份);`undefined` = 跟全局默认。 */
|
|
67
|
+
readonly value?: SessionModeModel;
|
|
68
|
+
/** 保存之后这一行会不会留下用户层那一条(有就得给"恢复默认")。 */
|
|
69
|
+
readonly overridden: boolean;
|
|
70
|
+
/** 这一行有未保存的编辑。 */
|
|
71
|
+
readonly dirty: boolean;
|
|
72
|
+
/** 草稿不完整(选了 provider 没选 model):它阻止保存。 */
|
|
73
|
+
readonly invalid: boolean;
|
|
74
|
+
}
|
|
75
|
+
/** 卡片呈现的状态:表单壳 + 行 + 两条读取的落点。 */
|
|
76
|
+
interface ModelDefaultsCardState extends SettingsFormShell {
|
|
77
|
+
readonly rows: readonly ModelDefaultsRow[];
|
|
78
|
+
/** 目录里的 provider 分组(选择器的选项来源)。 */
|
|
79
|
+
readonly directory: readonly ModelProviderGroup[];
|
|
80
|
+
readonly rosterStatus: "loading" | "ready" | "error";
|
|
81
|
+
readonly directoryStatus: "loading" | "ready" | "error";
|
|
82
|
+
/** 部分失败:这些 provider 的目录没读到。 */
|
|
83
|
+
readonly directoryFailures: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
/** 槽位渲染器绑定的状态与动作。 */
|
|
86
|
+
interface ModelDefaultsCardFace {
|
|
87
|
+
hooks: {
|
|
88
|
+
modelDefaultsCard: SnapshotStore<ModelDefaultsCardState>;
|
|
89
|
+
};
|
|
90
|
+
/** 给某个模式换 provider;换 provider 会连 model 与档位一起清掉(档位是模型自带的)。 */
|
|
91
|
+
setProvider(modeId: string, provider: string): void;
|
|
92
|
+
/** 给某个模式选 model;新模型不认识旧档位时档位被清掉。 */
|
|
93
|
+
setModel(modeId: string, model: string): void;
|
|
94
|
+
/** 给某个模式选档位;空串=跟模型(provider)默认。 */
|
|
95
|
+
setEffort(modeId: string, effort: string): void;
|
|
96
|
+
/** 这一行回到装配层的值(清掉用户层那一条)。 */
|
|
97
|
+
resetMode(modeId: string): void;
|
|
98
|
+
/** 把全部草稿写成一次 `mutate`。 */
|
|
99
|
+
save(): void;
|
|
100
|
+
/** 丢掉全部草稿。 */
|
|
101
|
+
discard(): void;
|
|
102
|
+
}
|
|
103
|
+
/** 把一张动态映射编辑成一次设置的写。 */
|
|
104
|
+
declare class ModelDefaultsCardController {
|
|
105
|
+
private readonly scope;
|
|
106
|
+
private readonly sources;
|
|
107
|
+
private readonly store;
|
|
108
|
+
private readonly unsubscribe;
|
|
109
|
+
private readonly drafts;
|
|
110
|
+
private roster;
|
|
111
|
+
private rosterStatus;
|
|
112
|
+
private directory;
|
|
113
|
+
private directoryFailures;
|
|
114
|
+
private directoryStatus;
|
|
115
|
+
private saving;
|
|
116
|
+
private failed;
|
|
117
|
+
private disposed;
|
|
118
|
+
private saveGeneration;
|
|
119
|
+
/**
|
|
120
|
+
* @param scope - 本包 host 行(`session-mode`)的共享配置表单。
|
|
121
|
+
* @param sources - 模式清单与模型目录的两条读取。
|
|
122
|
+
*/
|
|
123
|
+
constructor(scope: SettingsFormScope<SessionModeSettings>, sources: ModelDefaultsSources);
|
|
124
|
+
/** 停止观察设置,并让晚到的写入结果不再落到状态上。 */
|
|
125
|
+
dispose(): void;
|
|
126
|
+
/**
|
|
127
|
+
* 把状态与动作绑到槽位渲染器上。
|
|
128
|
+
* @returns 快照与编辑、保存动作。
|
|
129
|
+
*/
|
|
130
|
+
inject(): ModelDefaultsCardFace;
|
|
131
|
+
/** 用户层有没有这一条。 */
|
|
132
|
+
private overridden;
|
|
133
|
+
/** 生效值(用户层叠在装配层上)。 */
|
|
134
|
+
private current;
|
|
135
|
+
/** 装配层那份(用户层清掉之后剩下的)。 */
|
|
136
|
+
private base;
|
|
137
|
+
/**
|
|
138
|
+
* 这一行现在的值:草稿优先,否则是生效值;草稿是"回到默认"时看装配层那份(它清掉的就是用户层)。
|
|
139
|
+
* 同一个值既是选择器显示的东西,也是下一次编辑的起点。
|
|
140
|
+
* @param modeId - 模式 id。
|
|
141
|
+
* @returns 这一行呈现的模型;`undefined` = 跟全局默认。
|
|
142
|
+
*/
|
|
143
|
+
private shown;
|
|
144
|
+
/**
|
|
145
|
+
* 这一行的草稿算不算一次真的编辑。
|
|
146
|
+
* @param modeId - 模式 id。
|
|
147
|
+
* @returns 保存会不会改变什么。
|
|
148
|
+
*/
|
|
149
|
+
private dirty;
|
|
150
|
+
/** 保存之后这一行会不会留下用户层那一条("已覆盖"与"恢复默认"都看它)。 */
|
|
151
|
+
private leavesOverride;
|
|
152
|
+
private setProvider;
|
|
153
|
+
private setModel;
|
|
154
|
+
private setEffort;
|
|
155
|
+
private stage;
|
|
156
|
+
private discard;
|
|
157
|
+
/** 可以编辑:这一行被服务到(`status: ready`)且文档接受写入。 */
|
|
158
|
+
private writable;
|
|
159
|
+
/** 这一次保存要写的 path op(按编辑顺序;没变的行不写)。 */
|
|
160
|
+
private plannedOps;
|
|
161
|
+
private save;
|
|
162
|
+
private loadRoster;
|
|
163
|
+
private loadDirectory;
|
|
164
|
+
/** 某个 provider 在目录里的模型。 */
|
|
165
|
+
private modelsOf;
|
|
166
|
+
/** 某个 provider + model 声明的档位(模型自带;没声明就是没有)。 */
|
|
167
|
+
private efforts;
|
|
168
|
+
private projection;
|
|
169
|
+
private publish;
|
|
170
|
+
}
|
|
171
|
+
//#endregion
|
|
172
|
+
//#region src/client/ModelDefaultsCard.d.ts
|
|
173
|
+
/** 槽位渲染器给卡片的 props:运行时面 + 卡片自己的注入面(`t` 由本包的 `inject` 面带进来)。 */
|
|
174
|
+
type ModelDefaultsCardProps = PropsRuntime<"plugins.row.config"> & InjectFace<ModelDefaultsCardFace & {
|
|
175
|
+
t: Translate;
|
|
176
|
+
}>;
|
|
177
|
+
/** 本页字典的读取器(命名空间的 key 由 `LocaleNamespaceMap` 合并声明给)。 */
|
|
178
|
+
type Translate = TranslateNS<"session-mode">;
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/client/SessionModeLabel.d.ts
|
|
181
|
+
/** 完整 props:头部动作槽位的运行时 props + 本包的字典。 */
|
|
182
|
+
type SessionModeLabelProps = PropsRuntime<"conversation.session.header.actions"> & PropsLocale<"session-mode">;
|
|
183
|
+
//#endregion
|
|
184
|
+
//#region src/client/SessionModeSeat.d.ts
|
|
185
|
+
/** 完整 props:hero 槽位的运行时 props + 本包的字典。 */
|
|
186
|
+
type SessionModeSeatProps = PropsRuntime<"conversation.hero.agentPreset"> & PropsLocale<"session-mode">;
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region src/client/index.d.ts
|
|
189
|
+
declare module "@deepseek-ai/dsh-client-ui-slots" {
|
|
190
|
+
interface LocaleNamespaceMap {
|
|
191
|
+
/** 模式选择面与设置卡片的文案。 */
|
|
192
|
+
"session-mode": SessionModeLocaleKey;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 本行的配置入口 key:`<bundle 包名>#<行 id>`。
|
|
197
|
+
*
|
|
198
|
+
* 页面侧由 `ui-plugin-manager` 的 `rowConfigKey(bundle, rowId)` 生成同一个串——bundle 是本包
|
|
199
|
+
* (`dsh.profile.bundles` 里那一项),行 id 是本包 patch 里插的 `session-mode`。
|
|
200
|
+
*/
|
|
201
|
+
declare const SESSION_MODE_ROW_CONFIG_KEY = "@morlay/dsh-session-mode#session-mode";
|
|
202
|
+
/** 需要的服务:槽位与字典(会话列表经槽位的标准 props 到达组件,不必自己 inject)。 */
|
|
203
|
+
declare const inject: string[];
|
|
204
|
+
/**
|
|
205
|
+
* 装上三个面。
|
|
206
|
+
* @param ctx - 浏览器插件上下文。
|
|
207
|
+
*/
|
|
208
|
+
declare function apply(ctx: Context): void;
|
|
209
|
+
//#endregion
|
|
210
|
+
export { ModelDefaultsCardController, type ModelDefaultsCardFace, type ModelDefaultsCardProps, type ModelDefaultsCardState, type ModelDefaultsRow, type ModelDefaultsSources, type ModelDirectory, SESSION_MODE_NS, SESSION_MODE_ROW_CONFIG_KEY, type SessionModeLabelProps, type SessionModeLocaleKey, type SessionModeSeatProps, type SessionModeSettings, apply, inject };
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { a as ResolvedConfig, c as SessionModeModels, i as Config, l as SessionModePersona, n as SessionModeRoster, o as SessionMode, r as SessionModeRow, s as SessionModeModel, t as SESSION_MODE_PATH, u as SessionModeRole } from "./shared-FNWe-_rS.cjs";
|
|
2
|
+
import { Context, Service } from "@deepseek-ai/cordis";
|
|
3
|
+
import { Agent } from "@deepseek-ai/dsh-agent";
|
|
4
|
+
import { Session, SessionEvent, SessionId } from "@deepseek-ai/dsh-session";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
//#region src/index.d.ts
|
|
7
|
+
/** Cordis 插件名:与行 id 一致。 */
|
|
8
|
+
declare const name = "session-mode";
|
|
9
|
+
/**
|
|
10
|
+
* 依赖:投影服务(登记 `sessionMode`、读 `turnBoundary`)、读会话与 agent 的两个注册表,以及提示词注册表
|
|
11
|
+
* (persona 的 section 注册在它上面)。
|
|
12
|
+
*
|
|
13
|
+
* 这些名字必须在 `inject` 里点名:cordis 的**属性访问**(`this.ctx.sessions`)要求本 fiber 声明过那个服务,
|
|
14
|
+
* 未声明会抛 `cannot get property "sessions" without inject`(`ctx.get(name)` 才不需要声明)。
|
|
15
|
+
*/
|
|
16
|
+
declare const inject: string[];
|
|
17
|
+
declare module "@deepseek-ai/cordis" {
|
|
18
|
+
interface Context {
|
|
19
|
+
sessionModes: SessionModes;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
declare module "@deepseek-ai/dsh-session/types" {
|
|
23
|
+
interface SessionEventMap {
|
|
24
|
+
/**
|
|
25
|
+
* 会话在空白窗口里换了模式。**log-only**:它记录此后每一步实际运行的模式,恢复与 fork 时据此重建
|
|
26
|
+
* (模式决定模型看到的工具与提示词,所以它必须进日志)。
|
|
27
|
+
*/
|
|
28
|
+
"session-mode/selected": {
|
|
29
|
+
sessionMode: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
declare module "@deepseek-ai/dsh-session-projection/types" {
|
|
34
|
+
interface SessionProjectionStateMap {
|
|
35
|
+
sessionMode: string | null;
|
|
36
|
+
}
|
|
37
|
+
interface SessionProjectionMap {
|
|
38
|
+
/** 会话当前模式;`null` 表示没选过(用部署默认)。 */
|
|
39
|
+
sessionMode: string | null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** 会话模式的投影:初值来自空日志(没选过就是 `null`),只被选择事件推进。 */
|
|
43
|
+
declare const sessionModeProjection: {
|
|
44
|
+
key: "sessionMode";
|
|
45
|
+
stateSchema: z.ZodType<string | null, unknown, z.core.$ZodTypeInternals<string | null, unknown>>;
|
|
46
|
+
init: () => null;
|
|
47
|
+
apply: (state: string | null, event: SessionEvent) => string | null;
|
|
48
|
+
wire: {
|
|
49
|
+
viewSchema: z.ZodType<string | null, unknown, z.core.$ZodTypeInternals<string | null, unknown>>;
|
|
50
|
+
view: (state: string | null) => string | null;
|
|
51
|
+
};
|
|
52
|
+
stateVersion: number;
|
|
53
|
+
};
|
|
54
|
+
/** 模式清单、默认模式、按会话读取与切换。 */
|
|
55
|
+
declare class SessionModes extends Service {
|
|
56
|
+
config: ResolvedConfig;
|
|
57
|
+
/** 每个 agent 已经装上的那一份(persona + 默认模型兜底;模式变了就换一份)。 */
|
|
58
|
+
private readonly installs;
|
|
59
|
+
constructor(ctx: Context, config: ResolvedConfig);
|
|
60
|
+
/** 新会话用它:config 里的 `default`。 */
|
|
61
|
+
get defaultId(): string;
|
|
62
|
+
/** 选择器要的清单:只列 `main` 角色的模式(id、展示名、说明,顺序即 config 里 `modes` 的插入序)。 */
|
|
63
|
+
list(): SessionModeRow[];
|
|
64
|
+
/**
|
|
65
|
+
* 声明了某个角色的模式 id(顺序即 config 的插入序):`main` 给用户选择器,`subagent` 给子代理候选。
|
|
66
|
+
* @param role - 目标角色。
|
|
67
|
+
* @returns 该角色下的模式 id。
|
|
68
|
+
*/
|
|
69
|
+
idsFor(role: SessionModeRole): string[];
|
|
70
|
+
/**
|
|
71
|
+
* 同 {@link idsFor},给的是定义——"指定 mode" 那条接缝要拿候选集。
|
|
72
|
+
* @param role - 目标角色。
|
|
73
|
+
* @returns 该角色下的模式与其定义。
|
|
74
|
+
*/
|
|
75
|
+
modesFor(role: SessionModeRole): {
|
|
76
|
+
id: string;
|
|
77
|
+
mode: SessionMode;
|
|
78
|
+
}[];
|
|
79
|
+
/** 页面用的清单 + 默认模式。 */
|
|
80
|
+
roster(): SessionModeRoster;
|
|
81
|
+
/** 按 id 取定义;未知 id 直接抛(切换路径上它就是用户的错)。 */
|
|
82
|
+
definition(id?: string): SessionMode;
|
|
83
|
+
/** 会话当前模式:投影上有就用它,否则是部署默认。 */
|
|
84
|
+
modeOf(session: Session): string;
|
|
85
|
+
/** 会话当前模式的定义。 */
|
|
86
|
+
modeOfSession(session: Session): SessionMode;
|
|
87
|
+
/**
|
|
88
|
+
* 把某个空白会话切到某个模式。
|
|
89
|
+
* @param sessionId - 目标会话(必须还没有开过 turn)。
|
|
90
|
+
* @param mode - 目标模式 id。
|
|
91
|
+
* @returns 提交后的模式 id。
|
|
92
|
+
*/
|
|
93
|
+
select(sessionId: SessionId, mode: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* 把某个活着的 agent 切到某个模式。与 {@link select} 的差别:它不要求空白会话——子代理创建时的继承
|
|
96
|
+
* 走这里,**未来的"指定 mode"入口(模型侧或配置侧)也走这里**(那条接缝还没做)。
|
|
97
|
+
* @param agent - 目标 agent。
|
|
98
|
+
* @param mode - 目标模式 id。
|
|
99
|
+
* @param options.record - 是否把这次切换写进会话日志(缺省写;只想改当前进程时给 `false`)。
|
|
100
|
+
*/
|
|
101
|
+
applyTo(agent: Agent, mode: string, options?: {
|
|
102
|
+
record?: boolean;
|
|
103
|
+
}): void;
|
|
104
|
+
/**
|
|
105
|
+
* 该 agent 用哪个模式:会话选过(投影上有)优先,子代理继承父,其余用部署默认。
|
|
106
|
+
*
|
|
107
|
+
* 继承要**写进子会话日志**:它是一条会话事实,冷恢复与 fork 都要靠它重建({@link modeOf} 只读投影)。
|
|
108
|
+
*/
|
|
109
|
+
private resolveModeId;
|
|
110
|
+
/** 子代理(有 durable 父会话)继承父当前模式;父不在场、或不是子代理时没有可继承的。 */
|
|
111
|
+
private inheritedModeId;
|
|
112
|
+
/** 装或换该 agent 的那一份(幂等:同一模式不重复注册)。 */
|
|
113
|
+
private installFor;
|
|
114
|
+
/**
|
|
115
|
+
* 模式的默认模型(config 顶层 `models.<模式 id>`)兜底:只在会话**尚无任何模型事实**(没选过模型、也
|
|
116
|
+
* 还没跑过请求)时接管这一请求的路由;一旦用户选过(投影 `pending`)或会话已经落过 header,就不再插手。
|
|
117
|
+
*
|
|
118
|
+
* 它是**配置事实**,不写会话事件——重启后仍由 config 决定;设置页里那条会话级选择才是会话事实。
|
|
119
|
+
*
|
|
120
|
+
* 模型取自 `config.models`:那是个 volatile 引用,设置页保存时只有**引用里的值**变,这一行不重挂,
|
|
121
|
+
* 所以每次请求都现场 `.get()`(与 `llm-openai-compatible` 读 `config.providers` 同一种读法)。
|
|
122
|
+
*/
|
|
123
|
+
private installDefaultModel;
|
|
124
|
+
/** 收口服务由 `@morlay/dsh-context-assembler/scope` 那一行发布;没装它就只有 persona。 */
|
|
125
|
+
private toolScope;
|
|
126
|
+
}
|
|
127
|
+
declare function apply(ctx: Context, config: ResolvedConfig): void;
|
|
128
|
+
//#endregion
|
|
129
|
+
export { Config, type ResolvedConfig, SESSION_MODE_PATH, type SessionMode, type SessionModeModel, type SessionModeModels, type SessionModePersona, type SessionModeRole, type SessionModeRoster, type SessionModeRow, SessionModes, apply, inject, name, sessionModeProjection };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { a as ResolvedConfig, c as SessionModeModels, i as Config, l as SessionModePersona, n as SessionModeRoster, o as SessionMode, r as SessionModeRow, s as SessionModeModel, t as SESSION_MODE_PATH, u as SessionModeRole } from "./shared-FNWe-_rS.mjs";
|
|
2
|
+
import { Context, Service } from "@deepseek-ai/cordis";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { Agent } from "@deepseek-ai/dsh-agent";
|
|
5
|
+
import { Session, SessionEvent, SessionId } from "@deepseek-ai/dsh-session";
|
|
6
|
+
//#region src/index.d.ts
|
|
7
|
+
/** Cordis 插件名:与行 id 一致。 */
|
|
8
|
+
declare const name = "session-mode";
|
|
9
|
+
/**
|
|
10
|
+
* 依赖:投影服务(登记 `sessionMode`、读 `turnBoundary`)、读会话与 agent 的两个注册表,以及提示词注册表
|
|
11
|
+
* (persona 的 section 注册在它上面)。
|
|
12
|
+
*
|
|
13
|
+
* 这些名字必须在 `inject` 里点名:cordis 的**属性访问**(`this.ctx.sessions`)要求本 fiber 声明过那个服务,
|
|
14
|
+
* 未声明会抛 `cannot get property "sessions" without inject`(`ctx.get(name)` 才不需要声明)。
|
|
15
|
+
*/
|
|
16
|
+
declare const inject: string[];
|
|
17
|
+
declare module "@deepseek-ai/cordis" {
|
|
18
|
+
interface Context {
|
|
19
|
+
sessionModes: SessionModes;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
declare module "@deepseek-ai/dsh-session/types" {
|
|
23
|
+
interface SessionEventMap {
|
|
24
|
+
/**
|
|
25
|
+
* 会话在空白窗口里换了模式。**log-only**:它记录此后每一步实际运行的模式,恢复与 fork 时据此重建
|
|
26
|
+
* (模式决定模型看到的工具与提示词,所以它必须进日志)。
|
|
27
|
+
*/
|
|
28
|
+
"session-mode/selected": {
|
|
29
|
+
sessionMode: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
declare module "@deepseek-ai/dsh-session-projection/types" {
|
|
34
|
+
interface SessionProjectionStateMap {
|
|
35
|
+
sessionMode: string | null;
|
|
36
|
+
}
|
|
37
|
+
interface SessionProjectionMap {
|
|
38
|
+
/** 会话当前模式;`null` 表示没选过(用部署默认)。 */
|
|
39
|
+
sessionMode: string | null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** 会话模式的投影:初值来自空日志(没选过就是 `null`),只被选择事件推进。 */
|
|
43
|
+
declare const sessionModeProjection: {
|
|
44
|
+
key: "sessionMode";
|
|
45
|
+
stateSchema: z.ZodType<string | null, unknown, z.core.$ZodTypeInternals<string | null, unknown>>;
|
|
46
|
+
init: () => null;
|
|
47
|
+
apply: (state: string | null, event: SessionEvent) => string | null;
|
|
48
|
+
wire: {
|
|
49
|
+
viewSchema: z.ZodType<string | null, unknown, z.core.$ZodTypeInternals<string | null, unknown>>;
|
|
50
|
+
view: (state: string | null) => string | null;
|
|
51
|
+
};
|
|
52
|
+
stateVersion: number;
|
|
53
|
+
};
|
|
54
|
+
/** 模式清单、默认模式、按会话读取与切换。 */
|
|
55
|
+
declare class SessionModes extends Service {
|
|
56
|
+
config: ResolvedConfig;
|
|
57
|
+
/** 每个 agent 已经装上的那一份(persona + 默认模型兜底;模式变了就换一份)。 */
|
|
58
|
+
private readonly installs;
|
|
59
|
+
constructor(ctx: Context, config: ResolvedConfig);
|
|
60
|
+
/** 新会话用它:config 里的 `default`。 */
|
|
61
|
+
get defaultId(): string;
|
|
62
|
+
/** 选择器要的清单:只列 `main` 角色的模式(id、展示名、说明,顺序即 config 里 `modes` 的插入序)。 */
|
|
63
|
+
list(): SessionModeRow[];
|
|
64
|
+
/**
|
|
65
|
+
* 声明了某个角色的模式 id(顺序即 config 的插入序):`main` 给用户选择器,`subagent` 给子代理候选。
|
|
66
|
+
* @param role - 目标角色。
|
|
67
|
+
* @returns 该角色下的模式 id。
|
|
68
|
+
*/
|
|
69
|
+
idsFor(role: SessionModeRole): string[];
|
|
70
|
+
/**
|
|
71
|
+
* 同 {@link idsFor},给的是定义——"指定 mode" 那条接缝要拿候选集。
|
|
72
|
+
* @param role - 目标角色。
|
|
73
|
+
* @returns 该角色下的模式与其定义。
|
|
74
|
+
*/
|
|
75
|
+
modesFor(role: SessionModeRole): {
|
|
76
|
+
id: string;
|
|
77
|
+
mode: SessionMode;
|
|
78
|
+
}[];
|
|
79
|
+
/** 页面用的清单 + 默认模式。 */
|
|
80
|
+
roster(): SessionModeRoster;
|
|
81
|
+
/** 按 id 取定义;未知 id 直接抛(切换路径上它就是用户的错)。 */
|
|
82
|
+
definition(id?: string): SessionMode;
|
|
83
|
+
/** 会话当前模式:投影上有就用它,否则是部署默认。 */
|
|
84
|
+
modeOf(session: Session): string;
|
|
85
|
+
/** 会话当前模式的定义。 */
|
|
86
|
+
modeOfSession(session: Session): SessionMode;
|
|
87
|
+
/**
|
|
88
|
+
* 把某个空白会话切到某个模式。
|
|
89
|
+
* @param sessionId - 目标会话(必须还没有开过 turn)。
|
|
90
|
+
* @param mode - 目标模式 id。
|
|
91
|
+
* @returns 提交后的模式 id。
|
|
92
|
+
*/
|
|
93
|
+
select(sessionId: SessionId, mode: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* 把某个活着的 agent 切到某个模式。与 {@link select} 的差别:它不要求空白会话——子代理创建时的继承
|
|
96
|
+
* 走这里,**未来的"指定 mode"入口(模型侧或配置侧)也走这里**(那条接缝还没做)。
|
|
97
|
+
* @param agent - 目标 agent。
|
|
98
|
+
* @param mode - 目标模式 id。
|
|
99
|
+
* @param options.record - 是否把这次切换写进会话日志(缺省写;只想改当前进程时给 `false`)。
|
|
100
|
+
*/
|
|
101
|
+
applyTo(agent: Agent, mode: string, options?: {
|
|
102
|
+
record?: boolean;
|
|
103
|
+
}): void;
|
|
104
|
+
/**
|
|
105
|
+
* 该 agent 用哪个模式:会话选过(投影上有)优先,子代理继承父,其余用部署默认。
|
|
106
|
+
*
|
|
107
|
+
* 继承要**写进子会话日志**:它是一条会话事实,冷恢复与 fork 都要靠它重建({@link modeOf} 只读投影)。
|
|
108
|
+
*/
|
|
109
|
+
private resolveModeId;
|
|
110
|
+
/** 子代理(有 durable 父会话)继承父当前模式;父不在场、或不是子代理时没有可继承的。 */
|
|
111
|
+
private inheritedModeId;
|
|
112
|
+
/** 装或换该 agent 的那一份(幂等:同一模式不重复注册)。 */
|
|
113
|
+
private installFor;
|
|
114
|
+
/**
|
|
115
|
+
* 模式的默认模型(config 顶层 `models.<模式 id>`)兜底:只在会话**尚无任何模型事实**(没选过模型、也
|
|
116
|
+
* 还没跑过请求)时接管这一请求的路由;一旦用户选过(投影 `pending`)或会话已经落过 header,就不再插手。
|
|
117
|
+
*
|
|
118
|
+
* 它是**配置事实**,不写会话事件——重启后仍由 config 决定;设置页里那条会话级选择才是会话事实。
|
|
119
|
+
*
|
|
120
|
+
* 模型取自 `config.models`:那是个 volatile 引用,设置页保存时只有**引用里的值**变,这一行不重挂,
|
|
121
|
+
* 所以每次请求都现场 `.get()`(与 `llm-openai-compatible` 读 `config.providers` 同一种读法)。
|
|
122
|
+
*/
|
|
123
|
+
private installDefaultModel;
|
|
124
|
+
/** 收口服务由 `@morlay/dsh-context-assembler/scope` 那一行发布;没装它就只有 persona。 */
|
|
125
|
+
private toolScope;
|
|
126
|
+
}
|
|
127
|
+
declare function apply(ctx: Context, config: ResolvedConfig): void;
|
|
128
|
+
//#endregion
|
|
129
|
+
export { Config, type ResolvedConfig, SESSION_MODE_PATH, type SessionMode, type SessionModeModel, type SessionModeModels, type SessionModePersona, type SessionModeRole, type SessionModeRoster, type SessionModeRow, SessionModes, apply, inject, name, sessionModeProjection };
|