prismcast 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/dist/app.js +9 -8
  2. package/dist/app.js.map +1 -1
  3. package/dist/browser/cdp.js +1 -1
  4. package/dist/browser/cdp.js.map +1 -1
  5. package/dist/browser/channelSelection.d.ts +10 -34
  6. package/dist/browser/channelSelection.js +19 -96
  7. package/dist/browser/channelSelection.js.map +1 -1
  8. package/dist/browser/display.d.ts +19 -0
  9. package/dist/browser/display.js +16 -11
  10. package/dist/browser/display.js.map +1 -1
  11. package/dist/browser/index.d.ts +9 -46
  12. package/dist/browser/index.js +136 -191
  13. package/dist/browser/index.js.map +1 -1
  14. package/dist/browser/login.d.ts +65 -0
  15. package/dist/browser/login.js +196 -0
  16. package/dist/browser/login.js.map +1 -0
  17. package/dist/browser/precaching.js +12 -0
  18. package/dist/browser/precaching.js.map +1 -1
  19. package/dist/browser/tuning/comcastPolymer.d.ts +23 -0
  20. package/dist/browser/tuning/comcastPolymer.js +655 -0
  21. package/dist/browser/tuning/comcastPolymer.js.map +1 -0
  22. package/dist/browser/tuning/cox.d.ts +2 -0
  23. package/dist/browser/tuning/cox.js +14 -0
  24. package/dist/browser/tuning/cox.js.map +1 -0
  25. package/dist/browser/tuning/directv.js +1 -1
  26. package/dist/browser/tuning/directv.js.map +1 -1
  27. package/dist/browser/tuning/fox.js +2 -2
  28. package/dist/browser/tuning/fox.js.map +1 -1
  29. package/dist/browser/tuning/hbo.js +1 -1
  30. package/dist/browser/tuning/hbo.js.map +1 -1
  31. package/dist/browser/tuning/hulu.js +1 -1
  32. package/dist/browser/tuning/hulu.js.map +1 -1
  33. package/dist/browser/tuning/shared.d.ts +46 -0
  34. package/dist/browser/tuning/shared.js +100 -0
  35. package/dist/browser/tuning/shared.js.map +1 -0
  36. package/dist/browser/tuning/sling.js +1 -1
  37. package/dist/browser/tuning/sling.js.map +1 -1
  38. package/dist/browser/tuning/spectrum.js +1 -1
  39. package/dist/browser/tuning/spectrum.js.map +1 -1
  40. package/dist/browser/tuning/thumbnailRow.js +1 -1
  41. package/dist/browser/tuning/thumbnailRow.js.map +1 -1
  42. package/dist/browser/tuning/tileClick.js +1 -1
  43. package/dist/browser/tuning/tileClick.js.map +1 -1
  44. package/dist/browser/tuning/xfinity.js +10 -603
  45. package/dist/browser/tuning/xfinity.js.map +1 -1
  46. package/dist/browser/tuning/youtubeTv.js +1 -1
  47. package/dist/browser/tuning/youtubeTv.js.map +1 -1
  48. package/dist/browser/video.d.ts +18 -0
  49. package/dist/browser/video.js +69 -107
  50. package/dist/browser/video.js.map +1 -1
  51. package/dist/channels/index.d.ts +4 -2
  52. package/dist/channels/index.js +2261 -800
  53. package/dist/channels/index.js.map +1 -1
  54. package/dist/config/health.js +30 -17
  55. package/dist/config/health.js.map +1 -1
  56. package/dist/config/index.js +37 -63
  57. package/dist/config/index.js.map +1 -1
  58. package/dist/config/profiles.js +10 -10
  59. package/dist/config/profiles.js.map +1 -1
  60. package/dist/config/providerPacks.js +4 -1
  61. package/dist/config/providerPacks.js.map +1 -1
  62. package/dist/config/providers.d.ts +12 -5
  63. package/dist/config/providers.js +133 -104
  64. package/dist/config/providers.js.map +1 -1
  65. package/dist/config/sites.js +15 -9
  66. package/dist/config/sites.js.map +1 -1
  67. package/dist/config/userChannels.d.ts +108 -7
  68. package/dist/config/userChannels.js +374 -44
  69. package/dist/config/userChannels.js.map +1 -1
  70. package/dist/config/userConfig.d.ts +3 -1
  71. package/dist/config/userConfig.js +31 -19
  72. package/dist/config/userConfig.js.map +1 -1
  73. package/dist/config/userProfiles.js +27 -39
  74. package/dist/config/userProfiles.js.map +1 -1
  75. package/dist/hdhr/channelMap.d.ts +1 -1
  76. package/dist/hdhr/channelMap.js +4 -4
  77. package/dist/hdhr/channelMap.js.map +1 -1
  78. package/dist/hdhr/discover.js +7 -15
  79. package/dist/hdhr/discover.js.map +1 -1
  80. package/dist/index.js +9 -15
  81. package/dist/index.js.map +1 -1
  82. package/dist/native/index.d.ts +3 -0
  83. package/dist/native/index.js +16 -25
  84. package/dist/native/index.js.map +1 -1
  85. package/dist/native/probe.d.ts +4 -3
  86. package/dist/native/probe.js +36 -12
  87. package/dist/native/probe.js.map +1 -1
  88. package/dist/native/proxy.d.ts +2 -0
  89. package/dist/native/proxy.js +369 -326
  90. package/dist/native/proxy.js.map +1 -1
  91. package/dist/routes/assets.js +26 -48
  92. package/dist/routes/assets.js.map +1 -1
  93. package/dist/routes/channels.js +5 -11
  94. package/dist/routes/channels.js.map +1 -1
  95. package/dist/routes/components.d.ts +43 -8
  96. package/dist/routes/components.js +122 -19
  97. package/dist/routes/components.js.map +1 -1
  98. package/dist/routes/config/channels/index.d.ts +2 -2
  99. package/dist/routes/config/channels/index.js +1 -1
  100. package/dist/routes/config/channels/index.js.map +1 -1
  101. package/dist/routes/config/channels/routes.js +749 -71
  102. package/dist/routes/config/channels/routes.js.map +1 -1
  103. package/dist/routes/config/channels/table.d.ts +93 -2
  104. package/dist/routes/config/channels/table.js +594 -104
  105. package/dist/routes/config/channels/table.js.map +1 -1
  106. package/dist/routes/config/index.d.ts +1 -1
  107. package/dist/routes/config/index.js +1 -1
  108. package/dist/routes/config/index.js.map +1 -1
  109. package/dist/routes/config/providers.d.ts +6 -6
  110. package/dist/routes/config/providers.js +76 -102
  111. package/dist/routes/config/providers.js.map +1 -1
  112. package/dist/routes/config/settings.js +57 -36
  113. package/dist/routes/config/settings.js.map +1 -1
  114. package/dist/routes/icons.d.ts +16 -0
  115. package/dist/routes/icons.js +44 -0
  116. package/dist/routes/icons.js.map +1 -0
  117. package/dist/routes/index.d.ts +0 -16
  118. package/dist/routes/index.js +0 -17
  119. package/dist/routes/index.js.map +1 -1
  120. package/dist/routes/playlist.d.ts +6 -4
  121. package/dist/routes/playlist.js +68 -27
  122. package/dist/routes/playlist.js.map +1 -1
  123. package/dist/routes/providers.js +106 -3
  124. package/dist/routes/providers.js.map +1 -1
  125. package/dist/routes/root/content.js +96 -40
  126. package/dist/routes/root/content.js.map +1 -1
  127. package/dist/routes/root/index.js +2 -1
  128. package/dist/routes/root/index.js.map +1 -1
  129. package/dist/routes/root/scripts/channels.js +955 -310
  130. package/dist/routes/root/scripts/channels.js.map +1 -1
  131. package/dist/routes/root/scripts/config.js +695 -569
  132. package/dist/routes/root/scripts/config.js.map +1 -1
  133. package/dist/routes/root/scripts/index.d.ts +1 -0
  134. package/dist/routes/root/scripts/index.js +1 -0
  135. package/dist/routes/root/scripts/index.js.map +1 -1
  136. package/dist/routes/root/scripts/shared.d.ts +6 -0
  137. package/dist/routes/root/scripts/shared.js +437 -0
  138. package/dist/routes/root/scripts/shared.js.map +1 -0
  139. package/dist/routes/root/scripts/status.js +33 -24
  140. package/dist/routes/root/scripts/status.js.map +1 -1
  141. package/dist/routes/root/styles.js +157 -11
  142. package/dist/routes/root/styles.js.map +1 -1
  143. package/dist/routes/ui.d.ts +1 -1
  144. package/dist/routes/ui.js +1 -1
  145. package/dist/routes/ui.js.map +1 -1
  146. package/dist/service/commands.js +4 -35
  147. package/dist/service/commands.js.map +1 -1
  148. package/dist/streaming/codec.d.ts +20 -0
  149. package/dist/streaming/codec.js +68 -0
  150. package/dist/streaming/codec.js.map +1 -0
  151. package/dist/streaming/fmp4Segmenter.d.ts +2 -0
  152. package/dist/streaming/fmp4Segmenter.js +7 -4
  153. package/dist/streaming/fmp4Segmenter.js.map +1 -1
  154. package/dist/streaming/hls.js +274 -188
  155. package/dist/streaming/hls.js.map +1 -1
  156. package/dist/streaming/hlsResume.d.ts +9 -3
  157. package/dist/streaming/hlsResume.js +15 -8
  158. package/dist/streaming/hlsResume.js.map +1 -1
  159. package/dist/streaming/hlsSegments.d.ts +1 -2
  160. package/dist/streaming/hlsSegments.js +48 -46
  161. package/dist/streaming/hlsSegments.js.map +1 -1
  162. package/dist/streaming/lifecycle.js +8 -12
  163. package/dist/streaming/lifecycle.js.map +1 -1
  164. package/dist/streaming/monitor.js +625 -585
  165. package/dist/streaming/monitor.js.map +1 -1
  166. package/dist/streaming/mpegts.js +1 -1
  167. package/dist/streaming/mpegts.js.map +1 -1
  168. package/dist/streaming/preroll.d.ts +41 -20
  169. package/dist/streaming/preroll.js +157 -76
  170. package/dist/streaming/preroll.js.map +1 -1
  171. package/dist/streaming/recovery.d.ts +0 -6
  172. package/dist/streaming/recovery.js +0 -8
  173. package/dist/streaming/recovery.js.map +1 -1
  174. package/dist/streaming/registry.d.ts +36 -9
  175. package/dist/streaming/registry.js +6 -9
  176. package/dist/streaming/registry.js.map +1 -1
  177. package/dist/streaming/setup.d.ts +3 -3
  178. package/dist/streaming/setup.js +38 -22
  179. package/dist/streaming/setup.js.map +1 -1
  180. package/dist/streaming/showInfo.d.ts +7 -6
  181. package/dist/streaming/showInfo.js +156 -36
  182. package/dist/streaming/showInfo.js.map +1 -1
  183. package/dist/streaming/statusEmitter.d.ts +14 -2
  184. package/dist/streaming/statusEmitter.js +22 -4
  185. package/dist/streaming/statusEmitter.js.map +1 -1
  186. package/dist/types/channels.d.ts +34 -0
  187. package/dist/types/config.d.ts +3 -2
  188. package/dist/types/index.d.ts +3 -2
  189. package/dist/types/index.js +1 -0
  190. package/dist/types/index.js.map +1 -1
  191. package/dist/types/profiles.d.ts +8 -3
  192. package/dist/types/selection.d.ts +1 -0
  193. package/dist/types/shared.d.ts +1 -1
  194. package/dist/types/streaming.d.ts +7 -15
  195. package/dist/types/streaming.js +5 -1
  196. package/dist/types/streaming.js.map +1 -1
  197. package/dist/upgrade/commands.js +1 -16
  198. package/dist/upgrade/commands.js.map +1 -1
  199. package/dist/utils/cliOutput.d.ts +10 -0
  200. package/dist/utils/cliOutput.js +17 -0
  201. package/dist/utils/cliOutput.js.map +1 -0
  202. package/dist/utils/debugFilter.d.ts +0 -5
  203. package/dist/utils/debugFilter.js +5 -11
  204. package/dist/utils/debugFilter.js.map +1 -1
  205. package/dist/utils/delay.d.ts +12 -0
  206. package/dist/utils/delay.js +20 -0
  207. package/dist/utils/delay.js.map +1 -1
  208. package/dist/utils/evaluate.js +6 -11
  209. package/dist/utils/evaluate.js.map +1 -1
  210. package/dist/utils/ffmpeg.d.ts +13 -5
  211. package/dist/utils/ffmpeg.js +32 -11
  212. package/dist/utils/ffmpeg.js.map +1 -1
  213. package/dist/utils/format.d.ts +20 -3
  214. package/dist/utils/format.js +32 -6
  215. package/dist/utils/format.js.map +1 -1
  216. package/dist/utils/index.d.ts +2 -0
  217. package/dist/utils/index.js +2 -0
  218. package/dist/utils/index.js.map +1 -1
  219. package/dist/utils/logEmitter.js +1 -1
  220. package/dist/utils/logEmitter.js.map +1 -1
  221. package/dist/utils/retry.d.ts +15 -9
  222. package/dist/utils/retry.js +8 -26
  223. package/dist/utils/retry.js.map +1 -1
  224. package/dist/utils/timing.d.ts +5 -0
  225. package/dist/utils/timing.js +13 -0
  226. package/dist/utils/timing.js.map +1 -0
  227. package/dist/utils/version.js +2 -2
  228. package/dist/utils/version.js.map +1 -1
  229. package/package.json +5 -5
