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.
Files changed (67) hide show
  1. package/CHANGELOG.ja.md +33 -229
  2. package/CHANGELOG.ko.md +33 -229
  3. package/CHANGELOG.md +33 -363
  4. package/INSTALL.ja.md +164 -164
  5. package/INSTALL.ko.md +164 -164
  6. package/INSTALL.md +164 -164
  7. package/INSTALL.zh.md +164 -164
  8. package/LICENSE +21 -21
  9. package/README.en.md +41 -46
  10. package/README.ja.md +33 -57
  11. package/README.ko.md +32 -55
  12. package/README.md +64 -64
  13. package/cordis.patch.yml +19 -16
  14. package/dsh.plugin.json +4 -4
  15. package/lib/client.js +661 -3082
  16. package/lib/index.d.ts +79 -970
  17. package/lib/index.js +249 -2669
  18. package/locale/de.json +2 -2
  19. package/locale/en.json +2 -2
  20. package/locale/es.json +2 -2
  21. package/locale/fr.json +2 -2
  22. package/locale/it.json +2 -2
  23. package/locale/ja.json +2 -2
  24. package/locale/ko.json +2 -2
  25. package/locale/ru.json +2 -2
  26. package/locale/zh.json +2 -2
  27. package/package.json +15 -25
  28. package/screenshots.json +3 -3
  29. package/src/client/bridge-scope.ts +202 -213
  30. package/src/client/card.tsx +154 -154
  31. package/src/client/health-panel.tsx +49 -49
  32. package/src/client/host-api.ts +72 -6
  33. package/src/client/index.ts +594 -503
  34. package/src/client/locales.ts +893 -893
  35. package/src/client/manage-locales.ts +178 -0
  36. package/src/client/{search/manage.tsx → manage.tsx} +430 -404
  37. package/src/client/panel.tsx +131 -129
  38. package/src/client/session-menu-legacy.ts +2 -3
  39. package/src/client/session-menu.tsx +5 -5
  40. package/src/config.ts +43 -99
  41. package/src/host/health/attribution.ts +118 -118
  42. package/src/host/health/lossless.ts +128 -128
  43. package/src/host/health/repair.ts +2 -2
  44. package/src/host/health/source-kind.ts +350 -350
  45. package/src/host/history/archive-source.ts +250 -250
  46. package/src/host/history/archive.ts +249 -249
  47. package/src/host/history/favorites.ts +71 -71
  48. package/src/host/history/purge.ts +370 -370
  49. package/src/host/history/tombstones.ts +3 -3
  50. package/src/host/registry/archive-registry.ts +317 -317
  51. package/src/host/settings-bridge.ts +222 -264
  52. package/src/index.ts +66 -694
  53. package/src/client/search/card.tsx +0 -563
  54. package/src/client/search/host-api.ts +0 -213
  55. package/src/client/search/locales.ts +0 -861
  56. package/src/client/search/locate.ts +0 -330
  57. package/src/client/search/panel.tsx +0 -940
  58. package/src/client/search/platform.ts +0 -136
  59. package/src/host/index/archive-source.ts +0 -90
  60. package/src/host/index/drs-source.ts +0 -211
  61. package/src/host/index/engine.ts +0 -699
  62. package/src/host/index/extract.ts +0 -272
  63. package/src/host/index/peers.ts +0 -62
  64. package/src/host/index/rebuild.ts +0 -432
  65. package/src/host/index/schema.ts +0 -136
  66. package/src/host/index/snapshot.ts +0 -135
  67. package/src/host/index/sync.ts +0 -413
