@dsh-plus/lifeboat 0.2.0 → 0.2.1
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/lib/index.js +6 -6
- package/package.json +15 -15
- package/src/config.ts +2 -3
- package/src/fallback-llm.ts +9 -11
- package/src/health-api.ts +1 -1
package/lib/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { dshHomePath } from "@deepseek-ai/dsh-home-paths";
|
|
2
|
-
import { SettingsConflictError, settingsNamespace } from "@deepseek-ai/dsh-settings";
|
|
3
2
|
import z from "@deepseek-ai/schemastery";
|
|
4
3
|
import { copyFile, readFile, rename, writeFile } from "node:fs/promises";
|
|
4
|
+
import { SettingsConflictError } from "@deepseek-ai/dsh-settings";
|
|
5
5
|
import { parseDocument } from "yaml";
|
|
6
6
|
//#endregion
|
|
7
7
|
//#region src/config.ts
|
|
@@ -13,8 +13,8 @@ import { parseDocument } from "yaml";
|
|
|
13
13
|
* schema 刻意宽松:lifeboat 是最后防线,自身命名空间的数据问题绝不能让它起不来。
|
|
14
14
|
* @module lifeboat/config
|
|
15
15
|
*/
|
|
16
|
-
/** settings
|
|
17
|
-
const SETTINGS_NS =
|
|
16
|
+
/** settings 命名空间(字面量直供 settings 服务注册/读写,0.1.2-alpha.2 起编译期校验语法)。 */
|
|
17
|
+
const SETTINGS_NS = "dsh-plus-lifeboat";
|
|
18
18
|
/** 行级配置:全部有默认值,正常部署零配置。 */
|
|
19
19
|
const Config = z.object({
|
|
20
20
|
enabled: z.boolean().description("故障隔离总开关").default(true),
|
|
@@ -56,8 +56,8 @@ const JournalSchema = z.object({
|
|
|
56
56
|
* 协议推断是启发式(显式 api > 路由名 > 模型继承源 > openai-completions 兜底)。
|
|
57
57
|
* @module lifeboat/fallback-llm
|
|
58
58
|
*/
|
|
59
|
-
const NS_PI_AI =
|
|
60
|
-
const NS_AGENT_DEFAULT =
|
|
59
|
+
const NS_PI_AI = "llm-pi-ai";
|
|
60
|
+
const NS_AGENT_DEFAULT = "agent-default-model";
|
|
61
61
|
const RAW_NS_LLM_PI = "dsh-plus-llm-pi";
|
|
62
62
|
/** 官方配置路径物化的 compat 子集(其余字段降级期丢弃)。 */
|
|
63
63
|
const COMPAT_WHITELIST = ["thinkingFormat", "supportsReasoningEffort"];
|
|
@@ -454,7 +454,7 @@ function installHostWatch(ctx, q) {
|
|
|
454
454
|
* - GET /dsh-plus/lifeboat/status → journal + 翻译状态 + 当前用户 patch 层已禁用的 dsh-plus 插件
|
|
455
455
|
* - POST /dsh-plus/lifeboat/restore {name} → removeDisable + journal + 告警
|
|
456
456
|
* rc8 用户 patch 层热应用:恢复无需重启,watchUserPatches 即时重载。
|
|
457
|
-
* (0.1.2-alpha.
|
|
457
|
+
* (0.1.2-alpha.2 基线复核:用户 patch 层热应用机制保留,行为不变。)
|
|
458
458
|
* @module lifeboat/health-api
|
|
459
459
|
*/
|
|
460
460
|
const ROUTE_STATUS = "/dsh-plus/lifeboat/status";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-plus/lifeboat",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "dsh-plus service plugin: 故障救生艇——兄弟插件崩溃时自动隔离(写用户 patch 层禁用),llm-pi 缺席时把其配置临时翻译为官方 llm-pi-ai 路由,恢复后自动还原",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -30,26 +30,26 @@
|
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"yaml": "^2.
|
|
34
|
-
"@dsh-plus/shared": "0.1.
|
|
33
|
+
"yaml": "^2.9.0",
|
|
34
|
+
"@dsh-plus/shared": "0.1.7"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
38
|
-
"@deepseek-ai/dsh-home-paths": "^0.1.2-alpha.
|
|
39
|
-
"@deepseek-ai/dsh-llm": "^0.1.2-alpha.
|
|
40
|
-
"@deepseek-ai/dsh-settings": "^0.1.2-alpha.
|
|
38
|
+
"@deepseek-ai/dsh-home-paths": "^0.1.2-alpha.2",
|
|
39
|
+
"@deepseek-ai/dsh-llm": "^0.1.2-alpha.2",
|
|
40
|
+
"@deepseek-ai/dsh-settings": "^0.1.2-alpha.2",
|
|
41
41
|
"@deepseek-ai/schemastery": "^3.18.1"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@deepseek-ai/cordis": "4.0.
|
|
45
|
-
"@deepseek-ai/dsh-home-paths": "0.1.2-alpha.
|
|
46
|
-
"@deepseek-ai/dsh-host-webserver": "0.1.2-alpha.
|
|
47
|
-
"@deepseek-ai/dsh-llm": "0.1.2-alpha.
|
|
48
|
-
"@deepseek-ai/dsh-settings": "0.1.2-alpha.
|
|
49
|
-
"@deepseek-ai/schemastery": "3.18.
|
|
50
|
-
"@types/
|
|
51
|
-
"react": "
|
|
52
|
-
"
|
|
44
|
+
"@deepseek-ai/cordis": "4.0.2",
|
|
45
|
+
"@deepseek-ai/dsh-home-paths": "0.1.2-alpha.2",
|
|
46
|
+
"@deepseek-ai/dsh-host-webserver": "0.1.2-alpha.2",
|
|
47
|
+
"@deepseek-ai/dsh-llm": "0.1.2-alpha.2",
|
|
48
|
+
"@deepseek-ai/dsh-settings": "0.1.2-alpha.2",
|
|
49
|
+
"@deepseek-ai/schemastery": "3.18.2",
|
|
50
|
+
"@types/node": "26.4.0",
|
|
51
|
+
"@types/react": "~18.3.31",
|
|
52
|
+
"react": "^18.2.0"
|
|
53
53
|
},
|
|
54
54
|
"publishConfig": {
|
|
55
55
|
"access": "public"
|
package/src/config.ts
CHANGED
|
@@ -7,13 +7,12 @@
|
|
|
7
7
|
* @module lifeboat/config
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { settingsNamespace } from '@deepseek-ai/dsh-settings'
|
|
11
10
|
import z from '@deepseek-ai/schemastery'
|
|
12
11
|
|
|
13
12
|
import { SETTINGS_NS as NS_LITERAL } from './ns.ts'
|
|
14
13
|
|
|
15
|
-
/** settings
|
|
16
|
-
export const SETTINGS_NS =
|
|
14
|
+
/** settings 命名空间(字面量直供 settings 服务注册/读写,0.1.2-alpha.2 起编译期校验语法)。 */
|
|
15
|
+
export const SETTINGS_NS = NS_LITERAL
|
|
17
16
|
|
|
18
17
|
/** 行级配置:全部有默认值,正常部署零配置。 */
|
|
19
18
|
export const Config = z.object({
|
package/src/fallback-llm.ts
CHANGED
|
@@ -15,18 +15,16 @@ import { readFile } from 'node:fs/promises'
|
|
|
15
15
|
import type { Context } from '@deepseek-ai/cordis'
|
|
16
16
|
import { dshHomePath } from '@deepseek-ai/dsh-home-paths'
|
|
17
17
|
import type {} from '@deepseek-ai/dsh-llm'
|
|
18
|
-
import {
|
|
19
|
-
SettingsConflictError,
|
|
20
|
-
type SettingsProvider,
|
|
21
|
-
settingsNamespace,
|
|
22
|
-
} from '@deepseek-ai/dsh-settings'
|
|
18
|
+
import { SettingsConflictError, type SettingsProvider } from '@deepseek-ai/dsh-settings'
|
|
23
19
|
import { parseDocument } from 'yaml'
|
|
24
20
|
|
|
25
21
|
import type { FallbackStateT } from './config.ts'
|
|
26
22
|
import type { Alerter } from './notify.ts'
|
|
27
23
|
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
// 0.1.2-alpha.2 起 settings 命名空间直接以字面量使用(编译期校验语法),
|
|
25
|
+
// 不再需要 settingsNamespace() 品牌化。
|
|
26
|
+
const NS_PI_AI = 'llm-pi-ai'
|
|
27
|
+
const NS_AGENT_DEFAULT = 'agent-default-model'
|
|
30
28
|
const RAW_NS_LLM_PI = 'dsh-plus-llm-pi'
|
|
31
29
|
|
|
32
30
|
/** 翻译路由键后缀:与源路由错开,避免 llm-pi 恢复瞬间撞 DUPLICATE_ADAPTER。 */
|
|
@@ -184,9 +182,9 @@ export async function readRawSection(
|
|
|
184
182
|
}
|
|
185
183
|
|
|
186
184
|
interface SettingsWrite {
|
|
187
|
-
update(ns:
|
|
185
|
+
update(ns: string, patch: object): Promise<void>
|
|
188
186
|
mutate(
|
|
189
|
-
ns:
|
|
187
|
+
ns: string,
|
|
190
188
|
ops: readonly {
|
|
191
189
|
op: 'set' | 'unset'
|
|
192
190
|
path: readonly string[]
|
|
@@ -236,7 +234,7 @@ export function installLlmFallback(ctx: Context, deps: FallbackDeps): void {
|
|
|
236
234
|
const translated = translateProviders(providers)
|
|
237
235
|
const fbProvider = `${provider}${FALLBACK_SUFFIX}`
|
|
238
236
|
try {
|
|
239
|
-
// 官方 llm-pi-ai 的
|
|
237
|
+
// 官方 llm-pi-ai 的 installSection 注册了 validate(assertServiceable),
|
|
240
238
|
// 写时拒绝不适配的翻译结果;update 无 expectedRevision 本就无条件写,不做冲突
|
|
241
239
|
// 重试——失败一律分类为「翻译失败」。
|
|
242
240
|
await writes.update(NS_PI_AI, { providers: translated })
|
|
@@ -324,7 +322,7 @@ export function installLlmFallback(ctx: Context, deps: FallbackDeps): void {
|
|
|
324
322
|
ctx.root.on('settings/updated' as never, (ns: unknown) => {
|
|
325
323
|
if (typeof ns === 'string' && WATCHED_NS.has(ns)) run()
|
|
326
324
|
})
|
|
327
|
-
// 事件名已核对:
|
|
325
|
+
// 事件名已核对:0.1.2-alpha.2 的 dsh-llm 保留 'llm/adapters-updated'
|
|
328
326
|
// (packages/llm/llm/src/types.ts:23 module augmentation,index.ts:344 于每次
|
|
329
327
|
// adapter 注册/注销提交点 dispatch);@deepseek-ai/dsh-llm 的类型导入已携带该
|
|
330
328
|
// 声明,无需 as never。
|
package/src/health-api.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* - GET /dsh-plus/lifeboat/status → journal + 翻译状态 + 当前用户 patch 层已禁用的 dsh-plus 插件
|
|
4
4
|
* - POST /dsh-plus/lifeboat/restore {name} → removeDisable + journal + 告警
|
|
5
5
|
* rc8 用户 patch 层热应用:恢复无需重启,watchUserPatches 即时重载。
|
|
6
|
-
* (0.1.2-alpha.
|
|
6
|
+
* (0.1.2-alpha.2 基线复核:用户 patch 层热应用机制保留,行为不变。)
|
|
7
7
|
* @module lifeboat/health-api
|
|
8
8
|
*/
|
|
9
9
|
import { readFile } from 'node:fs/promises'
|