dsh-manage-session 0.5.7 → 2.0.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/CHANGELOG.ja.md +33 -229
- package/CHANGELOG.ko.md +33 -229
- package/CHANGELOG.md +33 -363
- package/INSTALL.ja.md +164 -164
- package/INSTALL.ko.md +164 -164
- package/INSTALL.md +164 -164
- package/INSTALL.zh.md +164 -164
- package/LICENSE +21 -21
- package/README.en.md +41 -46
- package/README.ja.md +33 -57
- package/README.ko.md +32 -55
- package/README.md +64 -64
- package/cordis.patch.yml +19 -16
- package/dsh.plugin.json +4 -4
- package/lib/client.js +661 -3082
- package/lib/index.d.ts +79 -970
- package/lib/index.js +249 -2669
- package/locale/de.json +2 -2
- package/locale/en.json +2 -2
- package/locale/es.json +2 -2
- package/locale/fr.json +2 -2
- package/locale/it.json +2 -2
- package/locale/ja.json +2 -2
- package/locale/ko.json +2 -2
- package/locale/ru.json +2 -2
- package/locale/zh.json +2 -2
- package/package.json +15 -25
- package/screenshots.json +3 -3
- package/src/client/bridge-scope.ts +202 -213
- package/src/client/card.tsx +154 -154
- package/src/client/health-panel.tsx +49 -49
- package/src/client/host-api.ts +72 -6
- package/src/client/index.ts +594 -503
- package/src/client/locales.ts +893 -893
- package/src/client/manage-locales.ts +178 -0
- package/src/client/{search/manage.tsx → manage.tsx} +430 -404
- package/src/client/panel.tsx +131 -129
- package/src/client/session-menu-legacy.ts +2 -3
- package/src/client/session-menu.tsx +5 -5
- package/src/config.ts +43 -99
- package/src/host/health/attribution.ts +118 -118
- package/src/host/health/lossless.ts +128 -128
- package/src/host/health/repair.ts +2 -2
- package/src/host/health/source-kind.ts +350 -350
- package/src/host/history/archive-source.ts +250 -250
- package/src/host/history/archive.ts +249 -249
- package/src/host/history/favorites.ts +71 -71
- package/src/host/history/purge.ts +370 -370
- package/src/host/history/tombstones.ts +3 -3
- package/src/host/registry/archive-registry.ts +317 -317
- package/src/host/settings-bridge.ts +222 -264
- package/src/index.ts +66 -694
- package/src/client/search/card.tsx +0 -563
- package/src/client/search/host-api.ts +0 -213
- package/src/client/search/locales.ts +0 -861
- package/src/client/search/locate.ts +0 -330
- package/src/client/search/panel.tsx +0 -940
- package/src/client/search/platform.ts +0 -136
- package/src/host/index/archive-source.ts +0 -90
- package/src/host/index/drs-source.ts +0 -211
- package/src/host/index/engine.ts +0 -699
- package/src/host/index/extract.ts +0 -272
- package/src/host/index/peers.ts +0 -62
- package/src/host/index/rebuild.ts +0 -432
- package/src/host/index/schema.ts +0 -136
- package/src/host/index/snapshot.ts +0 -135
- package/src/host/index/sync.ts +0 -413
package/src/client/panel.tsx
CHANGED
|
@@ -1,129 +1,131 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* 2026-10-20 页面调整(用户定标):「养老院」页签取消——管理台已覆盖其全部
|
|
5
|
-
* 动作面(archive/unarchive/purge + 归档域筛选),独立页签属重复入口;
|
|
6
|
-
* 历史文件组件(history-panel.tsx)随摘除,宿主侧 history 路由与配置字段
|
|
7
|
-
* (historyFiles)保留不动,字典键留用以备回迁。
|
|
8
|
-
*
|
|
9
|
-
* 页签可见性由开关决定:`search=false` 时「管理」消失(退到体检),
|
|
10
|
-
* `healthCheck=false` 时「体检」消失;两者都关时进入面板直接显示空壳提示
|
|
11
|
-
* (客户端也会隐藏入口)。
|
|
12
|
-
*/
|
|
13
|
-
import { createElement, useEffect, useState, type ReactElement } from 'react'
|
|
14
|
-
import { createPortal } from 'react-dom'
|
|
15
|
-
import { HealthPanel } from './health-panel.tsx'
|
|
16
|
-
import { ManageConsole } from './
|
|
17
|
-
import { translate, type LocaleKey } from './locales.ts'
|
|
18
|
-
|
|
19
|
-
/** 面板字典面。 */
|
|
20
|
-
export type PanelTranslate = (key: LocaleKey, params?: Record<string, unknown>) => string
|
|
21
|
-
|
|
22
|
-
/** 页签 id(导出供测试断言)。 */
|
|
23
|
-
export const TAB_HEALTH = '
|
|
24
|
-
export const TAB_MANAGE = '
|
|
25
|
-
|
|
26
|
-
/** 面板入参。 */
|
|
27
|
-
export interface StewardPanelProps {
|
|
28
|
-
t?: PanelTranslate
|
|
29
|
-
/**
|
|
30
|
-
healthCheck: boolean
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
if (healthCheck) {
|
|
67
|
-
tabs.push(createElement('button', {
|
|
68
|
-
key: TAB_HEALTH,
|
|
69
|
-
id: TAB_HEALTH,
|
|
70
|
-
type: 'button',
|
|
71
|
-
className: `
|
|
72
|
-
'aria-selected': tab === 'health',
|
|
73
|
-
onClick: () => { setTab('health') },
|
|
74
|
-
}, translate(t, 'panel.tab.health')))
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const body: ReactElement = tab === 'manage'
|
|
78
|
-
? createElement('div', { style: { display: 'flex', flexDirection: 'column', flex: '1 1 auto', minHeight: 0 } },
|
|
79
|
-
createElement(ManageConsole, { open: openSession ?? (() => {}) }))
|
|
80
|
-
:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
'
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
'
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 会话管理面板壳:一个侧边栏入口,两个页签(管理=主页面 / 体检=备用)。
|
|
3
|
+
*
|
|
4
|
+
* 2026-10-20 页面调整(用户定标):「养老院」页签取消——管理台已覆盖其全部
|
|
5
|
+
* 动作面(archive/unarchive/purge + 归档域筛选),独立页签属重复入口;
|
|
6
|
+
* 历史文件组件(history-panel.tsx)随摘除,宿主侧 history 路由与配置字段
|
|
7
|
+
* (historyFiles)保留不动,字典键留用以备回迁。
|
|
8
|
+
*
|
|
9
|
+
* 页签可见性由开关决定:`search=false` 时「管理」消失(退到体检),
|
|
10
|
+
* `healthCheck=false` 时「体检」消失;两者都关时进入面板直接显示空壳提示
|
|
11
|
+
* (客户端也会隐藏入口)。
|
|
12
|
+
*/
|
|
13
|
+
import { createElement, useEffect, useState, type ReactElement } from 'react'
|
|
14
|
+
import { createPortal } from 'react-dom'
|
|
15
|
+
import { HealthPanel } from './health-panel.tsx'
|
|
16
|
+
import { ManageConsole } from './manage.tsx'
|
|
17
|
+
import { translate, type LocaleKey } from './locales.ts'
|
|
18
|
+
|
|
19
|
+
/** 面板字典面。 */
|
|
20
|
+
export type PanelTranslate = (key: LocaleKey, params?: Record<string, unknown>) => string
|
|
21
|
+
|
|
22
|
+
/** 页签 id(导出供测试断言)。 */
|
|
23
|
+
export const TAB_HEALTH = 'dms-tab-health'
|
|
24
|
+
export const TAB_MANAGE = 'dms-tab-manage'
|
|
25
|
+
|
|
26
|
+
/** 面板入参。 */
|
|
27
|
+
export interface StewardPanelProps {
|
|
28
|
+
t?: PanelTranslate
|
|
29
|
+
/** 健康检查子域是否可见(关掉只剩管理页签)。 */
|
|
30
|
+
healthCheck: boolean
|
|
31
|
+
/** 打开会话(管理台行点击;apply 侧经 openSessionThrough 解析)。 */
|
|
32
|
+
openSession?: (sessionId: string) => void
|
|
33
|
+
onClose: () => void
|
|
34
|
+
/**
|
|
35
|
+
* 壳形态:`dialog`(缺省)= 背景遮罩上的浮动对话框(底栏入口用);
|
|
36
|
+
* `page` = 填满主栏的整页(顶栏工具行入口用,无遮罩 / 无圆角阴影)。
|
|
37
|
+
*/
|
|
38
|
+
variant?: 'dialog' | 'page'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 会话管理对话框 / 整页。 */
|
|
42
|
+
export function StewardPanel({ t, healthCheck, openSession, onClose, variant = 'dialog' }: StewardPanelProps): ReactElement {
|
|
43
|
+
// 主页面=管理(会话管理台);体检是备用页签。
|
|
44
|
+
const [tab, setTab] = useState<'health' | 'manage'>('manage')
|
|
45
|
+
|
|
46
|
+
// 开关变化后收敛到仍然可见的页签(体检关掉→回管理)。
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (tab === 'health' && !healthCheck) setTab('manage')
|
|
49
|
+
}, [tab, healthCheck])
|
|
50
|
+
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
const onKey = (event: KeyboardEvent): void => { if (event.key === 'Escape') onClose() }
|
|
53
|
+
document.addEventListener('keydown', onKey)
|
|
54
|
+
return () => { document.removeEventListener('keydown', onKey) }
|
|
55
|
+
}, [onClose])
|
|
56
|
+
|
|
57
|
+
const tabs: ReactElement[] = []
|
|
58
|
+
tabs.push(createElement('button', {
|
|
59
|
+
key: TAB_MANAGE,
|
|
60
|
+
id: TAB_MANAGE,
|
|
61
|
+
type: 'button',
|
|
62
|
+
className: `dms_tab${tab === 'manage' ? ' dms_tabActive' : ''}`,
|
|
63
|
+
'aria-selected': tab === 'manage',
|
|
64
|
+
onClick: () => { setTab('manage') },
|
|
65
|
+
}, translate(t, 'panel.tab.manage')))
|
|
66
|
+
if (healthCheck) {
|
|
67
|
+
tabs.push(createElement('button', {
|
|
68
|
+
key: TAB_HEALTH,
|
|
69
|
+
id: TAB_HEALTH,
|
|
70
|
+
type: 'button',
|
|
71
|
+
className: `dms_tab${tab === 'health' ? ' dms_tabActive' : ''}`,
|
|
72
|
+
'aria-selected': tab === 'health',
|
|
73
|
+
onClick: () => { setTab('health') },
|
|
74
|
+
}, translate(t, 'panel.tab.health')))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const body: ReactElement = tab === 'manage'
|
|
78
|
+
? createElement('div', { style: { display: 'flex', flexDirection: 'column', flex: '1 1 auto', minHeight: 0 } },
|
|
79
|
+
createElement(ManageConsole, { open: openSession ?? (() => {}) }))
|
|
80
|
+
: createElement(HealthPanel, { t, onClose })
|
|
81
|
+
|
|
82
|
+
const panelEl = createElement('div', {
|
|
83
|
+
key: 'panel',
|
|
84
|
+
className: variant === 'page' ? 'dms_panel dms_panelPage' : 'dms_panel',
|
|
85
|
+
role: variant === 'page' ? 'region' : 'dialog',
|
|
86
|
+
'aria-label': translate(t, 'panel.title'),
|
|
87
|
+
style: { display: 'flex', flexDirection: 'column' },
|
|
88
|
+
}, [
|
|
89
|
+
createElement('div', { key: 'head', className: 'dms_dialogHead' }, [
|
|
90
|
+
createElement('span', { key: 'title', className: 'dms_dialogTitle' }, translate(t, 'panel.title')),
|
|
91
|
+
createElement('span', { key: 'tabs', className: 'dms_tabRow' }, tabs),
|
|
92
|
+
createElement('button', {
|
|
93
|
+
key: 'close',
|
|
94
|
+
type: 'button',
|
|
95
|
+
className: 'dms_actBtn',
|
|
96
|
+
onClick: onClose,
|
|
97
|
+
}, translate(t, 'panel.close')),
|
|
98
|
+
]),
|
|
99
|
+
body,
|
|
100
|
+
])
|
|
101
|
+
|
|
102
|
+
// 整页形态直接占用主栏(宿主已给页容器,不再叠遮罩 / 传送门)。
|
|
103
|
+
if (variant === 'page') return panelEl
|
|
104
|
+
return createPortal(createElement('div', { key: 'steward-root' }, [
|
|
105
|
+
createElement('div', { key: 'backdrop', className: 'dms_backdrop', onClick: onClose }),
|
|
106
|
+
panelEl,
|
|
107
|
+
]), document.body)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** 侧边栏脚部入口:宽栏带文案成行控件,收起轨道退化为 36x36 图标钮。 */
|
|
111
|
+
export function StewardFooter(props: {
|
|
112
|
+
onClick?: () => void
|
|
113
|
+
title?: string
|
|
114
|
+
label?: string
|
|
115
|
+
wide?: boolean
|
|
116
|
+
}): ReactElement {
|
|
117
|
+
const wide = props.wide === true
|
|
118
|
+
return createElement('button', {
|
|
119
|
+
type: 'button',
|
|
120
|
+
className: wide ? 'dms_footerEntry' : 'dms_footerEntry dms_footerEntryRail',
|
|
121
|
+
title: props.title,
|
|
122
|
+
'aria-label': props.title,
|
|
123
|
+
onClick: props.onClick,
|
|
124
|
+
}, [
|
|
125
|
+
createElement('span', { key: 'icon', className: 'dms_footerIcon', 'aria-hidden': true }, '🧭'),
|
|
126
|
+
// 收起轨道里 36px 装不下文案,标签与宽栏同条件出现,与搜索入口一致。
|
|
127
|
+
wide && props.label !== undefined
|
|
128
|
+
? createElement('span', { key: 'label', className: 'dms_footerLabel' }, props.label)
|
|
129
|
+
: null,
|
|
130
|
+
])
|
|
131
|
+
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 纪律:全程 best-effort、任何异常吞掉绝不影响宿主;仅在 directDelete=true 时
|
|
15
15
|
* 注入(缺省关,破坏性入口不默认铺开)。fiber 取 id 失败即放弃该行(不伪造)。
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { callSteward, probeDirectDelete } from './host-api.ts'
|
|
18
18
|
import { dictionaries, type LocaleKey } from './locales.ts'
|
|
19
19
|
|
|
20
20
|
/** dedup 标记(与 session-menu.tsx 席位行同串)。 */
|
|
@@ -233,8 +233,7 @@ export function makeDirectDeleteProbe(): () => Promise<boolean> {
|
|
|
233
233
|
if (Date.now() - at < 30_000) return cached
|
|
234
234
|
at = Date.now()
|
|
235
235
|
try {
|
|
236
|
-
|
|
237
|
-
cached = (res as Partial<HostIndexStatus>).directDelete === true
|
|
236
|
+
cached = (await probeDirectDelete()) === true
|
|
238
237
|
} catch {
|
|
239
238
|
cached = false
|
|
240
239
|
}
|
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
* 本臂 order=500(末位,破坏性动作不抢位)。老线(≤0.1.5)inject 静默等待
|
|
10
10
|
* 无害;删除入口在老线仍由搜索面板行内按钮承担(同一 purge 链路)。
|
|
11
11
|
*
|
|
12
|
-
* 可见性:行挂载时探针
|
|
12
|
+
* 可见性:行挂载时探针 `session-health-status.switches.directDelete`(管理开关,缺省关)——
|
|
13
13
|
* 非 true(含探针失败/旧宿主半无字段)整行不渲染;两步确认与管理端/面板
|
|
14
14
|
* 同款(第一击上弦变红「确认删除」,第二击执行;点其它处菜单收起即解弦)。
|
|
15
15
|
*/
|
|
16
16
|
import { createElement, useEffect, useState } from 'react'
|
|
17
|
-
import {
|
|
17
|
+
import { callSteward, probeDirectDelete } from './host-api.ts'
|
|
18
18
|
import { TRASH_ICON_SVG } from './session-menu-legacy.ts'
|
|
19
19
|
|
|
20
20
|
/** 宿主菜单席位名(0.1.7+ 存在)。 */
|
|
21
21
|
export const SESSION_MENU_SEAT = 'sidebar.workspaces.session.menu.item'
|
|
22
22
|
/** 本行注册 id(包名空间,避免遮蔽宿主行)。 */
|
|
23
|
-
export const SESSION_MENU_DELETE_ID = 'dsh-session
|
|
23
|
+
export const SESSION_MENU_DELETE_ID = 'dsh-manage-session.delete'
|
|
24
24
|
/** 落位序:宿主末行 session-id(450) 之后。 */
|
|
25
25
|
export const SESSION_MENU_DELETE_ORDER = 500
|
|
26
26
|
|
|
@@ -50,8 +50,8 @@ export function StewardDeleteMenuItem(props: StewardMenuDeleteProps) {
|
|
|
50
50
|
const openState = typeof useMenuOpenState === 'function' ? useMenuOpenState() : undefined
|
|
51
51
|
useEffect(() => {
|
|
52
52
|
let disposed = false
|
|
53
|
-
|
|
54
|
-
.then((
|
|
53
|
+
void probeDirectDelete()
|
|
54
|
+
.then((enabled) => { if (!disposed) setVisible(menuDeleteVisible(enabled)) })
|
|
55
55
|
.catch(() => { if (!disposed) setVisible(false) })
|
|
56
56
|
return () => { disposed = true }
|
|
57
57
|
}, [])
|
package/src/config.ts
CHANGED
|
@@ -1,99 +1,43 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* dsh-manage-session
|
|
3
|
-
*
|
|
4
|
-
* 与 host 半身(schemastery schema 在 src/index.ts)以及浏览器半身共用同一形状,
|
|
5
|
-
* 使一处 admitted 的值在另一处也 admitted。
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - `
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
/** 侧边栏入口 id(客户端注册 id)。 */
|
|
45
|
-
export const STEWARD_ENTRY_ID = 'dsh-manage-session'
|
|
46
|
-
|
|
47
|
-
/** host 路由前缀(管家子域;与搜索子域的 /switch-search/api 互不干扰)。 */
|
|
48
|
-
export const STEWARD_API_PREFIX = '/session-steward/api'
|
|
49
|
-
|
|
50
|
-
/** ------------------------------------------------------------------ 搜索子域 */
|
|
51
|
-
|
|
52
|
-
/** 搜索子域的历史设置命名空间(存储键稳定承诺,永不迁移)。 */
|
|
53
|
-
export const SWITCH_SEARCH_SETTINGS_NAMESPACE = 'switch-search'
|
|
54
|
-
|
|
55
|
-
/** 搜索子域路由前缀(历史值,浏览器旧 bundle 与快照文件名依赖它,保持不变)。 */
|
|
56
|
-
export const SWITCH_API_PREFIX = '/switch-search/api'
|
|
57
|
-
|
|
58
|
-
/** 搜索面板打开时的默认模式。 */
|
|
59
|
-
export type SwitchSearchDefaultMode = 'title' | 'content'
|
|
60
|
-
|
|
61
|
-
/** 搜索子域可调配置(独立于 StewardConfig 的历史形状,字段名保持稳定)。 */
|
|
62
|
-
export interface SwitchSearchConfig {
|
|
63
|
-
/**
|
|
64
|
-
* 搜索卡上的「启用」开关。合并包里它与管家 `enabled` 是**同一个**组合入口
|
|
65
|
-
* 字段(0.1.7 configForms 单 scope);保留在此处是为了 legacy settingsScope
|
|
66
|
-
* 回退路径(旧 switch-search 命名空间的存储形状)与设置卡类型不变。
|
|
67
|
-
*/
|
|
68
|
-
enabled?: boolean
|
|
69
|
-
/** 面板默认模式。 */
|
|
70
|
-
defaultMode: SwitchSearchDefaultMode
|
|
71
|
-
/** 独立索引是否后台自动同步(水位轮询)。 */
|
|
72
|
-
autoSync?: boolean
|
|
73
|
-
/** 增量同步间隔(ms)。 */
|
|
74
|
-
syncIntervalMs?: number
|
|
75
|
-
/** 整理索引后保留的归档份数。 */
|
|
76
|
-
archiveKeep?: number
|
|
77
|
-
/** 独立索引文件的可选绝对目录。 */
|
|
78
|
-
indexDir?: string
|
|
79
|
-
/**
|
|
80
|
-
* 语料源(T7.1):`'native'`=sessionQuery 服务 + 转录文件兜底(缺省);
|
|
81
|
-
* `'drs'`=dsh-reference-session-collector 投影库(docs 直插;DRS 不可达时整轮
|
|
82
|
-
* 回退 native 链路,水位语义切换的首轮会全量重灌一次)。
|
|
83
|
-
*/
|
|
84
|
-
corpusSource?: 'native' | 'drs'
|
|
85
|
-
/** DRS 投影库 API 基址;空=自动(首个 trustedHosts 条目,再退 http://127.0.0.1:8080)。 */
|
|
86
|
-
drsBaseUrl?: string
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/** 搜索子域缺省值。 */
|
|
90
|
-
export const SWITCH_DEFAULT_CONFIG: Required<SwitchSearchConfig> = {
|
|
91
|
-
enabled: true,
|
|
92
|
-
defaultMode: 'title',
|
|
93
|
-
autoSync: true,
|
|
94
|
-
syncIntervalMs: 30_000,
|
|
95
|
-
archiveKeep: 2,
|
|
96
|
-
indexDir: '',
|
|
97
|
-
corpusSource: 'native',
|
|
98
|
-
drsBaseUrl: '',
|
|
99
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* dsh-manage-session 的共享配置面(会话管理器:归档 + 体检)。
|
|
3
|
+
*
|
|
4
|
+
* 与 host 半身(schemastery schema 在 src/index.ts)以及浏览器半身共用同一形状,
|
|
5
|
+
* 使一处 admitted 的值在另一处也 admitted。
|
|
6
|
+
*
|
|
7
|
+
* 设置命名空间只有一个:`manage-session`(enabled/historyFiles/healthCheck/directDelete)。
|
|
8
|
+
* 搜索/索引子域已拆回 dsh-search-index,本包不再持有 `search` 开关、索引目录、
|
|
9
|
+
* 语料源(DRS)等字段——DRS 依赖也随搜索一起迁回那边。
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** 会话管理运行时配置(设置命名空间 + 组合入口)。 */
|
|
13
|
+
export interface StewardConfig {
|
|
14
|
+
/** 插件总开关(关闭后不注册任何子域路由)。 */
|
|
15
|
+
enabled: boolean
|
|
16
|
+
/** 会话历史文件(归档浏览与清理)。关闭后不注册 history 路由。 */
|
|
17
|
+
historyFiles?: boolean
|
|
18
|
+
/** 会话健康检查(体检 → 处方 → 出院)。关闭后不注册 health 路由、不渲染「体检」页签。 */
|
|
19
|
+
healthCheck?: boolean
|
|
20
|
+
/**
|
|
21
|
+
* 直接删除入口(2026-10-20 用户定标):开启后侧栏会话菜单出现「删除」行
|
|
22
|
+
* (两步确认,走管理端同款 session-history-purge 链路)。
|
|
23
|
+
* **缺省关**——破坏性入口不默认铺开;管理端批量删除不受本开关限制。
|
|
24
|
+
*/
|
|
25
|
+
directDelete?: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** 缺省值。 */
|
|
29
|
+
export const DEFAULT_CONFIG: Required<StewardConfig> = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
historyFiles: true,
|
|
32
|
+
healthCheck: true,
|
|
33
|
+
directDelete: false,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** host 半身注册的设置命名空间(与 src/index.ts 保持一致)。 */
|
|
37
|
+
export const STEWARD_SETTINGS_NAMESPACE = 'manage-session'
|
|
38
|
+
|
|
39
|
+
/** 侧边栏入口 id(客户端注册 id)。 */
|
|
40
|
+
export const STEWARD_ENTRY_ID = 'dsh-manage-session'
|
|
41
|
+
|
|
42
|
+
/** host 路由前缀(管理 + 体检,方法名一律 `session-*`)。 */
|
|
43
|
+
export const STEWARD_API_PREFIX = '/manage-session/api'
|