@@ -7,6 +7,14 @@ export type UserChannel = Channel;
7
7
  * Map of channel keys to stored channel data (full definitions or deltas). This is the raw file format for channels.json.
8
8
  */
9
9
  export type UserChannelMap = StoredChannelMap;
10
+ /**
11
+ * Tag registry state persisted in channels.json alongside channel data. Tracks user-created tags and user-deleted predefined tags. The runtime tag vocabulary
12
+ * is computed as: (PREDEFINED_TAGS - deletedTags) + tags, sorted alphabetically.
13
+ */
14
+ export interface TagRegistry {
15
+ deletedTags: string[];
16
+ tags: string[];
17
+ }
10
18
  /**
11
19
  * Result of loading user channels from the file.
12
20
  */
@@ -15,6 +23,7 @@ export interface UserChannelsLoadResult {
15
23
  parseError: boolean;
16
24
  parseErrorMessage?: string;
17
25
  providerSelections: Record<string, string>;
26
+ tagRegistry: TagRegistry;
18
27
  }
19
28
  /**
20
29
  * Returns the path to the user channels file.
@@ -33,14 +42,16 @@ export declare function hasChannelsParseError(): boolean;
33
42
  export declare function getChannelsParseErrorMessage(): string | undefined;
34
43
  /**
35
44
  * Loads user channels from the channels file. Returns an empty map if the file doesn't exist, and sets parseError if the file exists but contains invalid JSON.
36
- * The file can contain a special `providerSelections` key with user's provider preferences, which is extracted separately from channels.
37
- * @returns The loaded channels with parse status and provider selections.
45
+ * The file can contain metadata keys (`providerSelections`, `tagRegistry`) which are extracted separately from channel data.
46
+ * @returns The loaded channels with parse status, provider selections, and tag registry.
38
47
  */
