@morlay/dsh-client-ui-primitives 0.0.12 → 0.0.14-alpha.0

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/dist/client.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_client = require("./client-Ngzv0PL1.cjs");
3
- const require_reference = require("./reference-hchCWm3z.cjs");
2
+ const require_client = require("./client-DQVzIDP3.cjs");
3
+ const require_reference = require("./reference-BExb65Ah.cjs");
4
4
  exports.Bubble = require_client.Bubble;
5
5
  exports.Button = require_client.Button;
6
6
  exports.DisclosureRow = require_client.DisclosureRow;
package/dist/client.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-AMHtcyMt.mjs";
2
- import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-BX54bj6_.mjs";
1
+ import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-DWlN5aPg.mjs";
2
+ import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-Bnz5fGkr.mjs";
3
3
  export * from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  export { Bubble, type BubbleProps, Button, type ButtonProps, type ButtonTone, DisclosureRow, type DisclosureRowProps, type FieldMeta, type FieldNode, IconButton, type IconButtonProps, type LayoutAlign, type LayoutGap, type LayoutJustify, type LayoutPad, MarkdownCopySeat, type ModelRouteCandidate, ModelRouteList, type ModelRouteListProps, MultilineField, type MultilineFieldProps, type Reference, type ReferenceActions, ReferenceMarkdown, type ReferenceMarkdownProps, type ReferenceSpan, Row, type RowProps, NS as SCHEMA_FORM_NS, type SchemaFormActions, SchemaFormController, type SchemaFormFace, SchemaFormHints, type SchemaFormLocaleKey, type SchemaFormState, SearchSelect, type SearchSelectOption, type SearchSelectProps, SeatButton, type SeatButtonProps, type SelectOption, type SelectSpec, SettingsFieldRow, type SettingsFieldRowProps, Spinner, type SpinnerProps, Stack, type StackProps, type SuggestedKeys, TagInput, type TagInputProps, Text, type TextProps, type TextSize, type TextTone, TimeLabel, type TimeLabelProps, type ValidationFailure, VisuallyHidden, type VisuallyHiddenProps, type WalkedField, apply, failureOf, findReferences, formatReference, formatReferenceMention, inject, isLocalReference, markdownLabels, mergeTags, parseReference, parseReferenceToken, parseTagList, projectRoot, referenceMentions, rowRegistrations, index_d_exports as schemaForm, walkFields };
package/dist/client.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-AMHtcyMt.mjs";
2
- import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-BX54bj6_.mjs";
1
+ import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-DWlN5aPg.mjs";
2
+ import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-Bnz5fGkr.mjs";
3
3
  export * from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  export { Bubble, type BubbleProps, Button, type ButtonProps, type ButtonTone, DisclosureRow, type DisclosureRowProps, type FieldMeta, type FieldNode, IconButton, type IconButtonProps, type LayoutAlign, type LayoutGap, type LayoutJustify, type LayoutPad, MarkdownCopySeat, type ModelRouteCandidate, ModelRouteList, type ModelRouteListProps, MultilineField, type MultilineFieldProps, type Reference, type ReferenceActions, ReferenceMarkdown, type ReferenceMarkdownProps, type ReferenceSpan, Row, type RowProps, NS as SCHEMA_FORM_NS, type SchemaFormActions, SchemaFormController, type SchemaFormFace, SchemaFormHints, type SchemaFormLocaleKey, type SchemaFormState, SearchSelect, type SearchSelectOption, type SearchSelectProps, SeatButton, type SeatButtonProps, type SelectOption, type SelectSpec, SettingsFieldRow, type SettingsFieldRowProps, Spinner, type SpinnerProps, Stack, type StackProps, type SuggestedKeys, TagInput, type TagInputProps, Text, type TextProps, type TextSize, type TextTone, TimeLabel, type TimeLabelProps, type ValidationFailure, VisuallyHidden, type VisuallyHiddenProps, type WalkedField, apply, failureOf, findReferences, formatReference, formatReferenceMention, inject, isLocalReference, markdownLabels, mergeTags, parseReference, parseReferenceToken, parseTagList, projectRoot, referenceMentions, rowRegistrations, index_d_exports as schemaForm, walkFields };
package/dist/client.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as failureOf, C as markdownLabels, D as SchemaFormHints, E as rowRegistrations, O as SchemaFormController, S as Row, T as schema_form_exports, _ as Button, a as TagInput, b as Text, c as SearchSelect, d as IconButton, f as VisuallyHidden, g as DisclosureRow, h as SeatButton, i as referenceMentions, j as walkFields, k as projectRoot, l as MultilineField, m as Spinner, n as inject, o as mergeTags, p as TimeLabel, r as ReferenceMarkdown, s as parseTagList, t as apply, u as ModelRouteList, v as Bubble, w as NS, x as Stack, y as SettingsFieldRow } from "./client-BunyBylj.mjs";
2
- import { a as parseReference, i as isLocalReference, n as formatReference, o as parseReferenceToken, r as formatReferenceMention, t as findReferences } from "./reference-Cjcn21uW.mjs";
1
+ import { A as failureOf, C as markdownLabels, D as SchemaFormHints, E as rowRegistrations, O as SchemaFormController, S as Row, T as schema_form_exports, _ as Button, a as TagInput, b as Text, c as SearchSelect, d as IconButton, f as VisuallyHidden, g as DisclosureRow, h as SeatButton, i as referenceMentions, j as walkFields, k as projectRoot, l as MultilineField, m as Spinner, n as inject, o as mergeTags, p as TimeLabel, r as ReferenceMarkdown, s as parseTagList, t as apply, u as ModelRouteList, v as Bubble, w as NS, x as Stack, y as SettingsFieldRow } from "./client-BedkS2tw.mjs";
2
+ import { a as parseReference, i as isLocalReference, n as formatReference, o as parseReferenceToken, r as formatReferenceMention, t as findReferences } from "./reference-DTa9OfbR.mjs";
3
3
  export * from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  export { Bubble, Button, DisclosureRow, IconButton, ModelRouteList, MultilineField, ReferenceMarkdown, Row, NS as SCHEMA_FORM_NS, SchemaFormController, SchemaFormHints, SearchSelect, SeatButton, SettingsFieldRow, Spinner, Stack, TagInput, Text, TimeLabel, VisuallyHidden, apply, failureOf, findReferences, formatReference, formatReferenceMention, inject, isLocalReference, markdownLabels, mergeTags, parseReference, parseReferenceToken, parseTagList, projectRoot, referenceMentions, rowRegistrations, schema_form_exports as schemaForm, walkFields };
