@tx5dr/contracts 1.7.3 → 1.7.5

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 (109) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/schema/__tests__/ability.test.d.ts +2 -0
  6. package/dist/schema/__tests__/ability.test.d.ts.map +1 -0
  7. package/dist/schema/__tests__/ability.test.js +32 -0
  8. package/dist/schema/__tests__/ability.test.js.map +1 -0
  9. package/dist/schema/__tests__/cw-decoder.schema.test.d.ts +2 -0
  10. package/dist/schema/__tests__/cw-decoder.schema.test.d.ts.map +1 -0
  11. package/dist/schema/__tests__/cw-decoder.schema.test.js +114 -0
  12. package/dist/schema/__tests__/cw-decoder.schema.test.js.map +1 -0
  13. package/dist/schema/__tests__/device-ui.schema.test.d.ts +2 -0
  14. package/dist/schema/__tests__/device-ui.schema.test.d.ts.map +1 -0
  15. package/dist/schema/__tests__/device-ui.schema.test.js +111 -0
  16. package/dist/schema/__tests__/device-ui.schema.test.js.map +1 -0
  17. package/dist/schema/__tests__/process-monitor.schema.test.js +96 -0
  18. package/dist/schema/__tests__/process-monitor.schema.test.js.map +1 -1
  19. package/dist/schema/__tests__/radio.schema.test.d.ts +2 -0
  20. package/dist/schema/__tests__/radio.schema.test.d.ts.map +1 -0
  21. package/dist/schema/__tests__/radio.schema.test.js +143 -0
  22. package/dist/schema/__tests__/radio.schema.test.js.map +1 -0
  23. package/dist/schema/ability.d.ts +3 -1
  24. package/dist/schema/ability.d.ts.map +1 -1
  25. package/dist/schema/ability.js +11 -0
  26. package/dist/schema/ability.js.map +1 -1
  27. package/dist/schema/api-response.schema.d.ts +168 -1
  28. package/dist/schema/api-response.schema.d.ts.map +1 -1
  29. package/dist/schema/api-response.schema.js +22 -0
  30. package/dist/schema/api-response.schema.js.map +1 -1
  31. package/dist/schema/cpu-profile.schema.d.ts +6 -6
  32. package/dist/schema/cw-decoder.schema.d.ts +2501 -0
  33. package/dist/schema/cw-decoder.schema.d.ts.map +1 -0
  34. package/dist/schema/cw-decoder.schema.js +196 -0
  35. package/dist/schema/cw-decoder.schema.js.map +1 -0
  36. package/dist/schema/cw-keyer.schema.d.ts +368 -0
  37. package/dist/schema/cw-keyer.schema.d.ts.map +1 -0
  38. package/dist/schema/cw-keyer.schema.js +143 -0
  39. package/dist/schema/cw-keyer.schema.js.map +1 -0
  40. package/dist/schema/desktop-https.schema.js +1 -1
  41. package/dist/schema/desktop-https.schema.js.map +1 -1
  42. package/dist/schema/device-ui.schema.d.ts +1782 -0
  43. package/dist/schema/device-ui.schema.d.ts.map +1 -0
  44. package/dist/schema/device-ui.schema.js +156 -0
  45. package/dist/schema/device-ui.schema.js.map +1 -0
  46. package/dist/schema/mode.schema.d.ts +1 -0
  47. package/dist/schema/mode.schema.d.ts.map +1 -1
  48. package/dist/schema/mode.schema.js +8 -0
  49. package/dist/schema/mode.schema.js.map +1 -1
  50. package/dist/schema/plugin.schema.d.ts +905 -60
  51. package/dist/schema/plugin.schema.d.ts.map +1 -1
  52. package/dist/schema/plugin.schema.js +62 -2
  53. package/dist/schema/plugin.schema.js.map +1 -1
  54. package/dist/schema/process-monitor.schema.d.ts +1948 -261
  55. package/dist/schema/process-monitor.schema.d.ts.map +1 -1
  56. package/dist/schema/process-monitor.schema.js +11 -0
  57. package/dist/schema/process-monitor.schema.js.map +1 -1
  58. package/dist/schema/radio-capability.schema.d.ts +1 -1
  59. package/dist/schema/radio-capability.schema.d.ts.map +1 -1
  60. package/dist/schema/radio-capability.schema.js +41 -0
  61. package/dist/schema/radio-capability.schema.js.map +1 -1
  62. package/dist/schema/radio-power.schema.d.ts +6 -0
  63. package/dist/schema/radio-power.schema.d.ts.map +1 -1
  64. package/dist/schema/radio-profile.schema.d.ts +86 -0
  65. package/dist/schema/radio-profile.schema.d.ts.map +1 -1
  66. package/dist/schema/radio.schema.d.ts +160 -3
  67. package/dist/schema/radio.schema.d.ts.map +1 -1
  68. package/dist/schema/radio.schema.js +82 -0
  69. package/dist/schema/radio.schema.js.map +1 -1
  70. package/dist/schema/realtime.schema.d.ts +6 -6
  71. package/dist/schema/voice.schema.d.ts +1 -1
  72. package/dist/schema/voice.schema.d.ts.map +1 -1
  73. package/dist/schema/voice.schema.js +1 -1
  74. package/dist/schema/voice.schema.js.map +1 -1
  75. package/dist/schema/websocket.schema.d.ts +6071 -574
  76. package/dist/schema/websocket.schema.d.ts.map +1 -1
  77. package/dist/schema/websocket.schema.js +102 -2
  78. package/dist/schema/websocket.schema.js.map +1 -1
  79. package/dist/utils/__tests__/cwTiming.test.d.ts +2 -0
  80. package/dist/utils/__tests__/cwTiming.test.d.ts.map +1 -0
  81. package/dist/utils/__tests__/cwTiming.test.js +74 -0
  82. package/dist/utils/__tests__/cwTiming.test.js.map +1 -0
  83. package/dist/utils/cwTiming.d.ts +36 -0
  84. package/dist/utils/cwTiming.d.ts.map +1 -0
  85. package/dist/utils/cwTiming.js +155 -0
  86. package/dist/utils/cwTiming.js.map +1 -0
  87. package/package.json +1 -1
  88. package/src/index.ts +8 -0
  89. package/src/schema/__tests__/ability.test.ts +40 -0
  90. package/src/schema/__tests__/cw-decoder.schema.test.ts +127 -0
  91. package/src/schema/__tests__/device-ui.schema.test.ts +122 -0
  92. package/src/schema/__tests__/process-monitor.schema.test.ts +99 -0
  93. package/src/schema/__tests__/radio.schema.test.ts +160 -0
  94. package/src/schema/ability.ts +13 -0
  95. package/src/schema/api-response.schema.ts +22 -0
  96. package/src/schema/cw-decoder.schema.ts +234 -0
  97. package/src/schema/cw-keyer.schema.ts +177 -0
  98. package/src/schema/desktop-https.schema.ts +1 -1
  99. package/src/schema/device-ui.schema.ts +182 -0
  100. package/src/schema/mode.schema.ts +8 -0
  101. package/src/schema/plugin.schema.ts +80 -2
  102. package/src/schema/process-monitor.schema.ts +18 -0
  103. package/src/schema/radio-capability.schema.ts +41 -0
  104. package/src/schema/radio.schema.ts +97 -0
  105. package/src/schema/voice.schema.ts +1 -1
  106. package/src/schema/websocket.schema.ts +131 -2
  107. package/src/utils/__tests__/cwTiming.test.ts +91 -0
  108. package/src/utils/cwTiming.ts +203 -0
  109. package/test/plugin-slot-schema.test.ts +52 -0
@@ -48,7 +48,7 @@ export type PluginPanelComponent = z.infer<typeof PluginPanelComponentSchema>;
48
48
  * These values control both validation expectations and default frontend
49
49
  * rendering in plugin settings UIs.
50
50
  */
51
- export declare const PluginSettingTypeSchema: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "info"]>;
51
+ export declare const PluginSettingTypeSchema: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "keyedStringArrays", "info"]>;
52
52
  /**
53
53
  * Supported generated-form field types for plugin settings.
54
54
  */
@@ -93,6 +93,65 @@ export declare const PluginObjectArrayFieldSchema: z.ZodObject<{
93
93
  required?: boolean | undefined;
94
94
  }>;
95
95
  export type PluginObjectArrayField = z.infer<typeof PluginObjectArrayFieldSchema>;
