@tx5dr/plugin-api 1.7.12 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +274 -17
- package/dist/__tests__/adif.test.js +40 -0
- package/dist/__tests__/adif.test.js.map +1 -1
- package/dist/__tests__/capability-context.test.d.ts +2 -0
- package/dist/__tests__/capability-context.test.d.ts.map +1 -0
- package/dist/__tests__/capability-context.test.js +99 -0
- package/dist/__tests__/capability-context.test.js.map +1 -0
- package/dist/__tests__/testing-utils.test.js +217 -15
- package/dist/__tests__/testing-utils.test.js.map +1 -1
- package/dist/capabilities.d.ts +37 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +48 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/context.d.ts +95 -56
- package/dist/context.d.ts.map +1 -1
- package/dist/definition.d.ts +73 -20
- package/dist/definition.d.ts.map +1 -1
- package/dist/definition.js +8 -1
- package/dist/definition.js.map +1 -1
- package/dist/helpers.d.ts +322 -129
- package/dist/helpers.d.ts.map +1 -1
- package/dist/hooks.d.ts +54 -34
- package/dist/hooks.d.ts.map +1 -1
- package/dist/host-dependencies.d.ts +101 -0
- package/dist/host-dependencies.d.ts.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +164 -9
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +9 -1
- package/dist/runtime.js.map +1 -1
- package/dist/settings.d.ts +31 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/sync.d.ts +98 -6
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +6 -0
- package/dist/sync.js.map +1 -1
- package/dist/testing/index.d.ts +70 -12
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +307 -105
- package/dist/testing/index.js.map +1 -1
- package/dist/utils/adif.d.ts.map +1 -1
- package/dist/utils/adif.js +6 -2
- package/dist/utils/adif.js.map +1 -1
- package/dist/utils/qso-text-fields.d.ts +7 -1
- package/dist/utils/qso-text-fields.d.ts.map +1 -1
- package/dist/utils/qso-text-fields.js +74 -6
- package/dist/utils/qso-text-fields.js.map +1 -1
- package/package.json +4 -4
package/dist/runtime.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ParsedFT8Message, FrameMessage, SlotInfo } from '@tx5dr/contracts';
|
|
2
|
-
import type { StrategyDecision
|
|
1
|
+
import type { ParsedFT8Message, FrameMessage, SlotInfo, QSORecord } from '@tx5dr/contracts';
|
|
2
|
+
import type { StrategyDecision } from './hooks.js';
|
|
3
3
|
/**
|
|
4
4
|
* Logical FT8 transmit slot identifiers used by the built-in automation model.
|
|
5
5
|
*
|
|
@@ -41,7 +41,102 @@ export interface StrategyRuntimeSnapshot {
|
|
|
41
41
|
context?: StrategyRuntimeContext;
|
|
42
42
|
/** Optional list of user-visible next states, modes or branch hints. */
|
|
43
43
|
availableSlots?: string[];
|
|
44
|
+
/** Host correlation token for QSO persistence; it is not an RF decision epoch. */
|
|
45
|
+
qsoLifecycleEpoch?: number;
|
|
46
|
+
/** Optional compact projection exposed by queue-capable strategies. */
|
|
47
|
+
queue?: AssistedQueueSnapshot;
|
|
44
48
|
}
|
|
49
|
+
/** User-facing phase shown for one row in a queue-capable strategy. */
|
|
50
|
+
export type AssistedQueueDisplayState = 'TX1' | 'TX2' | 'TX3' | 'TX4' | 'TX5' | 'engaged' | 'closing' | 'paused' | 'no-response' | 'later' | 'review';
|
|
51
|
+
/** Why a queued target is temporarily paused instead of being selected. */
|
|
52
|
+
export type AssistedQueuePauseReason = 'target-busy' | 'stale';
|
|
53
|
+
/** Semantic color treatment requested for an assisted queue row. */
|
|
54
|
+
export type AssistedQueueTone = 'neutral' | 'active' | 'success' | 'warning' | 'danger';
|
|
55
|
+
/** Host icon identifier requested for an assisted queue row. */
|
|
56
|
+
export type AssistedQueueIcon = 'circle' | 'radio' | 'check-circle' | 'loader-circle' | 'clock' | 'pause' | 'triangle-alert';
|
|
57
|
+
/** Stable, serializable UI projection of one queued target. */
|
|
58
|
+
export interface AssistedQueueRow {
|
|
59
|
+
/** Queue-entry identity used by reorder/remove/retry commands. */
|
|
60
|
+
entryId: string;
|
|
61
|
+
/** Target station callsign. */
|
|
62
|
+
callsign: string;
|
|
63
|
+
/** Zero-based display order in the current snapshot. */
|
|
64
|
+
order: number;
|
|
65
|
+
/** Whether the UI may offer drag-to-reorder for this row. */
|
|
66
|
+
draggable: boolean;
|
|
67
|
+
/** Current protocol or queue phase shown to the operator. */
|
|
68
|
+
displayState: AssistedQueueDisplayState;
|
|
69
|
+
/** Semantic visual treatment for the row. */
|
|
70
|
+
tone: AssistedQueueTone;
|
|
71
|
+
/** Icon chosen by the strategy for the current state. */
|
|
72
|
+
icon: AssistedQueueIcon;
|
|
73
|
+
/** Why this row is paused, when `displayState` is `paused`. */
|
|
74
|
+
pauseReason?: AssistedQueuePauseReason;
|
|
75
|
+
/** Consecutive no-response cycles observed for this target. */
|
|
76
|
+
noResponseCycles?: number;
|
|
77
|
+
/** Last known Maidenhead grid locator for the target. */
|
|
78
|
+
targetGrid?: string;
|
|
79
|
+
/** Most recently decoded signal report in dB. */
|
|
80
|
+
lastSnr?: number;
|
|
81
|
+
/** Receive cycles elapsed since this target was last decoded. */
|
|
82
|
+
lastHeardCyclesAgo?: number;
|
|
83
|
+
}
|
|
84
|
+
/** Versioned queue projection embedded in `StrategyRuntimeSnapshot.queue`. */
|
|
85
|
+
export interface AssistedQueueSnapshot {
|
|
86
|
+
/** Monotonically increasing revision used for optimistic mutations. */
|
|
87
|
+
version: number;
|
|
88
|
+
/** Entry currently owned by the active QSO lifecycle, when any. */
|
|
89
|
+
activeEntryId?: string;
|
|
90
|
+
/** Queue rows in display order. */
|
|
91
|
+
rows: AssistedQueueRow[];
|
|
92
|
+
}
|
|
93
|
+
/** Metadata supplied when a queue-capable strategy observes decoded messages. */
|
|
94
|
+
export interface QueuedStrategyObservationMeta {
|
|
95
|
+
/** Slot that produced the decoded messages. */
|
|
96
|
+
slotInfo: SlotInfo;
|
|
97
|
+
/** Why the Host is asking the strategy to observe this batch. */
|
|
98
|
+
source: StrategyDecisionSource;
|
|
99
|
+
/** Aborts when this observation is superseded or the instance stops. */
|
|
100
|
+
signal: AbortSignal;
|
|
101
|
+
}
|
|
102
|
+
/** Target and optional triggering frame submitted to an assisted queue. */
|
|
103
|
+
export interface QueuedStrategyTargetRequest {
|
|
104
|
+
/** Callsign to normalize and enqueue. */
|
|
105
|
+
callsign: string;
|
|
106
|
+
/** Authentic decoder frame/slot pair that triggered the request, when known. */
|
|
107
|
+
lastMessage?: {
|
|
108
|
+
message: FrameMessage;
|
|
109
|
+
slotInfo: SlotInfo;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Result of an assisted queue mutation, including the authoritative snapshot. */
|
|
113
|
+
export interface QueuedStrategyMutationResult {
|
|
114
|
+
/** Whether the mutation changed the queue, was already satisfied, or was rejected. */
|
|
115
|
+
outcome: 'accepted' | 'duplicate' | 'rejected';
|
|
116
|
+
/** Machine-readable rejection reason. */
|
|
117
|
+
reason?: 'queue_full' | 'invalid_target' | 'entry_not_found' | 'entry_not_retryable' | 'active_entry' | 'version_conflict';
|
|
118
|
+
/** Authoritative queue state after the attempted mutation. */
|
|
119
|
+
snapshot: AssistedQueueSnapshot;
|
|
120
|
+
}
|
|
121
|
+
/** Optional capability implemented by strategies that own a target queue. */
|
|
122
|
+
export interface QueuedStrategyRuntime extends StrategyRuntime {
|
|
123
|
+
/** Incorporates a decoded batch and returns whether the queue projection changed. */
|
|
124
|
+
observeDecodedMessages(messages: ParsedFT8Message[], meta: QueuedStrategyObservationMeta): boolean;
|
|
125
|
+
/** Adds a target unless it is invalid, duplicated or the queue is full. */
|
|
126
|
+
enqueueTarget(request: QueuedStrategyTargetRequest): QueuedStrategyMutationResult;
|
|
127
|
+
/** Moves an entry before another entry, or to the end when `beforeEntryId` is null. */
|
|
128
|
+
reorderTarget(entryId: string, beforeEntryId: string | null, expectedVersion: number): QueuedStrategyMutationResult;
|
|
129
|
+
/** Removes a non-active entry using optimistic version validation. */
|
|
130
|
+
removeTarget(entryId: string, expectedVersion: number): QueuedStrategyMutationResult;
|
|
131
|
+
/** Makes a retryable failed/no-response entry eligible again. */
|
|
132
|
+
retryTarget?(entryId: string, expectedVersion: number): QueuedStrategyMutationResult;
|
|
133
|
+
/** Removes every non-active entry using optimistic version validation. */
|
|
134
|
+
clearTargets?(expectedVersion: number): QueuedStrategyMutationResult;
|
|
135
|
+
/** Returns the current detached queue snapshot. */
|
|
136
|
+
getQueueSnapshot(): AssistedQueueSnapshot;
|
|
137
|
+
}
|
|
138
|
+
/** Runtime type guard for the optional assisted-target queue capability. */
|
|
139
|
+
export declare function isQueuedStrategyRuntime(runtime: StrategyRuntime): runtime is QueuedStrategyRuntime;
|
|
45
140
|
/**
|
|
46
141
|
* Describes a slot text mutation emitted by the strategy runtime.
|
|
47
142
|
*/
|
|
@@ -51,6 +146,53 @@ export interface StrategyRuntimeSlotContentUpdate {
|
|
|
51
146
|
/** Human-readable content for the slot, usually an FT8 message template. */
|
|
52
147
|
content: string;
|
|
53
148
|
}
|
|
149
|
+
/** Trigger that caused the Host to request a strategy decision. */
|
|
150
|
+
export type StrategyDecisionSource = 'slot-auto' | 'late-decode';
|
|
151
|
+
/** Invocation metadata for a speculative API v2 strategy decision. */
|
|
152
|
+
export interface StrategyDecisionMetaV2 {
|
|
153
|
+
/** Monotonic Host decision epoch; newer epochs supersede older decisions. */
|
|
154
|
+
epoch: number;
|
|
155
|
+
/** Slot progression or late-decode event that triggered the decision. */
|
|
156
|
+
source: StrategyDecisionSource;
|
|
157
|
+
/** `true` when new information caused the current slot to be evaluated again. */
|
|
158
|
+
isReDecision: boolean;
|
|
159
|
+
/** Aborts when this decision is superseded, times out or the instance stops. */
|
|
160
|
+
signal: AbortSignal;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Strategy-owned state captured before a speculative decision.
|
|
164
|
+
*
|
|
165
|
+
* The value must be structured-clone compatible and must not contain Host
|
|
166
|
+
* capabilities, functions, promises or external resource handles.
|
|
167
|
+
*/
|
|
168
|
+
export type StrategyRuntimeCheckpoint = unknown;
|
|
169
|
+
/** Declarative request for the Host to durably commit one completed QSO. */
|
|
170
|
+
export interface StrategyQSOCompletionEffect {
|
|
171
|
+
/** Complete QSO record to validate and persist. */
|
|
172
|
+
record: QSORecord;
|
|
173
|
+
/** Stable within one strategy runtime generation; distinct from RF decision epochs. */
|
|
174
|
+
lifecycleEpoch: number;
|
|
175
|
+
}
|
|
176
|
+
/** Host acknowledgement for a previously returned QSO completion effect. */
|
|
177
|
+
export interface StrategyQSOCompletionSettlement {
|
|
178
|
+
/** Lifecycle epoch copied from the effect being settled. */
|
|
179
|
+
lifecycleEpoch: number;
|
|
180
|
+
/** Record ID from the accepted completion effect after Host persistence settles. */
|
|
181
|
+
recordId: string;
|
|
182
|
+
/** Whether the Host committed the record or the durable operation failed. */
|
|
183
|
+
status: 'committed' | 'failed';
|
|
184
|
+
}
|
|
185
|
+
/** Complete output of one speculative strategy decision. */
|
|
186
|
+
export interface StrategyDecisionResult extends StrategyDecision {
|
|
187
|
+
/** Exact text to queue next, or `null` when this decision should not transmit. */
|
|
188
|
+
transmission: string | null;
|
|
189
|
+
/** UI/diagnostic snapshot produced from the same post-decision state. */
|
|
190
|
+
snapshot: StrategyRuntimeSnapshot;
|
|
191
|
+
/** Optional QSO persistence effect executed by the Host after acceptance. */
|
|
192
|
+
qsoCompletion?: StrategyQSOCompletionEffect;
|
|
193
|
+
/** Optional cycle selected from the triggering RX frame; applied by the host after target reservation. */
|
|
194
|
+
requestedTransmitCycle?: number;
|
|
195
|
+
}
|
|
54
196
|
/**
|
|
55
197
|
* Active controller for a `strategy` plugin.
|
|
56
198
|
*
|
|
@@ -59,16 +201,27 @@ export interface StrategyRuntimeSlotContentUpdate {
|
|
|
59
201
|
* respect to the incoming slot/decode stream.
|
|
60
202
|
*/
|
|
61
203
|
export interface StrategyRuntime {
|
|
204
|
+
/** Captures all mutable state needed to roll back the next decision. */
|
|
205
|
+
checkpoint(): StrategyRuntimeCheckpoint;
|
|
206
|
+
/** Restores a previously captured checkpoint after a decision is discarded. */
|
|
207
|
+
restore(checkpoint: StrategyRuntimeCheckpoint): void;
|
|
208
|
+
/**
|
|
209
|
+
* Optional acknowledgement for a declarative QSO effect. Implementations may
|
|
210
|
+
* use it to prevent a completed contact from leaking into the next lifecycle.
|
|
211
|
+
* The Host invokes it only for an accepted effect from the same runtime
|
|
212
|
+
* generation and reports whether durable persistence committed or failed.
|
|
213
|
+
*/
|
|
214
|
+
settleQSOCompletion?(settlement: StrategyQSOCompletionSettlement): void;
|
|
62
215
|
/**
|
|
63
216
|
* Re-evaluates the current automation state using the latest decoded messages.
|
|
64
217
|
*
|
|
65
|
-
* Return `{ stop: true }` to
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
218
|
+
* Return `{ stop: true }` to stop this operator's automation and prevent new
|
|
219
|
+
* frames. It never grants an RF interrupt: an already committed/on-air frame
|
|
220
|
+
* is allowed to finish. Explicit operator contribution removal is available
|
|
221
|
+
* only through the invocation-guarded `operator:transmit-control` command
|
|
222
|
+
* port outside speculative strategy execution.
|
|
70
223
|
*/
|
|
71
|
-
decide(messages: ParsedFT8Message[], meta
|
|
224
|
+
decide(messages: ParsedFT8Message[], meta: StrategyDecisionMetaV2): Promise<StrategyDecisionResult> | StrategyDecisionResult;
|
|
72
225
|
/**
|
|
73
226
|
* Returns the exact text that should be transmitted next, or `null` when no
|
|
74
227
|
* transmission should be queued.
|
|
@@ -79,11 +232,13 @@ export interface StrategyRuntime {
|
|
|
79
232
|
*
|
|
80
233
|
* The optional `lastMessage` provides the frame that triggered the call, which
|
|
81
234
|
* is useful when reacting to a specific CQ or completion signal.
|
|
235
|
+
* Return exactly `false` to reject the target; `true` or `void` means the
|
|
236
|
+
* runtime accepted it and the Host may start the operator.
|
|
82
237
|
*/
|
|
83
238
|
requestCall(callsign: string, lastMessage?: {
|
|
84
239
|
message: FrameMessage;
|
|
85
240
|
slotInfo: SlotInfo;
|
|
86
|
-
}): void;
|
|
241
|
+
}): boolean | void;
|
|
87
242
|
/**
|
|
88
243
|
* Produces a serializable runtime snapshot for diagnostics and UI.
|
|
89
244
|
*/
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/** Runtime type guard for the optional assisted-target queue capability. */
|
|
2
|
+
export function isQueuedStrategyRuntime(runtime) {
|
|
3
|
+
const candidate = runtime;
|
|
4
|
+
return typeof candidate.observeDecodedMessages === 'function'
|
|
5
|
+
&& typeof candidate.enqueueTarget === 'function'
|
|
6
|
+
&& typeof candidate.reorderTarget === 'function'
|
|
7
|
+
&& typeof candidate.removeTarget === 'function'
|
|
8
|
+
&& typeof candidate.getQueueSnapshot === 'function';
|
|
9
|
+
}
|
|
2
10
|
//# sourceMappingURL=runtime.js.map
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAuJA,4EAA4E;AAC5E,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,SAAS,GAAG,OAAyC,CAAC;IAC5D,OAAO,OAAO,SAAS,CAAC,sBAAsB,KAAK,UAAU;WACxD,OAAO,SAAS,CAAC,aAAa,KAAK,UAAU;WAC7C,OAAO,SAAS,CAAC,aAAa,KAAK,UAAU;WAC7C,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU;WAC5C,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,CAAC;AACxD,CAAC"}
|
package/dist/settings.d.ts
CHANGED
|
@@ -4,33 +4,57 @@ import type { DecodeWindowSettings, NtpServerListSettings, PresetFrequency, PSKR
|
|
|
4
4
|
* the `settings:ft8` permission.
|
|
5
5
|
*/
|
|
6
6
|
export interface HostFT8Settings {
|
|
7
|
+
/** Station callsign used by the digital-mode engine. */
|
|
7
8
|
myCallsign: string;
|
|
9
|
+
/** Station Maidenhead grid locator. */
|
|
8
10
|
myGrid: string;
|
|
11
|
+
/** Current digital-mode dial frequency in hertz. */
|
|
9
12
|
frequency: number;
|
|
13
|
+
/** Configured transmit power in watts. */
|
|
10
14
|
transmitPower: number;
|
|
15
|
+
/** Whether the Host automatically answers eligible decoded calls. */
|
|
11
16
|
autoReply: boolean;
|
|
17
|
+
/** No-progress receive/transmit cycles before the active QSO times out. */
|
|
12
18
|
maxQSOTimeout: number;
|
|
13
19
|
/** Set to 0 to disable the host repeated-transmission guard. */
|
|
14
20
|
maxSameTransmissionCount: number;
|
|
21
|
+
/** Whether decoding continues while any operator is transmitting. */
|
|
15
22
|
decodeWhileTransmitting: boolean;
|
|
23
|
+
/** Whether spectrum analysis continues while transmitting. */
|
|
16
24
|
spectrumWhileTransmitting: boolean;
|
|
17
25
|
}
|
|
26
|
+
/** Partial update accepted by `ctx.settings.ft8.update()`. */
|
|
18
27
|
export type HostFT8SettingsPatch = Partial<HostFT8Settings>;
|
|
28
|
+
/** Current frequency preset list and whether it differs from Host defaults. */
|
|
19
29
|
export interface HostFrequencyPresetsSettings {
|
|
30
|
+
/** Presets currently exposed by the Host. */
|
|
20
31
|
presets: PresetFrequency[];
|
|
32
|
+
/** `true` when the current list is user- or plugin-customized. */
|
|
21
33
|
isCustomized: boolean;
|
|
22
34
|
}
|
|
35
|
+
/** Partial station metadata update accepted by the station namespace. */
|
|
23
36
|
export type HostStationInfoPatch = Partial<StationInfo>;
|
|
37
|
+
/** Partial PSK Reporter update accepted by the PSK Reporter namespace. */
|
|
24
38
|
export type HostPSKReporterSettingsPatch = Partial<PSKReporterConfig>;
|
|
39
|
+
/**
|
|
40
|
+
* Read/update pair shared by patch- or replacement-based settings namespaces.
|
|
41
|
+
* The concrete namespace type determines whether `update` is a partial patch or
|
|
42
|
+
* complete replacement. Host schema validation, normalization or persistence
|
|
43
|
+
* failures reject the returned Promise.
|
|
44
|
+
*/
|
|
25
45
|
export interface HostSettingsNamespace<TValue, TPatch> {
|
|
26
46
|
/** Returns the current host setting value for this namespace. */
|
|
27
47
|
get(): Promise<TValue>;
|
|
28
48
|
/** Applies a patch or replacement value and returns the updated value. */
|
|
29
49
|
update(patch: TPatch): Promise<TValue>;
|
|
30
50
|
}
|
|
51
|
+
/** Frequency preset namespace with explicit update and reset operations. */
|
|
31
52
|
export interface HostFrequencyPresetsSettingsNamespace {
|
|
53
|
+
/** Returns the current preset list and customization flag. */
|
|
32
54
|
get(): Promise<HostFrequencyPresetsSettings>;
|
|
55
|
+
/** Replaces all presets and returns the normalized Host value. */
|
|
33
56
|
update(presets: PresetFrequency[]): Promise<HostFrequencyPresetsSettings>;
|
|
57
|
+
/** Restores Host defaults and returns the resulting value. */
|
|
34
58
|
reset(): Promise<HostFrequencyPresetsSettings>;
|
|
35
59
|
}
|
|
36
60
|
/**
|
|
@@ -40,12 +64,19 @@ export interface HostFrequencyPresetsSettingsNamespace {
|
|
|
40
64
|
* `settings:ft8` for `ctx.settings.ft8`.
|
|
41
65
|
*/
|
|
42
66
|
export interface HostSettingsControl {
|
|
67
|
+
/** FT8/FT4 engine settings. Requires `settings:ft8`. */
|
|
43
68
|
readonly ft8: HostSettingsNamespace<HostFT8Settings, HostFT8SettingsPatch>;
|
|
69
|
+
/** Decode window configuration. Requires `settings:decode-windows`. */
|
|
44
70
|
readonly decodeWindows: HostSettingsNamespace<DecodeWindowSettings, DecodeWindowSettings>;
|
|
71
|
+
/** Realtime audio transport configuration. Requires `settings:realtime`. */
|
|
45
72
|
readonly realtime: HostSettingsNamespace<RealtimeSettings, RealtimeSettings>;
|
|
73
|
+
/** Frequency preset list. Requires `settings:frequency-presets`. */
|
|
46
74
|
readonly frequencyPresets: HostFrequencyPresetsSettingsNamespace;
|
|
75
|
+
/** Public station metadata. Requires `settings:station`. */
|
|
47
76
|
readonly station: HostSettingsNamespace<StationInfo, HostStationInfoPatch>;
|
|
77
|
+
/** PSK Reporter configuration. Requires `settings:psk-reporter`. */
|
|
48
78
|
readonly pskReporter: HostSettingsNamespace<PSKReporterConfig, HostPSKReporterSettingsPatch>;
|
|
79
|
+
/** NTP server list. Requires `settings:ntp`. */
|
|
49
80
|
readonly ntp: HostSettingsNamespace<NtpServerListSettings, UpdateNtpServerListRequest>;
|
|
50
81
|
}
|
|
51
82
|
//# sourceMappingURL=settings.d.ts.map
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC3B,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,wBAAwB,EAAE,MAAM,CAAC;IACjC,uBAAuB,EAAE,OAAO,CAAC;IACjC,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAE5D,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEtE,MAAM,WAAW,qBAAqB,CAAC,MAAM,EAAE,MAAM;IACnD,iEAAiE;IACjE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACvB,0EAA0E;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qCAAqC;IACpD,GAAG,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC1E,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IAC3E,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAC1F,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC7E,QAAQ,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;IACjE,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC3E,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC,iBAAiB,EAAE,4BAA4B,CAAC,CAAC;IAC7F,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;CACxF"}
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,0BAA0B,EAC3B,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,wBAAwB,EAAE,MAAM,CAAC;IACjC,qEAAqE;IACrE,uBAAuB,EAAE,OAAO,CAAC;IACjC,8DAA8D;IAC9D,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,8DAA8D;AAC9D,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAE5D,+EAA+E;AAC/E,MAAM,WAAW,4BAA4B;IAC3C,6CAA6C;IAC7C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,kEAAkE;IAClE,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,yEAAyE;AACzE,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACxD,0EAA0E;AAC1E,MAAM,MAAM,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB,CAAC,MAAM,EAAE,MAAM;IACnD,iEAAiE;IACjE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACvB,0EAA0E;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,4EAA4E;AAC5E,MAAM,WAAW,qCAAqC;IACpD,8DAA8D;IAC9D,GAAG,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC7C,kEAAkE;IAClE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC1E,8DAA8D;IAC9D,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;IAC3E,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAC1F,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC7E,oEAAoE;IACpE,QAAQ,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;IACjE,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;IAC3E,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC,iBAAiB,EAAE,4BAA4B,CAAC,CAAC;IAC7F,gDAAgD;IAChD,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC;CACxF"}
|
package/dist/sync.d.ts
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* A utility plugin registers a sync provider via `ctx.logbookSync.register()`
|
|
5
5
|
* during `onLoad`. The host manages per-callsign lifecycle, auto-upload on QSO
|
|
6
6
|
* completion, and renders the provider's settings page in the sync modal.
|
|
7
|
+
* Registration requires a global API v2 utility with `logbook:sync`; the
|
|
8
|
+
* referenced settings page must use `resourceBinding: 'callsign'`.
|
|
7
9
|
*/
|
|
8
10
|
/**
|
|
9
11
|
* A logbook sync provider implements the communication logic with a single
|
|
@@ -14,10 +16,15 @@
|
|
|
14
16
|
* its own per-callsign state (typically via `ctx.store.global` keyed by
|
|
15
17
|
* callsign).
|
|
16
18
|
*
|
|
17
|
-
*
|
|
18
|
-
* responsible for querying, writing and deduplicating QSO
|
|
19
|
-
* The host
|
|
20
|
-
*
|
|
19
|
+
* A typical provider declares `network`, `logbook:read`, `logbook:write` and
|
|
20
|
+
* `logbook:sync`. It is responsible for querying, writing and deduplicating QSO
|
|
21
|
+
* records internally. The host routes actions and passes narrow auto-upload
|
|
22
|
+
* batches; it does not invent provider-specific synchronization behavior.
|
|
23
|
+
*
|
|
24
|
+
* Every method runs inside a fresh Host invocation. Results that complete after
|
|
25
|
+
* unload/reload are discarded. Return structured `failures` for expected
|
|
26
|
+
* operational problems; reserve thrown errors for unexpected failures. Provider
|
|
27
|
+
* results, details and progress payloads must remain JSON-compatible.
|
|
21
28
|
*/
|
|
22
29
|
export interface LogbookSyncProvider {
|
|
23
30
|
/** Stable service identifier (e.g. 'lotw', 'qrz', 'wavelog'). */
|
|
@@ -28,7 +35,7 @@ export interface LogbookSyncProvider {
|
|
|
28
35
|
readonly icon?: string;
|
|
29
36
|
/** Optional button color hint for the frontend (HeroUI color name). */
|
|
30
37
|
readonly color?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
|
|
31
|
-
/** Which audience may access this provider
|
|
38
|
+
/** Which audience may access Host routes for this provider. Defaults to `admin`. */
|
|
32
39
|
readonly accessScope?: 'admin' | 'operator';
|
|
33
40
|
/**
|
|
34
41
|
* ID of the settings page declared in `PluginDefinition.ui.pages`.
|
|
@@ -44,7 +51,7 @@ export interface LogbookSyncProvider {
|
|
|
44
51
|
* an iframe page for user input before proceeding (`pageId`).
|
|
45
52
|
*/
|
|
46
53
|
readonly actions?: SyncAction[];
|
|
47
|
-
/** Tests
|
|
54
|
+
/** Tests credentials/connectivity and returns a user-displayable result. */
|
|
48
55
|
testConnection(callsign: string): Promise<SyncTestResult>;
|
|
49
56
|
/**
|
|
50
57
|
* Uploads QSO records to the external service.
|
|
@@ -108,65 +115,113 @@ export interface SyncAction {
|
|
|
108
115
|
*/
|
|
109
116
|
operation?: 'upload' | 'download' | 'full_sync';
|
|
110
117
|
}
|
|
118
|
+
/** Layer that produced a synchronization failure. */
|
|
111
119
|
export type SyncFailureSource = 'provider' | 'host' | 'remote' | 'network' | 'logbook';
|
|
120
|
+
/** User-visible synchronization operation associated with a failure. */
|
|
112
121
|
export type SyncFailureOperation = 'upload' | 'download' | 'full_sync' | 'preflight' | 'test_connection';
|
|
122
|
+
/**
|
|
123
|
+
* Structured failure intended for logs and plugin UI.
|
|
124
|
+
*
|
|
125
|
+
* Construct failures with `createSyncFailure()` or `errorToSyncFailure()` so
|
|
126
|
+
* common credentials are redacted. Direct object construction performs no
|
|
127
|
+
* automatic sanitization.
|
|
128
|
+
*/
|
|
113
129
|
export interface SyncFailure {
|
|
130
|
+
/** Stable machine-readable code owned by the provider or Host. */
|
|
114
131
|
code: string;
|
|
132
|
+
/** Short display message; callers constructing directly must sanitize secrets. */
|
|
115
133
|
message: string;
|
|
134
|
+
/** Layer that produced the failure. */
|
|
116
135
|
source?: SyncFailureSource;
|
|
136
|
+
/** Sync operation that was in progress. */
|
|
117
137
|
operation?: SyncFailureOperation;
|
|
138
|
+
/** Provider ID when the failure crosses a shared Host surface. */
|
|
118
139
|
providerId?: string;
|
|
140
|
+
/** Local QSO record ID for a per-record failure. */
|
|
119
141
|
qsoId?: string;
|
|
142
|
+
/** Remote station callsign for a per-record failure. */
|
|
120
143
|
qsoCallsign?: string;
|
|
144
|
+
/** HTTP response status when a remote request reached the server. */
|
|
121
145
|
httpStatus?: number;
|
|
146
|
+
/** Whether retrying later without changing input may succeed. */
|
|
122
147
|
retryable?: boolean;
|
|
148
|
+
/** Optional diagnostic detail; callers constructing directly must sanitize it. */
|
|
123
149
|
detail?: string;
|
|
124
150
|
}
|
|
151
|
+
/** Input accepted by `createSyncFailure`, including values that must be redacted. */
|
|
125
152
|
export type SyncFailureInput = Omit<SyncFailure, 'message' | 'detail'> & {
|
|
126
153
|
message?: string;
|
|
127
154
|
detail?: string;
|
|
128
155
|
secrets?: Array<string | undefined | null>;
|
|
129
156
|
};
|
|
157
|
+
/** Best-effort redaction of explicit secrets and common credential-bearing URL/query patterns. */
|
|
130
158
|
export declare function sanitizeSyncFailureText(value: unknown, secrets?: Array<string | undefined | null>): string;
|
|
159
|
+
/** Builds a normalized failure after sanitizing its message and detail. */
|
|
131
160
|
export declare function createSyncFailure(input: SyncFailureInput): SyncFailure;
|
|
161
|
+
/** Converts an unknown thrown value into a normalized, sanitized failure. */
|
|
132
162
|
export declare function errorToSyncFailure(error: unknown, defaults: SyncFailureInput): SyncFailure;
|
|
163
|
+
/** Formats one failure for compact user-facing lists. */
|
|
133
164
|
export declare function failureMessage(failure: SyncFailure): string;
|
|
165
|
+
/** Result returned by `LogbookSyncProvider.testConnection()`. */
|
|
134
166
|
export interface SyncTestResult {
|
|
167
|
+
/** Whether credentials and the tested remote operation succeeded. */
|
|
135
168
|
success: boolean;
|
|
136
169
|
/** Human-readable result description. */
|
|
137
170
|
message?: string;
|
|
138
171
|
/** Additional service-specific details (e.g. account info, logbook count). */
|
|
139
172
|
details?: unknown;
|
|
173
|
+
/** Structured failures when the test did not fully succeed. */
|
|
140
174
|
failures?: SyncFailure[];
|
|
141
175
|
}
|
|
176
|
+
/** Aggregate result returned after an upload attempt. */
|
|
142
177
|
export interface SyncUploadResult {
|
|
143
178
|
/** Number of records submitted to the external service. */
|
|
144
179
|
submitted?: number;
|
|
145
180
|
/** @deprecated Upload providers should not verify by querying the external service; download sync owns confirmation. */
|
|
146
181
|
verified?: number;
|
|
182
|
+
/** Records accepted by the remote service and committed to local sync state. */
|
|
147
183
|
uploaded: number;
|
|
184
|
+
/** Records intentionally not submitted, for example because they were already sent. */
|
|
148
185
|
skipped: number;
|
|
186
|
+
/** Records that could not be uploaded. */
|
|
149
187
|
failed: number;
|
|
188
|
+
/** Structured per-record or operation failures. */
|
|
150
189
|
failures?: SyncFailure[];
|
|
151
190
|
}
|
|
191
|
+
/** Incremental upload status sent to an optional in-process progress callback. */
|
|
152
192
|
export interface SyncUploadProgress {
|
|
193
|
+
/** Current upload pipeline phase. */
|
|
153
194
|
stage: 'preparing' | 'prepared' | 'batch_uploading' | 'batch_accepted' | 'batch_failed' | 'updating_local' | 'finished';
|
|
195
|
+
/** Station callsign whose logbook is being synchronized. */
|
|
154
196
|
callsign?: string;
|
|
197
|
+
/** One-based current batch number. */
|
|
155
198
|
batchIndex?: number;
|
|
199
|
+
/** Total number of upload batches. */
|
|
156
200
|
batchCount?: number;
|
|
201
|
+
/** QSO records represented by the current progress event. */
|
|
157
202
|
qsoCount?: number;
|
|
203
|
+
/** Records discovered as pending upload. */
|
|
158
204
|
pendingCount?: number;
|
|
205
|
+
/** Pending records eligible for this upload. */
|
|
159
206
|
uploadableCount?: number;
|
|
207
|
+
/** Pending records blocked by preflight validation. */
|
|
160
208
|
blockedCount?: number;
|
|
209
|
+
/** Records submitted to the remote service so far. */
|
|
161
210
|
submitted?: number;
|
|
211
|
+
/** Records accepted and reflected in local sync state so far. */
|
|
162
212
|
uploaded?: number;
|
|
163
213
|
/** @deprecated Upload providers should not verify by querying the external service; download sync owns confirmation. */
|
|
164
214
|
verified?: number;
|
|
215
|
+
/** Records intentionally skipped so far. */
|
|
165
216
|
skipped?: number;
|
|
217
|
+
/** Records whose upload failed so far. */
|
|
166
218
|
failed?: number;
|
|
219
|
+
/** Structured failures accumulated so far. */
|
|
167
220
|
failureCount?: number;
|
|
221
|
+
/** Optional short status text for custom UIs. */
|
|
168
222
|
message?: string;
|
|
169
223
|
}
|
|
224
|
+
/** Optional range, source batch and progress callback for an upload. */
|
|
170
225
|
export interface SyncUploadOptions {
|
|
171
226
|
/** Distinguishes manual uploads from auto-upload triggered by QSO completion. */
|
|
172
227
|
trigger?: 'manual' | 'auto';
|
|
@@ -188,6 +243,7 @@ export interface SyncUploadOptions {
|
|
|
188
243
|
*/
|
|
189
244
|
records?: import('@tx5dr/contracts').QSORecord[];
|
|
190
245
|
}
|
|
246
|
+
/** Range and inclusion rules used by an upload readiness check. */
|
|
191
247
|
export interface SyncUploadPreflightOptions {
|
|
192
248
|
/** Check records starting at this timestamp (epoch ms), inclusive. */
|
|
193
249
|
since?: number;
|
|
@@ -196,23 +252,39 @@ export interface SyncUploadPreflightOptions {
|
|
|
196
252
|
/** Include records already marked as uploaded/sent locally. Defaults to false. */
|
|
197
253
|
includeAlreadyUploaded?: boolean;
|
|
198
254
|
}
|
|
255
|
+
/** One actionable issue discovered before upload starts. */
|
|
199
256
|
export interface SyncPreflightIssue {
|
|
257
|
+
/** Stable provider-owned issue code. */
|
|
200
258
|
code: string;
|
|
259
|
+
/** Whether the issue is informational, cautionary or blocking. */
|
|
201
260
|
severity: 'info' | 'warning' | 'error';
|
|
261
|
+
/** Short user-facing explanation. */
|
|
202
262
|
message: string;
|
|
263
|
+
/** Optional sanitized diagnostic or remediation detail. */
|
|
203
264
|
detail?: string;
|
|
265
|
+
/** Local QSO ID when the issue concerns one record. */
|
|
204
266
|
qsoId?: string;
|
|
267
|
+
/** Target callsign when the issue concerns one record. */
|
|
205
268
|
qsoCallsign?: string;
|
|
206
269
|
}
|
|
270
|
+
/** Aggregate readiness result shown before an upload or full sync. */
|
|
207
271
|
export interface SyncUploadPreflightResult {
|
|
272
|
+
/** Whether upload can start without skipping blocking records. */
|
|
208
273
|
ready: boolean;
|
|
274
|
+
/** Records currently awaiting upload. */
|
|
209
275
|
pendingCount: number;
|
|
276
|
+
/** Pending records that can be uploaded now. */
|
|
210
277
|
uploadableCount: number;
|
|
278
|
+
/** Pending records blocked by validation or missing data. */
|
|
211
279
|
blockedCount: number;
|
|
280
|
+
/** Structured issues for the operation or individual records. */
|
|
212
281
|
issues?: SyncPreflightIssue[];
|
|
282
|
+
/** Whether the provider supports continuing with only uploadable records. */
|
|
213
283
|
canSkipBlocked?: boolean;
|
|
284
|
+
/** Optional ordered remediation hints for the UI. */
|
|
214
285
|
guidance?: string[];
|
|
215
286
|
}
|
|
287
|
+
/** Aggregate result returned after downloading and reconciling remote data. */
|
|
216
288
|
export interface SyncDownloadResult {
|
|
217
289
|
/** Number of records downloaded from the external service. */
|
|
218
290
|
downloaded: number;
|
|
@@ -224,25 +296,43 @@ export interface SyncDownloadResult {
|
|
|
224
296
|
imported?: number;
|
|
225
297
|
/** Number of provider request windows used to download the range. */
|
|
226
298
|
windowCount?: number;
|
|
299
|
+
/** Structured request, parsing or per-record failures. */
|
|
227
300
|
failures?: SyncFailure[];
|
|
228
301
|
}
|
|
302
|
+
/** Incremental status sent while a provider downloads one or more windows. */
|
|
229
303
|
export interface SyncDownloadProgress {
|
|
304
|
+
/** Current download pipeline phase. */
|
|
230
305
|
stage: 'preparing' | 'window_waiting' | 'window_downloading' | 'window_retrying' | 'window_processing' | 'window_done' | 'window_failed' | 'finished';
|
|
306
|
+
/** Station callsign whose logbook is being synchronized. */
|
|
231
307
|
callsign?: string;
|
|
308
|
+
/** One-based current request-window number. */
|
|
232
309
|
windowIndex?: number;
|
|
310
|
+
/** Total request windows planned for the selected range. */
|
|
233
311
|
windowCount?: number;
|
|
312
|
+
/** Human-readable date/time range represented by the current window. */
|
|
234
313
|
range?: string;
|
|
314
|
+
/** Provider-mandated wait before the next request. */
|
|
235
315
|
waitSeconds?: number;
|
|
316
|
+
/** One-based retry attempt for the current window. */
|
|
236
317
|
attempt?: number;
|
|
318
|
+
/** Remote records returned by the current window. */
|
|
237
319
|
recordCount?: number;
|
|
320
|
+
/** Remote records downloaded so far. */
|
|
238
321
|
downloaded?: number;
|
|
322
|
+
/** Remote records matched to existing local QSOs so far. */
|
|
239
323
|
matched?: number;
|
|
324
|
+
/** Existing local QSOs updated so far. */
|
|
240
325
|
updated?: number;
|
|
326
|
+
/** New remote records imported so far. */
|
|
241
327
|
imported?: number;
|
|
328
|
+
/** Records/windows that failed so far. */
|
|
242
329
|
failed?: number;
|
|
330
|
+
/** Structured failures accumulated so far. */
|
|
243
331
|
failureCount?: number;
|
|
332
|
+
/** Optional short status text for custom UIs. */
|
|
244
333
|
message?: string;
|
|
245
334
|
}
|
|
335
|
+
/** Optional date range and progress callback for a download. */
|
|
246
336
|
export interface SyncDownloadOptions {
|
|
247
337
|
/** Download records since this timestamp (epoch ms). */
|
|
248
338
|
since?: number;
|
|
@@ -261,6 +351,8 @@ export interface LogbookSyncRegistrar {
|
|
|
261
351
|
*
|
|
262
352
|
* A single plugin may register multiple providers (e.g. one plugin
|
|
263
353
|
* supporting both upload and download for different services).
|
|
354
|
+
* The Host unregisters every provider owned by the plugin generation during
|
|
355
|
+
* disable, reload or unload.
|
|
264
356
|
*/
|
|
265
357
|
register(provider: LogbookSyncProvider): void;
|
|
266
358
|
}
|
package/dist/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAExF,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAE5C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IAEhC,4EAA4E;IAC5E,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE1D;;;;;;;;;;OAUG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEjF;;;;;OAKG;IACH,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAEhH;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEvF,8EAA8E;IAC9E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAExC,oEAAoE;IACpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAChD;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;CACjD;AAID,qDAAqD;AACrD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AACvF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEzG;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;CAC5C,CAAC;AASF,kGAAkG;AAClG,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAM,GAC7C,MAAM,CAaR;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAgBtE;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gBAAgB,GACzB,WAAW,CAab;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAI3D;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,KAAK,EACD,WAAW,GACX,UAAU,GACV,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,UAAU,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wHAAwH;IACxH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,kBAAkB,EAAE,SAAS,EAAE,CAAC;CAClD;AAED,mEAAmE;AACnE,MAAM,WAAW,0BAA0B;IACzC,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sEAAsE;AACtE,MAAM,WAAW,yBAAyB;IACxC,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC9B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,KAAK,EACD,WAAW,GACX,gBAAgB,GAChB,oBAAoB,GACpB,iBAAiB,GACjB,mBAAmB,GACnB,aAAa,GACb,eAAe,GACf,UAAU,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACvD;AAID;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC/C"}
|