@@ -1,4 +1,4 @@
1
- import { t as Reference } from "./reference-BX54bj6_.mjs";
1
+ import { t as Reference } from "./reference-Bnz5fGkr.mjs";
2
2
  import { Context, Service } from "@deepseek-ai/cordis";
3
3
  import { Button, DisclosureRow, MarkdownFileMentions, MarkdownLabels, MarkdownLabels as MarkdownLabels$1, MarkdownPathImages, SettingsFormShell } from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  import { ButtonHTMLAttributes, ComponentProps, ElementType, HTMLAttributes, ReactNode, TextareaHTMLAttributes } from "react";
@@ -6,12 +6,8 @@ import { PropsRuntime, TranslateNS } from "@deepseek-ai/dsh-client-ui-slots";
6
6
  import { BundleInfo, SettingsNamespaceView } from "@deepseek-ai/dsh-api-remotes/client";
7
7
  import { SnapshotStore } from "@deepseek-ai/dsh-client-store";
8
8
  import { ConfigForm, SchemaNode, SettingsDescribeFace } from "@deepseek-ai/dsh-client-ui-settings/client";
9
- //#endregion
10
- //#region src/client/markdown-labels.d.ts
11
9
  type MarkdownCopySeat = (key: "copy" | "copied" | "markdown.footnotes") => string;
12
10
  declare function markdownLabels(t: MarkdownCopySeat): MarkdownLabels;
13
- //#endregion
14
- //#region src/client/layout/scales.d.ts
15
11
  type LayoutGap = 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | "wide";
16
12
  type LayoutAlign = "stretch" | "start" | "center" | "end";
17
13
  type LayoutJustify = "start" | "center" | "between" | "end";
@@ -19,8 +15,6 @@ type LayoutPad = "none" | "card" | "body" | "page" | "row" | "blocking";
19
15
  type TextSize = "xs" | "sm" | "md" | "base" | "lg";
20
16
  type TextTone = "primary" | "secondary" | "tertiary" | "danger";
21
17
  type TextWeight = "medium" | "strong";
