dsh-config-manager 0.1.76 → 0.1.78

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 (84) hide show
  1. package/lib/adapters/plugin-data-declared.d.ts +12 -0
  2. package/lib/adapters/plugin-data-declared.js +57 -0
  3. package/lib/adapters/plugin-data.d.ts +4 -6
  4. package/lib/adapters/plugin-data.js +8 -36
  5. package/lib/adapters/plugins.d.ts +16 -0
  6. package/lib/adapters/plugins.js +223 -16
  7. package/lib/client.d.ts +104 -9
  8. package/lib/client.js +1800 -718
  9. package/lib/core/analyzer.js +3 -1
  10. package/lib/core/backup.d.ts +9 -0
  11. package/lib/core/backup.js +16 -1
  12. package/lib/core/messages.d.ts +11 -0
  13. package/lib/core/messages.js +22 -0
  14. package/lib/core/plugin-cli.d.ts +26 -0
  15. package/lib/core/plugin-cli.js +62 -2
  16. package/lib/core/rollback-attribution.d.ts +81 -0
  17. package/lib/core/rollback-attribution.js +236 -0
  18. package/lib/core/rollback-merge.d.ts +22 -0
  19. package/lib/core/rollback-merge.js +203 -0
  20. package/lib/core/rollback-point.d.ts +114 -0
  21. package/lib/core/rollback-point.js +534 -17
  22. package/lib/core/types.d.ts +28 -0
  23. package/lib/index.d.ts +26 -3
  24. package/lib/index.js +129 -16
  25. package/lib/routes/recovery.js +11 -0
  26. package/lib/schema/section-registry.js +5 -5
  27. package/lib/schema/types.d.ts +14 -0
  28. package/lib/ui/badge-tone.d.ts +16 -0
  29. package/lib/ui/badge-tone.js +20 -0
  30. package/lib/ui/i18n.d.ts +4 -4
  31. package/lib/ui/i18n.js +8 -8
  32. package/lib/ui/rollback-view.d.ts +95 -0
  33. package/lib/ui/rollback-view.js +55 -0
  34. package/lib/ui/selection-model.d.ts +140 -1
  35. package/lib/ui/selection-model.js +241 -9
  36. package/package.json +1 -1
  37. package/src/adapters/plugin-data-declared.ts +60 -0
  38. package/src/adapters/plugin-data.ts +7 -33
  39. package/src/adapters/plugins.test.ts +162 -0
  40. package/src/adapters/plugins.ts +236 -17
  41. package/src/adapters/units.test.ts +26 -0
  42. package/src/client/chat/ChatEntryView.tsx +147 -46
  43. package/src/client/chat/chat-entry-view.test.ts +277 -1
  44. package/src/client/chat/chat-entry-view.ts +98 -4
  45. package/src/client/chat/chat-node-registration.ts +71 -0
  46. package/src/client/chat/chat-slots.ts +30 -12
  47. package/src/client/common/ContentPicker.tsx +581 -175
  48. package/src/client/common/host-primitives.ts +64 -1
  49. package/src/client/common/ui.tsx +17 -3
  50. package/src/client/config-manager.module.css +630 -397
  51. package/src/client/css-scale-guard.test.ts +41 -3
  52. package/src/client/css-token-guard.test.ts +10 -4
  53. package/src/client/export/ExportView.tsx +2 -0
  54. package/src/client/index.ts +15 -3
  55. package/src/client/locales.ts +54 -10
  56. package/src/client/recovery/RollbackCard.tsx +56 -2
  57. package/src/client/recovery/RollbackDiffPane.tsx +5 -0
  58. package/src/client/recovery/RollbackFileChanges.tsx +46 -2
  59. package/src/client/recovery/recovery-locales.ts +22 -0
  60. package/src/client/recovery/rollback-file-changes.test.ts +1 -1
  61. package/src/core/analyzer.ts +3 -1
  62. package/src/core/backup.ts +16 -1
  63. package/src/core/messages.ts +22 -0
  64. package/src/core/plugin-cli.fs.test.ts +65 -3
  65. package/src/core/plugin-cli.ts +55 -2
  66. package/src/core/rollback-attribution.test.ts +120 -0
  67. package/src/core/rollback-attribution.ts +267 -0
  68. package/src/core/rollback-merge.test.ts +133 -0
  69. package/src/core/rollback-merge.ts +213 -0
  70. package/src/core/rollback-point.test.ts +412 -0
  71. package/src/core/rollback-point.ts +560 -20
  72. package/src/core/types.ts +29 -0
  73. package/src/index.facade.test.ts +60 -0
  74. package/src/index.ts +133 -19
  75. package/src/routes/recovery.ts +11 -0
  76. package/src/schema/section-registry.ts +5 -5
  77. package/src/schema/types.ts +14 -0
  78. package/src/ui/badge-tone.test.ts +23 -0
  79. package/src/ui/badge-tone.ts +27 -0
  80. package/src/ui/i18n.ts +8 -8
  81. package/src/ui/rollback-view.test.ts +27 -0
  82. package/src/ui/rollback-view.ts +139 -0
  83. package/src/ui/selection-model.test.ts +240 -2
  84. package/src/ui/selection-model.ts +349 -1