96
+ export declare const PluginKeyedStringArrayKeySchema: z.ZodObject<{
97
+ key: z.ZodString;
98
+ label: z.ZodString;
99
+ description: z.ZodOptional<z.ZodString>;
100
+ }, "strip", z.ZodTypeAny, {
101
+ label: string;
102
+ key: string;
103
+ description?: string | undefined;
104
+ }, {
105
+ label: string;
106
+ key: string;
107
+ description?: string | undefined;
108
+ }>;
109
+ export type PluginKeyedStringArrayKey = z.infer<typeof PluginKeyedStringArrayKeySchema>;
110
+ export declare const PluginSettingConditionSchema: z.ZodObject<{
111
+ setting: z.ZodString;
112
+ equals: z.ZodOptional<z.ZodUnknown>;
113
+ notEquals: z.ZodOptional<z.ZodUnknown>;
114
+ }, "strip", z.ZodTypeAny, {
115
+ setting: string;
116
+ equals?: unknown;
117
+ notEquals?: unknown;
118
+ }, {
119
+ setting: string;
120
+ equals?: unknown;
121
+ notEquals?: unknown;
122
+ }>;
123
+ export type PluginSettingCondition = z.infer<typeof PluginSettingConditionSchema>;
124
+ export declare const PluginSettingConditionalDescriptionSchema: z.ZodObject<{
125
+ when: z.ZodObject<{
126
+ setting: z.ZodString;
127
+ equals: z.ZodOptional<z.ZodUnknown>;
128
+ notEquals: z.ZodOptional<z.ZodUnknown>;
129
+ }, "strip", z.ZodTypeAny, {
130
+ setting: string;
131
+ equals?: unknown;
132
+ notEquals?: unknown;
133
+ }, {
134
+ setting: string;
135
+ equals?: unknown;
136
+ notEquals?: unknown;
137
+ }>;
138
+ description: z.ZodString;
139
+ }, "strip", z.ZodTypeAny, {
140
+ description: string;
141
+ when: {
142
+ setting: string;
143
+ equals?: unknown;
144
+ notEquals?: unknown;
145
+ };
146
+ }, {
147
+ description: string;
148
+ when: {
149
+ setting: string;
150
+ equals?: unknown;
151
+ notEquals?: unknown;
152
+ };
153
+ }>;
154
+ export type PluginSettingConditionalDescription = z.infer<typeof PluginSettingConditionalDescriptionSchema>;
96
155
  /**
97
156
  * Persistence and UI scope for a plugin setting.
98
157
  *
@@ -113,7 +172,7 @@ export type PluginSettingScope = z.infer<typeof PluginSettingScopeSchema>;
113
172
  * and resolve default values before injecting them into `ctx.config`.
114
173
  */
115
174
  export declare const PluginSettingDescriptorSchema: z.ZodObject<{
116
- type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "info"]>;
175
+ type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "keyedStringArrays", "info"]>;
117
176
  default: z.ZodUnknown;
118
177
  label: z.ZodString;
119
178
  description: z.ZodOptional<z.ZodString>;
@@ -152,14 +211,78 @@ export declare const PluginSettingDescriptorSchema: z.ZodObject<{
152
211
  placeholder?: string | undefined;
153
212
  required?: boolean | undefined;
154
213
  }>, "many">>;
214
+ /** Fixed key list used by generated editors for `keyedStringArrays` settings. */
215
+ keys: z.ZodOptional<z.ZodArray<z.ZodObject<{
216
+ key: z.ZodString;
217
+ label: z.ZodString;
218
+ description: z.ZodOptional<z.ZodString>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ label: string;
221
+ key: string;
222
+ description?: string | undefined;
223
+ }, {
224
+ label: string;
225
+ key: string;
226
+ description?: string | undefined;
227
+ }>, "many">>;
228
+ /** Conditionally show the field based on another setting in the same form. */
229
+ visibleWhen: z.ZodOptional<z.ZodObject<{
230
+ setting: z.ZodString;
231
+ equals: z.ZodOptional<z.ZodUnknown>;
232
+ notEquals: z.ZodOptional<z.ZodUnknown>;
233
+ }, "strip", z.ZodTypeAny, {
234
+ setting: string;
235
+ equals?: unknown;
236
+ notEquals?: unknown;
237
+ }, {
238
+ setting: string;
239
+ equals?: unknown;
240
+ notEquals?: unknown;
241
+ }>>;
242
+ /** Conditionally override the field description based on another setting. */
243
+ descriptionWhen: z.ZodOptional<z.ZodArray<z.ZodObject<{
244
+ when: z.ZodObject<{
245
+ setting: z.ZodString;
246
+ equals: z.ZodOptional<z.ZodUnknown>;
247
+ notEquals: z.ZodOptional<z.ZodUnknown>;
248
+ }, "strip", z.ZodTypeAny, {
249
+ setting: string;
250
+ equals?: unknown;
251
+ notEquals?: unknown;
252
+ }, {
253
+ setting: string;
254
+ equals?: unknown;
255
+ notEquals?: unknown;
256
+ }>;
257
+ description: z.ZodString;
258
+ }, "strip", z.ZodTypeAny, {
259
+ description: string;
260
+ when: {
261
+ setting: string;
262
+ equals?: unknown;
263
+ notEquals?: unknown;
264
+ };
265
+ }, {
266
+ description: string;
267
+ when: {
268
+ setting: string;
269
+ equals?: unknown;
270
+ notEquals?: unknown;
271
+ };
272
+ }>, "many">>;
155
273
  /** Internal settings are persisted/injected but hidden from generated UIs. */
156
274
  hidden: z.ZodOptional<z.ZodBoolean>;
157
275
  /** 设置作用域:global(所有操作员共享)或 operator(每操作员独立),默认 global */
158
276
  scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<["global", "operator"]>>>;