39
48
  export declare function loadUserChannels(): Promise<UserChannelsLoadResult>;
40
49
  /**
41
50
  * Saves user channels to the channels file and updates the in-memory cache. Changes take effect immediately for new stream requests without requiring a server
42
- * restart. Creates the data directory if it doesn't exist. Provider selections are also saved if any exist. Empty deltas (no overridden fields) for predefined
43
- * channel keys are stripped before saving to avoid storing no-op entries.
51
+ * restart. Creates the data directory if it doesn't exist. Metadata keys (provider selections, tag registry) are also saved if they have content. No-op deltas
52
+ * for predefined channel keys are normalized before saving: fields that match the predefined value or null-clear a field the predefined doesn't have are
53
+ * stripped. If the delta becomes empty after normalization, the entry is removed entirely. This ensures that any code path that writes deltas (inline edit,
54
+ * auto-number, browse modal, full edit) produces clean channels.json output without each handler needing to optimize its own delta.
44
55
  * @param channels - The channels to save (full definitions or delta overrides).
45
56
  * @throws If the file cannot be written.
46
57
  */
@@ -92,8 +103,8 @@ export declare function resolveStoredChannel(key: string, stored: StoredChannel)
92
103
  */
93
104
  export declare function getChannelListing(): ChannelListingEntry[];
