@tx5dr/contracts 1.2.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.
Files changed (180) hide show
  1. package/CLAUDE.md +41 -0
  2. package/dist/index.d.ts +55 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +86 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/schema/__tests__/plugin-runtime-log.schema.test.d.ts +2 -0
  7. package/dist/schema/__tests__/plugin-runtime-log.schema.test.d.ts.map +1 -0
  8. package/dist/schema/__tests__/plugin-runtime-log.schema.test.js +78 -0
  9. package/dist/schema/__tests__/plugin-runtime-log.schema.test.js.map +1 -0
  10. package/dist/schema/ability.d.ts +85 -0
  11. package/dist/schema/ability.d.ts.map +1 -0
  12. package/dist/schema/ability.js +119 -0
  13. package/dist/schema/ability.js.map +1 -0
  14. package/dist/schema/api-response.schema.d.ts +1017 -0
  15. package/dist/schema/api-response.schema.d.ts.map +1 -0
  16. package/dist/schema/api-response.schema.js +137 -0
  17. package/dist/schema/api-response.schema.js.map +1 -0
  18. package/dist/schema/audio-sidecar.schema.d.ts +106 -0
  19. package/dist/schema/audio-sidecar.schema.d.ts.map +1 -0
  20. package/dist/schema/audio-sidecar.schema.js +47 -0
  21. package/dist/schema/audio-sidecar.schema.js.map +1 -0
  22. package/dist/schema/audio.schema.d.ts +227 -0
  23. package/dist/schema/audio.schema.d.ts.map +1 -0
  24. package/dist/schema/audio.schema.js +56 -0
  25. package/dist/schema/audio.schema.js.map +1 -0
  26. package/dist/schema/auth.schema.d.ts +738 -0
  27. package/dist/schema/auth.schema.d.ts.map +1 -0
  28. package/dist/schema/auth.schema.js +161 -0
  29. package/dist/schema/auth.schema.js.map +1 -0
  30. package/dist/schema/cycle.schema.d.ts +33 -0
  31. package/dist/schema/cycle.schema.d.ts.map +1 -0
  32. package/dist/schema/cycle.schema.js +23 -0
  33. package/dist/schema/cycle.schema.js.map +1 -0
  34. package/dist/schema/desktop-https.schema.d.ts +146 -0
  35. package/dist/schema/desktop-https.schema.d.ts.map +1 -0
  36. package/dist/schema/desktop-https.schema.js +31 -0
  37. package/dist/schema/desktop-https.schema.js.map +1 -0
  38. package/dist/schema/ft8.schema.d.ts +1107 -0
  39. package/dist/schema/ft8.schema.d.ts.map +1 -0
  40. package/dist/schema/ft8.schema.js +268 -0
  41. package/dist/schema/ft8.schema.js.map +1 -0
  42. package/dist/schema/hello.schema.d.ts +10 -0
  43. package/dist/schema/hello.schema.d.ts.map +1 -0
  44. package/dist/schema/hello.schema.js +5 -0
  45. package/dist/schema/hello.schema.js.map +1 -0
  46. package/dist/schema/logbook.schema.d.ts +1472 -0
  47. package/dist/schema/logbook.schema.d.ts.map +1 -0
  48. package/dist/schema/logbook.schema.js +256 -0
  49. package/dist/schema/logbook.schema.js.map +1 -0
  50. package/dist/schema/mode.schema.d.ts +130 -0
  51. package/dist/schema/mode.schema.d.ts.map +1 -0
  52. package/dist/schema/mode.schema.js +141 -0
  53. package/dist/schema/mode.schema.js.map +1 -0
  54. package/dist/schema/openwebrx.schema.d.ts +352 -0
  55. package/dist/schema/openwebrx.schema.d.ts.map +1 -0
  56. package/dist/schema/openwebrx.schema.js +139 -0
  57. package/dist/schema/openwebrx.schema.js.map +1 -0
  58. package/dist/schema/operator.schema.d.ts +883 -0
  59. package/dist/schema/operator.schema.d.ts.map +1 -0
  60. package/dist/schema/operator.schema.js +97 -0
  61. package/dist/schema/operator.schema.js.map +1 -0
  62. package/dist/schema/plugin.schema.d.ts +1579 -0
  63. package/dist/schema/plugin.schema.d.ts.map +1 -0
  64. package/dist/schema/plugin.schema.js +336 -0
  65. package/dist/schema/plugin.schema.js.map +1 -0
  66. package/dist/schema/process-monitor.schema.d.ts +282 -0
  67. package/dist/schema/process-monitor.schema.d.ts.map +1 -0
  68. package/dist/schema/process-monitor.schema.js +31 -0
  69. package/dist/schema/process-monitor.schema.js.map +1 -0
  70. package/dist/schema/pskreporter.schema.d.ts +185 -0
  71. package/dist/schema/pskreporter.schema.d.ts.map +1 -0
  72. package/dist/schema/pskreporter.schema.js +80 -0
  73. package/dist/schema/pskreporter.schema.js.map +1 -0
  74. package/dist/schema/qso.schema.d.ts +419 -0
  75. package/dist/schema/qso.schema.d.ts.map +1 -0
  76. package/dist/schema/qso.schema.js +137 -0
  77. package/dist/schema/qso.schema.js.map +1 -0
  78. package/dist/schema/radio-capability.schema.d.ts +625 -0
  79. package/dist/schema/radio-capability.schema.d.ts.map +1 -0
  80. package/dist/schema/radio-capability.schema.js +191 -0
  81. package/dist/schema/radio-capability.schema.js.map +1 -0
  82. package/dist/schema/radio-power-support.d.ts +45 -0
  83. package/dist/schema/radio-power-support.d.ts.map +1 -0
  84. package/dist/schema/radio-power-support.js +64 -0
  85. package/dist/schema/radio-power-support.js.map +1 -0
  86. package/dist/schema/radio-power.schema.d.ts +319 -0
  87. package/dist/schema/radio-power.schema.d.ts.map +1 -0
  88. package/dist/schema/radio-power.schema.js +87 -0
  89. package/dist/schema/radio-power.schema.js.map +1 -0
  90. package/dist/schema/radio-profile.schema.d.ts +2694 -0
  91. package/dist/schema/radio-profile.schema.d.ts.map +1 -0
  92. package/dist/schema/radio-profile.schema.js +71 -0
  93. package/dist/schema/radio-profile.schema.js.map +1 -0
  94. package/dist/schema/radio.schema.d.ts +1438 -0
  95. package/dist/schema/radio.schema.d.ts.map +1 -0
  96. package/dist/schema/radio.schema.js +314 -0
  97. package/dist/schema/radio.schema.js.map +1 -0
  98. package/dist/schema/realtime.schema.d.ts +1299 -0
  99. package/dist/schema/realtime.schema.d.ts.map +1 -0
  100. package/dist/schema/realtime.schema.js +184 -0
  101. package/dist/schema/realtime.schema.js.map +1 -0
  102. package/dist/schema/rigctld.schema.d.ts +151 -0
  103. package/dist/schema/rigctld.schema.d.ts.map +1 -0
  104. package/dist/schema/rigctld.schema.js +42 -0
  105. package/dist/schema/rigctld.schema.js.map +1 -0
  106. package/dist/schema/server-message-keys.d.ts +21 -0
  107. package/dist/schema/server-message-keys.d.ts.map +1 -0
  108. package/dist/schema/server-message-keys.js +22 -0
  109. package/dist/schema/server-message-keys.js.map +1 -0
  110. package/dist/schema/slot-info.schema.d.ts +696 -0
  111. package/dist/schema/slot-info.schema.d.ts.map +1 -0
  112. package/dist/schema/slot-info.schema.js +144 -0
  113. package/dist/schema/slot-info.schema.js.map +1 -0
  114. package/dist/schema/spectrum.schema.d.ts +716 -0
  115. package/dist/schema/spectrum.schema.d.ts.map +1 -0
  116. package/dist/schema/spectrum.schema.js +128 -0
  117. package/dist/schema/spectrum.schema.js.map +1 -0
  118. package/dist/schema/station-info.schema.d.ts +202 -0
  119. package/dist/schema/station-info.schema.d.ts.map +1 -0
  120. package/dist/schema/station-info.schema.js +32 -0
  121. package/dist/schema/station-info.schema.js.map +1 -0
  122. package/dist/schema/system.schema.d.ts +113 -0
  123. package/dist/schema/system.schema.d.ts.map +1 -0
  124. package/dist/schema/system.schema.js +95 -0
  125. package/dist/schema/system.schema.js.map +1 -0
  126. package/dist/schema/transmission.schema.d.ts +413 -0
  127. package/dist/schema/transmission.schema.d.ts.map +1 -0
  128. package/dist/schema/transmission.schema.js +78 -0
  129. package/dist/schema/transmission.schema.js.map +1 -0
  130. package/dist/schema/voice.schema.d.ts +38 -0
  131. package/dist/schema/voice.schema.d.ts.map +1 -0
  132. package/dist/schema/voice.schema.js +24 -0
  133. package/dist/schema/voice.schema.js.map +1 -0
  134. package/dist/schema/websocket.schema.d.ts +16916 -0
  135. package/dist/schema/websocket.schema.d.ts.map +1 -0
  136. package/dist/schema/websocket.schema.js +1050 -0
  137. package/dist/schema/websocket.schema.js.map +1 -0
  138. package/dist/utils/grid.d.ts +13 -0
  139. package/dist/utils/grid.d.ts.map +1 -0
  140. package/dist/utils/grid.js +71 -0
  141. package/dist/utils/grid.js.map +1 -0
  142. package/eslint.config.js +15 -0
  143. package/package.json +28 -0
  144. package/src/index.ts +152 -0
  145. package/src/schema/__tests__/plugin-runtime-log.schema.test.ts +90 -0
  146. package/src/schema/ability.ts +205 -0
  147. package/src/schema/api-response.schema.ts +187 -0
  148. package/src/schema/audio-sidecar.schema.ts +53 -0
  149. package/src/schema/audio.schema.ts +73 -0
  150. package/src/schema/auth.schema.ts +224 -0
  151. package/src/schema/cycle.schema.ts +25 -0
  152. package/src/schema/desktop-https.schema.ts +43 -0
  153. package/src/schema/ft8.schema.ts +362 -0
  154. package/src/schema/hello.schema.ts +7 -0
  155. package/src/schema/logbook.schema.ts +310 -0
  156. package/src/schema/mode.schema.ts +158 -0
  157. package/src/schema/openwebrx.schema.ts +160 -0
  158. package/src/schema/operator.schema.ts +112 -0
  159. package/src/schema/plugin.schema.ts +503 -0
  160. package/src/schema/process-monitor.schema.ts +41 -0
  161. package/src/schema/pskreporter.schema.ts +102 -0
  162. package/src/schema/qso.schema.ts +173 -0
  163. package/src/schema/radio-capability.schema.ts +244 -0
  164. package/src/schema/radio-power-support.ts +107 -0
  165. package/src/schema/radio-power.schema.ts +101 -0
  166. package/src/schema/radio-profile.schema.ts +91 -0
  167. package/src/schema/radio.schema.ts +385 -0
  168. package/src/schema/realtime.schema.ts +262 -0
  169. package/src/schema/rigctld.schema.ts +51 -0
  170. package/src/schema/server-message-keys.ts +26 -0
  171. package/src/schema/slot-info.schema.ts +162 -0
  172. package/src/schema/spectrum.schema.ts +166 -0
  173. package/src/schema/station-info.schema.ts +40 -0
  174. package/src/schema/system.schema.ts +121 -0
  175. package/src/schema/transmission.schema.ts +105 -0
  176. package/src/schema/voice.schema.ts +28 -0
  177. package/src/schema/websocket.schema.ts +1480 -0
  178. package/src/utils/grid.ts +94 -0
  179. package/test/mode-schema.test.ts +48 -0
  180. package/tsconfig.json +9 -0