@@ -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 './search/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 = 'dss-tab-health'
24
- export const TAB_MANAGE = 'dss-tab-manage'
25
-
26
- /** 面板入参。 */
27
- export interface StewardPanelProps {
28
- t?: PanelTranslate
29
- /** 健康检查子域是否可见。 */
30
- healthCheck: boolean
31
- /** 搜索子域是否启用(启用才有「管理」页签——它读统一索引语料)。 */
32
- searchEnabled?: boolean
33
- /** 打开会话(管理台行点击;apply 侧经 openSessionThrough 解析)。 */
34
- openSession?: (sessionId: string) => void
35
- onClose: () => void
36
- }
37
-
38
- /** 会话管家对话框。 */
39
- export function StewardPanel({ t, healthCheck, searchEnabled = false, openSession, onClose }: StewardPanelProps): ReactElement {
40
- // 主页面=管理;管理关闭时退到体检兜底。
41
- const [tab, setTab] = useState<'health' | 'manage'>(searchEnabled ? 'manage' : 'health')
42
-
43
- // 开关变化后收敛到仍然可见的页签。
44
- useEffect(() => {
45
- if (tab === 'manage' && !searchEnabled && healthCheck) setTab('health')
46
- if (tab === 'health' && !healthCheck && searchEnabled) setTab('manage')
47
- }, [tab, healthCheck, searchEnabled])
48
-
49
- useEffect(() => {
50
- const onKey = (event: KeyboardEvent): void => { if (event.key === 'Escape') onClose() }
51
- document.addEventListener('keydown', onKey)
52
- return () => { document.removeEventListener('keydown', onKey) }
53
- }, [onClose])
54
-
55
- const tabs: ReactElement[] = []
56
- if (searchEnabled) {
57
- tabs.push(createElement('button', {
58
- key: TAB_MANAGE,
59
- id: TAB_MANAGE,
60
- type: 'button',
61
- className: `dss_tab${tab === 'manage' ? ' dss_tabActive' : ''}`,
62
- 'aria-selected': tab === 'manage',
63
- onClick: () => { setTab('manage') },
64
- }, translate(t, 'panel.tab.manage')))
65
- }
66
- if (healthCheck) {
67
- tabs.push(createElement('button', {
68
- key: TAB_HEALTH,
69
- id: TAB_HEALTH,
70
- type: 'button',
71
- className: `dss_tab${tab === 'health' ? ' dss_tabActive' : ''}`,
72
- 'aria-selected': tab === 'health',
73
- onClick: () => { setTab('health') },
74
- }, translate(t, 'panel.tab.health')))
75
- }
76
-
77
- const body: ReactElement = tab === 'manage' && searchEnabled
78
- ? createElement('div', { style: { display: 'flex', flexDirection: 'column', flex: '1 1 auto', minHeight: 0 } },
79
- createElement(ManageConsole, { open: openSession ?? (() => {}) }))
80
- : tab === 'health' && healthCheck
81
- ? createElement(HealthPanel, { t, onClose })
82
- : createElement('div', { className: 'dss_empty' }, translate(t, 'card.enabled.desc'))
83
-
84
- return createPortal(createElement('div', { key: 'steward-root' }, [
85
- createElement('div', { key: 'backdrop', className: 'dss_backdrop', onClick: onClose }),
86
- createElement('div', {
87
- key: 'panel',
88
- className: 'dss_panel',
89
- role: 'dialog',
90
- 'aria-label': translate(t, 'panel.title'),
91
- style: { display: 'flex', flexDirection: 'column' },
92
- }, [
93
- createElement('div', { key: 'head', className: 'dss_dialogHead' }, [
94
- createElement('span', { key: 'title', className: 'dss_dialogTitle' }, translate(t, 'panel.title')),
95
- createElement('span', { key: 'tabs', className: 'dss_tabRow' }, tabs),
96
- createElement('button', {
97
- key: 'close',
98
- type: 'button',
99
- className: 'dss_actBtn',
100
- onClick: onClose,
101
- }, translate(t, 'panel.close')),
102
- ]),
103
- body,
104
- ]),
105
- ]), document.body)
106
- }
107
-
108
- /** 侧边栏脚部入口:宽栏带文案成行控件,收起轨道退化为 36x36 图标钮。 */
109
- export function StewardFooter(props: {
110
- onClick?: () => void
111
- title?: string
112
- label?: string
113
- wide?: boolean
114
- }): ReactElement {
115
- const wide = props.wide === true
116
- return createElement('button', {
117
- type: 'button',
118
- className: wide ? 'dss_footerEntry' : 'dss_footerEntry dss_footerEntryRail',
119
- title: props.title,
120
- 'aria-label': props.title,
121
- onClick: props.onClick,
122
- }, [
123
- createElement('span', { key: 'icon', className: 'dss_footerIcon', 'aria-hidden': true }, '🧭'),
124
- // 收起轨道里 36px 装不下文案,标签与宽栏同条件出现,与搜索入口一致。
125
- wide && props.label !== undefined
126
- ? createElement('span', { key: 'label', className: 'dss_footerLabel' }, props.label)
127
- : null,
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 { callHostAny, callSteward, type HostIndexStatus } from './search/host-api.ts'
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
- const res = await callHostAny<HostIndexStatus>('index-status', {})
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
- * 可见性:行挂载时探针 index-status.directDelete(管家开关,缺省关)——
12
+ * 可见性:行挂载时探针 `session-health-status.switches.directDelete`(管理开关,缺省关)——
13
13
  * 非 true(含探针失败/旧宿主半无字段)整行不渲染;两步确认与管理端/面板
14
14
  * 同款(第一击上弦变红「确认删除」,第二击执行;点其它处菜单收起即解弦)。
15
15
  */
16
16
  import { createElement, useEffect, useState } from 'react'
17
- import { callHostAny, callSteward, type HostIndexStatus } from './search/host-api.ts'
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-steward.delete'
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
- callHostAny<HostIndexStatus>('index-status', {})
54
- .then((res) => { if (!disposed) setVisible(menuDeleteVisible((res as HostIndexStatus).directDelete)) })
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
- * - `session-steward` —— 管家子域(enabled/historyFiles/healthCheck/search 等共享键);
9
- * - `switch-search` —— 搜索子域的历史命名空间,存储键承诺保持稳定(见
10
- * dsh-search-index README「存储键保持稳定,不做迁移」);0.1.7 起两者实际
11
- * 都落在同一 composition entry(configForms),旧宿主才按命名空间分流。
12
- */
13
-
14
- /** 会话管家运行时配置(设置命名空间 + 组合入口)。 */
15
- export interface StewardConfig {
16
- /** 插件总开关(合并包唯一 master:关闭后不注册任何子域路由)。 */
17
- enabled: boolean
18
- /** 会话历史文件(归档浏览与清理)。关闭后不注册 history 路由、不渲染「养老院」页签。 */
19
- historyFiles?: boolean
20
- /** 会话健康检查(体检 → 处方 → 出院)。关闭后不注册 health 路由、不渲染「体检」页签。 */
21
- healthCheck?: boolean
22
- /** 搜索索引子域(`index-*` 路由与侧栏搜索入口)。关闭后索引子域整体停摆。 */
23
- search?: boolean
24
- /**
25
- * 直接删除入口(2026-10-20 用户定标):开启后搜索面板结果行出现行内
26
- * 「删除」按钮(两步确认,走管理端同款 session-history-purge 链路)。
27
- * **缺省关**——破坏性入口不默认铺开;管理端批量删除不受本开关限制。
28
- */
29
- directDelete?: boolean
30
- }
31
-
32
- /** 缺省值。 */
33
- export const DEFAULT_CONFIG: Required<StewardConfig> = {
34
- enabled: true,
35
- historyFiles: true,
36
- healthCheck: true,
37
- search: true,
38
- directDelete: false,
39
- }
40
-
41
- /** host 半身注册的设置命名空间(与 src/index.ts 保持一致)。 */
42
- export const STEWARD_SETTINGS_NAMESPACE = 'session-steward'
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'