94
105
  /**
95
- * Returns all available channels (predefined + user), with user channels taking precedence on key conflicts. Disabled predefined channels are excluded unless they
96
- * have a user override. Built on top of getChannelListing() to ensure a single merging code path.
106
+ * Returns all available channels (predefined + user), with user channels taking precedence on key conflicts. Disabled predefined channels are excluded. Built on
107
+ * top of getChannelListing() to ensure a single merging code path.
97
108
  * @returns The merged channel map with disabled predefined channels filtered out.
98
109
  */
99
110
  export declare function getAllChannels(): ChannelMap;
@@ -102,6 +113,44 @@ export declare function getAllChannels(): ChannelMap;
102
113
  * @returns The stored channel map.
103
114
  */
104
115
  export declare function getUserChannels(): StoredChannelMap;
116
+ /**
117
+ * Returns the current tag registry state.
118
+ * @returns A copy of the tag registry with user-created tags and deleted predefined tags.
119
+ */
120
+ export declare function getTagRegistry(): TagRegistry;
121
+ /**
122
+ * Updates the tag registry state in memory. Call saveUserChannels() after to persist the change.
123
+ * @param registry - The new tag registry state.
124
+ */
125
+ export declare function setTagRegistry(registry: TagRegistry): void;
126
+ /**
127
+ * Returns the active tag vocabulary: predefined tags minus user-deleted tags, plus user-created tags, sorted alphabetically. This is the single source of truth
128
+ * for which tags are visible, assignable, and queryable throughout the system. Tags not in this list are invisible to the UI and rejected by the ?tag= query
129
+ * parameter, even if they exist on channel definitions (vocabulary-as-lens model).
130
+ * @returns Sorted array of active tag strings.
131
+ */
132
+ export declare function getActiveTagVocabulary(): string[];
133
+ /**
134
+ * Returns a channel's effective tags — the intersection of the channel's assigned tags with the active vocabulary. Tags that exist on the channel but are not in
135
+ * the active vocabulary are filtered out, ensuring only assignable and queryable tags are visible in the UI and playlist responses.
136
+ * @param channel - The channel to get effective tags for.
137
+ * @returns Sorted array of effective tag strings, or empty array if the channel has no tags or none are in the active vocabulary.
138
+ */
139
+ export declare function getChannelEffectiveTags(channel: Channel): string[];
140
+ /**
141
+ * Applies a tag transformation across channels and persists the result. This is the single source of truth for batch tag mutations — delete, rename, and bulk
142
+ * toggle all route through this function. The caller provides a filter (which channels to transform) and a transform (how to modify each channel's tags). This
143
+ * function handles loading stored channel data, applying the transform, and saving. Delta normalization in saveUserChannels() handles predefined channel
144
+ * delta computation automatically — callers do not need to reason about deltas vs. full definitions.
145
+ * @param filter - Predicate selecting which listing entries to transform. Receives each ChannelListingEntry from getChannelListing().
146
+ * @param transform - Pure function mapping a channel's current resolved tags to its new tags. Receives the channel's current tags array (may be empty, ordering
147
+ * not guaranteed). Must return the desired tags array (may be empty to clear all tags). The returned array is sorted before storage.
148
+ * @returns Object with the affected channel keys and success status. On parse error, returns an error message and empty affected keys.
149
+ */
150
+ export declare function transformChannelTags(filter: (entry: ChannelListingEntry) => boolean, transform: (tags: string[]) => string[]): Promise<{
151
+ affectedKeys: string[];
152
+ error?: string;
153
+ }>;
105
154
  /**
106
155
  * Returns the predefined channel definition for a key.
107
156
  * @param key - The channel key to look up.
@@ -114,6 +163,44 @@ export declare function getPredefinedChannel(key: string): Channel | undefined;
114
163
  * @returns True if the channel is predefined.
115
164
  */
