dsh-ui-fortifier 0.1.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/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # dsh-ui-fortifier
2
+
3
+ ![AI-Crap](https://img.shields.io/badge/💩-AI_crap_code-5C4033?style=flat-square)
4
+ [![npm](https://img.shields.io/npm/v/dsh-ui-fortifier?style=flat-square)](https://www.npmjs.com/package/dsh-ui-fortifier)
5
+
6
+ [中文](README.zh.md)
7
+
8
+ A DSH Web UI enhancer plugin
9
+
10
+ See [design/en/current.md](design/en/current.md) for details.
11
+
12
+ ## Installation
13
+
14
+ ```sh
15
+ dsh plugin --profile web add dsh-ui-fortifier
16
+ ```
17
+
18
+ Installing via GitHub is not supported.
19
+
20
+ ## Features
21
+
22
+ Adds a "dsh-ui-fortifier" tab in Settings to toggle every feature module of this plugin.
23
+
24
+ | Feature | Description |
25
+ | --- | --- |
26
+ | provider-label | Shows the currently selected provider to the left of the model selector. |
27
+
28
+ ## Developed against dsh `0.1.2-alpha.1`
29
+
30
+ ## Secondary Development
31
+
32
+ Clone this repository into a dsh workspace package directory, then install and build:
33
+
34
+ ```sh
35
+ git clone https://github.com/pgnqukezrdxmhjso/dsh-ui-fortifier packages/my/dsh-ui-fortifier
36
+ pnpm install
37
+ pnpm --filter dsh-ui-fortifier bundle
38
+ ```
package/README.zh.md ADDED
@@ -0,0 +1,38 @@
1
+ # dsh-ui-fortifier
2
+
3
+ ![AI-Crap](https://img.shields.io/badge/💩-AI_crap_code-5C4033?style=flat-square)
4
+ [![npm](https://img.shields.io/npm/v/dsh-ui-fortifier?style=flat-square)](https://www.npmjs.com/package/dsh-ui-fortifier)
5
+
6
+ [English](README.md)
7
+
8
+ DSH Web UI 强化插件
9
+
10
+ 详情见 [design/zh/current.md](design/zh/current.md)。
11
+
12
+ ## 安装
13
+
14
+ ```sh
15
+ dsh plugin --profile web add dsh-ui-fortifier
16
+ ```
17
+
18
+ 不支持通过 GitHub 安装。
19
+
20
+ ## 功能
21
+
22
+ 在设置页新增「dsh-ui-fortifier」标签页,集中开关本插件各功能模块。
23
+
24
+ | 功能 | 描述 |
25
+ | --- | --- |
26
+ | provider-label | 在模型选择按钮左侧显示当前选择的提供方。 |
27
+
28
+ ## 基于 dsh `0.1.2-alpha.1` 开发
29
+
30
+ ## 二次开发说明
31
+
32
+ 将此仓库克隆到 dsh workspace 的包目录,然后安装并构建:
33
+
34
+ ```sh
35
+ git clone https://github.com/pgnqukezrdxmhjso/dsh-ui-fortifier packages/my/dsh-ui-fortifier
36
+ pnpm install
37
+ pnpm --filter dsh-ui-fortifier bundle
38
+ ```
package/lib/client.js ADDED
@@ -0,0 +1,201 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "dsh-ui-fortifier",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ //#region \0dsh-css:D:\data\code\deepseek-harness\packages\my\dsh-ui-fortifier\src\client\settings\FortifierSettingsPage.module.css.mjs
9
+ const css$1 = ".t1_2kq_page{flex-direction:column;gap:8px;padding:16px;display:flex}.t1_2kq_heading{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;line-height:24px}.t1_2kq_list{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.t1_2kq_row{background:var(--dsw-alias-bg-layer-2);border-radius:6px;align-items:center;gap:8px;padding:8px;display:flex}.t1_2kq_row label{cursor:pointer;color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:13px;line-height:20px;display:flex}";
10
+ const tagId$1 = "dsh-ui-fortifier/FortifierSettingsPage.module.css";
11
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
12
+ const tag = document.createElement("style");
13
+ tag.dataset.plugin = "dsh-ui-fortifier";
14
+ tag.dataset.pluginCss = tagId$1;
15
+ tag.textContent = css$1;
16
+ document.head.appendChild(tag);
17
+ }
18
+ var FortifierSettingsPage_module_css_default = {
19
+ "heading": "t1_2kq_heading",
20
+ "list": "t1_2kq_list",
21
+ "page": "t1_2kq_page",
22
+ "row": "t1_2kq_row"
23
+ };
24
+ //#endregion
25
+ //#region src/client/settings/FortifierSettingsPage.tsx
26
+ /** 设置页:读取配置项自动生成开关行。 */
27
+ function FortifierSettingsPage(props) {
28
+ const t = props.t;
29
+ const rows = props.useToggles((value) => value);
30
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
31
+ className: FortifierSettingsPage_module_css_default.page,
32
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
33
+ className: FortifierSettingsPage_module_css_default.heading,
34
+ children: t("nav")
35
+ }), rows.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: t("empty") }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
36
+ className: FortifierSettingsPage_module_css_default.list,
37
+ children: rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
38
+ className: FortifierSettingsPage_module_css_default.row,
39
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
40
+ type: "checkbox",
41
+ checked: row.value,
42
+ onChange: (event) => {
43
+ props.set(row.field, event.target.checked);
44
+ }
45
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(`config.${row.field}`) })] })
46
+ }, row.field))
47
+ })]
48
+ });
49
+ }
50
+ //#endregion
51
+ //#region src/client/locales.ts
52
+ /** 英文文案。 */
53
+ const en = {
54
+ nav: "ui-fortifier",
55
+ empty: "No feature modules registered.",
56
+ "config.provider-label": "Show provider in input"
57
+ };
58
+ /** 中文文案。 */
59
+ const zh = {
60
+ nav: "ui-fortifier",
61
+ empty: "没有已注册的功能模块。",
62
+ "config.provider-label": "输入框显示提供商"
63
+ };
64
+ //#endregion
65
+ //#region src/client/settings/index.ts
66
+ /** 本插件设置命名空间(与 host 侧一致)。 */
67
+ const UI_FORTIFIER = "ui-fortifier";
68
+ /**
69
+ * 注册设置页并绑定功能开关的 settings 作用域。
70
+ * @param ctx - 需已提供 slots/locale/settingsScope 的客户端上下文。
71
+ * @param moduleFields - 功能模块字段列表(settings 开关 key),由调用方传入。
72
+ * @returns 功能开关的 settings 绑定,供调用方控制子模块注册。
73
+ */
74
+ function installSettings(ctx, moduleFields) {
75
+ ctx.effect(() => ctx.locale.register(UI_FORTIFIER, {
76
+ zh,
77
+ en
78
+ }), "dsh-ui-fortifier: copy dictionaries");
79
+ const scope = ctx.settingsScope.bind({ namespace: UI_FORTIFIER });
80
+ const mirror = ctx.settingsScope.describe();
81
+ const view = () => mirror.getSnapshot().view?.namespaces.find((row) => row.ns === UI_FORTIFIER);
82
+ const sectionInjected = () => {
83
+ let cached = [];
84
+ let cachedSignature = "";
85
+ return {
86
+ hooks: { toggles: {
87
+ getSnapshot: () => {
88
+ const value = view()?.value ?? {};
89
+ const rows = moduleFields.map((field) => ({
90
+ field,
91
+ value: value[field] ?? true
92
+ }));
93
+ const signature = JSON.stringify(rows);
94
+ if (signature !== cachedSignature) {
95
+ cached = rows;
96
+ cachedSignature = signature;
97
+ }
98
+ return cached;
99
+ },
100
+ subscribe: (listener) => {
101
+ const offScope = scope.subscribe(listener);
102
+ const offMirror = mirror.subscribe(listener);
103
+ return () => {
104
+ offScope();
105
+ offMirror();
106
+ };
107
+ }
108
+ } },
109
+ set: (field, value) => {
110
+ scope.set(field, value);
111
+ }
112
+ };
113
+ };
114
+ ctx.slots.inject("settings.section", () => ctx.slots.register({
115
+ name: "settings.section",
116
+ id: UI_FORTIFIER,
117
+ order: 30,
118
+ label: () => ctx.locale.bind(UI_FORTIFIER)("nav"),
119
+ locale: UI_FORTIFIER,
120
+ inject: sectionInjected
121
+ }, FortifierSettingsPage));
122
+ return scope;
123
+ }
124
+ //#endregion
125
+ //#region \0dsh-css:D:\data\code\deepseek-harness\packages\my\dsh-ui-fortifier\src\client\provider-label\ProviderLabel.module.css.mjs
126
+ const css = ".LjXNpG_label{text-overflow:ellipsis;white-space:nowrap;max-width:160px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;overflow:hidden}";
127
+ const tagId = "dsh-ui-fortifier/ProviderLabel.module.css";
128
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
129
+ const tag = document.createElement("style");
130
+ tag.dataset.plugin = "dsh-ui-fortifier";
131
+ tag.dataset.pluginCss = tagId;
132
+ tag.textContent = css;
133
+ document.head.appendChild(tag);
134
+ }
135
+ var ProviderLabel_module_css_default = { "label": "LjXNpG_label" };
136
+ //#endregion
137
+ //#region src/client/provider-label/ProviderLabel.tsx
138
+ function ProviderLabel(props) {
139
+ const provider = props.useDirectory((value) => value).current?.provider;
140
+ if (provider === void 0 || provider.length === 0) return null;
141
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
142
+ className: ProviderLabel_module_css_default.label,
143
+ title: provider,
144
+ children: provider
145
+ });
146
+ }
147
+ //#endregion
148
+ //#region src/client/provider-label/index.ts
149
+ /**
150
+ * 注册 provider 标签到 conversation.input.right。
151
+ * @param ctx - 需已提供 modelDirectories 服务的客户端上下文。
152
+ * @returns 停止注入并卸载注册的 disposer。
153
+ */
154
+ function installProviderLabel(ctx) {
155
+ return ctx.slots.inject("conversation.input.right", () => ctx.slots.register({
156
+ name: "conversation.input.right",
157
+ id: "provider-label",
158
+ order: 999,
159
+ inject: (sessionId) => ({ hooks: { directory: ctx.modelDirectories.directoryFor(sessionId).store } })
160
+ }, ProviderLabel));
161
+ }
162
+ //#endregion
163
+ //#region src/client/index.ts
164
+ /** 功能模块清单:字段名(settings 开关 key) → 模块安装面。 */
165
+ const modules = { "provider-label": {
166
+ module: installProviderLabel,
167
+ dispose: void 0
168
+ } };
169
+ const inject = [
170
+ "slots",
171
+ "locale",
172
+ "settingsScope",
173
+ "modelDirectories"
174
+ ];
175
+ /**
176
+ * 客户端插件体:注册设置页并据开关状态挂载各功能模块。
177
+ * @param ctx - 需已提供 slots/locale/settingsScope/modelDirectories 的客户端上下文。
178
+ */
179
+ function apply(ctx) {
180
+ const scope = installSettings(ctx, Object.keys(modules));
181
+ for (const field of Object.keys(modules)) {
182
+ const item = modules[field];
183
+ const sync = () => {
184
+ const enabled = scope.getSnapshot().value?.[field] ?? true;
185
+ item.dispose?.();
186
+ if (enabled) item.dispose = item.module(ctx);
187
+ else item.dispose = void 0;
188
+ };
189
+ scope.subscribe(sync);
190
+ sync();
191
+ }
192
+ }
193
+ //#endregion
194
+ exports.apply = apply;
195
+ exports.inject = inject;
196
+ exports.modules = modules;
197
+ return module.exports;
198
+ }
199
+ });
200
+
201
+ //# sourceMappingURL=client.js.map
package/lib/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import { installSettingsSection, settingsNamespace } from "@deepseek-ai/dsh-settings";
2
+ import z from "@deepseek-ai/schemastery";
3
+ //#region lib/types/index.js
4
+ /** 功能开关的 settings 命名空间。 */
5
+ const UI_FORTIFIER_SETTINGS_NAMESPACE = settingsNamespace("ui-fortifier");
6
+ /** 插件配置 schema。 */
7
+ const Config = z.object({ "provider-label": z.boolean().default(true) });
8
+ /**
9
+ * 注册功能开关的 settings 命名空间。
10
+ * @param ctx - 需已挂载 settings 服务的 Cordis 上下文。
11
+ * @param config - 插件配置,作为 base 层。
12
+ */
13
+ function apply(ctx, config) {
14
+ installSettingsSection(ctx, UI_FORTIFIER_SETTINGS_NAMESPACE, Config, config, {
15
+ setSource: () => {},
16
+ onChange: () => {}
17
+ });
18
+ }
19
+ //#endregion
20
+ export { Config, UI_FORTIFIER_SETTINGS_NAMESPACE, apply };
@@ -0,0 +1,12 @@
1
+ //#region lib/types/invariant.js
2
+ const PACKAGE_NAME = "dsh-ui-fortifier";
3
+ const name = "ui-fortifier-invariant";
4
+ const inject = ["invariants"];
5
+ /**
6
+ * No runtime invariant: 本包是纯插槽表面,注册/卸载由 slots 系统的
7
+ * effect 语义保证,无自有事件流或可变数据可断言。
8
+ */
9
+ const install = () => {};
10
+ const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
11
+ //#endregion
12
+ export { apply, inject, name };
@@ -0,0 +1,25 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { Config } from '../index';
3
+ import type { UiFortifierLocaleKey } from './locales.ts';
4
+ /** 一个功能模块的安装面。 */
5
+ interface ModuleEntry {
6
+ /** 安装函数:注册模块并返回卸载 disposer。 */
7
+ module: (ctx: Context) => () => void;
8
+ /** 当前注册的 disposer;归位后为 undefined。 */
9
+ dispose: (() => void) | undefined;
10
+ }
11
+ /** 功能模块清单:字段名(settings 开关 key) → 模块安装面。 */
12
+ export declare const modules: Record<keyof Config, ModuleEntry>;
13
+ export declare const inject: string[];
14
+ /**
15
+ * 客户端插件体:注册设置页并据开关状态挂载各功能模块。
16
+ * @param ctx - 需已提供 slots/locale/settingsScope/modelDirectories 的客户端上下文。
17
+ */
18
+ export declare function apply(ctx: Context): void;
19
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
20
+ interface LocaleNamespaceMap {
21
+ 'ui-fortifier': UiFortifierLocaleKey;
22
+ }
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ /** dsh-ui-fortifier 的文案。 */
2
+ /** locale key。 */
3
+ export type UiFortifierLocaleKey = 'nav' | 'empty' | 'config.provider-label';
4
+ /** 英文文案。 */
5
+ export declare const en: Record<UiFortifierLocaleKey, string>;
6
+ /** 中文文案。 */
7
+ export declare const zh: Record<UiFortifierLocaleKey, string>;
8
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1,4 @@
1
+ import type { ProviderBadgeProps } from './index.ts';
2
+ /** 渲染当前会话的 provider 文本;无选择时不渲染。 */
3
+ export declare function ProviderBadge({ directory }: ProviderBadgeProps): import("react").JSX.Element | null;
4
+ //# sourceMappingURL=ProviderBadge.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * provider-badge 功能:在模型选择按钮左侧显示当前会话的模型提供方。
3
+ * 注册位置:conversation.input.right(渲染在 conversation.input.model 左侧)。
4
+ * 数据源:ModelDirectory(ctx.modelDirectories),current.provider 是 host 报告的当前选择。
5
+ */
6
+ import type { ClientContext, SessionId } from '@deepseek-ai/dsh-client-runtime/client';
7
+ import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
8
+ import type { ModelDirectoryResolver } from '@deepseek-ai/dsh-client-ui-model-selection/client';
9
+ /** 本功能注入面:按会话解析 ModelDirectory。 */
10
+ export interface ProviderBadgeInjected {
11
+ directoryFor: (sessionId: SessionId) => ReturnType<ModelDirectoryResolver['directoryFor']>;
12
+ }
13
+ /**
14
+ * 注册 provider 标签到 conversation.input.right。
15
+ * @param ctx - 客户端根上下文。
16
+ * @param injected - 本功能注入面。
17
+ */
18
+ export declare function installProviderBadge(ctx: ClientContext, injected: ProviderBadgeInjected): void;
19
+ /** ProviderBadge 组件 props。 */
20
+ export type ProviderBadgeProps = PropsRuntime<'conversation.input.right'> & {
21
+ directory: ReturnType<ModelDirectoryResolver['directoryFor']>;
22
+ };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,12 @@
1
+ import type { HostObservable, InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client';
3
+ /** 注入面:模型目录的响应式快照。 */
4
+ export interface ProviderLabelInjected {
5
+ hooks: {
6
+ /** 模型目录 store(SnapshotStore 即 HostObservable)。 */
7
+ directory: HostObservable<ModelDirectoryState>;
8
+ };
9
+ }
10
+ export type ProviderLabelProps = PropsRuntime<'conversation.input.right'> & InjectFace<ProviderLabelInjected>;
11
+ export declare function ProviderLabel(props: ProviderLabelProps): import("react").JSX.Element | null;
12
+ //# sourceMappingURL=ProviderLabel.d.ts.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * provider-label 功能:在模型选择按钮左侧显示当前会话的模型提供方。
3
+ */
4
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
5
+ /**
6
+ * 注册 provider 标签到 conversation.input.right。
7
+ * @param ctx - 需已提供 modelDirectories 服务的客户端上下文。
8
+ * @returns 停止注入并卸载注册的 disposer。
9
+ */
10
+ export declare function installProviderLabel(ctx: ClientContext): () => void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,22 @@
1
+ import type { HostObservable, InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
+ /** 一个功能开关行的状态。 */
3
+ export interface FortifierToggleRow {
4
+ /** 字段名(即 settings 的 key)。 */
5
+ field: string;
6
+ /** 当前值。 */
7
+ value: boolean;
8
+ }
9
+ /** 设置页渲染所需的面。 */
10
+ export interface FortifierPageInjected {
11
+ hooks: {
12
+ /** 所有功能开关的当前值(响应式)。 */
13
+ toggles: HostObservable<readonly FortifierToggleRow[]>;
14
+ };
15
+ /** 写入一个开关值(user 层)。 */
16
+ set: (field: string, value: boolean) => void;
17
+ }
18
+ /** 设置页 props。 */
19
+ export type FortifierSettingsPageProps = PropsRuntime<'settings.section'> & PropsLocale<'ui-fortifier'> & InjectFace<FortifierPageInjected>;
20
+ /** 设置页:读取配置项自动生成开关行。 */
21
+ export declare function FortifierSettingsPage(props: FortifierSettingsPageProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=FortifierSettingsPage.d.ts.map
@@ -0,0 +1,14 @@
1
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
2
+ import type { SettingsScope } from '@deepseek-ai/dsh-client-ui-settings/client';
3
+ import type { Config } from '../../index';
4
+ export type { FortifierPageInjected, FortifierSettingsPageProps } from './FortifierSettingsPage.tsx';
5
+ /** 本插件设置命名空间(与 host 侧一致)。 */
6
+ export declare const UI_FORTIFIER = "ui-fortifier";
7
+ /**
8
+ * 注册设置页并绑定功能开关的 settings 作用域。
9
+ * @param ctx - 需已提供 slots/locale/settingsScope 的客户端上下文。
10
+ * @param moduleFields - 功能模块字段列表(settings 开关 key),由调用方传入。
11
+ * @returns 功能开关的 settings 绑定,供调用方控制子模块注册。
12
+ */
13
+ export declare function installSettings(ctx: ClientContext, moduleFields: readonly string[]): SettingsScope<Config>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,18 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import z from '@deepseek-ai/schemastery';
3
+ /** 功能开关的 settings 命名空间。 */
4
+ export declare const UI_FORTIFIER_SETTINGS_NAMESPACE: import("@deepseek-ai/dsh-settings").SettingsNamespace;
5
+ /** 插件配置:功能开关状态(配置默认值)。 */
6
+ export interface Config {
7
+ /** 输入框显示当前提供商。 */
8
+ 'provider-label': boolean;
9
+ }
10
+ /** 插件配置 schema。 */
11
+ export declare const Config: z<Config>;
12
+ /**
13
+ * 注册功能开关的 settings 命名空间。
14
+ * @param ctx - 需已挂载 settings 服务的 Cordis 上下文。
15
+ * @param config - 插件配置,作为 base 层。
16
+ */
17
+ export declare function apply(ctx: Context, config: Config): void;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ export declare const name = "ui-fortifier-invariant";
3
+ export declare const inject: string[];
4
+ export declare const apply: (ctx: Context) => Promise<() => void>;
5
+ //# sourceMappingURL=invariant.d.ts.map
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "dsh-ui-fortifier",
3
+ "description": "UI 强化",
4
+ "version": "0.1.0",
5
+ "license": "MIT",
6
+ "contributors": [
7
+ "pgnqukezrdxmhjso"
8
+ ],
9
+ "homepage": "https://github.com/pgnqukezrdxmhjso/dsh-ui-fortifier",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/pgnqukezrdxmhjso/dsh-ui-fortifier.git"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/pgnqukezrdxmhjso/dsh-ui-fortifier/issues"
16
+ },
17
+ "keywords": [
18
+ "dsh",
19
+ "plugin",
20
+ "ui",
21
+ "fortifier"
22
+ ],
23
+ "type": "module",
24
+ "main": "lib/index.js",
25
+ "types": "lib/types/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./lib/types/index.d.ts",
29
+ "default": "./lib/index.js"
30
+ },
31
+ "./invariant": {
32
+ "types": "./lib/types/invariant.d.ts",
33
+ "default": "./lib/invariant.js"
34
+ },
35
+ "./client": {
36
+ "types": "./lib/types/client/index.d.ts",
37
+ "default": "./lib/client.js"
38
+ },
39
+ "./src/*": "./src/*",
40
+ "./package.json": "./package.json"
41
+ },
42
+ "files": [
43
+ "lib/index.js",
44
+ "lib/invariant.js",
45
+ "lib/client.js",
46
+ "lib/types/**/*.d.ts"
47
+ ],
48
+ "scripts": {
49
+ "bundle": "tsc -b && tsdown",
50
+ "watch": "tsdown --watch",
51
+ "pub": "npm login --registry=https://registry.npmjs.org && npm publish --registry=https://registry.npmjs.org"
52
+ },
53
+ "peerDependencies": {
54
+ "@deepseek-ai/cordis": "workspace:^",
55
+ "@deepseek-ai/dsh-api-session-controller": "workspace:^",
56
+ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
57
+ "@deepseek-ai/dsh-client-ui-model-selection": "workspace:^",
58
+ "@deepseek-ai/dsh-client-ui-renderer": "workspace:^",
59
+ "@deepseek-ai/dsh-invariants": "workspace:^",
60
+ "@deepseek-ai/dsh-settings": "workspace:^",
61
+ "@deepseek-ai/schemastery": "workspace:^"
62
+ },
63
+ "devDependencies": {
64
+ "@deepseek-ai/cordis": "workspace:^",
65
+ "@deepseek-ai/dsh-api-session-controller": "workspace:^",
66
+ "@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
67
+ "@deepseek-ai/dsh-client-ui-model-selection": "workspace:^",
68
+ "@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
69
+ "@deepseek-ai/dsh-client-ui-renderer": "workspace:^",
70
+ "@deepseek-ai/dsh-client-ui-slots": "workspace:^",
71
+ "@deepseek-ai/dsh-client-ui-settings": "workspace:^",
72
+ "@deepseek-ai/dsh-client-locale": "workspace:^",
73
+ "@deepseek-ai/dsh-invariants": "workspace:^",
74
+ "@deepseek-ai/dsh-settings": "workspace:^",
75
+ "@deepseek-ai/schemastery": "workspace:^",
76
+ "@types/react": "~18.3.1",
77
+ "react": "^18.2.0"
78
+ },
79
+ "dsh": {
80
+ "bundle": {
81
+ "patch": "./cordis.patch.yml"
82
+ },
83
+ "client": {
84
+ "inject": [
85
+ "@deepseek-ai/dsh-api-session-controller",
86
+ "@deepseek-ai/dsh-client-ui-conversation",
87
+ "@deepseek-ai/dsh-client-ui-model-selection",
88
+ "@deepseek-ai/dsh-client-ui-renderer",
89
+ "@deepseek-ai/dsh-client-ui-settings",
90
+ "@deepseek-ai/dsh-client-locale"
91
+ ],
92
+ "platform": "web"
93
+ }
94
+ }
95
+ }