@@ -10,6 +10,10 @@
10
10
  * 所以:只在**真要画 / 真要投影的那一刻**取,拿不到就回落本地实现。
11
11
  *
12
12
  * 该包因此不进 bundle:源码里只有 `require` 调用,白名单登记在 `src/utils/bundle-scan.ts`。
13
+ *
14
+ * 当前消费面(三样,全部「拿不到就回落本地实现」):
15
+ * ① `FileTypeIcon` —— 文件类型图标;② `projectUserText` —— 用户正文投影;
16
+ * ③ `Tag` —— 只读状态标签(2026-10-17 对齐原生:四态徽章直接吃原生调色板)。
13
17
  * 三态缓存:undefined = 还没试过;null = 试过了,这台宿主没有;对象 = 拿到了。
14
18
  */
15
19
  import type { ComponentType, ReactNode } from 'react'
@@ -36,10 +40,45 @@ export type DshUserTextProjector = (
36
40
  references?: { openFile?: unknown; openSkill?: unknown },
37
41
  ) => ReactNode
38
42
 
39
- /** 宿主原语包里我们消费的那两个导出(其余一律不碰)。 */
43
+ /**
44
+ * 宿主 `Tag` 的入参面(只声明我们传的字段):tone 选调色板,children 是已翻译文案。
45
+ * 与 ui-primitives 的 Tag.d.ts 逐字同形;className 也透传(我们一般不用)。
46
+ */
47
+ export interface DshTagProps {
48
+ tone?: 'outline' | 'solid' | 'neutral' | 'quiet' | 'success' | 'info' | 'warning' | 'danger'
49
+ className?: string
50
+ children?: ReactNode
51
+ }
52
+
53
+ /**
54
+ * 宿主图标组件的入参面(只声明我们传的字段):
55
+ * ui-primitives 的图标都是 `(props) => svg` 的普通组件,`size` 缺省 16、`strokeWidth` 由
56
+ * Artwork 决定(`…OutlineRegular` = 1px 描边),颜色走 `currentColor`。
57
+ */
58
+ export interface DshIconProps {
59
+ /** 边长(px;宿主缺省 16)。 */
60
+ size?: number
61
+ /** 追加类名(宿主组件自己的类名照旧生效)。 */
62
+ className?: string
63
+ /** 描边宽度(我们一般不动,留给宿主 Artwork 的档位)。 */
64
+ strokeWidth?: number
65
+ }
66
+
67
+ /**
68
+ * 我们真的用到的宿主图标 —— **闭集**:名字逐字对齐 ui-primitives 的导出,
69
+ * 只列这三个(复制 / 已复制 / 回退),别把整张 328 个图标的表搬进来。
70
+ */
71
+ export type DshIconName = 'IconCopyOutlineRegular' | 'IconCheckOutlineRegular' | 'IconRefreshOutlineRegular'
72
+
73
+ /** 宿主原语包里我们消费的那几个导出(其余一律不碰)。 */
40
74
  interface HostPrimitivesFace {
41
75
  FileTypeIcon?: unknown
42
76
  projectUserText?: unknown
77
+ Tag?: unknown
78
+ /** 图标(闭集,见 {@link DshIconName})。 */
79
+ IconCopyOutlineRegular?: unknown
80
+ IconCheckOutlineRegular?: unknown
81
+ IconRefreshOutlineRegular?: unknown
43
82
  }
44
83
 
45
84
  let cached: HostPrimitivesFace | null | undefined
@@ -66,6 +105,30 @@ export function hostFileTypeIcon(): ComponentType<DshFileTypeIconProps> | null {
66
105
  return null
67
106
  }
