dsh-plugin-update 0.2.0 → 0.3.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.
@@ -0,0 +1,113 @@
1
+ import { type BatchCheckOutcome, type BatchInstallOutcome, type BatchRunStep } from './batch-run.js';
2
+ import { type UpdateConfigInput } from './config.js';
3
+ import { type ReaderOverrides } from './host.js';
4
+ /** 一个批量目标:要更新的那个插件包 + 它在电话表里的前缀。 */
5
+ export interface MultiTargetSpec {
6
+ /** 会话内稳定键(唯一)。 */
7
+ key: string;
8
+ /** 中文名(面板行首用;缺省用 key)。 */
9
+ title?: string;
10
+ /** 目标包名(createHostUpdate 的 targetPackageName)。 */
11
+ packageName: string;
12
+ /** 该目标的单插件电话前缀(七个必须互不相同,否则串台)。 */
13
+ prefix: string;
14
+ /** 宿主侧插件标识(缺省用 batchPrefix + '-' + key)。 */
15
+ pluginId?: string;
16
+ /** 该目标的落盘使用范围(家目录):缺省随批量范围;与批量不一致即如实拒绝(cross-scope)。 */
17
+ homeDir?: string;
18
+ /** 该目标的落盘使用范围(使用范围目录):缺省随批量范围;与批量不一致即如实拒绝。 */
19
+ profileDir?: string;
20
+ }
21
+ /** createMultiHostUpdate 的配置。 */
22
+ export interface MultiHostOptions {
23
+ /** 批量电话前缀(例 'life')。 */
24
+ prefix: string;
25
+ /** 目标清单(顺序即会话顺序;selfKey 会被排到最后)。 */
26
+ targets: MultiTargetSpec[];
27
+ /** 「自己」的键:排序时排最后,自更新安全。 */
28
+ selfKey?: string | null;
29
+ /** 一家失败后是否停下(默认 false:继续下一家)。 */
30
+ stopOnFailure?: boolean;
31
+ /** 宿主侧 drain:定时自动推进队列(**默认关**,显式 opt-in)。 */
32
+ drain?: boolean;
33
+ /** drain 间隔(毫秒,缺省 5000,下限 1000)。 */
34
+ drainIntervalMs?: number;
35
+ }
36
+ /** 查一家:真路径打该目标的 updateCheck 电话,单测给假件。 */
37
+ export type TargetCheckFn = (key: string, spec: MultiTargetSpec) => Promise<BatchCheckOutcome>;
38
+ /** 装一家:requestId 是会话账本里的幂等编号(同一会话同一目标恒定)。 */
39
+ export type TargetInstallFn = (key: string, spec: MultiTargetSpec, requestId: string, version: string) => Promise<BatchInstallOutcome>;
40
+ /** 定时器:drain 用;测试给假件即能确定性地断言「起没起、停没停」。 */
41
+ export interface MultiHostTimer {
42
+ setTimeout: (fn: () => void, ms: number) => unknown;
43
+ clearTimeout: (handle: unknown) => void;
44
+ }
45
+ /**
46
+ * createMultiHostUpdate 的宿主依赖(全部可选)。
47
+ * ctx / logCtx / desktopPnpm / pluginManager / readerOverrides 原样透传给每个目标的 createHostUpdate;
48
+ * 其余是本入口自己的口子(范围、传输、定时器、时钟、编号),生产可不传。
49
+ */
50
+ export interface MultiHostDeps {
51
+ ctx?: unknown;
52
+ logCtx?: {
53
+ fire: (level: string, event: string, fields: Record<string, unknown>) => void;
54
+ } | null;
55
+ desktopPnpm?: unknown;
56
+ pluginManager?: unknown;
57
+ /** 逐目标共用的读侧覆盖(透传给每个目标)。 */
58
+ readerOverrides?: ReaderOverrides;
59
+ /** 逐目标读侧覆盖(给了就按目标算;测试与异构目标用)。 */
60
+ readerOverridesFor?: (spec: MultiTargetSpec) => ReaderOverrides | undefined;
61
+ /** 逐目标共用的配置覆盖(pluginId / prefix / targetPackageName 按目标算,不从这里来)。 */
62
+ config?: Omit<UpdateConfigInput, 'pluginId' | 'prefix' | 'targetPackageName'>;
63
+ /** 批量使用范围(会话落盘与共享队列端口用;缺省取 readerOverrides 的同名项)。 */
64
+ scope?: {
65
+ homeDir?: string;
66
+ profileDir?: string;
67
+ };
68
+ /** 查/装传输:缺省走单插件电话;测试给假件。 */
69
+ transport?: {
70
+ check?: TargetCheckFn;
71
+ install?: TargetInstallFn;
72
+ };
73
+ /** drain 的定时器(缺省真 setTimeout / clearTimeout)。 */
74
+ timers?: MultiHostTimer;
75
+ now?: () => number;
76
+ randomId?: () => string;
77
+ /** 装完之后轮询该家状态的间隔毫秒(缺省 500;后台安装收尾用)。 */
78
+ installPollMs?: number;
79
+ }
80
+ /** 批量宿主入口的返回面。 */
81
+ export interface MultiHostUpdate {
82
+ /** 电话表:批量电话 + 每个目标的单插件三电话,键即电话名。 */
83
+ handlers: Record<string, (args?: Record<string, unknown>) => Promise<unknown>>;
84
+ /** 批量电话名(供接入方登记用,不写字面量)。 */
85
+ phoneNames: {
86
+ status: string;
87
+ check: string;
88
+ install: string;
89
+ resume: string;
90
+ cancel: string;
91
+ };
92
+ /** 目标清单(顺序与会话一致)。 */
93
+ targets: readonly MultiTargetSpec[];
94
+ /** 最近一次推进的读数(驱动器停下来的原因 + 步骤):给日志与门禁用;没推过为 null。 */
95
+ lastRun: {
96
+ stoppedBecause: string;
97
+ steps: BatchRunStep[];
98
+ } | null;
99
+ /** 停掉 drain(接入方卸载时调)。 */
100
+ dispose(): void;
101
+ }
102
+ /**
103
+ * 账本幂等编号 -> 电话/队列收的编号。账本编号形如 batch:<会话>:<目标>,带冒号,
104
+ * 不在更新核心收的「不透明编号」形状里([A-Za-z0-9._~-],见 service.ts 的 validRequestId)。
105
+ * 纯函数:同一账本编号恒得同一电话编号,所以「同一会话同一目标恒定、重复提交不重复装」原样成立;
106
+ * 形状被改写过的追加短哈希,避免不同账本编号撞成同一个电话编号。
107
+ */
108
+ export declare function phoneRequestIdOf(batchRequestId: string): string;
109
+ /**
110
+ * 建批量宿主能力:给 N 个目标各建一份单插件宿主能力,共享一套队列端口与一份会话账本。
111
+ * 参数错了在装载时抛(fail fast);使用范围冲突、装到一半、盘上没有会话这些运行期情况都走回包,不抛。
112
+ */
113
+ export declare function createMultiHostUpdate(deps: (MultiHostDeps | Record<string, unknown>) | undefined, options: MultiHostOptions): MultiHostUpdate;