116
165
  export declare function isPredefinedChannel(key: string): boolean;
166
+ /**
167
+ * Returns the East canonical key for a Pacific channel. Pacific canonicals are auto-generated by generatePacificDefinitions with a "p" suffix (e.g., "disneyp"
168
+ * from "disney"). When a Pacific canonical's logo or other brand-level metadata is unavailable, the East counterpart provides a fallback. Returns undefined
169
+ * when the key is not a Pacific canonical (doesn't end with "p" or the base key isn't predefined).
170
+ * @param key - The channel key to check.
171
+ * @returns The East canonical key if this is a Pacific channel, undefined otherwise.
172
+ */
173
+ export declare function getEastCanonicalKey(key: string): string | undefined;
174
+ /**
175
+ * Bulk-populates the logo cache from a stationId-to-URL map. Called by showInfo.ts after fetching logo data from the DVR. Existing entries are overwritten with
176
+ * fresh data to pick up any logo URL changes (e.g., network rebrands).
177
+ * @param logos - Map of Gracenote station ID to logo URL.
178
+ */
179
+ export declare function setChannelLogos(logos: Map<string, string>): void;
180
+ /**
181
+ * Sets a single logo cache entry. Called by showInfo.ts after a TMS station name search for a single channel (tier 2 population or channel add/edit).
182
+ * @param stationId - The Gracenote station ID.
183
+ * @param url - The logo URL.
184
+ */
185
+ export declare function setChannelLogo(stationId: string, url: string): void;
186
+ /**
187
+ * Clears the logo cache. Called on shutdown to release memory.
188
+ */
189
+ export declare function clearChannelLogos(): void;
190
+ /**
191
+ * Resolves a channel key to its effective Gracenote station ID. Pacific channels (e.g., "bravop") resolve to their east counterpart's station ID since
192
+ * they share the same brand logo. User channel overrides that change the stationId are reflected. Returns undefined if the channel has no stationId.
193
+ * @param channelKey - The channel key to resolve (e.g., "amc", "bravop").
194
+ * @returns The Gracenote station ID, or undefined.
195
+ */
196
+ export declare function getChannelStationId(channelKey: string): string | undefined;
197
+ /**
198
+ * Returns the logo URL for a channel from the cache. Pacific channels (e.g., "bravop") are resolved to their east counterpart automatically. The cache is
199
+ * populated by showInfo.ts from the Channels DVR API - this function only reads from it.
200
+ * @param channelKey - The channel key to look up (e.g., "amc", "bravop"). Pacific keys resolve to their east variant internally.
201
+ * @returns The logo URL if cached, undefined otherwise.
202
+ */
203
+ export declare function getChannelLogo(channelKey: string): string | undefined;
117
204
  /**
118
205
  * Checks if a channel key exists in the user channels.
119
206
  * @param key - The channel key to check.
@@ -121,7 +208,8 @@ export declare function isPredefinedChannel(key: string): boolean;
121
208
  */