159
277
  }, "strip", z.ZodTypeAny, {
160
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
278
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
161
279
  label: string;
162
280
  scope: "operator" | "global";
281
+ keys?: {
282
+ label: string;
283
+ key: string;
284
+ description?: string | undefined;
285
+ }[] | undefined;
163
286
  options?: {
164
287
  value: string;
165
288
  label: string;
@@ -176,10 +299,28 @@ export declare const PluginSettingDescriptorSchema: z.ZodObject<{
176
299
  placeholder?: string | undefined;
177
300
  required?: boolean | undefined;
178
301
  }[] | undefined;
302
+ visibleWhen?: {
303
+ setting: string;
304
+ equals?: unknown;
305
+ notEquals?: unknown;
306
+ } | undefined;
307
+ descriptionWhen?: {
308
+ description: string;
309
+ when: {
310
+ setting: string;
311
+ equals?: unknown;
312
+ notEquals?: unknown;
313
+ };
314
+ }[] | undefined;
179
315
  hidden?: boolean | undefined;
180
316
  }, {
181
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
317
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
182
318
  label: string;
319
+ keys?: {
320
+ label: string;
321
+ key: string;
322
+ description?: string | undefined;
323
+ }[] | undefined;
183
324
  options?: {
184
325
  value: string;
185
326
  label: string;
@@ -196,6 +337,19 @@ export declare const PluginSettingDescriptorSchema: z.ZodObject<{
196
337
  placeholder?: string | undefined;
197
338
  required?: boolean | undefined;
198
339
  }[] | undefined;
340
+ visibleWhen?: {
341
+ setting: string;
342
+ equals?: unknown;
343
+ notEquals?: unknown;
344
+ } | undefined;
345
+ descriptionWhen?: {
346
+ description: string;
347
+ when: {
348
+ setting: string;
349
+ equals?: unknown;
350
+ notEquals?: unknown;
351
+ };
352
+ }[] | undefined;
199
353
  hidden?: boolean | undefined;
200
354
  scope?: "operator" | "global" | undefined;
201
355
  }>;
@@ -267,7 +421,7 @@ export type PluginCapability = z.infer<typeof PluginCapabilitySchema>;
267
421
  * - `voice-left-top`: shown above the voice frequency control card.
268
422
  * - `voice-right-top`: shown in the tabbed top area of the voice right panel.
269
423
  */
270
- export declare const PluginPanelSlotSchema: z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>;
424
+ export declare const PluginPanelSlotSchema: z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>;
271
425
  /**
272
426
  * Rendering slot that determines where a panel appears in the UI.
273
427
  */
@@ -284,6 +438,22 @@ export declare const PluginPanelWidthSchema: z.ZodEnum<["half", "full"]>;
284
438
  * Preferred width hint for plugin-owned panels.
285
439
  */
286
440
  export type PluginPanelWidth = z.infer<typeof PluginPanelWidthSchema>;
441
+ /**
442
+ * How an iframe panel is opened when rendered as a toolbar entry.
443
+ */
444
+ export declare const PluginPanelOpenModeSchema: z.ZodEnum<["popover", "modal"]>;
445
+ /**
446
+ * How an iframe panel is opened when rendered as a toolbar entry.
447
+ */
448
+ export type PluginPanelOpenMode = z.infer<typeof PluginPanelOpenModeSchema>;
449
+ /**
450
+ * Controlled size hint for iframe panels rendered as popovers or modals.
451
+ */
452
+ export declare const PluginPanelUISizeSchema: z.ZodEnum<["sm", "md", "lg"]>;
453
+ /**
454
+ * Controlled size hint for iframe panels rendered as popovers or modals.
455
+ */
456
+ export type PluginPanelUISize = z.infer<typeof PluginPanelUISizeSchema>;
287
457
  /**
288
458
  * Declarative definition of a plugin-owned panel in the frontend.
289
459
  *
@@ -292,7 +462,7 @@ export type PluginPanelWidth = z.infer<typeof PluginPanelWidthSchema>;
292
462
  * the panel renders a custom UI page inside a sandboxed iframe instead. Static
293
463
  * manifest panels and runtime UI contributions use this same descriptor.
294
464
  */
295
- export declare const PluginPanelDescriptorSchema: z.ZodObject<{
465
+ export declare const PluginPanelDescriptorSchema: z.ZodEffects<z.ZodObject<{
296
466
  id: z.ZodString;
297
467
  title: z.ZodString;
298
468
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -301,25 +471,59 @@ export declare const PluginPanelDescriptorSchema: z.ZodObject<{
301
471
  /** Optional string params forwarded to iframe panels as URL/init params. */
302
472
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
303
473
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
304
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
474
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
305
475
  /** Preferred width hint. Defaults to `'half'`. */
306
476
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
477
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
478
+ icon: z.ZodOptional<z.ZodString>;
479
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
480
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
481
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
482
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
307
483
  }, "strip", z.ZodTypeAny, {
308
484
  id: string;
309
485
  title: string;
310
486
  component: "table" | "key-value" | "chart" | "log" | "iframe";
311
487
  params?: Record<string, string> | undefined;
488
+ icon?: string | undefined;
489
+ pageId?: string | undefined;
490
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
491
+ width?: "full" | "half" | undefined;
492
+ openMode?: "popover" | "modal" | undefined;
493
+ uiSize?: "sm" | "md" | "lg" | undefined;
494
+ }, {
495
+ id: string;
496
+ title: string;
497
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
498
+ params?: Record<string, string> | undefined;
499
+ icon?: string | undefined;
500
+ pageId?: string | undefined;
501
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
502
+ width?: "full" | "half" | undefined;
503
+ openMode?: "popover" | "modal" | undefined;
504
+ uiSize?: "sm" | "md" | "lg" | undefined;
505
+ }>, {
506
+ id: string;
507
+ title: string;
508
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
509
+ params?: Record<string, string> | undefined;
510
+ icon?: string | undefined;
312
511
  pageId?: string | undefined;
313
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
512
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
314
513
  width?: "full" | "half" | undefined;
514
+ openMode?: "popover" | "modal" | undefined;
515
+ uiSize?: "sm" | "md" | "lg" | undefined;
315
516
  }, {
316
517
  id: string;
317
518
  title: string;
318
519
  component: "table" | "key-value" | "chart" | "log" | "iframe";
319
520
  params?: Record<string, string> | undefined;
521
+ icon?: string | undefined;
320
522
  pageId?: string | undefined;
321
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
523
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
322
524
  width?: "full" | "half" | undefined;
525
+ openMode?: "popover" | "modal" | undefined;
526
+ uiSize?: "sm" | "md" | "lg" | undefined;
323
527
  }>;
324
528
  /**
325
529
  * Declarative definition of a plugin-owned panel in the frontend.
@@ -370,7 +574,7 @@ export declare const PluginUIPanelContributionGroupSchema: z.ZodObject<{
370
574
  operatorId: string;
371
575
  kind: "operator";
372
576
  }>]>>;
373
- panels: z.ZodArray<z.ZodObject<{
577
+ panels: z.ZodArray<z.ZodEffects<z.ZodObject<{
374
578
  id: z.ZodString;
375
579
  title: z.ZodString;
376
580
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -379,25 +583,59 @@ export declare const PluginUIPanelContributionGroupSchema: z.ZodObject<{
379
583
  /** Optional string params forwarded to iframe panels as URL/init params. */
380
584
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
381
585
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
382
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
586
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
383
587
  /** Preferred width hint. Defaults to `'half'`. */
384
588
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
589
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
590
+ icon: z.ZodOptional<z.ZodString>;
591
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
592
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
593
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
594
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
385
595
  }, "strip", z.ZodTypeAny, {
386
596
  id: string;
387
597
  title: string;
388
598
  component: "table" | "key-value" | "chart" | "log" | "iframe";
389
599
  params?: Record<string, string> | undefined;
600
+ icon?: string | undefined;
601
+ pageId?: string | undefined;
602
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
603
+ width?: "full" | "half" | undefined;
604
+ openMode?: "popover" | "modal" | undefined;
605
+ uiSize?: "sm" | "md" | "lg" | undefined;
606
+ }, {
607
+ id: string;
608
+ title: string;
609
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
610
+ params?: Record<string, string> | undefined;
611
+ icon?: string | undefined;
612
+ pageId?: string | undefined;
613
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
614
+ width?: "full" | "half" | undefined;
615
+ openMode?: "popover" | "modal" | undefined;
616
+ uiSize?: "sm" | "md" | "lg" | undefined;
617
+ }>, {
618
+ id: string;
619
+ title: string;
620
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
621
+ params?: Record<string, string> | undefined;
622
+ icon?: string | undefined;
390
623
  pageId?: string | undefined;
391
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
624
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
392
625
  width?: "full" | "half" | undefined;
626
+ openMode?: "popover" | "modal" | undefined;
627
+ uiSize?: "sm" | "md" | "lg" | undefined;
393
628
  }, {
394
629
  id: string;
395
630
  title: string;
396
631
  component: "table" | "key-value" | "chart" | "log" | "iframe";
397
632
  params?: Record<string, string> | undefined;
633
+ icon?: string | undefined;
398
634
  pageId?: string | undefined;
399
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
635
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
400
636
  width?: "full" | "half" | undefined;
637
+ openMode?: "popover" | "modal" | undefined;
638
+ uiSize?: "sm" | "md" | "lg" | undefined;
401
639
  }>, "many">;
402
640
  }, "strip", z.ZodTypeAny, {
403
641
  pluginName: string;
@@ -408,9 +646,12 @@ export declare const PluginUIPanelContributionGroupSchema: z.ZodObject<{
408
646
  title: string;
409
647
  component: "table" | "key-value" | "chart" | "log" | "iframe";
410
648
  params?: Record<string, string> | undefined;
649
+ icon?: string | undefined;
411
650
  pageId?: string | undefined;
412
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
651
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
413
652
  width?: "full" | "half" | undefined;
653
+ openMode?: "popover" | "modal" | undefined;
654
+ uiSize?: "sm" | "md" | "lg" | undefined;
414
655
  }[];
415
656
  instanceTarget?: {
416
657
  kind: "global";
@@ -427,9 +668,12 @@ export declare const PluginUIPanelContributionGroupSchema: z.ZodObject<{
427
668
  title: string;
428
669
  component: "table" | "key-value" | "chart" | "log" | "iframe";
429
670
  params?: Record<string, string> | undefined;
671
+ icon?: string | undefined;
430
672
  pageId?: string | undefined;
431
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
673
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
432
674
  width?: "full" | "half" | undefined;
675
+ openMode?: "popover" | "modal" | undefined;
676
+ uiSize?: "sm" | "md" | "lg" | undefined;
433
677
  }[];
434
678
  instanceTarget?: {
435
679
  kind: "global";
@@ -575,7 +819,7 @@ export declare const PluginManifestSchema: z.ZodObject<{
575
819
  description: z.ZodOptional<z.ZodString>;
576
820
  permissions: z.ZodOptional<z.ZodArray<z.ZodEnum<["network", "radio:read", "radio:control", "radio:power", "settings:ft8", "settings:decode-windows", "settings:realtime", "settings:frequency-presets", "settings:station", "settings:psk-reporter", "settings:ntp"]>, "many">>;
577
821
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
578
- type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "info"]>;
822
+ type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "keyedStringArrays", "info"]>;
579
823
  default: z.ZodUnknown;
580
824
  label: z.ZodString;
581
825
  description: z.ZodOptional<z.ZodString>;
@@ -614,14 +858,78 @@ export declare const PluginManifestSchema: z.ZodObject<{
614
858
  placeholder?: string | undefined;
615
859
  required?: boolean | undefined;
616
860
  }>, "many">>;
861
+ /** Fixed key list used by generated editors for `keyedStringArrays` settings. */
862
+ keys: z.ZodOptional<z.ZodArray<z.ZodObject<{
863
+ key: z.ZodString;
864
+ label: z.ZodString;
865
+ description: z.ZodOptional<z.ZodString>;
866
+ }, "strip", z.ZodTypeAny, {
867
+ label: string;
868
+ key: string;
869
+ description?: string | undefined;
870
+ }, {
871
+ label: string;
872
+ key: string;
873
+ description?: string | undefined;
874
+ }>, "many">>;
875
+ /** Conditionally show the field based on another setting in the same form. */
876
+ visibleWhen: z.ZodOptional<z.ZodObject<{
877
+ setting: z.ZodString;
878
+ equals: z.ZodOptional<z.ZodUnknown>;
879
+ notEquals: z.ZodOptional<z.ZodUnknown>;
880
+ }, "strip", z.ZodTypeAny, {
881
+ setting: string;
882
+ equals?: unknown;
883
+ notEquals?: unknown;
884
+ }, {
885
+ setting: string;
886
+ equals?: unknown;
887
+ notEquals?: unknown;
888
+ }>>;
889
+ /** Conditionally override the field description based on another setting. */
890
+ descriptionWhen: z.ZodOptional<z.ZodArray<z.ZodObject<{
891
+ when: z.ZodObject<{
892
+ setting: z.ZodString;
893
+ equals: z.ZodOptional<z.ZodUnknown>;
894
+ notEquals: z.ZodOptional<z.ZodUnknown>;
895
+ }, "strip", z.ZodTypeAny, {
896
+ setting: string;
897
+ equals?: unknown;
898
+ notEquals?: unknown;
899
+ }, {
900
+ setting: string;
901
+ equals?: unknown;
902
+ notEquals?: unknown;
903
+ }>;
904
+ description: z.ZodString;
905
+ }, "strip", z.ZodTypeAny, {
906
+ description: string;
907
+ when: {
908
+ setting: string;
909
+ equals?: unknown;
910
+ notEquals?: unknown;
911
+ };
912
+ }, {
913
+ description: string;
914
+ when: {
915
+ setting: string;
916
+ equals?: unknown;
917
+ notEquals?: unknown;
918
+ };
919
+ }>, "many">>;
617
920
  /** Internal settings are persisted/injected but hidden from generated UIs. */
618
921
  hidden: z.ZodOptional<z.ZodBoolean>;
619
922
  /** 设置作用域:global(所有操作员共享)或 operator(每操作员独立),默认 global */
620
923
  scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<["global", "operator"]>>>;
621
924
  }, "strip", z.ZodTypeAny, {
622
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
925
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
623
926
  label: string;
624
927
  scope: "operator" | "global";
928
+ keys?: {
929
+ label: string;
930
+ key: string;
931
+ description?: string | undefined;
932
+ }[] | undefined;
625
933
  options?: {
626
934
  value: string;
627
935
  label: string;
@@ -638,10 +946,28 @@ export declare const PluginManifestSchema: z.ZodObject<{
638
946
  placeholder?: string | undefined;
639
947
  required?: boolean | undefined;
640
948
  }[] | undefined;
949
+ visibleWhen?: {
950
+ setting: string;
951
+ equals?: unknown;
952
+ notEquals?: unknown;
953
+ } | undefined;
954
+ descriptionWhen?: {
955
+ description: string;
956
+ when: {
957
+ setting: string;
958
+ equals?: unknown;
959
+ notEquals?: unknown;
960
+ };
961
+ }[] | undefined;
641
962
  hidden?: boolean | undefined;
642
963
  }, {
643
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
964
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
644
965
  label: string;
966
+ keys?: {
967
+ label: string;
968
+ key: string;
969
+ description?: string | undefined;
970
+ }[] | undefined;
645
971
  options?: {
646
972
  value: string;
647
973
  label: string;
@@ -658,6 +984,19 @@ export declare const PluginManifestSchema: z.ZodObject<{
658
984
  placeholder?: string | undefined;
659
985
  required?: boolean | undefined;
660
986
  }[] | undefined;
987
+ visibleWhen?: {
988
+ setting: string;
989
+ equals?: unknown;
990
+ notEquals?: unknown;
991
+ } | undefined;
992
+ descriptionWhen?: {
993
+ description: string;
994
+ when: {
995
+ setting: string;
996
+ equals?: unknown;
997
+ notEquals?: unknown;
998
+ };
999
+ }[] | undefined;
661
1000
  hidden?: boolean | undefined;
662
1001
  scope?: "operator" | "global" | undefined;
663
1002
  }>>>;
@@ -681,7 +1020,7 @@ export declare const PluginManifestSchema: z.ZodObject<{
681
1020
  }, {
682
1021
  settingKey: string;
683
1022
  }>, "many">>;
684
- panels: z.ZodOptional<z.ZodArray<z.ZodObject<{
1023
+ panels: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodObject<{
685
1024
  id: z.ZodString;
686
1025
  title: z.ZodString;
687
1026
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -690,25 +1029,59 @@ export declare const PluginManifestSchema: z.ZodObject<{
690
1029
  /** Optional string params forwarded to iframe panels as URL/init params. */
691
1030
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
692
1031
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
693
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
1032
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
694
1033
  /** Preferred width hint. Defaults to `'half'`. */
695
1034
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
1035
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
1036
+ icon: z.ZodOptional<z.ZodString>;
1037
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
1038
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
1039
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
1040
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
696
1041
  }, "strip", z.ZodTypeAny, {
697
1042
  id: string;
698
1043
  title: string;
699
1044
  component: "table" | "key-value" | "chart" | "log" | "iframe";
700
1045
  params?: Record<string, string> | undefined;
1046
+ icon?: string | undefined;
701
1047
  pageId?: string | undefined;
702
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1048
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
703
1049
  width?: "full" | "half" | undefined;
1050
+ openMode?: "popover" | "modal" | undefined;
1051
+ uiSize?: "sm" | "md" | "lg" | undefined;
704
1052
  }, {
705
1053
  id: string;
706
1054
  title: string;
707
1055
  component: "table" | "key-value" | "chart" | "log" | "iframe";
708
1056
  params?: Record<string, string> | undefined;
1057
+ icon?: string | undefined;
709
1058
  pageId?: string | undefined;
710
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1059
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
711
1060
  width?: "full" | "half" | undefined;
1061
+ openMode?: "popover" | "modal" | undefined;
1062
+ uiSize?: "sm" | "md" | "lg" | undefined;
1063
+ }>, {
1064
+ id: string;
1065
+ title: string;
1066
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
1067
+ params?: Record<string, string> | undefined;
1068
+ icon?: string | undefined;
1069
+ pageId?: string | undefined;
1070
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1071
+ width?: "full" | "half" | undefined;
1072
+ openMode?: "popover" | "modal" | undefined;
1073
+ uiSize?: "sm" | "md" | "lg" | undefined;
1074
+ }, {
1075
+ id: string;
1076
+ title: string;
1077
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
1078
+ params?: Record<string, string> | undefined;
1079
+ icon?: string | undefined;
1080
+ pageId?: string | undefined;
1081
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1082
+ width?: "full" | "half" | undefined;
1083
+ openMode?: "popover" | "modal" | undefined;
1084
+ uiSize?: "sm" | "md" | "lg" | undefined;
712
1085
  }>, "many">>;
713
1086
  storage: z.ZodOptional<z.ZodObject<{
714
1087
  scopes: z.ZodArray<z.ZodEnum<["global", "operator"]>, "many">;
@@ -781,9 +1154,12 @@ export declare const PluginManifestSchema: z.ZodObject<{
781
1154
  title: string;
782
1155
  component: "table" | "key-value" | "chart" | "log" | "iframe";
783
1156
  params?: Record<string, string> | undefined;
1157
+ icon?: string | undefined;
784
1158
  pageId?: string | undefined;
785
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1159
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
786
1160
  width?: "full" | "half" | undefined;
1161
+ openMode?: "popover" | "modal" | undefined;
1162
+ uiSize?: "sm" | "md" | "lg" | undefined;
787
1163
  }[] | undefined;
788
1164
  ui?: {
789
1165
  dir: string;
@@ -798,9 +1174,14 @@ export declare const PluginManifestSchema: z.ZodObject<{
798
1174
  } | undefined;
799
1175
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
800
1176
  settings?: Record<string, {
801
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1177
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
802
1178
  label: string;
803
1179
  scope: "operator" | "global";
1180
+ keys?: {
1181
+ label: string;
1182
+ key: string;
1183
+ description?: string | undefined;
1184
+ }[] | undefined;
804
1185
  options?: {
805
1186
  value: string;
806
1187
  label: string;
@@ -817,6 +1198,19 @@ export declare const PluginManifestSchema: z.ZodObject<{
817
1198
  placeholder?: string | undefined;
818
1199
  required?: boolean | undefined;
819
1200
  }[] | undefined;
1201
+ visibleWhen?: {
1202
+ setting: string;
1203
+ equals?: unknown;
1204
+ notEquals?: unknown;
1205
+ } | undefined;
1206
+ descriptionWhen?: {
1207
+ description: string;
1208
+ when: {
1209
+ setting: string;
1210
+ equals?: unknown;
1211
+ notEquals?: unknown;
1212
+ };
1213
+ }[] | undefined;
820
1214
  hidden?: boolean | undefined;
821
1215
  }> | undefined;
822
1216
  quickActions?: {
@@ -840,9 +1234,12 @@ export declare const PluginManifestSchema: z.ZodObject<{
840
1234
  title: string;
841
1235
  component: "table" | "key-value" | "chart" | "log" | "iframe";
842
1236
  params?: Record<string, string> | undefined;
1237
+ icon?: string | undefined;
843
1238
  pageId?: string | undefined;
844
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1239
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
845
1240
  width?: "full" | "half" | undefined;
1241
+ openMode?: "popover" | "modal" | undefined;
1242
+ uiSize?: "sm" | "md" | "lg" | undefined;
846
1243
  }[] | undefined;
847
1244
  ui?: {
848
1245
  dir?: string | undefined;
@@ -858,8 +1255,13 @@ export declare const PluginManifestSchema: z.ZodObject<{
858
1255
  instanceScope?: "operator" | "global" | undefined;
859
1256
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
860
1257
  settings?: Record<string, {
861
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1258
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
862
1259
  label: string;
1260
+ keys?: {
1261
+ label: string;
1262
+ key: string;
1263
+ description?: string | undefined;
1264
+ }[] | undefined;
863
1265
  options?: {
864
1266
  value: string;
865
1267
  label: string;
@@ -876,6 +1278,19 @@ export declare const PluginManifestSchema: z.ZodObject<{
876
1278
  placeholder?: string | undefined;
877
1279
  required?: boolean | undefined;
878
1280
  }[] | undefined;
1281
+ visibleWhen?: {
1282
+ setting: string;
1283
+ equals?: unknown;
1284
+ notEquals?: unknown;
1285
+ } | undefined;
1286
+ descriptionWhen?: {
1287
+ description: string;
1288
+ when: {
1289
+ setting: string;
1290
+ equals?: unknown;
1291
+ notEquals?: unknown;
1292
+ };
1293
+ }[] | undefined;
879
1294
  hidden?: boolean | undefined;
880
1295
  scope?: "operator" | "global" | undefined;
881
1296
  }> | undefined;
@@ -944,7 +1359,7 @@ export declare const PluginStatusSchema: z.ZodObject<{
944
1359
  /** 仅对 strategy 插件有意义:当前被哪些 operator 选中 */
945
1360
  assignedOperatorIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
946
1361
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
947
- type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "info"]>;
1362
+ type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "keyedStringArrays", "info"]>;
948
1363
  default: z.ZodUnknown;
949
1364
  label: z.ZodString;
950
1365
  description: z.ZodOptional<z.ZodString>;
@@ -983,14 +1398,78 @@ export declare const PluginStatusSchema: z.ZodObject<{
983
1398
  placeholder?: string | undefined;
984
1399
  required?: boolean | undefined;
985
1400
  }>, "many">>;
1401
+ /** Fixed key list used by generated editors for `keyedStringArrays` settings. */
1402
+ keys: z.ZodOptional<z.ZodArray<z.ZodObject<{
1403
+ key: z.ZodString;
1404
+ label: z.ZodString;
1405
+ description: z.ZodOptional<z.ZodString>;
1406
+ }, "strip", z.ZodTypeAny, {
1407
+ label: string;
1408
+ key: string;
1409
+ description?: string | undefined;
1410
+ }, {
1411
+ label: string;
1412
+ key: string;
1413
+ description?: string | undefined;
1414
+ }>, "many">>;
1415
+ /** Conditionally show the field based on another setting in the same form. */
1416
+ visibleWhen: z.ZodOptional<z.ZodObject<{
1417
+ setting: z.ZodString;
1418
+ equals: z.ZodOptional<z.ZodUnknown>;
1419
+ notEquals: z.ZodOptional<z.ZodUnknown>;
1420
+ }, "strip", z.ZodTypeAny, {
1421
+ setting: string;
1422
+ equals?: unknown;
1423
+ notEquals?: unknown;
1424
+ }, {
1425
+ setting: string;
1426
+ equals?: unknown;
1427
+ notEquals?: unknown;
1428
+ }>>;
1429
+ /** Conditionally override the field description based on another setting. */
1430
+ descriptionWhen: z.ZodOptional<z.ZodArray<z.ZodObject<{
1431
+ when: z.ZodObject<{
1432
+ setting: z.ZodString;
1433
+ equals: z.ZodOptional<z.ZodUnknown>;
1434
+ notEquals: z.ZodOptional<z.ZodUnknown>;
1435
+ }, "strip", z.ZodTypeAny, {
1436
+ setting: string;
1437
+ equals?: unknown;
1438
+ notEquals?: unknown;
1439
+ }, {
1440
+ setting: string;
1441
+ equals?: unknown;
1442
+ notEquals?: unknown;
1443
+ }>;
1444
+ description: z.ZodString;
1445
+ }, "strip", z.ZodTypeAny, {
1446
+ description: string;
1447
+ when: {
1448
+ setting: string;
1449
+ equals?: unknown;
1450
+ notEquals?: unknown;
1451
+ };
1452
+ }, {
1453
+ description: string;
1454
+ when: {
1455
+ setting: string;
1456
+ equals?: unknown;
1457
+ notEquals?: unknown;
1458
+ };
1459
+ }>, "many">>;
986
1460
  /** Internal settings are persisted/injected but hidden from generated UIs. */
987
1461
  hidden: z.ZodOptional<z.ZodBoolean>;
988
1462
  /** 设置作用域:global(所有操作员共享)或 operator(每操作员独立),默认 global */
989
1463
  scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<["global", "operator"]>>>;
990
1464
  }, "strip", z.ZodTypeAny, {
991
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1465
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
992
1466
  label: string;
993
1467
  scope: "operator" | "global";
1468
+ keys?: {
1469
+ label: string;
1470
+ key: string;
1471
+ description?: string | undefined;
1472
+ }[] | undefined;
994
1473
  options?: {
995
1474
  value: string;
996
1475
  label: string;
@@ -1007,10 +1486,28 @@ export declare const PluginStatusSchema: z.ZodObject<{
1007
1486
  placeholder?: string | undefined;
1008
1487
  required?: boolean | undefined;
1009
1488
  }[] | undefined;
1489
+ visibleWhen?: {
1490
+ setting: string;
1491
+ equals?: unknown;
1492
+ notEquals?: unknown;
1493
+ } | undefined;
1494
+ descriptionWhen?: {
1495
+ description: string;
1496
+ when: {
1497
+ setting: string;
1498
+ equals?: unknown;
1499
+ notEquals?: unknown;
1500
+ };
1501
+ }[] | undefined;
1010
1502
  hidden?: boolean | undefined;
1011
1503
  }, {
1012
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1504
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1013
1505
  label: string;
1506
+ keys?: {
1507
+ label: string;
1508
+ key: string;
1509
+ description?: string | undefined;
1510
+ }[] | undefined;
1014
1511
  options?: {
1015
1512
  value: string;
1016
1513
  label: string;
@@ -1027,6 +1524,19 @@ export declare const PluginStatusSchema: z.ZodObject<{
1027
1524
  placeholder?: string | undefined;
1028
1525
  required?: boolean | undefined;
1029
1526
  }[] | undefined;
1527
+ visibleWhen?: {
1528
+ setting: string;
1529
+ equals?: unknown;
1530
+ notEquals?: unknown;
1531
+ } | undefined;
1532
+ descriptionWhen?: {
1533
+ description: string;
1534
+ when: {
1535
+ setting: string;
1536
+ equals?: unknown;
1537
+ notEquals?: unknown;
1538
+ };
1539
+ }[] | undefined;
1030
1540
  hidden?: boolean | undefined;
1031
1541
  scope?: "operator" | "global" | undefined;
1032
1542
  }>>>;
@@ -1050,7 +1560,7 @@ export declare const PluginStatusSchema: z.ZodObject<{
1050
1560
  }, {
1051
1561
  settingKey: string;
1052
1562
  }>, "many">>;
1053
- panels: z.ZodOptional<z.ZodArray<z.ZodObject<{
1563
+ panels: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodObject<{
1054
1564
  id: z.ZodString;
1055
1565
  title: z.ZodString;
1056
1566
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -1059,25 +1569,59 @@ export declare const PluginStatusSchema: z.ZodObject<{
1059
1569
  /** Optional string params forwarded to iframe panels as URL/init params. */
1060
1570
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1061
1571
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
1062
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
1572
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
1063
1573
  /** Preferred width hint. Defaults to `'half'`. */
1064
1574
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
1575
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
1576
+ icon: z.ZodOptional<z.ZodString>;
1577
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
1578
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
1579
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
1580
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
1065
1581
  }, "strip", z.ZodTypeAny, {
1066
1582
  id: string;
1067
1583
  title: string;
1068
1584
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1069
1585
  params?: Record<string, string> | undefined;
1586
+ icon?: string | undefined;
1587
+ pageId?: string | undefined;
1588
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1589
+ width?: "full" | "half" | undefined;
1590
+ openMode?: "popover" | "modal" | undefined;
1591
+ uiSize?: "sm" | "md" | "lg" | undefined;
1592
+ }, {
1593
+ id: string;
1594
+ title: string;
1595
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
1596
+ params?: Record<string, string> | undefined;
1597
+ icon?: string | undefined;
1070
1598
  pageId?: string | undefined;
1071
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1599
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1072
1600
  width?: "full" | "half" | undefined;
1601
+ openMode?: "popover" | "modal" | undefined;
1602
+ uiSize?: "sm" | "md" | "lg" | undefined;
1603
+ }>, {
1604
+ id: string;
1605
+ title: string;
1606
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
1607
+ params?: Record<string, string> | undefined;
1608
+ icon?: string | undefined;
1609
+ pageId?: string | undefined;
1610
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1611
+ width?: "full" | "half" | undefined;
1612
+ openMode?: "popover" | "modal" | undefined;
1613
+ uiSize?: "sm" | "md" | "lg" | undefined;
1073
1614
  }, {
1074
1615
  id: string;
1075
1616
  title: string;
1076
1617
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1077
1618
  params?: Record<string, string> | undefined;
1619
+ icon?: string | undefined;
1078
1620
  pageId?: string | undefined;
1079
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1621
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1080
1622
  width?: "full" | "half" | undefined;
1623
+ openMode?: "popover" | "modal" | undefined;
1624
+ uiSize?: "sm" | "md" | "lg" | undefined;
1081
1625
  }>, "many">>;
1082
1626
  permissions: z.ZodOptional<z.ZodArray<z.ZodEnum<["network", "radio:read", "radio:control", "radio:power", "settings:ft8", "settings:decode-windows", "settings:realtime", "settings:frequency-presets", "settings:station", "settings:psk-reporter", "settings:ntp"]>, "many">>;
1083
1627
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<["auto_call_candidate", "auto_call_execution"]>, "many">>;
@@ -1181,9 +1725,12 @@ export declare const PluginStatusSchema: z.ZodObject<{
1181
1725
  title: string;
1182
1726
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1183
1727
  params?: Record<string, string> | undefined;
1728
+ icon?: string | undefined;
1184
1729
  pageId?: string | undefined;
1185
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1730
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1186
1731
  width?: "full" | "half" | undefined;
1732
+ openMode?: "popover" | "modal" | undefined;
1733
+ uiSize?: "sm" | "md" | "lg" | undefined;
1187
1734
  }[] | undefined;
1188
1735
  ui?: {
1189
1736
  dir: string;
@@ -1198,9 +1745,14 @@ export declare const PluginStatusSchema: z.ZodObject<{
1198
1745
  } | undefined;
1199
1746
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
1200
1747
  settings?: Record<string, {
1201
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1748
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1202
1749
  label: string;
1203
1750
  scope: "operator" | "global";
1751
+ keys?: {
1752
+ label: string;
1753
+ key: string;
1754
+ description?: string | undefined;
1755
+ }[] | undefined;
1204
1756
  options?: {
1205
1757
  value: string;
1206
1758
  label: string;
@@ -1217,6 +1769,19 @@ export declare const PluginStatusSchema: z.ZodObject<{
1217
1769
  placeholder?: string | undefined;
1218
1770
  required?: boolean | undefined;
1219
1771
  }[] | undefined;
1772
+ visibleWhen?: {
1773
+ setting: string;
1774
+ equals?: unknown;
1775
+ notEquals?: unknown;
1776
+ } | undefined;
1777
+ descriptionWhen?: {
1778
+ description: string;
1779
+ when: {
1780
+ setting: string;
1781
+ equals?: unknown;
1782
+ notEquals?: unknown;
1783
+ };
1784
+ }[] | undefined;
1220
1785
  hidden?: boolean | undefined;
1221
1786
  }> | undefined;
1222
1787
  quickActions?: {
@@ -1252,9 +1817,12 @@ export declare const PluginStatusSchema: z.ZodObject<{
1252
1817
  title: string;
1253
1818
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1254
1819
  params?: Record<string, string> | undefined;
1820
+ icon?: string | undefined;
1255
1821
  pageId?: string | undefined;
1256
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
1822
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1257
1823
  width?: "full" | "half" | undefined;
1824
+ openMode?: "popover" | "modal" | undefined;
1825
+ uiSize?: "sm" | "md" | "lg" | undefined;
1258
1826
  }[] | undefined;
1259
1827
  ui?: {
1260
1828
  dir?: string | undefined;
@@ -1270,8 +1838,13 @@ export declare const PluginStatusSchema: z.ZodObject<{
1270
1838
  instanceScope?: "operator" | "global" | undefined;
1271
1839
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
1272
1840
  settings?: Record<string, {
1273
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
1841
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1274
1842
  label: string;
1843
+ keys?: {
1844
+ label: string;
1845
+ key: string;
1846
+ description?: string | undefined;
1847
+ }[] | undefined;
1275
1848
  options?: {
1276
1849
  value: string;
1277
1850
  label: string;
@@ -1288,6 +1861,19 @@ export declare const PluginStatusSchema: z.ZodObject<{
1288
1861
  placeholder?: string | undefined;
1289
1862
  required?: boolean | undefined;
1290
1863
  }[] | undefined;
1864
+ visibleWhen?: {
1865
+ setting: string;
1866
+ equals?: unknown;
1867
+ notEquals?: unknown;
1868
+ } | undefined;
1869
+ descriptionWhen?: {
1870
+ description: string;
1871
+ when: {
1872
+ setting: string;
1873
+ equals?: unknown;
1874
+ notEquals?: unknown;
1875
+ };
1876
+ }[] | undefined;
1291
1877
  hidden?: boolean | undefined;
1292
1878
  scope?: "operator" | "global" | undefined;
1293
1879
  }> | undefined;
@@ -1388,7 +1974,7 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1388
1974
  /** 仅对 strategy 插件有意义:当前被哪些 operator 选中 */
1389
1975
  assignedOperatorIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1390
1976
  settings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1391
- type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "info"]>;
1977
+ type: z.ZodEnum<["boolean", "number", "string", "string[]", "object[]", "keyedStringArrays", "info"]>;
1392
1978
  default: z.ZodUnknown;
1393
1979
  label: z.ZodString;
1394
1980
  description: z.ZodOptional<z.ZodString>;
@@ -1427,14 +2013,78 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1427
2013
  placeholder?: string | undefined;
1428
2014
  required?: boolean | undefined;
1429
2015
  }>, "many">>;
2016
+ /** Fixed key list used by generated editors for `keyedStringArrays` settings. */
2017
+ keys: z.ZodOptional<z.ZodArray<z.ZodObject<{
2018
+ key: z.ZodString;
2019
+ label: z.ZodString;
2020
+ description: z.ZodOptional<z.ZodString>;
2021
+ }, "strip", z.ZodTypeAny, {
2022
+ label: string;
2023
+ key: string;
2024
+ description?: string | undefined;
2025
+ }, {
2026
+ label: string;
2027
+ key: string;
2028
+ description?: string | undefined;
2029
+ }>, "many">>;
2030
+ /** Conditionally show the field based on another setting in the same form. */
2031
+ visibleWhen: z.ZodOptional<z.ZodObject<{
2032
+ setting: z.ZodString;
2033
+ equals: z.ZodOptional<z.ZodUnknown>;
2034
+ notEquals: z.ZodOptional<z.ZodUnknown>;
2035
+ }, "strip", z.ZodTypeAny, {
2036
+ setting: string;
2037
+ equals?: unknown;
2038
+ notEquals?: unknown;
2039
+ }, {
2040
+ setting: string;
2041
+ equals?: unknown;
2042
+ notEquals?: unknown;
2043
+ }>>;
2044
+ /** Conditionally override the field description based on another setting. */
2045
+ descriptionWhen: z.ZodOptional<z.ZodArray<z.ZodObject<{
2046
+ when: z.ZodObject<{
2047
+ setting: z.ZodString;
2048
+ equals: z.ZodOptional<z.ZodUnknown>;
2049
+ notEquals: z.ZodOptional<z.ZodUnknown>;
2050
+ }, "strip", z.ZodTypeAny, {
2051
+ setting: string;
2052
+ equals?: unknown;
2053
+ notEquals?: unknown;
2054
+ }, {
2055
+ setting: string;
2056
+ equals?: unknown;
2057
+ notEquals?: unknown;
2058
+ }>;
2059
+ description: z.ZodString;
2060
+ }, "strip", z.ZodTypeAny, {
2061
+ description: string;
2062
+ when: {
2063
+ setting: string;
2064
+ equals?: unknown;
2065
+ notEquals?: unknown;
2066
+ };
2067
+ }, {
2068
+ description: string;
2069
+ when: {
2070
+ setting: string;
2071
+ equals?: unknown;
2072
+ notEquals?: unknown;
2073
+ };
2074
+ }>, "many">>;
1430
2075
  /** Internal settings are persisted/injected but hidden from generated UIs. */
1431
2076
  hidden: z.ZodOptional<z.ZodBoolean>;
1432
2077
  /** 设置作用域:global(所有操作员共享)或 operator(每操作员独立),默认 global */
1433
2078
  scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<["global", "operator"]>>>;
1434
2079
  }, "strip", z.ZodTypeAny, {
1435
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2080
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1436
2081
  label: string;
1437
2082
  scope: "operator" | "global";
2083
+ keys?: {
2084
+ label: string;
2085
+ key: string;
2086
+ description?: string | undefined;
2087
+ }[] | undefined;
1438
2088
  options?: {
1439
2089
  value: string;
1440
2090
  label: string;
@@ -1451,10 +2101,28 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1451
2101
  placeholder?: string | undefined;
1452
2102
  required?: boolean | undefined;
1453
2103
  }[] | undefined;
2104
+ visibleWhen?: {
2105
+ setting: string;
2106
+ equals?: unknown;
2107
+ notEquals?: unknown;
2108
+ } | undefined;
2109
+ descriptionWhen?: {
2110
+ description: string;
2111
+ when: {
2112
+ setting: string;
2113
+ equals?: unknown;
2114
+ notEquals?: unknown;
2115
+ };
2116
+ }[] | undefined;
1454
2117
  hidden?: boolean | undefined;
1455
2118
  }, {
1456
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2119
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1457
2120
  label: string;
2121
+ keys?: {
2122
+ label: string;
2123
+ key: string;
2124
+ description?: string | undefined;
2125
+ }[] | undefined;
1458
2126
  options?: {
1459
2127
  value: string;
1460
2128
  label: string;
@@ -1471,6 +2139,19 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1471
2139
  placeholder?: string | undefined;
1472
2140
  required?: boolean | undefined;
1473
2141
  }[] | undefined;
2142
+ visibleWhen?: {
2143
+ setting: string;
2144
+ equals?: unknown;
2145
+ notEquals?: unknown;
2146
+ } | undefined;
2147
+ descriptionWhen?: {
2148
+ description: string;
2149
+ when: {
2150
+ setting: string;
2151
+ equals?: unknown;
2152
+ notEquals?: unknown;
2153
+ };
2154
+ }[] | undefined;
1474
2155
  hidden?: boolean | undefined;
1475
2156
  scope?: "operator" | "global" | undefined;
1476
2157
  }>>>;
@@ -1494,7 +2175,7 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1494
2175
  }, {
1495
2176
  settingKey: string;
1496
2177
  }>, "many">>;
1497
- panels: z.ZodOptional<z.ZodArray<z.ZodObject<{
2178
+ panels: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodObject<{
1498
2179
  id: z.ZodString;
1499
2180
  title: z.ZodString;
1500
2181
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -1503,25 +2184,59 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1503
2184
  /** Optional string params forwarded to iframe panels as URL/init params. */
1504
2185
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1505
2186
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
1506
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
2187
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
1507
2188
  /** Preferred width hint. Defaults to `'half'`. */
1508
2189
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
2190
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
2191
+ icon: z.ZodOptional<z.ZodString>;
2192
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
2193
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
2194
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
2195
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
1509
2196
  }, "strip", z.ZodTypeAny, {
1510
2197
  id: string;
1511
2198
  title: string;
1512
2199
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1513
2200
  params?: Record<string, string> | undefined;
2201
+ icon?: string | undefined;
1514
2202
  pageId?: string | undefined;
1515
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2203
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1516
2204
  width?: "full" | "half" | undefined;
2205
+ openMode?: "popover" | "modal" | undefined;
2206
+ uiSize?: "sm" | "md" | "lg" | undefined;
1517
2207
  }, {
1518
2208
  id: string;
1519
2209
  title: string;
1520
2210
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1521
2211
  params?: Record<string, string> | undefined;
2212
+ icon?: string | undefined;
1522
2213
  pageId?: string | undefined;
1523
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2214
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1524
2215
  width?: "full" | "half" | undefined;
2216
+ openMode?: "popover" | "modal" | undefined;
2217
+ uiSize?: "sm" | "md" | "lg" | undefined;
2218
+ }>, {
2219
+ id: string;
2220
+ title: string;
2221
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
2222
+ params?: Record<string, string> | undefined;
2223
+ icon?: string | undefined;
2224
+ pageId?: string | undefined;
2225
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2226
+ width?: "full" | "half" | undefined;
2227
+ openMode?: "popover" | "modal" | undefined;
2228
+ uiSize?: "sm" | "md" | "lg" | undefined;
2229
+ }, {
2230
+ id: string;
2231
+ title: string;
2232
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
2233
+ params?: Record<string, string> | undefined;
2234
+ icon?: string | undefined;
2235
+ pageId?: string | undefined;
2236
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2237
+ width?: "full" | "half" | undefined;
2238
+ openMode?: "popover" | "modal" | undefined;
2239
+ uiSize?: "sm" | "md" | "lg" | undefined;
1525
2240
  }>, "many">>;
1526
2241
  permissions: z.ZodOptional<z.ZodArray<z.ZodEnum<["network", "radio:read", "radio:control", "radio:power", "settings:ft8", "settings:decode-windows", "settings:realtime", "settings:frequency-presets", "settings:station", "settings:psk-reporter", "settings:ntp"]>, "many">>;
1527
2242
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<["auto_call_candidate", "auto_call_execution"]>, "many">>;
@@ -1625,9 +2340,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1625
2340
  title: string;
1626
2341
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1627
2342
  params?: Record<string, string> | undefined;
2343
+ icon?: string | undefined;
1628
2344
  pageId?: string | undefined;
1629
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2345
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1630
2346
  width?: "full" | "half" | undefined;
2347
+ openMode?: "popover" | "modal" | undefined;
2348
+ uiSize?: "sm" | "md" | "lg" | undefined;
1631
2349
  }[] | undefined;
1632
2350
  ui?: {
1633
2351
  dir: string;
@@ -1642,9 +2360,14 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1642
2360
  } | undefined;
1643
2361
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
1644
2362
  settings?: Record<string, {
1645
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2363
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1646
2364
  label: string;
1647
2365
  scope: "operator" | "global";
2366
+ keys?: {
2367
+ label: string;
2368
+ key: string;
2369
+ description?: string | undefined;
2370
+ }[] | undefined;
1648
2371
  options?: {
1649
2372
  value: string;
1650
2373
  label: string;
@@ -1661,6 +2384,19 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1661
2384
  placeholder?: string | undefined;
1662
2385
  required?: boolean | undefined;
1663
2386
  }[] | undefined;
2387
+ visibleWhen?: {
2388
+ setting: string;
2389
+ equals?: unknown;
2390
+ notEquals?: unknown;
2391
+ } | undefined;
2392
+ descriptionWhen?: {
2393
+ description: string;
2394
+ when: {
2395
+ setting: string;
2396
+ equals?: unknown;
2397
+ notEquals?: unknown;
2398
+ };
2399
+ }[] | undefined;
1664
2400
  hidden?: boolean | undefined;
1665
2401
  }> | undefined;
1666
2402
  quickActions?: {
@@ -1696,9 +2432,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1696
2432
  title: string;
1697
2433
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1698
2434
  params?: Record<string, string> | undefined;
2435
+ icon?: string | undefined;
1699
2436
  pageId?: string | undefined;
1700
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2437
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1701
2438
  width?: "full" | "half" | undefined;
2439
+ openMode?: "popover" | "modal" | undefined;
2440
+ uiSize?: "sm" | "md" | "lg" | undefined;
1702
2441
  }[] | undefined;
1703
2442
  ui?: {
1704
2443
  dir?: string | undefined;
@@ -1714,8 +2453,13 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1714
2453
  instanceScope?: "operator" | "global" | undefined;
1715
2454
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
1716
2455
  settings?: Record<string, {
1717
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2456
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1718
2457
  label: string;
2458
+ keys?: {
2459
+ label: string;
2460
+ key: string;
2461
+ description?: string | undefined;
2462
+ }[] | undefined;
1719
2463
  options?: {
1720
2464
  value: string;
1721
2465
  label: string;
@@ -1732,6 +2476,19 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1732
2476
  placeholder?: string | undefined;
1733
2477
  required?: boolean | undefined;
1734
2478
  }[] | undefined;
2479
+ visibleWhen?: {
2480
+ setting: string;
2481
+ equals?: unknown;
2482
+ notEquals?: unknown;
2483
+ } | undefined;
2484
+ descriptionWhen?: {
2485
+ description: string;
2486
+ when: {
2487
+ setting: string;
2488
+ equals?: unknown;
2489
+ notEquals?: unknown;
2490
+ };
2491
+ }[] | undefined;
1735
2492
  hidden?: boolean | undefined;
1736
2493
  scope?: "operator" | "global" | undefined;
1737
2494
  }> | undefined;
@@ -1806,7 +2563,7 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1806
2563
  operatorId: string;
1807
2564
  kind: "operator";
1808
2565
  }>]>>;
1809
- panels: z.ZodArray<z.ZodObject<{
2566
+ panels: z.ZodArray<z.ZodEffects<z.ZodObject<{
1810
2567
  id: z.ZodString;
1811
2568
  title: z.ZodString;
1812
2569
  component: z.ZodEnum<["table", "key-value", "chart", "log", "iframe"]>;
@@ -1815,25 +2572,59 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1815
2572
  /** Optional string params forwarded to iframe panels as URL/init params. */
1816
2573
  params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1817
2574
  /** Where the panel renders. Defaults to `'operator'` (operator card live-panel area). */
1818
- slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top"]>>;
2575
+ slot: z.ZodOptional<z.ZodEnum<["operator", "automation", "main-right", "voice-left-top", "voice-right-top", "cw-right-top", "radio-control-toolbar"]>>;
1819
2576
  /** Preferred width hint. Defaults to `'half'`. */
1820
2577
  width: z.ZodOptional<z.ZodEnum<["half", "full"]>>;
2578
+ /** Optional FontAwesome Free icon name used by toolbar-style hosts. */
2579
+ icon: z.ZodOptional<z.ZodString>;
2580
+ /** Optional toolbar opening mode. Defaults to host-specific behavior, typically `'popover'`. */
2581
+ openMode: z.ZodOptional<z.ZodEnum<["popover", "modal"]>>;
2582
+ /** Optional controlled UI size hint for toolbar popovers/modals. */
2583
+ uiSize: z.ZodOptional<z.ZodEnum<["sm", "md", "lg"]>>;
1821
2584
  }, "strip", z.ZodTypeAny, {
1822
2585
  id: string;
1823
2586
  title: string;
1824
2587
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1825
2588
  params?: Record<string, string> | undefined;
2589
+ icon?: string | undefined;
1826
2590
  pageId?: string | undefined;
1827
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2591
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1828
2592
  width?: "full" | "half" | undefined;
2593
+ openMode?: "popover" | "modal" | undefined;
2594
+ uiSize?: "sm" | "md" | "lg" | undefined;
1829
2595
  }, {
1830
2596
  id: string;
1831
2597
  title: string;
1832
2598
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1833
2599
  params?: Record<string, string> | undefined;
2600
+ icon?: string | undefined;
1834
2601
  pageId?: string | undefined;
1835
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2602
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1836
2603
  width?: "full" | "half" | undefined;
2604
+ openMode?: "popover" | "modal" | undefined;
2605
+ uiSize?: "sm" | "md" | "lg" | undefined;
2606
+ }>, {
2607
+ id: string;
2608
+ title: string;
2609
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
2610
+ params?: Record<string, string> | undefined;
2611
+ icon?: string | undefined;
2612
+ pageId?: string | undefined;
2613
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2614
+ width?: "full" | "half" | undefined;
2615
+ openMode?: "popover" | "modal" | undefined;
2616
+ uiSize?: "sm" | "md" | "lg" | undefined;
2617
+ }, {
2618
+ id: string;
2619
+ title: string;
2620
+ component: "table" | "key-value" | "chart" | "log" | "iframe";
2621
+ params?: Record<string, string> | undefined;
2622
+ icon?: string | undefined;
2623
+ pageId?: string | undefined;
2624
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2625
+ width?: "full" | "half" | undefined;
2626
+ openMode?: "popover" | "modal" | undefined;
2627
+ uiSize?: "sm" | "md" | "lg" | undefined;
1837
2628
  }>, "many">;
1838
2629
  }, "strip", z.ZodTypeAny, {
1839
2630
  pluginName: string;
@@ -1844,9 +2635,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1844
2635
  title: string;
1845
2636
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1846
2637
  params?: Record<string, string> | undefined;
2638
+ icon?: string | undefined;
1847
2639
  pageId?: string | undefined;
1848
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2640
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1849
2641
  width?: "full" | "half" | undefined;
2642
+ openMode?: "popover" | "modal" | undefined;
2643
+ uiSize?: "sm" | "md" | "lg" | undefined;
1850
2644
  }[];
1851
2645
  instanceTarget?: {
1852
2646
  kind: "global";
@@ -1863,9 +2657,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1863
2657
  title: string;
1864
2658
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1865
2659
  params?: Record<string, string> | undefined;
2660
+ icon?: string | undefined;
1866
2661
  pageId?: string | undefined;
1867
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2662
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1868
2663
  width?: "full" | "half" | undefined;
2664
+ openMode?: "popover" | "modal" | undefined;
2665
+ uiSize?: "sm" | "md" | "lg" | undefined;
1869
2666
  }[];
1870
2667
  instanceTarget?: {
1871
2668
  kind: "global";
@@ -1902,9 +2699,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1902
2699
  title: string;
1903
2700
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1904
2701
  params?: Record<string, string> | undefined;
2702
+ icon?: string | undefined;
1905
2703
  pageId?: string | undefined;
1906
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2704
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1907
2705
  width?: "full" | "half" | undefined;
2706
+ openMode?: "popover" | "modal" | undefined;
2707
+ uiSize?: "sm" | "md" | "lg" | undefined;
1908
2708
  }[] | undefined;
1909
2709
  ui?: {
1910
2710
  dir: string;
@@ -1919,9 +2719,14 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1919
2719
  } | undefined;
1920
2720
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
1921
2721
  settings?: Record<string, {
1922
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2722
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
1923
2723
  label: string;
1924
2724
  scope: "operator" | "global";
2725
+ keys?: {
2726
+ label: string;
2727
+ key: string;
2728
+ description?: string | undefined;
2729
+ }[] | undefined;
1925
2730
  options?: {
1926
2731
  value: string;
1927
2732
  label: string;
@@ -1938,6 +2743,19 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1938
2743
  placeholder?: string | undefined;
1939
2744
  required?: boolean | undefined;
1940
2745
  }[] | undefined;
2746
+ visibleWhen?: {
2747
+ setting: string;
2748
+ equals?: unknown;
2749
+ notEquals?: unknown;
2750
+ } | undefined;
2751
+ descriptionWhen?: {
2752
+ description: string;
2753
+ when: {
2754
+ setting: string;
2755
+ equals?: unknown;
2756
+ notEquals?: unknown;
2757
+ };
2758
+ }[] | undefined;
1941
2759
  hidden?: boolean | undefined;
1942
2760
  }> | undefined;
1943
2761
  quickActions?: {
@@ -1972,9 +2790,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
1972
2790
  title: string;
1973
2791
  component: "table" | "key-value" | "chart" | "log" | "iframe";
1974
2792
  params?: Record<string, string> | undefined;
2793
+ icon?: string | undefined;
1975
2794
  pageId?: string | undefined;
1976
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2795
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
1977
2796
  width?: "full" | "half" | undefined;
2797
+ openMode?: "popover" | "modal" | undefined;
2798
+ uiSize?: "sm" | "md" | "lg" | undefined;
1978
2799
  }[];
1979
2800
  instanceTarget?: {
1980
2801
  kind: "global";
@@ -2008,9 +2829,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
2008
2829
  title: string;
2009
2830
  component: "table" | "key-value" | "chart" | "log" | "iframe";
2010
2831
  params?: Record<string, string> | undefined;
2832
+ icon?: string | undefined;
2011
2833
  pageId?: string | undefined;
2012
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2834
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2013
2835
  width?: "full" | "half" | undefined;
2836
+ openMode?: "popover" | "modal" | undefined;
2837
+ uiSize?: "sm" | "md" | "lg" | undefined;
2014
2838
  }[] | undefined;
2015
2839
  ui?: {
2016
2840
  dir?: string | undefined;
@@ -2026,8 +2850,13 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
2026
2850
  instanceScope?: "operator" | "global" | undefined;
2027
2851
  permissions?: ("network" | "radio:read" | "radio:control" | "radio:power" | "settings:ft8" | "settings:decode-windows" | "settings:realtime" | "settings:frequency-presets" | "settings:station" | "settings:psk-reporter" | "settings:ntp")[] | undefined;
2028
2852
  settings?: Record<string, {
2029
- type: "string" | "number" | "boolean" | "string[]" | "object[]" | "info";
2853
+ type: "string" | "number" | "boolean" | "string[]" | "object[]" | "keyedStringArrays" | "info";
2030
2854
  label: string;
2855
+ keys?: {
2856
+ label: string;
2857
+ key: string;
2858
+ description?: string | undefined;
2859
+ }[] | undefined;
2031
2860
  options?: {
2032
2861
  value: string;
2033
2862
  label: string;
@@ -2044,6 +2873,19 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
2044
2873
  placeholder?: string | undefined;
2045
2874
  required?: boolean | undefined;
2046
2875
  }[] | undefined;
2876
+ visibleWhen?: {
2877
+ setting: string;
2878
+ equals?: unknown;
2879
+ notEquals?: unknown;
2880
+ } | undefined;
2881
+ descriptionWhen?: {
2882
+ description: string;
2883
+ when: {
2884
+ setting: string;
2885
+ equals?: unknown;
2886
+ notEquals?: unknown;
2887
+ };
2888
+ }[] | undefined;
2047
2889
  hidden?: boolean | undefined;
2048
2890
  scope?: "operator" | "global" | undefined;
2049
2891
  }> | undefined;
@@ -2082,9 +2924,12 @@ export declare const PluginSystemSnapshotSchema: z.ZodObject<{
2082
2924
  title: string;
2083
2925
  component: "table" | "key-value" | "chart" | "log" | "iframe";
2084
2926
  params?: Record<string, string> | undefined;
2927
+ icon?: string | undefined;
2085
2928
  pageId?: string | undefined;
2086
- slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | undefined;
2929
+ slot?: "operator" | "automation" | "main-right" | "voice-left-top" | "voice-right-top" | "cw-right-top" | "radio-control-toolbar" | undefined;
2087
2930
  width?: "full" | "half" | undefined;
2931
+ openMode?: "popover" | "modal" | undefined;
2932
+ uiSize?: "sm" | "md" | "lg" | undefined;
2088
2933
  }[];
2089
2934
  instanceTarget?: {
2090
2935
  kind: "global";