dsh-input-traffic 0.7.0 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -10
- package/README.en.md +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/dsh.plugin.json +2 -2
- package/lib/client.js +315 -43
- package/lib/client.js.map +1 -1
- package/lib/index.js +195 -3
- package/lib/types/bridge.d.ts +45 -0
- package/lib/types/bridge.d.ts.map +1 -0
- package/lib/types/bridge.js +130 -0
- package/lib/types/bridge.js.map +1 -0
- package/lib/types/client/bridge-scope.d.ts +38 -0
- package/lib/types/client/bridge-scope.d.ts.map +1 -0
- package/lib/types/client/bridge-scope.js +81 -0
- package/lib/types/client/bridge-scope.js.map +1 -0
- package/lib/types/client/compat.d.ts.map +1 -1
- package/lib/types/client/compat.js +18 -8
- package/lib/types/client/compat.js.map +1 -1
- package/lib/types/client/family-card.d.ts +2 -1
- package/lib/types/client/family-card.d.ts.map +1 -1
- package/lib/types/client/family-card.js +12 -2
- package/lib/types/client/family-card.js.map +1 -1
- package/lib/types/client/family-host.d.ts +51 -0
- package/lib/types/client/family-host.d.ts.map +1 -0
- package/lib/types/client/family-host.js +147 -0
- package/lib/types/client/family-host.js.map +1 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +50 -11
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/index.d.ts +16 -5
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +25 -2
- package/lib/types/index.js.map +1 -1
- package/package.json +20 -18
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { JSX } from 'react';
|
|
2
|
+
/** 账本条目(id/order/label,label 已解析成字符串)。 */
|
|
3
|
+
export interface FamilyTabEntry {
|
|
4
|
+
id: string;
|
|
5
|
+
order: number;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
/** 只用到槽门面的这几件事,避免与 index.tsx 的类型互相拖累。 */
|
|
9
|
+
export interface FamilyHostSlots {
|
|
10
|
+
inject: (name: string, factory: () => unknown) => unknown;
|
|
11
|
+
register: (options: Record<string, unknown>, component: unknown) => unknown;
|
|
12
|
+
entries: (name: string) => readonly Record<string, unknown>[];
|
|
13
|
+
subscribe?: (name: string, fn: () => void) => () => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 接管分级——唯一真源是 `mine-dsh-plugins/_tools/family-rank.mjs`(离线实测 GitHub
|
|
17
|
+
* star + npm 周下载量加权)。延迟 = BASE + RANK * STEP;rank 越大越靠后兜底。
|
|
18
|
+
*/
|
|
19
|
+
export declare const FAMILY_CLAIM_RANK = 1;
|
|
20
|
+
/** 派生而非硬编码:改 rank 表就自动改时刻。 */
|
|
21
|
+
export declare const FAMILY_CLAIM_DELAY_MS: number;
|
|
22
|
+
type HostObservable<T> = {
|
|
23
|
+
getSnapshot(): T;
|
|
24
|
+
subscribe(listener: () => void): () => void;
|
|
25
|
+
};
|
|
26
|
+
export interface FamilyHostSectionProps {
|
|
27
|
+
renderSlot?: (key: 'dsh-family.tab', owner?: object, opts?: {
|
|
28
|
+
only?: string;
|
|
29
|
+
fallback?: JSX.Element | null;
|
|
30
|
+
}) => JSX.Element | null;
|
|
31
|
+
useTabs?: <S>(selector: (value: readonly FamilyTabEntry[]) => S) => S;
|
|
32
|
+
hooks?: {
|
|
33
|
+
tabs: HostObservable<readonly FamilyTabEntry[]>;
|
|
34
|
+
};
|
|
35
|
+
renderContributor?: (id: string) => JSX.Element | null;
|
|
36
|
+
}
|
|
37
|
+
/** 通用容器渲染:按 order 依次画出账本里每张贡献卡,不含任何"本插件特例"。 */
|
|
38
|
+
export declare function FamilyHostSection(props: FamilyHostSectionProps): JSX.Element;
|
|
39
|
+
/** 把账本条目投影成标题行:label 可能是函数,抛错退化成 id,绝不带崩整节。 */
|
|
40
|
+
export declare function projectLedger(slots: FamilyHostSlots): readonly FamilyTabEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* 若到点仍无人声明子席位,则自己接管容器。
|
|
43
|
+
* @param slots - 客户端槽门面。
|
|
44
|
+
* @param isHeld - 探针:本插件的 tab 工厂是否已被执行(= 有人声明了子席位)。
|
|
45
|
+
* @param label - 导航标题;家族共享节的标题,不是本插件名。
|
|
46
|
+
* @param log - console 前缀(带插件名)。
|
|
47
|
+
* @returns 取消定时器与撤销接管注册的 disposer。
|
|
48
|
+
*/
|
|
49
|
+
export declare function claimFamilyHostIfOrphaned(slots: FamilyHostSlots, isHeld: () => boolean, label: () => string, log: string): () => void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=family-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"family-host.d.ts","sourceRoot":"","sources":["../../../src/client/family-host.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,OAAO,CAAA;AAE3C,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,KAAK,OAAO,CAAA;IACzD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,KAAK,OAAO,CAAA;IAC3E,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC7D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CACzD;AAMD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAGlC,8BAA8B;AAC9B,eAAO,MAAM,qBAAqB,QAAkE,CAAA;AAMpG,KAAK,cAAc,CAAC,CAAC,IAAI;IACvB,WAAW,IAAI,CAAC,CAAA;IAChB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C,CAAA;AASD,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;KAAE,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;IACnI,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACrE,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC,SAAS,cAAc,EAAE,CAAC,CAAA;KAAE,CAAA;IAC3D,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;CACvD;AAID,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAqB5E;AAcD,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,cAAc,EAAE,CAqB/E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,OAAO,EACrB,KAAK,EAAE,MAAM,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,MAAM,IAAI,CAkDZ"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 家族容器兜底接管(family host backstop)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么需要:本插件把设置卡挂在 `dsh-family.tab` 上,而那个子席位由**别的插件**
|
|
5
|
+
* (thinking-levels / session-guard / session-steward / dsh-mcp-registry)声明。
|
|
6
|
+
* 宿主的规则是「注册未声明的槽直接抛」,且声明全局唯一、先到先得——所以只要那几家
|
|
7
|
+
* 全部让位或声明失败,本插件的设置面就整轮启动不可见,而且**不报任何错**
|
|
8
|
+
* (inject 工厂在槽未声明时压根不跑)。
|
|
9
|
+
*
|
|
10
|
+
* 本模块把"看不见"变成"自己上位":延迟到分级时刻检查**自己的 tab 工厂有没有被跑过**
|
|
11
|
+
* ——那是插件侧唯一合法的「有人声明了吗」探针(宿主只在声明成立后才执行工厂)。
|
|
12
|
+
* 没跑过 → 自己注册一个通用容器,声明子席位,按账本渲染所有贡献卡(含自己的)。
|
|
13
|
+
*
|
|
14
|
+
* declare-or-withdraw:声明子席位失败(别人已持有)时**绝不**退回不带 children 的
|
|
15
|
+
* 裸注册——残废容器会占住导航行、让后来者按「已有 dsh-family」集体退场,
|
|
16
|
+
* 这正是 2026-10-14 家族面板丢失的成因。
|
|
17
|
+
*/
|
|
18
|
+
import { createElement, useEffect, useState } from 'react';
|
|
19
|
+
/** 家族节固定 id 与子席位 key(与 thinking-levels 的声明严格一致)。 */
|
|
20
|
+
const FAMILY_SECTION_ID = 'dsh-family';
|
|
21
|
+
const FAMILY_CHILD_KEY = 'dsh-family.tab';
|
|
22
|
+
/**
|
|
23
|
+
* 接管分级——唯一真源是 `mine-dsh-plugins/_tools/family-rank.mjs`(离线实测 GitHub
|
|
24
|
+
* star + npm 周下载量加权)。延迟 = BASE + RANK * STEP;rank 越大越靠后兜底。
|
|
25
|
+
*/
|
|
26
|
+
export const FAMILY_CLAIM_RANK = 1;
|
|
27
|
+
const FAMILY_CLAIM_BASE_MS = 200;
|
|
28
|
+
const FAMILY_CLAIM_STEP_MS = 900;
|
|
29
|
+
/** 派生而非硬编码:改 rank 表就自动改时刻。 */
|
|
30
|
+
export const FAMILY_CLAIM_DELAY_MS = FAMILY_CLAIM_BASE_MS + FAMILY_CLAIM_RANK * FAMILY_CLAIM_STEP_MS;
|
|
31
|
+
/** 接管行的遮蔽优先级:必须大于任何正牌 owner(TL 无=0、guard=10),
|
|
32
|
+
* 这样 owner 一旦上位就自然遮蔽本兜底行(宿主规则:同 cell 最低者渲染)。 */
|
|
33
|
+
const FAMILY_HOST_PRIORITY = 50;
|
|
34
|
+
const NO_TABS = [];
|
|
35
|
+
/** 通用容器渲染:按 order 依次画出账本里每张贡献卡,不含任何"本插件特例"。 */
|
|
36
|
+
export function FamilyHostSection(props) {
|
|
37
|
+
const raw = props.hooks?.tabs;
|
|
38
|
+
const [polled, setPolled] = useState(() => raw?.getSnapshot() ?? NO_TABS);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (props.useTabs !== undefined || raw === undefined)
|
|
41
|
+
return;
|
|
42
|
+
return raw.subscribe(() => setPolled(raw.getSnapshot()));
|
|
43
|
+
});
|
|
44
|
+
const tabs = props.useTabs !== undefined ? props.useTabs(value => value) : polled;
|
|
45
|
+
return createElement('div', { style: { display: 'grid', gap: '12px' } }, tabs.map(row => createElement('div', { key: row.id }, props.renderSlot
|
|
46
|
+
? props.renderSlot(FAMILY_CHILD_KEY, {}, { only: row.id, fallback: null })
|
|
47
|
+
: props.renderContributor?.(row.id) ?? null)));
|
|
48
|
+
}
|
|
49
|
+
/** 取条目上的具名面(宿主条目是结构化对象,这里只做安全读取)。 */
|
|
50
|
+
function face(entry, key) {
|
|
51
|
+
if (entry === null || typeof entry !== 'object')
|
|
52
|
+
return undefined;
|
|
53
|
+
return entry[key];
|
|
54
|
+
}
|
|
55
|
+
/** 条目的 options 收窄(宿主侧是结构化对象,缺失时当空对象读)。 */
|
|
56
|
+
function optionsOf(entry) {
|
|
57
|
+
const raw = face(entry, 'options');
|
|
58
|
+
return raw !== null && typeof raw === 'object' ? raw : {};
|
|
59
|
+
}
|
|
60
|
+
/** 把账本条目投影成标题行:label 可能是函数,抛错退化成 id,绝不带崩整节。 */
|
|
61
|
+
export function projectLedger(slots) {
|
|
62
|
+
return slots
|
|
63
|
+
.entries(FAMILY_CHILD_KEY)
|
|
64
|
+
.map(rawEntry => {
|
|
65
|
+
const entry = rawEntry;
|
|
66
|
+
const options = entry.options ?? {};
|
|
67
|
+
const id = String(options['id'] ?? '');
|
|
68
|
+
const rawLabel = options['label'];
|
|
69
|
+
let label = id;
|
|
70
|
+
if (typeof rawLabel === 'function') {
|
|
71
|
+
try {
|
|
72
|
+
label = String(rawLabel() ?? id);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
label = id;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (typeof rawLabel === 'string') {
|
|
79
|
+
label = rawLabel;
|
|
80
|
+
}
|
|
81
|
+
return { id, order: Number(options['order'] ?? 0), label };
|
|
82
|
+
})
|
|
83
|
+
.sort((a, b) => a.order - b.order);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 若到点仍无人声明子席位,则自己接管容器。
|
|
87
|
+
* @param slots - 客户端槽门面。
|
|
88
|
+
* @param isHeld - 探针:本插件的 tab 工厂是否已被执行(= 有人声明了子席位)。
|
|
89
|
+
* @param label - 导航标题;家族共享节的标题,不是本插件名。
|
|
90
|
+
* @param log - console 前缀(带插件名)。
|
|
91
|
+
* @returns 取消定时器与撤销接管注册的 disposer。
|
|
92
|
+
*/
|
|
93
|
+
export function claimFamilyHostIfOrphaned(slots, isHeld, label, log) {
|
|
94
|
+
let disposeClaim;
|
|
95
|
+
let claimed = false;
|
|
96
|
+
const timer = setTimeout(() => {
|
|
97
|
+
// 有人持有声明(我们的工厂被跑过)或账本已有卡 → 只做成员,不上位。
|
|
98
|
+
if (isHeld())
|
|
99
|
+
return;
|
|
100
|
+
const ledger = {
|
|
101
|
+
getSnapshot: () => projectLedger(slots),
|
|
102
|
+
subscribe: listener => (slots.subscribe ? slots.subscribe(FAMILY_CHILD_KEY, listener) : () => undefined),
|
|
103
|
+
};
|
|
104
|
+
/** ≤0.1.5 壳没有 renderSlot:从账本条目现挂组件,失败一律 null。 */
|
|
105
|
+
const renderContributor = (id) => {
|
|
106
|
+
try {
|
|
107
|
+
const found = slots.entries(FAMILY_CHILD_KEY).find(candidate => String(optionsOf(candidate)['id'] ?? '') === id);
|
|
108
|
+
const entry = found;
|
|
109
|
+
const component = entry ? face(entry, 'component') : undefined;
|
|
110
|
+
const inject = entry ? face(entry, 'inject') : undefined;
|
|
111
|
+
if (typeof component !== 'function')
|
|
112
|
+
return null;
|
|
113
|
+
const injected = typeof inject === 'function' ? inject() : {};
|
|
114
|
+
return createElement(component, injected ?? {});
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
try {
|
|
121
|
+
const dispose = slots.register({
|
|
122
|
+
name: 'settings.section',
|
|
123
|
+
id: FAMILY_SECTION_ID,
|
|
124
|
+
order: 40,
|
|
125
|
+
priority: FAMILY_HOST_PRIORITY,
|
|
126
|
+
label,
|
|
127
|
+
inject: () => ({ hooks: { tabs: ledger }, renderContributor }),
|
|
128
|
+
children: { [FAMILY_CHILD_KEY]: { kind: 'list', scope: 'root' } },
|
|
129
|
+
}, FamilyHostSection);
|
|
130
|
+
if (typeof dispose === 'function')
|
|
131
|
+
disposeClaim = dispose;
|
|
132
|
+
claimed = true;
|
|
133
|
+
console.warn(`${log} family container unclaimed — took it over (children declared)`);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
// declare-or-withdraw: someone holds the declaration after all; a childless
|
|
137
|
+
// section here would hide every member card instead of saving it.
|
|
138
|
+
console.warn(`${log} family claim lost — withdrawing (${error instanceof Error ? error.message : String(error)})`);
|
|
139
|
+
}
|
|
140
|
+
}, FAMILY_CLAIM_DELAY_MS);
|
|
141
|
+
return () => {
|
|
142
|
+
clearTimeout(timer);
|
|
143
|
+
if (claimed)
|
|
144
|
+
disposeClaim?.();
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=family-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"family-host.js","sourceRoot":"","sources":["../../../src/client/family-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAqBnE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAA;AAkBpC;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,UAAkD,CAAA;AAErE;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA2I9C"}
|
|
@@ -3,7 +3,9 @@ import { SteerQueueDock } from "./steer-queue-dock.js";
|
|
|
3
3
|
import { FreezeButton } from "./freeze-button.js";
|
|
4
4
|
import { InputTrafficFamilyCard } from "./family-card.js";
|
|
5
5
|
import { HideEnterRow } from "./hide-enter-row.js";
|
|
6
|
+
import { BridgeDocHandle } from "./bridge-scope.js";
|
|
6
7
|
import { draftWriter, registerSettingsFaces } from "./compat.js";
|
|
8
|
+
import { claimFamilyHostIfOrphaned } from "./family-host.js";
|
|
7
9
|
/** Durable conversation settings namespace owned by ui-conversation. */
|
|
8
10
|
const CONVERSATION_SETTINGS_NAMESPACE = 'ui-conversation';
|
|
9
11
|
/** Busy-Enter field inside that namespace; the plugin pins it to queue. */
|
|
@@ -65,22 +67,59 @@ export function apply(ctx) {
|
|
|
65
67
|
// The durable-settings service is per-line (configForms 0.1.7+ /
|
|
66
68
|
// settingsScope ≤0.1.5) — the compat waist resolves it and the family tab
|
|
67
69
|
// registers against whichever scope resolves.
|
|
70
|
+
// 2026-10-07 修复(0.1.5 家族节空白根因,perm-gate ea18a6a 同款):≤0.1.5 上
|
|
71
|
+
// settingsScope 子注入永不 resolve → onScope 永不回调 → 原先关在回调里的
|
|
72
|
+
// family.tab 注册从未执行 → 接管/托管节账本为空 → 节内容空白。注册是金贵的:
|
|
73
|
+
// 提到 apply 顶层无条件执行,scope 改活引用(回调解到就填,卡 inject 现读),
|
|
74
|
+
// 未解析时卡自身呈现不可用态而不是整卡缺席。
|
|
75
|
+
const familyScopeRef = {};
|
|
76
|
+
// T20-b 桥轨(perm-gate T13b 双轨同架构):≤0.1.5 上 settingsScope 子注入
|
|
77
|
+
// 永不 resolve(A2 死路),原生句柄缺席时卡片数据与 busyEnter 钉值走自家
|
|
78
|
+
// webServer 桥(node 半区挂 describe/mutate 路由对;0.1.0 宿主 settings
|
|
79
|
+
// 服务实测全款具备该面)。原生句柄优先——configForms 臂解到就改走原生,
|
|
80
|
+
// 桥只在原生缺席时供数;桥 pending 期间快照 value 为 undefined,卡按钉死
|
|
81
|
+
// 默认值渲染,首拉落地后订阅通知刷新。
|
|
82
|
+
const bridgeScope = new BridgeDocHandle(CONVERSATION_SETTINGS_NAMESPACE);
|
|
83
|
+
let nativeScopeResolved = false;
|
|
84
|
+
let bridgePinned = false;
|
|
85
|
+
bridgeScope.subscribe(() => {
|
|
86
|
+
if (bridgePinned || nativeScopeResolved)
|
|
87
|
+
return;
|
|
88
|
+
if (bridgeScope.getSnapshot().status !== 'ready')
|
|
89
|
+
return;
|
|
90
|
+
// Pin through the bridge once, only when the native arm never resolved
|
|
91
|
+
// (≤0.1.5): same semantics as the configForms arm's startup pin. Worst
|
|
92
|
+
// race (both arms ready simultaneously) writes the same value twice —
|
|
93
|
+
// idempotent, and the host serializes writers.
|
|
94
|
+
bridgePinned = true;
|
|
95
|
+
void bridgeScope.set(BUSY_ENTER_FIELD, 'queue').catch((e) => {
|
|
96
|
+
console.warn('[dsh-input-traffic] bridge busyEnter pin failed:', e);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
// 探针:宿主执行过本工厂 == 有人声明了 `dsh-family.tab`(插件侧唯一合法的
|
|
100
|
+
// 「容器在不在」判据,槽门面不暴露 spec 查询)。
|
|
101
|
+
let familyTabHeld = false;
|
|
102
|
+
ctx.slots.inject('dsh-family.tab', () => {
|
|
103
|
+
familyTabHeld = true;
|
|
104
|
+
return ctx.slots.register({
|
|
105
|
+
name: 'dsh-family.tab',
|
|
106
|
+
id: 'input-traffic',
|
|
107
|
+
order: 50,
|
|
108
|
+
label: () => tFamily('family.title'),
|
|
109
|
+
locale: NS,
|
|
110
|
+
inject: () => ({ scope: familyScopeRef.scope ?? bridgeScope }),
|
|
111
|
+
}, InputTrafficFamilyCard);
|
|
112
|
+
});
|
|
113
|
+
// 家族容器兜底:到分级时刻仍无人声明子席位(owner 全部让位/声明失败)则自己上位,
|
|
114
|
+
// 否则本卡整轮启动不可见且不报错。declare-or-withdraw:声明失败不裸注册。
|
|
115
|
+
ctx.effect(() => claimFamilyHostIfOrphaned(ctx.slots, () => familyTabHeld, () => '起子插件设置', '[dsh-input-traffic]'), 'dsh-input-traffic: family host backstop');
|
|
68
116
|
registerSettingsFaces(ctx, {
|
|
69
117
|
namespace: CONVERSATION_SETTINGS_NAMESPACE,
|
|
70
118
|
field: BUSY_ENTER_FIELD,
|
|
71
119
|
value: 'queue',
|
|
72
120
|
onScope: (scope) => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
// inject 静默等待,不阻塞客户端半。
|
|
76
|
-
ctx.slots.inject('dsh-family.tab', () => ctx.slots.register({
|
|
77
|
-
name: 'dsh-family.tab',
|
|
78
|
-
id: 'input-traffic',
|
|
79
|
-
order: 50,
|
|
80
|
-
label: () => tFamily('family.title'),
|
|
81
|
-
locale: NS,
|
|
82
|
-
inject: () => ({ scope }),
|
|
83
|
-
}, InputTrafficFamilyCard));
|
|
121
|
+
familyScopeRef.scope = scope;
|
|
122
|
+
nativeScopeResolved = true;
|
|
84
123
|
},
|
|
85
124
|
});
|
|
86
125
|
// Shadow the official queue dock with the three-tier planning strip. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAwB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAqB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAmB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAsB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAwB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAqB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAmB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAsB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAA0B,MAAM,aAAa,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAwB,MAAM,kBAAkB,CAAA;AAElF,wEAAwE;AACxE,MAAM,+BAA+B,GAAG,iBAAiB,CAAA;AAEzD,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAEpC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAEpC;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,IAAmB,EAAE,IAAY;IACpD,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC7C,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAA;IAClH,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAA;AAErE;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAkB;IACtC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,iCAAiC,CAAC,CAAA;IAC1F,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,4EAA4E;IAC5E,kBAAkB;IAClB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEnC,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,kEAAkE;IAClE,iEAAiE;IACjE,0EAA0E;IAC1E,8CAA8C;IAC9C,6DAA6D;IAC7D,wDAAwD;IACxD,iDAAiD;IACjD,mDAAmD;IACnD,wBAAwB;IACxB,MAAM,cAAc,GAAkC,EAAE,CAAA;IACxD,4DAA4D;IAC5D,iDAAiD;IACjD,6DAA6D;IAC7D,4CAA4C;IAC5C,mDAAmD;IACnD,qBAAqB;IACrB,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,+BAA+B,CAAC,CAAA;IACxE,IAAI,mBAAmB,GAAG,KAAK,CAAA;IAC/B,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE;QACzB,IAAI,YAAY,IAAI,mBAAmB;YAAE,OAAM;QAC/C,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,MAAM,KAAK,OAAO;YAAE,OAAM;QACxD,uEAAuE;QACvE,uEAAuE;QACvE,sEAAsE;QACtE,+CAA+C;QAC/C,YAAY,GAAG,IAAI,CAAA;QACnB,KAAK,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YACnE,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,iDAAiD;IACjD,6BAA6B;IAC7B,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACtC,aAAa,GAAG,IAAI,CAAA;QACpB,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,IAAI,EAAE,gBAAgB;YACtB,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;YACpC,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;SAC/D,EAAE,sBAAsB,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IACF,8CAA8C;IAC9C,gDAAgD;IAChD,GAAG,CAAC,MAAM,CACR,GAAG,EAAE,CAAC,yBAAyB,CAC7B,GAAG,CAAC,KAAmC,EACvC,GAAG,EAAE,CAAC,aAAa,EACnB,GAAG,EAAE,CAAC,QAAQ,EACd,qBAAqB,CACtB,EACD,yCAAyC,CAC1C,CAAA;IACD,qBAAqB,CAAC,GAAG,EAAE;QACzB,SAAS,EAAE,+BAA+B;QAC1C,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,cAAc,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5B,mBAAmB,GAAG,IAAI,CAAA;QAC5B,CAAC;KACF,CAAC,CAAA;IAEF,yEAAyE;IACzE,wEAAwE;IACxE,kEAAkE;IAClE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnE,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,CAAC,CAAC;QACZ,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,CAAC,SAAoB,EAA0B,EAAE;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,qBAAqB,CAAC,CAAA;YAC/F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC7C,IAAI,YAAY,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC/F,OAAO;gBACL,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,MAAe,EAAE,MAAM,CAAC;gBAClF,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;gBACnC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvC,QAAQ,EAAE,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC;gBACzC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;aAC9E,CAAA;QACH,CAAC;KACF,EAAE,cAAc,CAAC,CAAC,CAAA;IAEnB,2EAA2E;IAC3E,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACpE,IAAI,EAAE,0BAA0B;QAChC,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,CAAC,SAAoB,EAA0B,EAAE;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,qBAAqB,CAAC,CAAA;YACjG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YAC7C,IAAI,YAAY,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;YACjG,OAAO;gBACL,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,MAAe,EAAE,MAAM,CAAC;gBAClF,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE;gBACnC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvC,iEAAiE;gBACjE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC5C,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;gBAC5B,QAAQ,EAAE,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC;gBACzC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;gBAC7E,2DAA2D;gBAC3D,gDAAgD;gBAChD,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;oBAC3B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;gBACnF,CAAC;aACF,CAAA;QACH,CAAC;KACF,EAAE,YAAY,CAAC,CAAC,CAAA;IAEjB,yEAAyE;IACzE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjE,IAAI,EAAE,uBAAuB;QAC7B,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,CAAC,CAAC;QACZ,MAAM,EAAE,EAAE;KACX,EAAE,YAAY,CAAC,CAAC,CAAA;AACnB,CAAC"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dsh-input-traffic —node half.
|
|
2
|
+
* dsh-input-traffic — node half.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Historically a deliberate no-op (pure client takeover shape). T20-b gave it
|
|
5
|
+
* one real job: host the settings bridge. The browser half's durable data
|
|
6
|
+
* plane (the `ui-conversation` busy-Enter pin) rides generation-exclusive
|
|
7
|
+
* client settings handles that are a dead end ≤0.1.5 (the A2 posture), so the
|
|
8
|
+
* node half exposes the host settings service over the plugin's webServer as
|
|
9
|
+
* a describe/mutate route pair (src/bridge.ts, perm-gate 5260fe6 generalized
|
|
10
|
+
* form) — see src/client/bridge-scope.ts for the consumer.
|
|
11
|
+
*
|
|
12
|
+
* Inject posture: `webServer` is loader-level (present on every kept line —
|
|
13
|
+
* the web profile serves the UI through it); `settings` resolves via a child
|
|
14
|
+
* effect so a host without it leaves the ref unset and the bridge degrades to
|
|
15
|
+
* `settings-unavailable` responses instead of failing the entry.
|
|
7
16
|
*/
|
|
8
17
|
import type { Context } from '@deepseek-ai/cordis';
|
|
9
|
-
/**
|
|
18
|
+
/** webServer hosts the bridge route pair. */
|
|
19
|
+
export declare const inject: string[];
|
|
20
|
+
/** @param ctx - host-side context; registers the bridge route pair. */
|
|
10
21
|
export declare function apply(ctx: Context): void;
|
|
11
22
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,6CAA6C;AAC7C,eAAO,MAAM,MAAM,UAAgB,CAAA;AASnC,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAmBxC"}
|
package/lib/types/index.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
import { registerSettingsBridgeRoutes } from './bridge.js';
|
|
2
|
+
/** The settings namespace the browser half pins (`ui-conversation.busyEnter`). */
|
|
3
|
+
const BRIDGE_NS = 'ui-conversation';
|
|
4
|
+
/** webServer hosts the bridge route pair. */
|
|
5
|
+
export const inject = ['webServer'];
|
|
6
|
+
/** @param ctx - host-side context; registers the bridge route pair. */
|
|
2
7
|
export function apply(ctx) {
|
|
3
|
-
|
|
8
|
+
// Live settings ref: the child effect keeps entry activation independent of
|
|
9
|
+
// the service (a host without settings just gets settings-unavailable).
|
|
10
|
+
const settingsRef = {};
|
|
11
|
+
ctx.inject(['settings'], (child) => {
|
|
12
|
+
// cordis inject callbacks receive (ctx, config) — read services off the
|
|
13
|
+
// scope object by name (the waist-wide convention; bare-service calls are
|
|
14
|
+
// a TypeError on every generation).
|
|
15
|
+
settingsRef.svc = child.settings;
|
|
16
|
+
});
|
|
17
|
+
// Register + unregister the route pair with the entry's life cycle. The
|
|
18
|
+
// webServer comes from the loader inject, with a ctx.get fallback for hosts
|
|
19
|
+
// that resolve services lazily (same posture as dsh-perm-gate).
|
|
20
|
+
ctx.effect(() => {
|
|
21
|
+
const injected = ctx;
|
|
22
|
+
const webServer = injected.webServer ?? injected.get?.('webServer');
|
|
23
|
+
const offs = registerSettingsBridgeRoutes(webServer, () => settingsRef.svc, BRIDGE_NS);
|
|
24
|
+
return () => { for (const off of offs)
|
|
25
|
+
off(); };
|
|
26
|
+
}, 'dsh-input-traffic: settings bridge routes');
|
|
4
27
|
}
|
|
5
28
|
//# sourceMappingURL=index.js.map
|
package/lib/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAE1D,kFAAkF;AAClF,MAAM,SAAS,GAAG,iBAAiB,CAAA;AAEnC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,CAAA;AASnC,uEAAuE;AACvE,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,WAAW,GAAkC,EAAE,CAAA;IACrD,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,wEAAwE;QACxE,0EAA0E;QAC1E,oCAAoC;QACpC,WAAW,CAAC,GAAG,GAAI,KAAuD,CAAC,QAAQ,CAAA;IACrF,CAAC,CAAC,CAAA;IACF,wEAAwE;IACxE,4EAA4E;IAC5E,gEAAgE;IAChE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,MAAM,QAAQ,GAAG,GAAsE,CAAA;QACvF,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;QACnE,MAAM,IAAI,GAAG,4BAA4B,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACtF,OAAO,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,GAAG,EAAE,CAAA,CAAC,CAAC,CAAA;IAChD,CAAC,EAAE,2CAA2C,CAAC,CAAA;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-input-traffic",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"publishConfig": {
|
|
5
|
+
"registry": "https://registry.npmjs.org",
|
|
5
6
|
"tag": "latest"
|
|
6
7
|
},
|
|
7
8
|
"type": "module",
|
|
@@ -53,19 +54,29 @@
|
|
|
53
54
|
"platform": "web"
|
|
54
55
|
}
|
|
55
56
|
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"build": "tsc -p tsconfig.json && tsdown",
|
|
59
|
+
"prepack": "npm run build",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"clean": "node -e \"require('node:fs').rmSync('lib', { recursive: true, force: true })\"",
|
|
62
|
+
"lint": "eslint src tests",
|
|
63
|
+
"lint:fix": "eslint src tests --fix",
|
|
64
|
+
"tdd": "vitest",
|
|
65
|
+
"verify": "npm run lint && npm run test && npm run build && node examples/verify-assembly.mjs"
|
|
66
|
+
},
|
|
56
67
|
"engines": {
|
|
57
68
|
"node": ">=20",
|
|
58
|
-
"dsh": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2"
|
|
69
|
+
"dsh": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1"
|
|
59
70
|
},
|
|
60
71
|
"license": "MIT",
|
|
61
72
|
"peerDependencies": {
|
|
62
73
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
63
|
-
"@deepseek-ai/dsh-client-locale": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2",
|
|
68
|
-
"@deepseek-ai/dsh-session": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2"
|
|
74
|
+
"@deepseek-ai/dsh-client-locale": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1",
|
|
77
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1",
|
|
79
|
+
"@deepseek-ai/dsh-session": "0.1.0-rc.2 || 0.1.0-rc.3 || 0.1.0-rc.6 || 0.1.0-rc.7 || 0.1.0-rc.8 || 0.1.1-rc.1 || 0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.5-rc.3 || 0.1.7-rc.1 || 0.1.7-rc.2 || 0.2.0-rc.1 || 0.2.0-rc.2 || 0.2.1-rc.1"
|
|
69
80
|
},
|
|
70
81
|
"devDependencies": {
|
|
71
82
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
@@ -106,14 +117,5 @@
|
|
|
106
117
|
"typescript": "^6.0.3",
|
|
107
118
|
"typescript-eslint": "^8.67.0",
|
|
108
119
|
"vitest": "^4.1.8"
|
|
109
|
-
},
|
|
110
|
-
"scripts": {
|
|
111
|
-
"build": "tsc -p tsconfig.json && tsdown",
|
|
112
|
-
"test": "vitest run",
|
|
113
|
-
"clean": "node -e \"require('node:fs').rmSync('lib', { recursive: true, force: true })\"",
|
|
114
|
-
"lint": "eslint src tests",
|
|
115
|
-
"lint:fix": "eslint src tests --fix",
|
|
116
|
-
"tdd": "vitest",
|
|
117
|
-
"verify": "npm run lint && npm run test && npm run build && node examples/verify-assembly.mjs"
|
|
118
120
|
}
|
|
119
|
-
}
|
|
121
|
+
}
|