68
107
 
108
+ /**
109
+ * DSH 自带的只读标签(徽章):与宿主同一颗组件、同一套调色板,拿不到回 null
110
+ * (调用方回落本仓库的 `.badge[data-kind]` 样式)。
111
+ */
112
+ export function hostTag(): ComponentType<DshTagProps> | null {
113
+ const tag = hostPrimitives()?.Tag
114
+ if (typeof tag === 'function' || typeof tag === 'object') return tag as ComponentType<DshTagProps>
115
+ return null
116
+ }
117
+
118
+ /**
119
+ * DSH 自带的图标组件(按导出名取;拿不到回 null ⇒ 调用方回落本仓库的图标)。
120
+ *
121
+ * 为什么按名字取而不是顶层 import:与 FileTypeIcon / projectUserText 同一条纪律(老宿主没有
122
+ * 这份模块表,顶层 import 会把整个浏览器半打挂);**为什么要用宿主图标**(2026-10-17 用户要求):
123
+ * 复制按钮在 DSH 里是 `IconCopyOutlineRegular → IconCheckOutlineRegular` 的**瞬时切换**(无形变动画),
124
+ * 回退用 `IconRefreshOutlineRegular` —— 与动作行同框时字形、描边、视觉重量才与原生一致。
125
+ */
126
+ export function hostIcon(name: DshIconName): ComponentType<DshIconProps> | null {
127
+ const icon = hostPrimitives()?.[name]
128
+ if (typeof icon === 'function' || typeof icon === 'object') return icon as ComponentType<DshIconProps>
129
+ return null
130
+ }
131
+
69
132
  /** DSH 自带的用户正文投影(把会话引用/斜杠名渲染成 chip;拿不到回 null)。 */
70
133
  export function hostUserTextProjector(): DshUserTextProjector | null {
71
134
  const project = hostPrimitives()?.projectUserText
@@ -12,6 +12,8 @@
12
12
  */
13
13
  import type { ChangeEvent, CSSProperties, ReactNode } from 'react'
14
14
  import { ExpandChevron } from './Icon.tsx'
15
+ import { badgeTone, type BadgeKind } from '../../ui/badge-tone.ts'
16
+ import { hostTag } from './host-primitives.ts'
15
17
  import css from '../config-manager.module.css'
16
18
 
17
19
  /* ---------------- Button ---------------- */
@@ -185,7 +187,7 @@ export function StatusDot({ kind = 'idle', pulse }: StatusDotProps) {
185
187
 
186
188
  /* ---------------- Badge ---------------- */
187
189
 
188
- export type BadgeKind = 'info' | 'ok' | 'warn' | 'error'
190
+ export type { BadgeKind }
189
191
 
190
192
  export interface BadgeProps {
191
193
  kind?: BadgeKind
@@ -194,9 +196,21 @@ export interface BadgeProps {
194
196
  title?: string
195
197
  }
196
198
 
197
- /** 状态徽章(info=业务色 / ok=成功 / warn=警告 / error=错误)。 */
199
+ /**
200
+ * 状态徽章(info=业务色 / ok=成功 / warn=警告 / error=错误)。
201
+ *
202
+ * **优先复用宿主的 `Tag`**(DSH 原生只读标签,与设置页/插件清单里那枚同源):四态映射到
203
+ * 原生调色板的 success / info / warning / danger(映射表在 `src/ui/badge-tone.ts`,可单测)。
204
+ * 拿不到原生包(老宿主)时回落本仓库的 `.badge[data-kind]` —— 两条路径的语义由**同一张表**给出。
205
+ * 原生 Tag 没有 title 入参:需要悬停提示时套一层 inline-flex 的 wrapper,不改变布局。
206
+ */
198
207
  export function Badge({ kind = 'info', children, title }: BadgeProps) {
199
- return <span className={`${css.badge} ${css[`badge${kind[0]!.toUpperCase()}${kind.slice(1)}`] ?? ''}`} title={title}>{children}</span>
208
+ const DshTag = hostTag()
209
+ if (DshTag !== null) {
210
+ const tag = <DshTag tone={badgeTone(kind)}>{children}</DshTag>
211
+ return title === undefined ? tag : <span className={css.badgeHost} title={title}>{tag}</span>
212
+ }
213
+ return <span className={css.badge} data-kind={kind} title={title}>{children}</span>
200
214
  }
201
215
 
202
216
  /* ---------------- Banner ---------------- */