22
- //#endregion
23
- //#region src/client/layout/Row.d.ts
24
18
  interface RowProps extends HTMLAttributes<HTMLDivElement> {
25
19
  as?: ElementType;
26
20
  gap?: LayoutGap;
@@ -36,8 +30,6 @@ interface RowProps extends HTMLAttributes<HTMLDivElement> {
36
30
  pad?: LayoutPad;
37
31
  }
38
32
  declare const Row: import("react").ForwardRefExoticComponent<RowProps & import("react").RefAttributes<HTMLElement>>;
39
- //#endregion
40
- //#region src/client/layout/Stack.d.ts
41
33
  interface StackProps extends HTMLAttributes<HTMLDivElement> {
42
34
  as?: ElementType;
43
35
  gap?: LayoutGap;
@@ -52,8 +44,6 @@ interface StackProps extends HTMLAttributes<HTMLDivElement> {
52
44
  plain?: boolean;
53
45
  }
54
46
  declare const Stack: import("react").ForwardRefExoticComponent<StackProps & import("react").RefAttributes<HTMLElement>>;
55
- //#endregion
56
- //#region src/client/layout/Text.d.ts
57
47
  interface TextProps extends Omit<HTMLAttributes<HTMLElement>, "children" | "color"> {
58
48
  as?: ElementType;
59
49
  size?: TextSize;
@@ -65,8 +55,6 @@ interface TextProps extends Omit<HTMLAttributes<HTMLElement>, "children" | "colo
65
55
  children?: ReactNode;
66
56
  }
67
57
  declare function Text({ as: Element, size, tone, weight, mono, truncate, tabular, className, children }: TextProps): ReactNode;
68
- //#endregion
69
- //#region src/client/settings-form/SettingsFieldRow.d.ts
70
58
  interface SettingsFieldRowProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "color"> {
71
59
  label: string;
72
60
  hint: string;
@@ -79,23 +67,15 @@ interface SettingsFieldRowProps extends Omit<HTMLAttributes<HTMLDivElement>, "ch
79
67
  children: ReactNode;
80
68
  }
81
69
  declare function SettingsFieldRow({ label, hint, layout, divider, overriddenLabel, resetLabel, onReset, invalid, children, className, ...rest }: SettingsFieldRowProps): ReactNode;
82
- //#endregion
83
- //#region src/client/controls/Bubble.d.ts
84
70
  type BubbleProps = HTMLAttributes<HTMLDivElement>;
85
71
  declare function Bubble({ className, children, ...rest }: BubbleProps): ReactNode;
86
- //#endregion
87
- //#region src/client/controls/Button.d.ts
88
72
  type ButtonTone = "danger";
89
73
  type ButtonProps = ComponentProps<typeof Button> & {
90
74
  tone?: ButtonTone;
91
75
  };
92
76
  declare const Button$1: import("react").ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
93
- //#endregion
94
- //#region src/client/controls/DisclosureRow.d.ts
95
77
  type DisclosureRowProps = ComponentProps<typeof DisclosureRow>;
96
78
  declare function DisclosureRow$1(props: DisclosureRowProps): ReactNode;
97
- //#endregion
98
- //#region src/client/controls/SeatButton.d.ts
99
79
  interface SeatButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> {
100
80
  icon: ReactNode;
101
81
  label: string;
@@ -103,24 +83,16 @@ interface SeatButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>,
103
83
  chevron?: ReactNode;
104
84
  }
105
85
  declare function SeatButton({ icon, label, expanded, chevron, type, className, ...rest }: SeatButtonProps): ReactNode;
106
- //#endregion
107
- //#region src/client/controls/Spinner.d.ts
108
86
  interface SpinnerProps {
109
87
  label: string;
110
88
  }
111
89
  declare function Spinner({ label }: SpinnerProps): ReactNode;
112
- //#endregion
113
- //#region src/client/controls/TimeLabel.d.ts
114
90
  type TimeLabelProps = HTMLAttributes<HTMLSpanElement>;
115
91
  declare function TimeLabel({ className, children, ...rest }: TimeLabelProps): ReactNode;
116
- //#endregion
117
- //#region src/client/controls/VisuallyHidden.d.ts
118
92
  interface VisuallyHiddenProps extends HTMLAttributes<HTMLSpanElement> {
119
93
  children: ReactNode;
120
94
  }
121
95
  declare function VisuallyHidden({ children, ...rest }: VisuallyHiddenProps): ReactNode;
122
- //#endregion
123
- //#region src/client/controls/IconButton.d.ts
124
96
  interface IconButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "aria-label"> {
125
97
  label: string;
126
98
  children: ReactNode;
@@ -128,8 +100,6 @@ interface IconButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>,
128
100
  size?: "md" | "sm";
129
101
  }
130
102
  declare function IconButton({ label, children, type, shape, size, className, ...rest }: IconButtonProps): ReactNode;
131
- //#endregion
132
- //#region src/client/controls/ModelRouteList.d.ts
133
103
  interface ModelRouteCandidate {
134
104
  readonly key: string;
135
105
  readonly provider: string;
@@ -149,12 +119,8 @@ interface ModelRouteListProps {
149
119
  onSelect: (candidate: ModelRouteCandidate) => void;
150
120
  }
151
121
  declare function ModelRouteList({ label, candidates, selectedKey, disabled, status, loadingLabel, errorLabel, emptyLabel, onSelect }: ModelRouteListProps): ReactNode;
152
- //#endregion
153
- //#region src/client/controls/MultilineField.d.ts
154
122
  type MultilineFieldProps = TextareaHTMLAttributes<HTMLTextAreaElement>;
155
123
  declare function MultilineField({ rows, className, ...rest }: MultilineFieldProps): import("react/jsx-runtime").JSX.Element;
156
- //#endregion
157
- //#region src/client/controls/SearchSelect.d.ts
158
124
  interface SearchSelectOption {
159
125
  readonly value: string;
160
126
  readonly label?: string | undefined;
@@ -170,8 +136,6 @@ interface SearchSelectProps {
170
136
  onSelect: (next: string) => void;
171
137
  }
172
138
  declare function SearchSelect({ label, value, emptyLabel, options, disabled, searchLabel, noMatchLabel, onSelect }: SearchSelectProps): ReactNode;
173
- //#endregion
174
- //#region src/client/controls/TagInput.d.ts
175
139
  interface TagInputProps {
176
140
  value: readonly string[];
177
141
  onChange: (next: string[]) => void;
@@ -183,12 +147,8 @@ interface TagInputProps {
183
147
  removeLabel: (name: string) => string;
184
148
  }
185
149
  declare function TagInput({ value, onChange, options, placeholder, label, disabled, noMatchLabel, removeLabel }: TagInputProps): ReactNode;
186
- //#endregion
187
- //#region src/client/controls/tags.d.ts
188
150
  declare function parseTagList(text: string): string[];
189
151
  declare function mergeTags(current: readonly string[], incoming: readonly string[]): string[];
190
- //#endregion
191
- //#region src/client/schema-form/schema-node.d.ts
192
152
  type ReadOnlyReason = "transform" | "function" | "constructor";
193
153
  interface FieldMeta {
194
154
  description: string | Readonly<Record<string, string>> | undefined;
@@ -275,8 +235,6 @@ interface VariantChoice {
275
235
  value: unknown;
276
236
  }
277
237
  declare function readPath(root: unknown, path: readonly string[]): unknown;
278
- //#endregion
279
- //#region src/client/schema-form/draft.d.ts
280
238
  type Section = Record<string, unknown>;
281
239
  type TextParseResult = {
282
240
  kind: "value";
@@ -301,8 +259,6 @@ interface DraftFieldState {
301
259
  staged: boolean;
302
260
  }
303
261
  type DraftScope = ConfigForm<Section>;
304
- //#endregion
305
- //#region src/client/schema-form/hints.d.ts
306
262
  type SuggestedKeysReader = () => readonly string[];
307
263
  interface FieldText {
308
264
  label?: string | undefined;
@@ -328,7 +284,11 @@ interface SchemaFormHintsFace {
328
284
  selectFor(ns: string, path: readonly string[]): SelectSpec | undefined;
329
285
  }
330
286
  declare class SchemaFormHints extends Service implements SchemaFormHintsFace {
331
- #private;
287
+ private readonly readers;
288
+ private readonly texts;
289
+ private readonly selects;
290
+ private readonly sources;
291
+ private readonly listeners;
332
292
  constructor(ctx: Context);
333
293
  keysFor(ns: string, path: readonly string[]): readonly string[];
334
294
  textFor(ns: string, path: readonly string[]): FieldText;
@@ -340,14 +300,13 @@ declare class SchemaFormHints extends Service implements SchemaFormHintsFace {
340
300
  suggestKeys(ns: string, path: readonly string[], read: SuggestedKeysReader): () => void;
341
301
  subscribe(listener: () => void): () => void;
342
302
  refresh(): void;
303
+ private publish;
343
304
  }
344
305
  declare module "@deepseek-ai/cordis" {
345
306
  interface Context {
346
307
  schemaFormHints: SchemaFormHints;
347
308
  }
348
309
  }
349
- //#endregion
350
- //#region src/client/schema-form/controller.d.ts
351
310
  declare function fieldKey(path: readonly string[]): string;
352
311
  declare function projectRoot(serialized: unknown, rehydrate: (serialized: unknown) => SchemaNode): {
353
312
  schema: SchemaNode;
@@ -410,11 +369,7 @@ declare class SchemaFormController {
410
369
  refresh(): void;
411
370
  dispose(): void;
412
371
  }
413
- //#endregion
414
- //#region src/client/schema-form/labels.d.ts
415
372
  type ResolveText = (text: string | Readonly<Record<string, string>>) => string;
416
- //#endregion
417
- //#region src/client/schema-form/locales.d.ts
418
373
  declare const zh: {
419
374
  readonly unavailable: "该插件当前未加载,暂时无法配置。";
420
375
  readonly readOnly: "本部署的设置为只读。";
@@ -470,8 +425,6 @@ declare const zh: {
470
425
  readonly missingItem: "每一项都需要一个 {key}";
471
426
  };
472
427
  type SchemaFormLocaleKey = keyof typeof zh;
473
- //#endregion
474
- //#region src/client/schema-form/slot-contract.d.ts
475
428
  interface SchemaFieldOwnerProps {
476
429
  ns: string;
477
430
  path: readonly string[];
@@ -541,15 +494,11 @@ declare module "@deepseek-ai/dsh-client-ui-slots" {
541
494
  };
542
495
  }
543
496
  }
544
- //#endregion
545
- //#region src/client/schema-form/rows.d.ts
546
497
  interface RowRegistrationPlan {
547
498
  key: string;
548
499
  ns: string;
549
500
  }
550
501
  declare function rowRegistrations(namespaces: readonly SettingsNamespaceView[], bundles: readonly BundleInfo[]): RowRegistrationPlan[];
551
- //#endregion
552
- //#region src/client/schema-form/value.d.ts
553
502
  declare function valueText(value: unknown): string;
554
503
  declare function tokenText(value: unknown): string;
555
504
  declare function tokenTone(value: unknown): "string" | "number" | "boolean" | "empty";
@@ -559,11 +508,7 @@ declare function InlineValue({ owner }: {
559
508
  declare function SchemaFieldDefault({ owner }: {
560
509
  owner: SchemaFieldOwnerProps;
561
510
  }): ReactNode;
562
- //#endregion
563
- //#region src/client/schema-form/fields.d.ts
564
511
  declare function parseFor(node: FieldNode, t: SchemaFormTranslate): TextParse;
565
- //#endregion
566
- //#region src/client/schema-form/lines.d.ts
567
512
  type AddLineSpec = {
568
513
  kind: "item";
569
514
  } | {
@@ -624,8 +569,6 @@ declare namespace index_d_exports {
624
569
  declare const NS = "settings.schema-form";
625
570
  declare const inject$1: string[];
626
571
  declare function apply$1(ctx: Context): void;
627
- //#endregion
628
- //#region src/reference-markdown.d.ts
629
572
  interface ReferenceActions {
630
573
  readonly openFile: (path: string) => void;
631
574
  readonly openSkill: (name: string) => void;
@@ -639,9 +582,6 @@ interface ReferenceMarkdownProps {
639
582
  }
640
583
  declare function referenceMentions(actions?: ReferenceActions, tokens?: ReadonlyMap<string, Reference>): MarkdownFileMentions;
641
584
  declare const ReferenceMarkdown: import("react").MemoExoticComponent<({ text, labels, actions, streaming, pathImages }: ReferenceMarkdownProps) => import("react/jsx-runtime").JSX.Element>;
642
- //#endregion
643
- //#region src/client/index.d.ts
644
585
  declare const inject: readonly string[];
645
586
  declare function apply(ctx: Context): void;
646
- //#endregion
647
587
  export { Bubble as $, SearchSelect as A, VisuallyHidden as B, SuggestedKeys as C, parseTagList as D, mergeTags as E, ModelRouteCandidate as F, SpinnerProps as G, TimeLabel as H, ModelRouteList as I, DisclosureRow$1 as J, SeatButton as K, ModelRouteListProps as L, SearchSelectProps as M, MultilineField as N, TagInput as O, MultilineFieldProps as P, ButtonTone as Q, IconButton as R, FieldNode as S, walkFields as T, TimeLabelProps as U, VisuallyHiddenProps as V, Spinner as W, Button$1 as X, DisclosureRowProps as Y, ButtonProps as Z, SelectOption as _, ReferenceMarkdownProps as a, Stack as at, failureOf as b, index_d_exports as c, RowProps as ct, SchemaFormActions as d, LayoutJustify as dt, BubbleProps as et, SchemaFormController as f, LayoutPad as ft, SchemaFormHints as g, markdownLabels as gt, projectRoot as h, MarkdownCopySeat as ht, ReferenceMarkdown as i, TextProps as it, SearchSelectOption as j, TagInputProps as k, rowRegistrations as l, LayoutAlign as lt, SchemaFormState as m, TextTone as mt, inject as n, SettingsFieldRowProps as nt, referenceMentions as o, StackProps as ot, SchemaFormFace as p, TextSize as pt, SeatButtonProps as q, ReferenceActions as r, Text as rt, NS as s, Row as st, apply as t, SettingsFieldRow as tt, SchemaFormLocaleKey as u, LayoutGap as ut, SelectSpec as v, WalkedField as w, FieldMeta as x, ValidationFailure as y, IconButtonProps as z };
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_client = require("./client-Ngzv0PL1.cjs");
3
- const require_reference = require("./reference-hchCWm3z.cjs");
2
+ const require_client = require("./client-DQVzIDP3.cjs");
3
+ const require_reference = require("./reference-BExb65Ah.cjs");
4
4
  exports.Bubble = require_client.Bubble;
5
5
  exports.Button = require_client.Button;
6
6
  exports.DisclosureRow = require_client.DisclosureRow;
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-AMHtcyMt.mjs";
2
- import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-BX54bj6_.mjs";
1
+ import { $ as Bubble, A as SearchSelect, B as VisuallyHidden, C as SuggestedKeys, D as parseTagList, E as mergeTags, F as ModelRouteCandidate, G as SpinnerProps, H as TimeLabel, I as ModelRouteList, J as DisclosureRow, K as SeatButton, L as ModelRouteListProps, M as SearchSelectProps, N as MultilineField, O as TagInput, P as MultilineFieldProps, Q as ButtonTone, R as IconButton, S as FieldNode, T as walkFields, U as TimeLabelProps, V as VisuallyHiddenProps, W as Spinner, X as Button, Y as DisclosureRowProps, Z as ButtonProps, _ as SelectOption, a as ReferenceMarkdownProps, at as Stack, b as failureOf, c as index_d_exports, ct as RowProps, d as SchemaFormActions, dt as LayoutJustify, et as BubbleProps, f as SchemaFormController, ft as LayoutPad, g as SchemaFormHints, gt as markdownLabels, h as projectRoot, ht as MarkdownCopySeat, i as ReferenceMarkdown, it as TextProps, j as SearchSelectOption, k as TagInputProps, l as rowRegistrations, lt as LayoutAlign, m as SchemaFormState, mt as TextTone, n as inject, nt as SettingsFieldRowProps, o as referenceMentions, ot as StackProps, p as SchemaFormFace, pt as TextSize, q as SeatButtonProps, r as ReferenceActions, rt as Text, s as NS, st as Row, t as apply, tt as SettingsFieldRow, u as SchemaFormLocaleKey, ut as LayoutGap, v as SelectSpec, w as WalkedField, x as FieldMeta, y as ValidationFailure, z as IconButtonProps } from "./index-DWlN5aPg.mjs";
2
+ import { a as formatReferenceMention, c as parseReferenceToken, i as formatReference, n as ReferenceSpan, o as isLocalReference, r as findReferences, s as parseReference, t as Reference } from "./reference-Bnz5fGkr.mjs";
3
3
  export * from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  export { Bubble, type BubbleProps, Button, type ButtonProps, type ButtonTone, DisclosureRow, type DisclosureRowProps, type FieldMeta, type FieldNode, IconButton, type IconButtonProps, type LayoutAlign, type LayoutGap, type LayoutJustify, type LayoutPad, MarkdownCopySeat, type ModelRouteCandidate, ModelRouteList, type ModelRouteListProps, MultilineField, type MultilineFieldProps, type Reference, type ReferenceActions, ReferenceMarkdown, type ReferenceMarkdownProps, type ReferenceSpan, Row, type RowProps, NS as SCHEMA_FORM_NS, type SchemaFormActions, SchemaFormController, type SchemaFormFace, SchemaFormHints, type SchemaFormLocaleKey, type SchemaFormState, SearchSelect, type SearchSelectOption, type SearchSelectProps, SeatButton, type SeatButtonProps, type SelectOption, type SelectSpec, SettingsFieldRow, type SettingsFieldRowProps, Spinner, type SpinnerProps, Stack, type StackProps, type SuggestedKeys, TagInput, type TagInputProps, Text, type TextProps, type TextSize, type TextTone, TimeLabel, type TimeLabelProps, type ValidationFailure, VisuallyHidden, type VisuallyHiddenProps, type WalkedField, apply, failureOf, findReferences, formatReference, formatReferenceMention, inject, isLocalReference, markdownLabels, mergeTags, parseReference, parseReferenceToken, parseTagList, projectRoot, referenceMentions, rowRegistrations, index_d_exports as schemaForm, walkFields };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as failureOf, C as markdownLabels, D as SchemaFormHints, E as rowRegistrations, O as SchemaFormController, S as Row, T as schema_form_exports, _ as Button, a as TagInput, b as Text, c as SearchSelect, d as IconButton, f as VisuallyHidden, g as DisclosureRow, h as SeatButton, i as referenceMentions, j as walkFields, k as projectRoot, l as MultilineField, m as Spinner, n as inject, o as mergeTags, p as TimeLabel, r as ReferenceMarkdown, s as parseTagList, t as apply, u as ModelRouteList, v as Bubble, w as NS, x as Stack, y as SettingsFieldRow } from "./client-BunyBylj.mjs";
2
- import { a as parseReference, i as isLocalReference, n as formatReference, o as parseReferenceToken, r as formatReferenceMention, t as findReferences } from "./reference-Cjcn21uW.mjs";
1
+ import { A as failureOf, C as markdownLabels, D as SchemaFormHints, E as rowRegistrations, O as SchemaFormController, S as Row, T as schema_form_exports, _ as Button, a as TagInput, b as Text, c as SearchSelect, d as IconButton, f as VisuallyHidden, g as DisclosureRow, h as SeatButton, i as referenceMentions, j as walkFields, k as projectRoot, l as MultilineField, m as Spinner, n as inject, o as mergeTags, p as TimeLabel, r as ReferenceMarkdown, s as parseTagList, t as apply, u as ModelRouteList, v as Bubble, w as NS, x as Stack, y as SettingsFieldRow } from "./client-BedkS2tw.mjs";
2
+ import { a as parseReference, i as isLocalReference, n as formatReference, o as parseReferenceToken, r as formatReferenceMention, t as findReferences } from "./reference-DTa9OfbR.mjs";
3
3
  export * from "@deepseek-ai/dsh-client-ui-primitives";
4
4
  export { Bubble, Button, DisclosureRow, IconButton, ModelRouteList, MultilineField, ReferenceMarkdown, Row, NS as SCHEMA_FORM_NS, SchemaFormController, SchemaFormHints, SearchSelect, SeatButton, SettingsFieldRow, Spinner, Stack, TagInput, Text, TimeLabel, VisuallyHidden, apply, failureOf, findReferences, formatReference, formatReferenceMention, inject, isLocalReference, markdownLabels, mergeTags, parseReference, parseReferenceToken, parseTagList, projectRoot, referenceMentions, rowRegistrations, schema_form_exports as schemaForm, walkFields };
@@ -3,7 +3,7 @@ let mdast_util_gfm = require("mdast-util-gfm");
3
3
  let micromark_util_character = require("micromark-util-character");
4
4
  let micromark_extension_gfm = require("micromark-extension-gfm");
5
5
  let micromark_util_symbol = require("micromark-util-symbol");
6
- //#region src/reference.ts
6
+ // src/reference.ts
7
7
  const DEFAULT_PROTOCOL = "file";
8
8
  const EXTERNAL_PROTOCOLS = [
9
9
  "http",
@@ -443,7 +443,6 @@ function decodeUri(value) {
443
443
  return;
444
444
  }
445
445
  }
446
- //#endregion
447
446
  Object.defineProperty(exports, "findReferences", {
448
447
  enumerable: true,
449
448
  get: function() {
@@ -1,6 +1,5 @@
1
1
  import "mdast-util-from-markdown";
2
2
  import "micromark-util-types";
3
- //#region src/reference.d.ts
4
3
  declare module "micromark-util-types" {
5
4
  interface TokenTypeMap {
6
5
  reference: "reference";
@@ -26,5 +25,4 @@ declare function formatReference(reference: Reference): string;
26
25
  declare function isLocalReference(reference: Reference): boolean;
27
26
  declare function formatReferenceMention(reference: Reference): string;
28
27
  declare function findReferences(text: string): readonly ReferenceSpan[];
29
- //#endregion
30
28
  export { formatReferenceMention as a, parseReferenceToken as c, formatReference as i, ReferenceSpan as n, isLocalReference as o, findReferences as r, parseReference as s, Reference as t };
@@ -3,7 +3,7 @@ import { gfmFromMarkdown } from "mdast-util-gfm";
3
3
  import { asciiAlpha, asciiAlphanumeric, asciiDigit, markdownLineEnding, markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from "micromark-util-character";
4
4
  import { gfm } from "micromark-extension-gfm";
5
5
  import { codes, types } from "micromark-util-symbol";
6
- //#region src/reference.ts
6
+ // src/reference.ts
7
7
  const DEFAULT_PROTOCOL = "file";
8
8
  const EXTERNAL_PROTOCOLS = [
9
9
  "http",
@@ -443,5 +443,4 @@ function decodeUri(value) {
443
443
  return;
444
444
  }
445
445
  }
446
- //#endregion
447
446
  export { parseReference as a, isLocalReference as i, formatReference as n, parseReferenceToken as o, formatReferenceMention as r, findReferences as t };
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_reference = require("./reference-hchCWm3z.cjs");
2
+ const require_reference = require("./reference-BExb65Ah.cjs");
3
3
  exports.findReferences = require_reference.findReferences;
4
4
  exports.parseReferenceToken = require_reference.parseReferenceToken;
@@ -1,3 +1,2 @@
1
- import { c as parseReferenceToken, n as ReferenceSpan, r as findReferences, t as Reference } from "./reference-BX54bj6_.mjs";
2
- //#endregion
1
+ import { c as parseReferenceToken, n as ReferenceSpan, r as findReferences, t as Reference } from "./reference-Bnz5fGkr.mjs";
3
2
  export { type Reference, type ReferenceSpan, findReferences, parseReferenceToken };
@@ -1 +1 @@
1
- export { t as findReferences, o as parseReferenceToken } from "./reference-Cjcn21uW.mjs";
1
+ export { t as findReferences, o as parseReferenceToken } from "./reference-DTa9OfbR.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morlay/dsh-client-ui-primitives",
3
- "version": "0.0.12",
3
+ "version": "0.0.14-alpha.0",
4
4
  "description": "client UI kit for this workspace: re-exports the official ui-primitives (Button / Menu / Input / Tag / Modal / Switch / SettingsForm …) plus our own layout primitives (Stack / Row / Text / Panel) and controls (TagInput / SearchSelect / ModelRouteList / Spinner …), all styled with the same CSS Modules + `--dsw-*` tokens as upstream; also the shared reference parser/renderer (findReferences / parseReferenceToken) and the schema-generated row config page. Ships as an inlined client library (`dsh.client.inline`), not as an assembly row.",
5
5
  "keywords": [
6
6
  "client",
@@ -46,28 +46,28 @@
46
46
  "micromark-util-types": "^2.0.2"
47
47
  },
48
48
  "devDependencies": {
49
- "@deepseek-ai/dsh-util-values": "^0.2.1-rc.1",
50
- "@deepseek-ai/schemastery": "^3.18.5",
51
- "@morlay/session-rdb": "0.1.8",
49
+ "@deepseek-ai/dsh-util-values": "^0.2.2-alpha.2",
50
+ "@deepseek-ai/schemastery": "^3.18.6-alpha.1",
51
+ "@morlay/session-rdb": "0.1.10-alpha.0",
52
52
  "@testing-library/react": "^16.3.0",
53
53
  "@types/mdast": "^4.0.4",
54
54
  "@types/react": "~18.3.1",
55
55
  "react-dom": "^18.2.0"
56
56
  },
57
57
  "peerDependencies": {
58
- "@deepseek-ai/cordis": "^4.0.5",
59
- "@deepseek-ai/dsh-api-remotes": "^0.2.1-rc.1",
60
- "@deepseek-ai/dsh-client-locale": "^0.2.1-rc.1",
61
- "@deepseek-ai/dsh-client-store": "^0.2.1-rc.1",
62
- "@deepseek-ai/dsh-client-ui-plugin-manager": "^0.2.1-rc.1",
63
- "@deepseek-ai/dsh-client-ui-primitives": "^0.2.1-rc.1",
64
- "@deepseek-ai/dsh-client-ui-renderer": "^0.2.1-rc.1",
65
- "@deepseek-ai/dsh-client-ui-settings": "^0.2.1-rc.1",
66
- "@deepseek-ai/dsh-client-ui-slots": "^0.2.1-rc.1",
58
+ "@deepseek-ai/cordis": "^4.0.6-alpha.1",
59
+ "@deepseek-ai/dsh-api-remotes": "^0.2.2-alpha.2",
60
+ "@deepseek-ai/dsh-client-locale": "^0.2.2-alpha.2",
61
+ "@deepseek-ai/dsh-client-store": "^0.2.2-alpha.2",
62
+ "@deepseek-ai/dsh-client-ui-plugin-manager": "^0.2.2-alpha.2",
63
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.2.2-alpha.2",
64
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.2.2-alpha.2",
65
+ "@deepseek-ai/dsh-client-ui-settings": "^0.2.2-alpha.2",
66
+ "@deepseek-ai/dsh-client-ui-slots": "^0.2.2-alpha.2",
67
67
  "react": "^18.2.0"
68
68
  },
69
69
  "engines": {
70
- "dsh": ">= 0.2.1-rc.1 < 0.2.2"
70
+ "dsh": ">= 0.2.2-alpha.2 < 0.2.3"
71
71
  },
72
72
  "scripts": {
73
73
  "build": "pnpm exec tsdown"
@@ -64,91 +64,95 @@ export interface SchemaFormHintsFace {
64
64
  }
65
65
 
66
66
  // 提示面的完整服务(业务用注册侧,表单一侧用读侧)。
67
+ //
68
+ // 状态用 TS `private`(运行时是普通属性)而不是 JS `#` 私有字段:本包是内联库,同一服务实例会被**另一份
69
+ // 副本**的代码读(多份副本各带一份类定义,`#` 字段跨类定义不可见,会抛
70
+ // `Cannot read private member #texts from an object whose class did not declare it`)。
67
71
  export class SchemaFormHints extends Service implements SchemaFormHintsFace {
68
- readonly #readers = new Map<string, SuggestedKeysReader>();
69
- readonly #texts = new Map<string, FieldTextReader>();
70
- readonly #selects = new Map<string, SelectSpec>();
71
- readonly #sources = new Map<string, SelectSpec>();
72
- readonly #listeners = new Set<() => void>();
72
+ private readonly readers = new Map<string, SuggestedKeysReader>();
73
+ private readonly texts = new Map<string, FieldTextReader>();
74
+ private readonly selects = new Map<string, SelectSpec>();
75
+ private readonly sources = new Map<string, SelectSpec>();
76
+ private readonly listeners = new Set<() => void>();
73
77
 
74
78
  constructor(ctx: Context) {
75
79
  super(ctx, "schemaFormHints");
76
80
  }
77
81
 
78
82
  keysFor(ns: string, path: readonly string[]): readonly string[] {
79
- return lookup(this.#readers, ns, path)?.() ?? [];
83
+ return lookup(this.readers, ns, path)?.() ?? [];
80
84
  }
81
85
 
82
86
  textFor(ns: string, path: readonly string[]): FieldText {
83
- return lookup(this.#texts, ns, path)?.() ?? {};
87
+ return lookup(this.texts, ns, path)?.() ?? {};
84
88
  }
85
89
 
86
90
  select(ns: string, path: readonly string[], spec: SelectSpec): () => void {
87
91
  const key = locationKey(ns, path);
88
- this.#selects.set(key, spec);
89
- this.#publish();
92
+ this.selects.set(key, spec);
93
+ this.publish();
90
94
  return () => {
91
- if (this.#selects.get(key) !== spec) return;
92
- this.#selects.delete(key);
93
- this.#publish();
95
+ if (this.selects.get(key) !== spec) return;
96
+ this.selects.delete(key);
97
+ this.publish();
94
98
  };
95
99
  }
96
100
 
97
101
  selectFor(ns: string, path: readonly string[]): SelectSpec | undefined {
98
- return lookup(this.#selects, ns, path);
102
+ return lookup(this.selects, ns, path);
99
103
  }
100
104
 
101
105
  source(name: string, spec: SelectSpec): () => void {
102
- this.#sources.set(name, spec);
103
- this.#publish();
106
+ this.sources.set(name, spec);
107
+ this.publish();
104
108
  return () => {
105
- if (this.#sources.get(name) !== spec) return;
106
- this.#sources.delete(name);
107
- this.#publish();
109
+ if (this.sources.get(name) !== spec) return;
110
+ this.sources.delete(name);
111
+ this.publish();
108
112
  };
109
113
  }
110
114
 
111
115
  sourceFor(name: string): SelectSpec | undefined {
112
- return this.#sources.get(name);
116
+ return this.sources.get(name);
113
117
  }
114
118
 
115
119
  describe(ns: string, path: readonly string[], read: FieldTextReader): () => void {
116
120
  const key = locationKey(ns, path);
117
- this.#texts.set(key, read);
118
- this.#publish();
121
+ this.texts.set(key, read);
122
+ this.publish();
119
123
  return () => {
120
- if (this.#texts.get(key) !== read) return;
121
- this.#texts.delete(key);
122
- this.#publish();
124
+ if (this.texts.get(key) !== read) return;
125
+ this.texts.delete(key);
126
+ this.publish();
123
127
  };
124
128
  }
125
129
 
126
130
  suggestKeys(ns: string, path: readonly string[], read: SuggestedKeysReader): () => void {
127
131
  const key = locationKey(ns, path);
128
- this.#readers.set(key, read);
129
- this.#publish();
132
+ this.readers.set(key, read);
133
+ this.publish();
130
134
  return () => {
131
- if (this.#readers.get(key) !== read) return;
132
- this.#readers.delete(key);
133
- this.#publish();
135
+ if (this.readers.get(key) !== read) return;
136
+ this.readers.delete(key);
137
+ this.publish();
134
138
  };
135
139
  }
136
140
 
137
141
  // 观察候选键的变化(注册与注销);返回取消订阅。
138
142
  subscribe(listener: () => void): () => void {
139
- this.#listeners.add(listener);
143
+ this.listeners.add(listener);
140
144
  return () => {
141
- this.#listeners.delete(listener);
145
+ this.listeners.delete(listener);
142
146
  };
143
147
  }
144
148
 
145
149
  // 重新通知一次:读数背后的数据变了(业务自己知道),页面据此重算候选行。
146
150
  refresh(): void {
147
- this.#publish();
151
+ this.publish();
148
152
  }
149
153
 
150
- #publish(): void {
151
- for (const listener of this.#listeners) listener();
154
+ private publish(): void {
155
+ for (const listener of this.listeners) listener();
152
156
  }
153
157
  }
154
158
 
@@ -91,9 +91,17 @@ export function apply(ctx: Context): void {
91
91
  }
92
92
 
93
93
  function install(ctx: Context): void {
94
- ctx.effect(() => ctx.locale.register(NS, { zh, en }), "ui-schema-form: dictionaries");
95
94
  // 提示面(dict 的候选键):同一次 apply 里提供,业务插件注册读数,本包的行投影读它。
96
- const hints = new SchemaFormHints(ctx);
95
+ //
96
+ // **必须最先提供,并且挂在 root 上**:多份副本各自的 `apply` 会同时等依赖到齐、各自回调;`apply` 里的检查
97
+ // 靠 `schemaFormHints` 判断“另一份已经装过”。两个细节缺一不可:
98
+ //
99
+ // - 放在 `locale.register` 之前:否则两次回调都可能先通过检查、再各注册一次 `settings.schema-form` 字典,
100
+ // 第二个抛 `locale namespace "settings.schema-form" already has locale "zh"`;
101
+ // - 用 `ctx.root` 提供:`scope.get` 默认只认 ACTIVE fiber,而 inject 回调期间它自己的 fiber 还没转
102
+ // ACTIVE——挂在当前 scope 上时,兄弟副本的回调看不到这个服务,照样会进来装第二遍。
103
+ const hints = new SchemaFormHints(ctx.root);
104
+ ctx.effect(() => ctx.locale.register(NS, { zh, en }), "ui-schema-form: dictionaries");
97
105
  ctx.effect(
98
106
  () =>
99
107
  ctx.slots.registerFactory(