122
209
  export declare function isUserChannel(key: string): boolean;
123
210
  /**
124
- * Checks if a predefined channel is disabled.
211
+ * Checks if a predefined channel is disabled. The disabled state is determined solely by the disabledPredefined list in config — the user's explicit visibility
212
+ * intent. Property overrides (HDHR toggle, name change, tag edits) stored as deltas in channels.json are orthogonal and do not affect the enabled/disabled state.
125
213
  * @param key - The channel key to check.
126
214
  * @returns True if the channel is predefined and disabled.
127
215
  */
@@ -183,6 +271,14 @@ export declare function isChannelAvailable(key: string): boolean;
183
271
  * @returns Error message if invalid, undefined if valid.
184
272
  */
185
273
  export declare function validateChannelKey(key: string, isNew: boolean): string | undefined;
274
+ /**
275
+ * Validates a channel number for range and uniqueness. Returns an error message if invalid, undefined if valid. Empty string means no channel number (valid).
276
+ * This is the single source of truth for channel number validation, shared by the full edit handler and the inline-edit handler.
277
+ * @param value - The channel number as a string (from form input or inline edit). Empty means "no number."
278
+ * @param excludeKey - The channel key being edited, excluded from the duplicate check.
279
+ * @returns Error message if invalid, undefined if valid.
280
+ */
281
+ export declare function validateChannelNumber(value: string, excludeKey: string): string | undefined;
186
282
  /**
187
283
  * Validates a channel URL.
188
284
  * @param url - The URL to validate.
@@ -222,3 +318,8 @@ export declare function validateImportedChannels(data: unknown, validProfiles: s
222
318
  * @throws If the file cannot be written.
223
319
  */
224
320
  export declare function saveProviderSelections(): Promise<void>;
321
+ /**
322
+ * Saves the current tag registry to the channels file. This triggers a full file save including all user channels.
323
+ * @throws If the file cannot be written.
324
+ */
325
+ export declare function saveTagRegistry(): Promise<void>;