@@ -0,0 +1,191 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * 能力分类
4
+ * - antenna: 天线相关(天调等)
5
+ * - rf: 射频相关(发射功率、噪声抑制等)
6
+ * - audio: 音频相关(AF 增益、静噪、VOX 等)
7
+ * - operation: 操作过程相关(RIT/XIT、中继偏移、音调等)
8
+ * - system: 电台系统状态(锁定、电源等)
9
+ */
10
+ export const CapabilityCategorySchema = z.enum(['antenna', 'rf', 'audio', 'operation', 'system']);
11
+ /**
12
+ * 能力值类型
13
+ * - boolean: 布尔开关
14
+ * - number: 数值(滑块/输入框)
15
+ * - enum: 枚举(下拉选择)
16
+ * - action: 纯动作按钮(无持久值,如手动调谐)
17
+ */
18
+ export const CapabilityValueTypeSchema = z.enum(['boolean', 'number', 'enum', 'action']);
19
+ /**
20
+ * 能力更新模式
21
+ * - polling: 服务端定时轮询检测变化
22
+ * - event: 由电台事件驱动(如连接时一次性读取)
23
+ * - none: 不主动更新(action 类或只写能力)
24
+ */
25
+ export const CapabilityUpdateModeSchema = z.enum(['polling', 'event', 'none']);
26
+ /**
27
+ * 枚举项可用值类型。
28
+ */
29
+ export const CapabilityOptionValueSchema = z.union([z.string(), z.number()]);
30
+ /**
31
+ * 运行时能力值。
32
+ */
33
+ export const CapabilityValueSchema = z.union([z.boolean(), z.number(), z.string()]);
34
+ /**
35
+ * 枚举项定义。
36
+ */
37
+ export const CapabilityOptionSchema = z.object({
38
+ value: CapabilityOptionValueSchema,
39
+ label: z.string().optional(),
40
+ labelI18nKey: z.string().optional(),
41
+ });
42
+ /**
43
+ * 前端展示模式。
44
+ */
45
+ export const CapabilityDisplayModeSchema = z.enum(['percent', 'value']);
46
+ export const CapabilityDisplayUnitSchema = z.enum(['Hz', 'kHz', 'toneHz', 'code', 'state']);
47
+ /**
48
+ * 展示格式提示,由服务端下发给前端。
49
+ */
50
+ export const CapabilityDisplaySchema = z.object({
51
+ mode: CapabilityDisplayModeSchema,
52
+ unit: CapabilityDisplayUnitSchema.optional(),
53
+ decimals: z.number().int().min(0).optional(),
54
+ signed: z.boolean().optional(),
55
+ });
56
+ /**
57
+ * 能力描述符
58
+ * 由服务端在运行时下发,作为当前连接会话的真源。
59
+ */
60
+ export const CapabilityDescriptorSchema = z.object({
61
+ /** 全局唯一能力 ID,如 'tuner_switch', 'rf_power', 'lock_mode' */
62
+ id: z.string(),
63
+ /** 能力分类,用于前端面板分组渲染 */
64
+ category: CapabilityCategorySchema,
65
+ /** 能力值类型 */
66
+ valueType: CapabilityValueTypeSchema,
67
+ /**
68
+ * 数值范围(仅 valueType='number' 时有效)
69
+ * 值可以是归一化范围(如 0-1),也可以是实际范围(如 -9999~9999 Hz)
70
+ */
71
+ range: z.object({
72
+ min: z.number(),
73
+ max: z.number(),
74
+ step: z.number().optional(),
75
+ }).optional(),
76
+ /**
77
+ * 数值能力的离散候选项(仅 valueType='number' 时有效)
78
+ * 例:RF 功率只允许若干固定挡位,但仍希望保留 slider 交互。
79
+ */
80
+ discreteOptions: z.array(CapabilityOptionSchema).optional(),
81
+ /** 枚举项(仅 valueType='enum' 时有效) */
82
+ options: z.array(CapabilityOptionSchema).optional(),
83
+ /** 是否可读取当前值(false = 只写,UI 无初始值) */
84
+ readable: z.boolean(),
85
+ /** 是否可写入(false = 只读展示) */
86
+ writable: z.boolean(),
87
+ /** 服务端更新策略 */
88
+ updateMode: CapabilityUpdateModeSchema,
89
+ /**
90
+ * 轮询间隔(ms),仅 updateMode='polling' 时有效。
91
+ */
92
+ pollIntervalMs: z.number().optional(),
93
+ /**
94
+ * 复合能力分组 ID。
95
+ * 同一 group 的描述符在面板中合并为一张卡片(如天调开关和手动调谐按钮)
96
+ */
97
+ compoundGroup: z.string().optional(),
98
+ /**
99
+ * 在复合能力组中的角色
100
+ * - switch: 布尔开关(主控制)
101
+ * - action: 动作按钮
102
+ */
103
+ compoundRole: z.enum(['switch', 'action']).optional(),
104
+ /** 前端标签 i18n key,如 'radio:capability.tuner_switch.label' */
105
+ labelI18nKey: z.string(),
106
+ /** 前端描述文字 i18n key(可选) */
107
+ descriptionI18nKey: z.string().optional(),
108
+ /** 展示格式提示 */
109
+ display: CapabilityDisplaySchema.optional(),
110
+ /** 是否在 RadioControl 工具栏 surface 区域露出紧凑控件 */
111
+ hasSurfaceControl: z.boolean(),
112
+ /**
113
+ * surface 控件的分组 ID。
114
+ * 同一 surfaceGroup 的控件聚合为一个 Popover(如天调开关和调谐按钮)
115
+ */
116
+ surfaceGroup: z.string().optional(),
117
+ });
118
+ /**
119
+ * 能力运行时状态
120
+ * 动态数据,通过 WebSocket 实时同步到前端。
121
+ */
122
+ export const CapabilityStateSchema = z.object({
123
+ /** 能力 ID,与 CapabilityDescriptor.id 对应 */
124
+ id: z.string(),
125
+ /** 当前连接的电台是否支持此能力(探测结果) */
126
+ supported: z.boolean(),
127
+ /**
128
+ * 当前值
129
+ * - boolean 类能力:true/false
130
+ * - number 类能力:数值(范围由 descriptor.range 定义)
131
+ * - enum 类能力:string/number(必须落在 descriptor.options 内)
132
+ * - action 类能力:始终为 null
133
+ */
134
+ value: CapabilityValueSchema.nullable(),
135
+ /**
136
+ * 附加元数据(能力特有信息)
137
+ * 例:tuner_switch 的 meta 可携带 { status: 'tuning' | 'idle' | 'success' | 'failed', swr?: number }
138
+ */
139
+ meta: z.record(z.unknown()).optional(),
140
+ /** 最后更新时间戳(ms) */
141
+ updatedAt: z.number(),
142
+ });
143
+ /**
144
+ * 能力列表快照(radioCapabilityList WS 消息 / REST 响应的 data 部分)
145
+ */
146
+ export const CapabilityListSchema = z.object({
147
+ descriptors: z.array(CapabilityDescriptorSchema),
148
+ capabilities: z.array(CapabilityStateSchema),
149
+ });
150
+ /**
151
+ * 写命令负载(writeRadioCapability WS 命令的 data 部分)
152
+ */
153
+ export const WriteCapabilityPayloadSchema = z.object({
154
+ /** 能力 ID */
155
+ id: z.string(),
156
+ /** 写入值(boolean/number/enum 类能力) */
157
+ value: CapabilityValueSchema.optional(),
158
+ /** 触发动作(action 类能力,传 true) */
159
+ action: z.boolean().optional(),
160
+ });
161
+ // ============================================================
162
+ // 能力 ID 字面量联合类型(方便类型检查)
163
+ // ============================================================
164
+ export const CAPABILITY_IDS = [
165
+ 'tuner_switch',
166
+ 'tuner_tune',
167
+ 'rf_power',
168
+ 'af_gain',
169
+ 'sql',
170
+ 'mic_gain',
171
+ 'compressor',
172
+ 'compressor_level',
173
+ 'monitor_gain',
174
+ 'nb',
175
+ 'nr',
176
+ 'lock_mode',
177
+ 'mute',
178
+ 'vox',
179
+ 'agc_mode',
180
+ 'preamp',
181
+ 'attenuator',
182
+ 'mode_bandwidth',
183
+ 'rit_offset',
184
+ 'xit_offset',
185
+ 'tuning_step',
186
+ 'repeater_shift',
187
+ 'repeater_offset',
188
+ 'ctcss_tone',
189
+ 'dcs_code',
190
+ ];
191
+ //# sourceMappingURL=radio-capability.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-capability.schema.js","sourceRoot":"","sources":["../../src/schema/radio-capability.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { HamlibConfig } from './radio.schema.js';
2
+ /**
3
+ * Radios known to support `rig_set_powerstat(RIG_POWER_ON)` via Hamlib.
4
+ * Matching happens on mfgName + modelName (case-insensitive, substring/regex).
5
+ *
6
+ * Because node-hamlib does not expose `rig_get_caps`, we cannot introspect
7
+ * per-model powerstat support at runtime. Instead we maintain a conservative
8
+ * allow-list of radios for which powerstat is verified to work; UI only
9
+ * surfaces the "power on" button for these models. The server still falls
10
+ * back to the actual Hamlib return value — an unsupported model receives a
11
+ * user-friendly error if the allow-list is bypassed.
12
+ *
13
+ * To add a new model: add an entry with the mfgName returned by
14
+ * `HamLib.getSupportedRigs()` and a pattern that matches its modelName.
15
+ */
16
+ export interface PowerCapableRigEntry {
17
+ mfg: string | RegExp;
18
+ model: string | RegExp;
19
+ }
20
+ export declare const POWER_CAPABLE_RIGS: ReadonlyArray<PowerCapableRigEntry>;
21
+ export declare function isRigModelPowerCapable(mfgName: string, modelName: string): boolean;
22
+ export type PowerSupportReason = 'model-unsupported' | 'network-mode-no-wake' | 'none-mode';
23
+ export interface PowerSupportDecision {
24
+ /** Whether the UI should surface a "power on" control. */
25
+ canPowerOn: boolean;
26
+ /** Whether the UI should surface a "power off" control. */
27
+ canPowerOff: boolean;
28
+ /** Machine-readable reason when `canPowerOn` is false. */
29
+ reason?: PowerSupportReason;
30
+ }
31
+ /**
32
+ * Decide whether power control should be surfaced for a given Profile radio config.
33
+ *
34
+ * For serial mode, the caller must provide the rig's mfgName/modelName
35
+ * (resolved via `HamLib.getSupportedRigs()` server-side). For network mode
36
+ * the rig model is not known ahead of time (rigctld proxies any radio) —
37
+ * `power on` is never offered because a remote rigctld running on the radio
38
+ * is unreachable when the radio is powered off. `power off` is still offered
39
+ * in case the rigctld process runs on a separate host.
40
+ */
41
+ export declare function decidePowerSupport(config: HamlibConfig, rigInfo?: {
42
+ mfgName: string;
43
+ modelName: string;
44
+ }): PowerSupportDecision;
45
+ //# sourceMappingURL=radio-power-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-power-support.d.ts","sourceRoot":"","sources":["../../src/schema/radio-power-support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,oBAAoB,CAoBlE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAYlF;AAED,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,sBAAsB,GACtB,WAAW,CAAC;AAEhB,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/C,oBAAoB,CAsBtB"}
@@ -0,0 +1,64 @@
1
+ export const POWER_CAPABLE_RIGS = [
2
+ // Icom modern transceivers (CI-V 0x18 command)
3
+ { mfg: /^icom$/i, model: /^IC-?705$/i },
4
+ { mfg: /^icom$/i, model: /^IC-?7300$/i },
5
+ { mfg: /^icom$/i, model: /^IC-?7610$/i },
6
+ { mfg: /^icom$/i, model: /^IC-?7100$/i },
7
+ { mfg: /^icom$/i, model: /^IC-?7851$/i },
8
+ { mfg: /^icom$/i, model: /^IC-?9700$/i },
9
+ { mfg: /^icom$/i, model: /^IC-?R8600$/i },
10
+ // Kenwood
11
+ { mfg: /^kenwood$/i, model: /^TS-590SG?$/i },
12
+ { mfg: /^kenwood$/i, model: /^TS-890$/i },
13
+ { mfg: /^kenwood$/i, model: /^TS-990$/i },
14
+ // Yaesu
15
+ { mfg: /^yaesu$/i, model: /^FT-991A?$/i },
16
+ { mfg: /^yaesu$/i, model: /^FTDX-?10$/i },
17
+ { mfg: /^yaesu$/i, model: /^FTDX-?101(MP|D)?$/i },
18
+ { mfg: /^yaesu$/i, model: /^FT-?710$/i },
19
+ ];
20
+ export function isRigModelPowerCapable(mfgName, modelName) {
21
+ return POWER_CAPABLE_RIGS.some((entry) => {
22
+ const mfgOk = typeof entry.mfg === 'string'
23
+ ? entry.mfg.toLowerCase() === mfgName.toLowerCase()
24
+ : entry.mfg.test(mfgName);
25
+ const modelOk = typeof entry.model === 'string'
26
+ ? entry.model.toLowerCase() === modelName.toLowerCase()
27
+ : entry.model.test(modelName);
28
+ return mfgOk && modelOk;
29
+ });
30
+ }
31
+ /**
32
+ * Decide whether power control should be surfaced for a given Profile radio config.
33
+ *
34
+ * For serial mode, the caller must provide the rig's mfgName/modelName
35
+ * (resolved via `HamLib.getSupportedRigs()` server-side). For network mode
36
+ * the rig model is not known ahead of time (rigctld proxies any radio) —
37
+ * `power on` is never offered because a remote rigctld running on the radio
38
+ * is unreachable when the radio is powered off. `power off` is still offered
39
+ * in case the rigctld process runs on a separate host.
40
+ */
41
+ export function decidePowerSupport(config, rigInfo) {
42
+ switch (config.type) {
43
+ case 'none':
44
+ return { canPowerOn: false, canPowerOff: false, reason: 'none-mode' };
45
+ case 'network':
46
+ return { canPowerOn: false, canPowerOff: true, reason: 'network-mode-no-wake' };
47
+ case 'icom-wlan':
48
+ // ICOM WLAN 的 CI-V-over-UDP 通道在电台关机后无法维持;即便已连接
49
+ // 发送 powerstat(off) 也不能可靠恢复。整体不暴露电源控制。
50
+ return { canPowerOn: false, canPowerOff: false, reason: 'model-unsupported' };
51
+ case 'serial': {
52
+ if (!rigInfo) {
53
+ return { canPowerOn: false, canPowerOff: false, reason: 'model-unsupported' };
54
+ }
55
+ const supported = isRigModelPowerCapable(rigInfo.mfgName, rigInfo.modelName);
56
+ return supported
57
+ ? { canPowerOn: true, canPowerOff: true }
58
+ : { canPowerOn: false, canPowerOff: false, reason: 'model-unsupported' };
59
+ }
60
+ default:
61
+ return { canPowerOn: false, canPowerOff: false, reason: 'model-unsupported' };
62
+ }
63
+ }
64
+ //# sourceMappingURL=radio-power-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-power-support.js","sourceRoot":"","sources":["../../src/schema/radio-power-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,319 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * High-level runtime state tracked by the RadioPowerController.
4
+ *
5
+ * - `off`: radio is known to be off (or was never connected).
6
+ * - `waking`: power-on command sent, waiting for the radio to respond.
7
+ * - `awake`: radio is responding; the engine is being started (if autoEngine).
8
+ * - `shutting_down`: engine is stopping in preparation for a power-off command.
9
+ * - `entering_standby`: powerstat(2) sent, waiting for radio to drop CAT link.
10
+ * - `failed`: last transition failed; UI should show an error + retry.
11
+ */
12
+ export declare const RadioPowerStateSchema: z.ZodEnum<["off", "waking", "awake", "shutting_down", "entering_standby", "failed"]>;
13
+ export type RadioPowerState = z.infer<typeof RadioPowerStateSchema>;
14
+ /**
15
+ * Finer-grained progress stage inside `waking` / `shutting_down`.
16
+ * UI uses this to show progress bar labels.
17
+ */
18
+ export declare const RadioPowerStageSchema: z.ZodEnum<["idle", "sending_command", "waiting_ready", "waiting_standby_disconnect", "starting_engine", "stopping_engine", "disconnecting"]>;
19
+ export type RadioPowerStage = z.infer<typeof RadioPowerStageSchema>;
20
+ /**
21
+ * WS event payload: server → client.
22
+ */
23
+ export declare const RadioPowerStateEventSchema: z.ZodObject<{
24
+ profileId: z.ZodOptional<z.ZodString>;
25
+ state: z.ZodEnum<["off", "waking", "awake", "shutting_down", "entering_standby", "failed"]>;
26
+ stage: z.ZodEnum<["idle", "sending_command", "waiting_ready", "waiting_standby_disconnect", "starting_engine", "stopping_engine", "disconnecting"]>;
27
+ /** Translation key reference for an inline error, e.g. 'radio:power.error.timeout'. */
28
+ errorKey: z.ZodOptional<z.ZodString>;
29
+ /** Free-form details for debugging; not user-facing. */
30
+ errorDetail: z.ZodOptional<z.ZodString>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ state: "failed" | "off" | "waking" | "awake" | "shutting_down" | "entering_standby";
33
+ stage: "idle" | "sending_command" | "waiting_ready" | "waiting_standby_disconnect" | "starting_engine" | "stopping_engine" | "disconnecting";
34
+ profileId?: string | undefined;
35
+ errorKey?: string | undefined;
36
+ errorDetail?: string | undefined;
37
+ }, {
38
+ state: "failed" | "off" | "waking" | "awake" | "shutting_down" | "entering_standby";
39
+ stage: "idle" | "sending_command" | "waiting_ready" | "waiting_standby_disconnect" | "starting_engine" | "stopping_engine" | "disconnecting";
40
+ profileId?: string | undefined;
41
+ errorKey?: string | undefined;
42
+ errorDetail?: string | undefined;
43
+ }>;
44
+ export type RadioPowerStateEvent = z.infer<typeof RadioPowerStateEventSchema>;
45
+ /**
46
+ * REST request body: POST /api/radio/power
47
+ */
48
+ /** Allowed target states for a power request. */
49
+ export declare const RadioPowerTargetSchema: z.ZodEnum<["on", "off", "standby", "operate"]>;
50
+ export type RadioPowerTarget = z.infer<typeof RadioPowerTargetSchema>;
51
+ export declare const RadioPowerRequestSchema: z.ZodObject<{
52
+ profileId: z.ZodString;
53
+ state: z.ZodEnum<["on", "off", "standby", "operate"]>;
54
+ /** Automatically start the engine after successful power-on. Defaults to true. */
55
+ autoEngine: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
56
+ }, "strip", z.ZodTypeAny, {
57
+ state: "off" | "on" | "standby" | "operate";
58
+ profileId: string;
59
+ autoEngine: boolean;
60
+ }, {
61
+ state: "off" | "on" | "standby" | "operate";
62
+ profileId: string;
63
+ autoEngine?: boolean | undefined;
64
+ }>;
65
+ export type RadioPowerRequest = z.infer<typeof RadioPowerRequestSchema>;
66
+ /**
67
+ * REST response: POST /api/radio/power
68
+ */
69
+ export declare const RadioPowerResponseSchema: z.ZodObject<{
70
+ success: z.ZodBoolean;
71
+ state: z.ZodEnum<["off", "waking", "awake", "shutting_down", "entering_standby", "failed"]>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ success: boolean;
74
+ state: "failed" | "off" | "waking" | "awake" | "shutting_down" | "entering_standby";
75
+ }, {
76
+ success: boolean;
77
+ state: "failed" | "off" | "waking" | "awake" | "shutting_down" | "entering_standby";
78
+ }>;
79
+ export type RadioPowerResponse = z.infer<typeof RadioPowerResponseSchema>;
80
+ /**
81
+ * REST response: GET /api/radio/power/support?profileId=xxx
82
+ * The server resolves mfgName/modelName internally via HamLib.getSupportedRigs().
83
+ */
84
+ export declare const RadioPowerSupportInfoSchema: z.ZodObject<{
85
+ profileId: z.ZodString;
86
+ canPowerOn: z.ZodBoolean;
87
+ canPowerOff: z.ZodBoolean;
88
+ /**
89
+ * States the user is allowed to switch *between* while the radio is connected.
90
+ * Empty when the radio is unsupported or not connected (UI then renders no dropdown).
91
+ */
92
+ supportedStates: z.ZodDefault<z.ZodArray<z.ZodEnum<["operate", "standby", "off"]>, "many">>;
93
+ reason: z.ZodOptional<z.ZodEnum<["model-unsupported", "network-mode-no-wake", "none-mode"]>>;
94
+ rigInfo: z.ZodOptional<z.ZodObject<{
95
+ mfgName: z.ZodString;
96
+ modelName: z.ZodString;
97
+ }, "strip", z.ZodTypeAny, {
98
+ mfgName: string;
99
+ modelName: string;
100
+ }, {
101
+ mfgName: string;
102
+ modelName: string;
103
+ }>>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ profileId: string;
106
+ canPowerOn: boolean;
107
+ canPowerOff: boolean;
108
+ supportedStates: ("off" | "standby" | "operate")[];
109
+ reason?: "model-unsupported" | "network-mode-no-wake" | "none-mode" | undefined;
110
+ rigInfo?: {
111
+ mfgName: string;
112
+ modelName: string;
113
+ } | undefined;
114
+ }, {
115
+ profileId: string;
116
+ canPowerOn: boolean;
117
+ canPowerOff: boolean;
118
+ reason?: "model-unsupported" | "network-mode-no-wake" | "none-mode" | undefined;
119
+ supportedStates?: ("off" | "standby" | "operate")[] | undefined;
120
+ rigInfo?: {
121
+ mfgName: string;
122
+ modelName: string;
123
+ } | undefined;
124
+ }>;
125
+ export type RadioPowerSupportInfo = z.infer<typeof RadioPowerSupportInfoSchema>;
126
+ /** Convenience re-export so callers can validate a full config blob. */
127
+ export declare const RadioPowerProfileConfigSchema: z.ZodObject<{
128
+ type: z.ZodEnum<["none", "network", "serial", "icom-wlan"]>;
129
+ network: z.ZodOptional<z.ZodObject<{
130
+ host: z.ZodString;
131
+ port: z.ZodNumber;
132
+ }, "strip", z.ZodTypeAny, {
133
+ host: string;
134
+ port: number;
135
+ }, {
136
+ host: string;
137
+ port: number;
138
+ }>>;
139
+ icomWlan: z.ZodOptional<z.ZodObject<{
140
+ ip: z.ZodString;
141
+ port: z.ZodNumber;
142
+ userName: z.ZodOptional<z.ZodString>;
143
+ password: z.ZodOptional<z.ZodString>;
144
+ dataMode: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
145
+ }, "strip", z.ZodTypeAny, {
146
+ ip: string;
147
+ port: number;
148
+ dataMode: boolean;
149
+ userName?: string | undefined;
150
+ password?: string | undefined;
151
+ }, {
152
+ ip: string;
153
+ port: number;
154
+ userName?: string | undefined;
155
+ password?: string | undefined;
156
+ dataMode?: boolean | undefined;
157
+ }>>;
158
+ serial: z.ZodOptional<z.ZodObject<{
159
+ path: z.ZodString;
160
+ rigModel: z.ZodNumber;
161
+ serialConfig: z.ZodOptional<z.ZodObject<{
162
+ data_bits: z.ZodOptional<z.ZodEnum<["5", "6", "7", "8"]>>;
163
+ stop_bits: z.ZodOptional<z.ZodEnum<["1", "2"]>>;
164
+ serial_parity: z.ZodOptional<z.ZodEnum<["None", "Even", "Odd", "Mark", "Space"]>>;
165
+ serial_handshake: z.ZodOptional<z.ZodEnum<["None", "Hardware", "Software"]>>;
166
+ rts_state: z.ZodOptional<z.ZodEnum<["ON", "OFF", "UNSET"]>>;
167
+ dtr_state: z.ZodOptional<z.ZodEnum<["ON", "OFF", "UNSET"]>>;
168
+ rate: z.ZodOptional<z.ZodNumber>;
169
+ timeout: z.ZodOptional<z.ZodNumber>;
170
+ retry: z.ZodOptional<z.ZodNumber>;
171
+ write_delay: z.ZodOptional<z.ZodNumber>;
172
+ post_write_delay: z.ZodOptional<z.ZodNumber>;
173
+ }, "strip", z.ZodTypeAny, {
174
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
175
+ stop_bits?: "1" | "2" | undefined;
176
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
177
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
178
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
179
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
180
+ rate?: number | undefined;
181
+ timeout?: number | undefined;
182
+ retry?: number | undefined;
183
+ write_delay?: number | undefined;
184
+ post_write_delay?: number | undefined;
185
+ }, {
186
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
187
+ stop_bits?: "1" | "2" | undefined;
188
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
189
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
190
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
191
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
192
+ rate?: number | undefined;
193
+ timeout?: number | undefined;
194
+ retry?: number | undefined;
195
+ write_delay?: number | undefined;
196
+ post_write_delay?: number | undefined;
197
+ }>>;
198
+ backendConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
199
+ }, "strip", z.ZodTypeAny, {
200
+ path: string;
201
+ rigModel: number;
202
+ serialConfig?: {
203
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
204
+ stop_bits?: "1" | "2" | undefined;
205
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
206
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
207
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
208
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
209
+ rate?: number | undefined;
210
+ timeout?: number | undefined;
211
+ retry?: number | undefined;
212
+ write_delay?: number | undefined;
213
+ post_write_delay?: number | undefined;
214
+ } | undefined;
215
+ backendConfig?: Record<string, string> | undefined;
216
+ }, {
217
+ path: string;
218
+ rigModel: number;
219
+ serialConfig?: {
220
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
221
+ stop_bits?: "1" | "2" | undefined;
222
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
223
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
224
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
225
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
226
+ rate?: number | undefined;
227
+ timeout?: number | undefined;
228
+ retry?: number | undefined;
229
+ write_delay?: number | undefined;
230
+ post_write_delay?: number | undefined;
231
+ } | undefined;
232
+ backendConfig?: Record<string, string> | undefined;
233
+ }>>;
234
+ spectrum: z.ZodOptional<z.ZodObject<{
235
+ speed: z.ZodOptional<z.ZodNumber>;
236
+ }, "strip", z.ZodTypeAny, {
237
+ speed?: number | undefined;
238
+ }, {
239
+ speed?: number | undefined;
240
+ }>>;
241
+ transmitCompensationMs: z.ZodOptional<z.ZodNumber>;
242
+ pttMethod: z.ZodOptional<z.ZodEnum<["cat", "vox", "dtr", "rts"]>>;
243
+ pttPort: z.ZodOptional<z.ZodString>;
244
+ }, "strip", z.ZodTypeAny, {
245
+ type: "none" | "network" | "serial" | "icom-wlan";
246
+ spectrum?: {
247
+ speed?: number | undefined;
248
+ } | undefined;
249
+ network?: {
250
+ host: string;
251
+ port: number;
252
+ } | undefined;
253
+ serial?: {
254
+ path: string;
255
+ rigModel: number;
256
+ serialConfig?: {
257
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
258
+ stop_bits?: "1" | "2" | undefined;
259
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
260
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
261
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
262
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
263
+ rate?: number | undefined;
264
+ timeout?: number | undefined;
265
+ retry?: number | undefined;
266
+ write_delay?: number | undefined;
267
+ post_write_delay?: number | undefined;
268
+ } | undefined;
269
+ backendConfig?: Record<string, string> | undefined;
270
+ } | undefined;
271
+ icomWlan?: {
272
+ ip: string;
273
+ port: number;
274
+ dataMode: boolean;
275
+ userName?: string | undefined;
276
+ password?: string | undefined;
277
+ } | undefined;
278
+ transmitCompensationMs?: number | undefined;
279
+ pttMethod?: "cat" | "vox" | "dtr" | "rts" | undefined;
280
+ pttPort?: string | undefined;
281
+ }, {
282
+ type: "none" | "network" | "serial" | "icom-wlan";
283
+ spectrum?: {
284
+ speed?: number | undefined;
285
+ } | undefined;
286
+ network?: {
287
+ host: string;
288
+ port: number;
289
+ } | undefined;
290
+ serial?: {
291
+ path: string;
292
+ rigModel: number;
293
+ serialConfig?: {
294
+ data_bits?: "5" | "6" | "7" | "8" | undefined;
295
+ stop_bits?: "1" | "2" | undefined;
296
+ serial_parity?: "None" | "Even" | "Odd" | "Mark" | "Space" | undefined;
297
+ serial_handshake?: "None" | "Hardware" | "Software" | undefined;
298
+ rts_state?: "ON" | "OFF" | "UNSET" | undefined;
299
+ dtr_state?: "ON" | "OFF" | "UNSET" | undefined;
300
+ rate?: number | undefined;
301
+ timeout?: number | undefined;
302
+ retry?: number | undefined;
303
+ write_delay?: number | undefined;
304
+ post_write_delay?: number | undefined;
305
+ } | undefined;
306
+ backendConfig?: Record<string, string> | undefined;
307
+ } | undefined;
308
+ icomWlan?: {
309
+ ip: string;
310
+ port: number;
311
+ userName?: string | undefined;
312
+ password?: string | undefined;
313
+ dataMode?: boolean | undefined;
314
+ } | undefined;
315
+ transmitCompensationMs?: number | undefined;
316
+ pttMethod?: "cat" | "vox" | "dtr" | "rts" | undefined;
317
+ pttPort?: string | undefined;
318
+ }>;
319
+ //# sourceMappingURL=radio-power.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-power.schema.d.ts","sourceRoot":"","sources":["../../src/schema/radio-power.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,sFAOhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB,8IAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;IAIrC,uFAAuF;;IAEvF,wDAAwD;;;;;;;;;;;;;;EAExD,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;GAEG;AACH,iDAAiD;AACjD,eAAO,MAAM,sBAAsB,gDAA8C,CAAC;AAClF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB;;;IAGlC,kFAAkF;;;;;;;;;;EAElF,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;EAGnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;IAItC;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASH,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,wEAAwE;AACxE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAqB,CAAC"}