@khorsheed/dsh-reader 0.2.1 → 0.3.1

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 (89) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.en.md +26 -121
  3. package/README.i18n.yaml +3 -3
  4. package/README.md +26 -121
  5. package/cordis.patch.yml +7 -0
  6. package/lib/client.js +30580 -6892
  7. package/lib/index.js +4189 -621
  8. package/lib/typert.host.js +2265 -319
  9. package/lib/typert.remote-client.d.ts +99 -3
  10. package/lib/typert.remote-client.js +1618 -240
  11. package/lib/types/captions.d.ts +99 -0
  12. package/lib/types/captions.js +236 -0
  13. package/lib/types/client/MediaPlayer.d.ts +55 -0
  14. package/lib/types/client/MediaPlayer.js +106 -0
  15. package/lib/types/client/NotesView.d.ts +57 -0
  16. package/lib/types/client/NotesView.js +124 -0
  17. package/lib/types/client/ReaderPane.d.ts +20 -3
  18. package/lib/types/client/ReaderPane.js +905 -164
  19. package/lib/types/client/SpeakerLegend.d.ts +18 -0
  20. package/lib/types/client/SpeakerLegend.js +26 -0
  21. package/lib/types/client/canvas-sync.d.ts +84 -0
  22. package/lib/types/client/canvas-sync.js +59 -0
  23. package/lib/types/client/contract.d.ts +138 -3
  24. package/lib/types/client/extract-article.d.ts +38 -1
  25. package/lib/types/client/extract-article.js +501 -28
  26. package/lib/types/client/icons.d.ts +1 -1
  27. package/lib/types/client/icons.js +1 -1
  28. package/lib/types/client/index.js +82 -2
  29. package/lib/types/client/locales.d.ts +279 -11
  30. package/lib/types/client/locales.js +278 -10
  31. package/lib/types/client/notes.d.ts +142 -0
  32. package/lib/types/client/notes.js +334 -0
  33. package/lib/types/client/parse-rss.js +40 -0
  34. package/lib/types/client/preset-visibility.d.ts +93 -0
  35. package/lib/types/client/preset-visibility.js +115 -0
  36. package/lib/types/client/selectors.d.ts +5 -0
  37. package/lib/types/client/selectors.js +5 -0
  38. package/lib/types/client/session.d.ts +21 -1
  39. package/lib/types/client/session.js +12 -0
  40. package/lib/types/client/store.js +4 -1
  41. package/lib/types/client/translate.d.ts +26 -1
  42. package/lib/types/client/translate.js +29 -12
  43. package/lib/types/client/useLocalTranscript.d.ts +43 -0
  44. package/lib/types/client/useLocalTranscript.js +129 -0
  45. package/lib/types/client/useMedia.d.ts +68 -0
  46. package/lib/types/client/useMedia.js +299 -0
  47. package/lib/types/client/useMediaStates.d.ts +9 -0
  48. package/lib/types/client/useMediaStates.js +43 -0
  49. package/lib/types/client/useNotes.d.ts +110 -0
  50. package/lib/types/client/useNotes.js +423 -0
  51. package/lib/types/client/usePolish.d.ts +47 -0
  52. package/lib/types/client/usePolish.js +162 -0
  53. package/lib/types/image-fetch.d.ts +81 -0
  54. package/lib/types/image-fetch.js +385 -0
  55. package/lib/types/index.d.ts +6 -0
  56. package/lib/types/index.js +3 -0
  57. package/lib/types/local-transcribe.d.ts +171 -0
  58. package/lib/types/local-transcribe.js +473 -0
  59. package/lib/types/media-host.d.ts +91 -0
  60. package/lib/types/media-host.js +230 -0
  61. package/lib/types/media.d.ts +100 -0
  62. package/lib/types/media.js +207 -0
  63. package/lib/types/notes-types.d.ts +158 -0
  64. package/lib/types/notes-types.js +8 -0
  65. package/lib/types/notes.d.ts +213 -0
  66. package/lib/types/notes.js +718 -0
  67. package/lib/types/polish.d.ts +41 -0
  68. package/lib/types/polish.js +136 -0
  69. package/lib/types/remote.d.ts +127 -1
  70. package/lib/types/remote.js +162 -1
  71. package/lib/types/service.d.ts +100 -1
  72. package/lib/types/service.js +320 -59
  73. package/lib/types/skill.d.ts +20 -0
  74. package/lib/types/skill.js +78 -0
  75. package/lib/types/store.js +30 -8
  76. package/lib/types/tool.d.ts +23 -0
  77. package/lib/types/tool.js +40 -0
  78. package/lib/types/tools.d.ts +69 -0
  79. package/lib/types/tools.js +400 -0
  80. package/lib/types/types.d.ts +106 -0
  81. package/lib/types/types.js +66 -0
  82. package/lib/types/xiaoyuzhou.d.ts +43 -0
  83. package/lib/types/xiaoyuzhou.js +134 -0
  84. package/lib/types/ytdlp.d.ts +111 -0
  85. package/lib/types/ytdlp.js +269 -0
  86. package/package.json +29 -20
  87. package/lib/invariant.js +0 -38
  88. package/lib/types/invariant.d.ts +0 -29
  89. package/lib/types/invariant.js +0 -38
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Generated by scripts/sync-icon-artwork.mts from @deepseek-ai/dsh-client-ui-primitives
3
- * (v0.1.7-rc.1, harness 46a7f68b09) — do not edit by hand. The 0.1.5 and rc.1 host lines
3
+ * (v0.2.1-rc.1, harness 1600d8a1e1) — do not edit by hand. The 0.1.5 and rc.1 host lines
4
4
  * share no icon export name, so the rc.1 artwork is inlined here: pure SVG,
5
5
  * no host runtime identity, identical on every line. Re-run the generator
6
6
  * after adding an icon import or bumping the harness checkout.
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  export const IconChevronDownOutlineMedium = ({ size = 14, className }) => (_jsx("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: _jsx("path", { d: "M4 6L7.29289 9.29289C7.68342 9.68342 8.31658 9.68342 8.70711 9.29289L12 6", stroke: "currentColor" }) }));
3
3
  export const IconChevronLeftOutlineMedium = ({ size = 14, className }) => (_jsx("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: _jsx("path", { d: "M10 4L6.70711 7.29289C6.31658 7.68342 6.31658 8.31658 6.70711 8.70711L10 12", stroke: "currentColor" }) }));
4
- export const IconClockOutlineMedium = ({ size = 16, className }) => (_jsxs("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: [_jsx("path", { d: "M8 14.5C11.5899 14.5 14.5 11.5899 14.5 8C14.5 4.41015 11.5899 1.5 8 1.5C4.41015 1.5 1.5 4.41015 1.5 8C1.5 11.5899 4.41015 14.5 8 14.5Z", stroke: "currentColor" }), _jsx("path", { d: "M8 4V8.5L11.25 10.25", stroke: "currentColor" })] }));
4
+ export const IconClockOutlineMedium = ({ size = 16, className }) => (_jsxs("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: [_jsx("path", { d: "M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14Z", stroke: "currentColor" }), _jsx("path", { d: "M8 4.31V8.46L11 10.08", stroke: "currentColor" })] }));
5
5
  export const IconCopyOutlineMedium = ({ size = 16, className }) => (_jsxs("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: [_jsx("rect", { x: "1.52075", y: "4.07373", width: "10.3932", height: "10.3932", rx: "2", stroke: "currentColor" }), _jsx("path", { d: "M11.9792 1.53296C13.36 1.53296 14.4792 2.65225 14.4792 4.03296V9.42847C14.4792 10.3756 13.9521 11.1987 13.1755 11.6228V10.3298C13.3652 10.0787 13.4792 9.7674 13.4792 9.42847V4.03296C13.4792 3.20453 12.8077 2.53296 11.9792 2.53296H6.58374C6.27966 2.53301 5.99684 2.6235 5.7605 2.77905H4.42358C4.85652 2.03463 5.66056 1.53304 6.58374 1.53296H11.9792Z", fill: "currentColor" })] }));
6
6
  export const IconGlobeOutlineMedium = ({ size = 14, className }) => (_jsxs("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: [_jsx("path", { d: "M7.99986 14.0887C11.3626 14.0887 14.0886 11.3627 14.0886 7.99998C14.0886 4.63727 11.3626 1.91125 7.99986 1.91125C4.63715 1.91125 1.91113 4.63727 1.91113 7.99998C1.91113 11.3627 4.63715 14.0887 7.99986 14.0887Z", stroke: "currentColor" }), _jsx("path", { d: "M2.34619 8H13.6538", stroke: "currentColor", strokeLinecap: "square" }), _jsx("path", { d: "M7.99976 14.0889C9.23509 14.0889 10.1743 11.3629 10.1743 8.00006C10.1743 4.63739 9.23509 1.91138 7.99976 1.91138", stroke: "currentColor" }), _jsx("path", { d: "M7.99973 14.0889C6.76445 14.0889 5.8252 11.3629 5.8252 8.00006C5.8252 4.63739 6.76445 1.91138 7.99973 1.91138", stroke: "currentColor" })] }));
7
7
  export const IconPlusOutlineMedium = ({ size = 16, className }) => (_jsxs("svg", { width: size, height: size, className: className, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", strokeWidth: 1.3, children: [_jsx("path", { d: "M8 2V14", stroke: "currentColor" }), _jsx("path", { d: "M2 8H14", stroke: "currentColor" })] }));
@@ -1,6 +1,8 @@
1
1
  import readerRemote from '@khorsheed/dsh-reader/remote';
2
2
  import { extractArticle } from "./extract-article.js";
3
3
  import { translationHash } from "./translate.js";
4
+ import { noteTargetForSelection } from "./notes.js";
5
+ import { ReaderTabVisibility, RegistrationToggle } from "./preset-visibility.js";
4
6
  import { READER_TAB_ID, readerDefinition } from "./definition.js";
5
7
  import { ReaderPane } from "./ReaderPane.js";
6
8
  import { createReaderStore } from "./store.js";
@@ -13,6 +15,10 @@ export { READER_KIND, READER_TAB_ID } from "./definition.js";
13
15
  * session scope, and the session id alone is not enough to reach it).
14
16
  */
15
17
  export const inject = ['slots', 'remote', 'locale', 'sidebarRightTabs', 'sessions'];
18
+ function mainSessionId(list) {
19
+ const view = list;
20
+ return Object.values(view.byId).find(s => (s.retainedBy?.mainView ?? 0) > 0)?.id ?? view.current;
21
+ }
16
22
  /**
17
23
  * Client plugin body: mount the Remote, register the dictionaries and the
18
24
  * sidebar tab, and return the disposer.
@@ -96,8 +102,13 @@ export async function apply(ctx) {
96
102
  * The split is the host/browser boundary: the host owns the network (its
97
103
  * sanctioned egress seam), this process owns the DOM, and neither can do the
98
104
  * other's half — so the view calls this one function and both halves happen.
105
+ * `onPhase` marks the legs for the pane's progress line; the extracting leg
106
+ * is preceded by one macrotask so the phase actually PAINTS — the extraction
107
+ * of a long article is a synchronous second the renderer would otherwise
108
+ * spend before the reader ever saw the word.
99
109
  */
100
- const fetchEntryBody = async (entryId, url) => {
110
+ const fetchEntryBody = async (entryId, url, onPhase) => {
111
+ onPhase?.('downloading');
101
112
  const fetched = await remote.fetchEntryBody({ entryId, url });
102
113
  if (!fetched.ok) {
103
114
  return { entryId, cached: false, fresh: false, fromFeed: false, error: fetched.error.message };
@@ -106,6 +117,8 @@ export async function apply(ctx) {
106
117
  if (value.raw === undefined || value.url === undefined) {
107
118
  return { entryId, cached: false, fresh: false, fromFeed: false, error: value.error ?? 'fetch-failed' };
108
119
  }
120
+ onPhase?.('extracting');
121
+ await new Promise(resolve => setTimeout(resolve, 0));
109
122
  const extracted = extractArticle(value.raw, value.url);
110
123
  if (!extracted.ok) {
111
124
  return { entryId, cached: false, fresh: false, fromFeed: false, error: extracted.error };
@@ -114,6 +127,7 @@ export async function apply(ctx) {
114
127
  ...(extracted.title === undefined ? {} : { title: extracted.title }),
115
128
  ...(extracted.excerpt === undefined ? {} : { excerpt: extracted.excerpt }),
116
129
  };
130
+ onPhase?.('storing');
117
131
  const stored = await remote.storeEntryBody({
118
132
  entryId,
119
133
  url: value.url,
@@ -145,6 +159,7 @@ export async function apply(ctx) {
145
159
  listBackfillCandidates: entries => remote.listBackfillCandidates({ entries }),
146
160
  getEntryBody: request => remote.getEntryBody(request),
147
161
  fetchEntryBody,
162
+ fetchImage: url => remote.fetchImage({ url }),
148
163
  getEntryTranslation: entryId => remote.getEntryTranslation({ entryId }),
149
164
  getSentenceTranslations: request => remote.getSentenceTranslations(request),
150
165
  rememberSentences: request => remote.rememberSentences(request),
@@ -189,7 +204,47 @@ export async function apply(ctx) {
189
204
  const capture = ctx.get('remote.capture');
190
205
  return typeof capture?.render === 'function' ? capture : undefined;
191
206
  },
207
+ entryNotes: entryId => remote.entryNotes({ entryId }),
208
+ noteCounts: () => remote.noteCounts(),
209
+ addNote: request => remote.addNote(request),
210
+ updateNote: request => remote.updateNote(request),
211
+ deleteNote: request => remote.deleteNote(request),
212
+ addReply: request => remote.addReply(request),
213
+ editReply: request => remote.editReply(request),
214
+ deleteDiscussion: request => remote.deleteDiscussion(request),
215
+ markSynced: request => remote.markSynced(request),
216
+ // The canvas's inbox (its client half provides `ctx.canvasInbox`), probed
217
+ // per gesture: without the canvas the sync gesture simply is not offered.
218
+ canvasInbox: () => {
219
+ const inbox = ctx.get('canvasInbox');
220
+ return typeof inbox?.addCard === 'function' && typeof inbox.listCanvases === 'function' ? inbox : undefined;
221
+ },
222
+ recordDiscussion: request => remote.recordDiscussion(request),
223
+ snapshotEntry: request => remote.snapshotEntry(request),
224
+ mediaTranscript: request => remote.mediaTranscript(request),
225
+ startLocalTranscript: request => remote.startLocalTranscript(request),
226
+ localTranscript: request => remote.localTranscript(request),
227
+ cancelLocalTranscript: request => remote.cancelLocalTranscript(request),
228
+ mediaStates: request => remote.mediaStates(request),
229
+ speakerNames: request => remote.speakerNames(request),
230
+ polish: request => remote.polish(request),
231
+ setPolishOff: request => remote.setPolishOff(request),
232
+ nameSpeaker: request => remote.nameSpeaker(request),
233
+ canOpenSession: () => workspaceNav()?.openSession !== undefined,
234
+ openSession: target => {
235
+ try {
236
+ workspaceNav()?.openSession?.(target);
237
+ }
238
+ catch (error) {
239
+ ctx.logger.warn('reader: openSession failed', error);
240
+ }
241
+ },
192
242
  });
243
+ /**
244
+ * ui-workspace's navigation face, probed per call (the canvas / datasets
245
+ * precedent): a composition without it simply has no 「回到会话」.
246
+ */
247
+ const workspaceNav = () => ctx.get('uiWorkspace');
193
248
  /** The conversation input for a session, when the composition has one. */
194
249
  const inputFor = (sessionId) => {
195
250
  const scope = ctx.get('sessions')?.scope(sessionId);
@@ -204,10 +259,35 @@ export async function apply(ctx) {
204
259
  const setDraft = (sessionId, merged) => {
205
260
  inputFor(sessionId)?.setDraft(merged);
206
261
  };
262
+ // 「记笔记」in the quote plugin's selection menu (its `ctx.quoteActions`
263
+ // registry). Probed, never injected: without quote the row simply does not
264
+ // exist and the pane's own 「记笔记」 button is the way in. The row shows only
265
+ // while the selection sits inside a reader article; it then opens THAT
266
+ // pane's note sheet.
267
+ const quoteActions = ctx.get('quoteActions');
268
+ if (quoteActions !== undefined && typeof quoteActions.registerAction === 'function') {
269
+ ctx.effect(() => quoteActions.registerAction({
270
+ id: 'reader.note',
271
+ label: () => t('notes.take'),
272
+ available: () => noteTargetForSelection() !== undefined,
273
+ run: () => { noteTargetForSelection()?.start(); },
274
+ }), 'reader: quote action');
275
+ }
207
276
  // Two-stage right-Sidebar registration: the type into the registry, the body
208
277
  // into the keyed pane seat under the type's id. Both ride `ctx.effect` so a
209
278
  // reload or unload removes them.
210
- ctx.effect(() => ctx.sidebarRightTabs.register(readerDefinition(t)), 'reader: tab type');
279
+ // The tab type registers exactly while the current session can reach the
280
+ // reader tools (preset-visibility.ts): a root-mounted `./tool` row (a
281
+ // standalone install) or the session's preset naming it (the learning and
282
+ // writing mode packs). Every unreadable path fails open.
283
+ const pluginInventory = ctx.get('remote.pluginInventory');
284
+ const tabVisibility = new ReaderTabVisibility(ctx, pluginInventory);
285
+ ctx.effect(() => {
286
+ const toggle = new RegistrationToggle(() => ctx.sidebarRightTabs.register(readerDefinition(t)), () => tabVisibility.show(mainSessionId(ctx.sessions.list.getSnapshot())));
287
+ toggle.setReady(true);
288
+ const unsubscribe = tabVisibility.subscribe(() => { toggle.sync(); });
289
+ return () => { unsubscribe(); toggle.setReady(false); };
290
+ }, 'reader: tab type visibility');
211
291
  ctx.effect(() => ctx.slots.inject('sidebar.right.pane.tab', () => ctx.slots.register({
212
292
  name: 'sidebar.right.pane.tab',
213
293
  key: READER_TAB_ID,
@@ -13,7 +13,7 @@
13
13
  */
14
14
  export declare const NS = "reader";
15
15
  /** The inspiration space's dictionary key set (the source of truth for both locales). */
16
- export type ReaderKey = 'tab.label' | 'tab.subtitle' | 'guide.description' | 'filter.today' | 'filter.all' | 'filter.unreadOnly' | 'filter.unreadOn' | 'filter.readState' | 'filter.bySource' | 'filter.byTag' | 'action.filter' | 'filter.searchSource' | 'filter.noSourceMatch' | 'filter.byKind' | 'filter.deleteTag' | 'filter.hideDupes' | 'dedupe.badge' | 'dedupe.title' | 'action.translate' | 'translate.view' | 'translate.onlyTranslation' | 'translate.bilingual' | 'translate.onlyOriginal' | 'translate.retry' | 'translate.tip' | 'translate.preparing' | 'translate.working' | 'translate.local' | 'translate.failed' | 'translate.dismiss' | 'translate.nothing' | 'translate.failedAll' | 'translate.unsupported' | 'action.fetchBody' | 'detail.bodyStale' | 'action.more' | 'action.addTag' | 'tag.title' | 'tag.placeholder' | 'tag.hint' | 'tag.create' | 'tag.empty' | 'search.placeholder' | 'sort.title' | 'sort.newest' | 'sort.oldest' | 'sort.source' | 'action.refresh' | 'action.refreshOne' | 'action.add' | 'action.back' | 'action.copyLink' | 'action.openExternal' | 'action.quote' | 'action.manage' | 'action.recent' | 'recent.title' | 'recent.help' | 'recent.empty' | 'recent.clearTitle' | 'recent.sourceGone' | 'action.remove' | 'action.submit' | 'action.done' | 'action.cancel' | 'action.clearSearch' | 'add.title' | 'add.help' | 'add.placeholder' | 'verdict.subscribed' | 'verdict.savedLink' | 'verdict.savedLinkNoPreview' | 'verdict.duplicate' | 'verdict.invalidUrl' | 'verdict.unsupportedContent' | 'verdict.fetchFailed' | 'preview.blocked' | 'preview.login' | 'preview.unsupportedType' | 'preview.redirected' | 'preview.empty' | 'preview.unreachable' | 'preview.http' | 'preview.unreadable' | 'detail.linkOnlyBadge' | 'detail.removeLink' | 'detail.fetchingBody' | 'detail.refetch' | 'detail.refetching' | 'detail.refetchTitle' | 'state.loading' | 'state.emptyTitle' | 'state.emptyBody' | 'state.noMatch' | 'state.fetching' | 'state.incomplete' | 'state.error' | 'state.stale' | 'state.emptyWall' | 'state.incompleteReason' | 'state.matches' | 'detail.scriptFigures' | 'fetch.none' | 'fetch.fetching' | 'fetch.raw' | 'fetch.ready' | 'fetch.failed' | 'fetch.noneTitle' | 'fetch.readyTitle' | 'fetch.failedTitle' | 'fetch.failedOpenTitle' | 'fetch.failedFinalTitle' | 'detail.renderFetch' | 'detail.rendering' | 'sources.title' | 'sources.count' | 'sources.empty' | 'sources.help' | 'sources.enabled' | 'sources.disabled' | 'sources.time' | 'sources.timeHelp' | 'sources.failed' | 'sources.items' | 'sources.never' | 'sources.cardHint' | 'sources.name' | 'sources.url' | 'sources.cache' | 'sources.cacheHelp' | 'sources.cacheHours' | 'sources.cacheForever' | 'sources.blocked' | 'sources.storageBodies' | 'sources.storageBodiesUsage' | 'sources.storageBodiesHelp' | 'sources.storageTranslations' | 'sources.storageTranslationsUsage' | 'sources.storageTranslationsHelp' | 'sources.translationBudget' | 'sources.translationBudgetHelp' | 'sources.clearTranslations' | 'sources.clearTranslationsConfirm' | 'sources.unreachable' | 'sources.httpError' | 'detail.fetchFailed' | 'sources.kindRss' | 'sources.kindLink' | 'sources.kindFilter' | 'sources.noMatch' | 'sources.sortAdded' | 'sources.sortName' | 'sources.sortFetched' | 'state.backfilling' | 'detail.filledIn' | 'detail.filledInBadge' | 'action.pause' | 'action.resume' | 'detail.incomplete' | 'detail.readOriginal' | 'detail.extractFailed' | 'detail.summaryOnly' | 'detail.resolvedFrom' | 'detail.alsoFrom' | 'detail.composerLabel' | 'detail.composerEmpty' | 'foot.refreshedAt' | 'foot.scheduled' | 'foot.never' | 'foot.unread' | 'foot.refreshing' | 'foot.deduped' | 'quote.copied' | 'quote.copyFailed' | 'quote.quoted' | 'quote.toSideChat' | 'quote.sideChatUnavailable' | 'when.justNow' | 'when.minutes' | 'when.hours' | 'when.yesterday' | 'when.days';
16
+ export type ReaderKey = 'tab.label' | 'tab.subtitle' | 'guide.description' | 'filter.today' | 'filter.all' | 'filter.unreadOnly' | 'filter.unreadOn' | 'filter.readState' | 'filter.bySource' | 'filter.byTag' | 'action.filter' | 'filter.searchSource' | 'filter.noSourceMatch' | 'filter.byKind' | 'filter.deleteTag' | 'filter.hideDupes' | 'dedupe.badge' | 'dedupe.title' | 'action.translate' | 'translate.view' | 'translate.onlyTranslation' | 'translate.bilingual' | 'translate.onlyOriginal' | 'translate.retry' | 'translate.tip' | 'translate.preparing' | 'translate.working' | 'translate.local' | 'translate.stored' | 'translate.failed' | 'translate.dismiss' | 'translate.nothing' | 'translate.failedAll' | 'translate.unsupported' | 'action.fetchBody' | 'detail.bodyStale' | 'action.more' | 'action.addTag' | 'translate.wallOff' | 'chip.unread' | 'chip.more' | 'state.incompleteCount' | 'action.showList' | 'action.foldList' | 'tag.title' | 'tag.placeholder' | 'tag.hint' | 'tag.create' | 'tag.empty' | 'search.placeholder' | 'sort.title' | 'sort.newest' | 'sort.oldest' | 'sort.source' | 'action.refresh' | 'action.refreshOne' | 'action.add' | 'action.back' | 'action.copyLink' | 'action.openExternal' | 'action.manage' | 'action.recent' | 'recent.title' | 'recent.help' | 'recent.empty' | 'recent.clearTitle' | 'recent.sourceGone' | 'action.remove' | 'action.submit' | 'action.done' | 'action.cancel' | 'action.clearSearch' | 'add.title' | 'add.help' | 'add.placeholder' | 'verdict.subscribed' | 'verdict.savedLink' | 'verdict.savedLinkNoPreview' | 'verdict.duplicate' | 'verdict.invalidUrl' | 'verdict.unsupportedContent' | 'verdict.fetchFailed' | 'verdict.willRender' | 'preview.blocked' | 'preview.login' | 'preview.unsupportedType' | 'preview.redirected' | 'preview.empty' | 'preview.unreachable' | 'preview.http' | 'preview.unreadable' | 'detail.linkOnlyBadge' | 'detail.removeLink' | 'detail.fetchingBody' | 'detail.phase.downloading' | 'detail.phase.extracting' | 'detail.phase.storing' | 'detail.fetchElapsed' | 'add.busy' | 'detail.refetch' | 'detail.refetching' | 'detail.refetchTitle' | 'state.loading' | 'state.emptyTitle' | 'state.emptyBody' | 'state.noMatch' | 'state.fetching' | 'state.incomplete' | 'state.error' | 'state.stale' | 'state.emptyWall' | 'state.incompleteReason' | 'state.matches' | 'detail.scriptFigures' | 'fetch.none' | 'fetch.fetching' | 'fetch.raw' | 'fetch.ready' | 'fetch.failed' | 'fetch.noneTitle' | 'fetch.readyTitle' | 'fetch.failedTitle' | 'fetch.failedOpenTitle' | 'fetch.failedFinalTitle' | 'detail.renderFetch' | 'detail.rendering' | 'detail.renderingWall' | 'detail.renderFailed' | 'sources.title' | 'sources.count' | 'sources.empty' | 'sources.help' | 'sources.enabled' | 'sources.disabled' | 'sources.time' | 'sources.timeHelp' | 'sources.failed' | 'sources.items' | 'sources.never' | 'sources.cardHint' | 'sources.name' | 'sources.url' | 'sources.cache' | 'sources.cacheHelp' | 'sources.cacheHours' | 'sources.cacheForever' | 'sources.blocked' | 'sources.storageBodies' | 'sources.storageBodiesUsage' | 'sources.storageBodiesHelp' | 'sources.storageTranslations' | 'sources.storageTranslationsUsage' | 'sources.storageTranslationsHelp' | 'sources.translationBudget' | 'sources.translationBudgetHelp' | 'sources.clearTranslations' | 'sources.clearTranslationsConfirm' | 'sources.unreachable' | 'sources.httpError' | 'detail.fetchFailed' | 'sources.kindRss' | 'sources.kindLink' | 'sources.kindFilter' | 'sources.noMatch' | 'sources.sortAdded' | 'sources.sortName' | 'sources.sortFetched' | 'state.backfilling' | 'detail.filledIn' | 'detail.filledInBadge' | 'action.pause' | 'action.resume' | 'detail.incomplete' | 'detail.readOriginal' | 'detail.extractFailed' | 'detail.summaryOnly' | 'detail.resolvedFrom' | 'detail.alsoFrom' | 'foot.refreshedAt' | 'foot.scheduled' | 'foot.never' | 'foot.unread' | 'foot.refreshing' | 'foot.deduped' | 'quote.copied' | 'quote.copyFailed' | 'quote.quoted' | 'add.fetching' | 'notes.checkShort' | 'polish.action' | 'polish.draft' | 'polish.continueDraft' | 'polish.tag' | 'polish.tagTitle' | 'polish.running' | 'polish.stalled' | 'polish.continue' | 'polish.done' | 'polish.showMachine' | 'polish.showPolish' | 'polish.awaiting' | 'when.justNow' | 'when.minutes' | 'when.hours' | 'when.yesterday' | 'when.days' | 'notes.tabArticle' | 'notes.tabNotes' | 'notes.tabsLabel' | 'notes.take' | 'notes.sheetTitle' | 'notes.excerpt' | 'notes.commentPlaceholder' | 'notes.commentOptional' | 'notes.save' | 'notes.saveFailed' | 'notes.empty' | 'notes.excerpts' | 'notes.discussions' | 'notes.noDiscussions' | 'notes.select' | 'notes.selectDone' | 'notes.selected' | 'notes.discuss' | 'notes.discussAll' | 'notes.edit' | 'notes.delete' | 'notes.deleteConfirm' | 'notes.notFound' | 'notes.inTranslation' | 'notes.discussedIn' | 'notes.draftHeading' | 'notes.draftComment' | 'notes.draftHint' | 'notes.untitledSession' | 'notes.badge' | 'notes.filter' | 'notes.replyAdd' | 'notes.replyAgent' | 'notes.replyUser' | 'notes.replyEdited' | 'notes.replyPlaceholder' | 'notes.replyEdit' | 'notes.replyRemove' | 'notes.discussionNotes' | 'notes.kindDiscussion' | 'notes.kindCheck' | 'notes.noDiscussionNotes' | 'notes.pointsCheck' | 'notes.pointsDiscussion' | 'notes.check' | 'notes.checkLead' | 'notes.checkDraft' | 'notes.checkDraftNotes' | 'notes.backToSession' | 'media.collapse' | 'media.expand' | 'media.noFollow' | 'media.captions' | 'media.sourcePlatform' | 'media.loading' | 'media.noCaptions' | 'media.noCaptionsAudio' | 'media.failed' | 'media.kindVideo' | 'media.kindAudio' | 'media.sourceLocal' | 'media.localFetching' | 'media.localQueued' | 'media.localQueuedAhead' | 'media.localRunning' | 'media.localEta' | 'media.cardPlatform' | 'media.cardLocal' | 'media.cardQueued' | 'media.cardQueuedAhead' | 'media.cardRunning' | 'media.cardFailed' | 'media.cardNone' | 'media.cardNoneAuto' | 'media.play' | 'media.pause' | 'media.startedAt' | 'media.tabTranscript' | 'media.autoTranslate' | 'media.translateAfter' | 'media.chipTitle' | 'media.chipTitleReload' | 'media.timeHint' | 'media.timeHintAudio' | 'media.timeHintOk' | 'media.backToNow' | 'media.speakerDefault' | 'media.speakerHint' | 'media.speakerRename' | 'media.speakersRunning' | 'media.localStop' | 'media.localStopped' | 'media.localFailed' | 'media.localRetry' | 'media.localModels' | 'media.localModelsGo' | 'notes.sync' | 'notes.syncTitle' | 'notes.syncLast' | 'notes.syncCards' | 'notes.syncReplies' | 'notes.syncKind' | 'notes.syncDone' | 'notes.syncOpen' | 'notes.syncFailed' | 'notes.syncedIn' | 'notes.syncNoCanvas' | 'notes.syncConclusion' | 'notes.syncOriginal' | 'notes.syncRun';
17
17
  export declare const en: {
18
18
  'tab.label': string;
19
19
  'tab.subtitle': string;
@@ -27,6 +27,12 @@ export declare const en: {
27
27
  'action.filter': string;
28
28
  'action.fetchBody': string;
29
29
  'action.more': string;
30
+ 'translate.wallOff': string;
31
+ 'chip.unread': string;
32
+ 'chip.more': string;
33
+ 'state.incompleteCount': string;
34
+ 'action.showList': string;
35
+ 'action.foldList': string;
30
36
  'action.addTag': string;
31
37
  'action.translate': string;
32
38
  'translate.view': string;
@@ -38,6 +44,7 @@ export declare const en: {
38
44
  'translate.preparing': string;
39
45
  'translate.working': string;
40
46
  'translate.local': string;
47
+ 'translate.stored': string;
41
48
  'translate.failed': string;
42
49
  'translate.failedAll': string;
43
50
  'translate.nothing': string;
@@ -68,7 +75,6 @@ export declare const en: {
68
75
  'action.back': string;
69
76
  'action.copyLink': string;
70
77
  'action.openExternal': string;
71
- 'action.quote': string;
72
78
  'action.manage': string;
73
79
  'action.recent': string;
74
80
  'recent.title': string;
@@ -94,6 +100,7 @@ export declare const en: {
94
100
  'verdict.unsupportedContent': string;
95
101
  'verdict.fetchFailed': string;
96
102
  'preview.blocked': string;
103
+ 'verdict.willRender': string;
97
104
  'preview.login': string;
98
105
  'preview.unsupportedType': string;
99
106
  'preview.redirected': string;
@@ -103,6 +110,11 @@ export declare const en: {
103
110
  'preview.unreadable': string;
104
111
  'detail.linkOnlyBadge': string;
105
112
  'detail.fetchingBody': string;
113
+ 'detail.phase.downloading': string;
114
+ 'detail.phase.extracting': string;
115
+ 'detail.phase.storing': string;
116
+ 'detail.fetchElapsed': string;
117
+ 'add.busy': string;
106
118
  'detail.refetch': string;
107
119
  'detail.refetching': string;
108
120
  'detail.refetchTitle': string;
@@ -163,8 +175,6 @@ export declare const en: {
163
175
  'detail.summaryOnly': string;
164
176
  'detail.resolvedFrom': string;
165
177
  'detail.alsoFrom': string;
166
- 'detail.composerLabel': string;
167
- 'detail.composerEmpty': string;
168
178
  'foot.refreshedAt': string;
169
179
  'foot.scheduled': string;
170
180
  'foot.never': string;
@@ -186,17 +196,141 @@ export declare const en: {
186
196
  'fetch.failedOpenTitle': string;
187
197
  'fetch.failedFinalTitle': string;
188
198
  'detail.renderFetch': string;
199
+ 'detail.renderingWall': string;
200
+ 'detail.renderFailed': string;
189
201
  'detail.rendering': string;
190
202
  'quote.copied': string;
191
203
  'quote.copyFailed': string;
192
204
  'quote.quoted': string;
193
- 'quote.toSideChat': string;
194
- 'quote.sideChatUnavailable': string;
205
+ 'add.fetching': string;
206
+ 'notes.checkShort': string;
207
+ 'polish.action': string;
208
+ 'polish.draft': string;
209
+ 'polish.continueDraft': string;
210
+ 'polish.tag': string;
211
+ 'polish.tagTitle': string;
212
+ 'polish.running': string;
213
+ 'polish.stalled': string;
214
+ 'polish.continue': string;
215
+ 'polish.done': string;
216
+ 'polish.showMachine': string;
217
+ 'polish.showPolish': string;
218
+ 'polish.awaiting': string;
195
219
  'when.justNow': string;
196
220
  'when.minutes': string;
197
221
  'when.hours': string;
198
222
  'when.yesterday': string;
199
223
  'when.days': string;
224
+ 'notes.tabArticle': string;
225
+ 'notes.tabNotes': string;
226
+ 'notes.tabsLabel': string;
227
+ 'notes.take': string;
228
+ 'notes.sheetTitle': string;
229
+ 'notes.excerpt': string;
230
+ 'notes.commentPlaceholder': string;
231
+ 'notes.commentOptional': string;
232
+ 'notes.save': string;
233
+ 'notes.saveFailed': string;
234
+ 'notes.empty': string;
235
+ 'notes.excerpts': string;
236
+ 'notes.discussions': string;
237
+ 'notes.noDiscussions': string;
238
+ 'notes.select': string;
239
+ 'notes.selectDone': string;
240
+ 'notes.selected': string;
241
+ 'notes.discuss': string;
242
+ 'notes.discussAll': string;
243
+ 'notes.edit': string;
244
+ 'notes.delete': string;
245
+ 'notes.deleteConfirm': string;
246
+ 'notes.notFound': string;
247
+ 'notes.inTranslation': string;
248
+ 'notes.discussedIn': string;
249
+ 'notes.draftHeading': string;
250
+ 'notes.draftComment': string;
251
+ 'notes.draftHint': string;
252
+ 'notes.untitledSession': string;
253
+ 'notes.badge': string;
254
+ 'notes.filter': string;
255
+ 'notes.replyAdd': string;
256
+ 'notes.replyAgent': string;
257
+ 'notes.replyUser': string;
258
+ 'notes.replyEdited': string;
259
+ 'notes.replyPlaceholder': string;
260
+ 'notes.replyEdit': string;
261
+ 'notes.replyRemove': string;
262
+ 'notes.discussionNotes': string;
263
+ 'notes.kindDiscussion': string;
264
+ 'notes.kindCheck': string;
265
+ 'notes.noDiscussionNotes': string;
266
+ 'notes.pointsCheck': string;
267
+ 'notes.pointsDiscussion': string;
268
+ 'notes.check': string;
269
+ 'notes.checkLead': string;
270
+ 'notes.checkDraft': string;
271
+ 'notes.checkDraftNotes': string;
272
+ 'notes.backToSession': string;
273
+ 'media.collapse': string;
274
+ 'media.noFollow': string;
275
+ 'media.expand': string;
276
+ 'media.captions': string;
277
+ 'media.sourcePlatform': string;
278
+ 'media.loading': string;
279
+ 'media.noCaptions': string;
280
+ 'media.noCaptionsAudio': string;
281
+ 'media.sourceLocal': string;
282
+ 'media.play': string;
283
+ 'media.pause': string;
284
+ 'media.startedAt': string;
285
+ 'media.tabTranscript': string;
286
+ 'media.autoTranslate': string;
287
+ 'media.translateAfter': string;
288
+ 'media.chipTitle': string;
289
+ 'media.chipTitleReload': string;
290
+ 'media.timeHint': string;
291
+ 'media.timeHintAudio': string;
292
+ 'media.timeHintOk': string;
293
+ 'media.backToNow': string;
294
+ 'media.speakerDefault': string;
295
+ 'media.speakerHint': string;
296
+ 'media.speakerRename': string;
297
+ 'media.speakersRunning': string;
298
+ 'media.cardPlatform': string;
299
+ 'media.cardLocal': string;
300
+ 'media.cardQueued': string;
301
+ 'media.cardQueuedAhead': string;
302
+ 'media.cardRunning': string;
303
+ 'media.cardFailed': string;
304
+ 'media.cardNone': string;
305
+ 'media.cardNoneAuto': string;
306
+ 'media.localFetching': string;
307
+ 'media.localQueued': string;
308
+ 'media.localQueuedAhead': string;
309
+ 'media.localRunning': string;
310
+ 'media.localEta': string;
311
+ 'media.localStop': string;
312
+ 'media.localStopped': string;
313
+ 'media.localFailed': string;
314
+ 'media.localRetry': string;
315
+ 'media.localModels': string;
316
+ 'media.localModelsGo': string;
317
+ 'media.failed': string;
318
+ 'media.kindVideo': string;
319
+ 'media.kindAudio': string;
320
+ 'notes.sync': string;
321
+ 'notes.syncTitle': string;
322
+ 'notes.syncLast': string;
323
+ 'notes.syncCards': string;
324
+ 'notes.syncReplies': string;
325
+ 'notes.syncKind': string;
326
+ 'notes.syncDone': string;
327
+ 'notes.syncOpen': string;
328
+ 'notes.syncFailed': string;
329
+ 'notes.syncedIn': string;
330
+ 'notes.syncNoCanvas': string;
331
+ 'notes.syncConclusion': string;
332
+ 'notes.syncOriginal': string;
333
+ 'notes.syncRun': string;
200
334
  };
201
335
  export declare const zh: {
202
336
  'tab.label': string;
@@ -211,6 +345,12 @@ export declare const zh: {
211
345
  'action.filter': string;
212
346
  'action.fetchBody': string;
213
347
  'action.more': string;
348
+ 'translate.wallOff': string;
349
+ 'chip.unread': string;
350
+ 'chip.more': string;
351
+ 'state.incompleteCount': string;
352
+ 'action.showList': string;
353
+ 'action.foldList': string;
214
354
  'action.addTag': string;
215
355
  'action.translate': string;
216
356
  'translate.view': string;
@@ -222,6 +362,7 @@ export declare const zh: {
222
362
  'translate.preparing': string;
223
363
  'translate.working': string;
224
364
  'translate.local': string;
365
+ 'translate.stored': string;
225
366
  'translate.failed': string;
226
367
  'translate.failedAll': string;
227
368
  'translate.nothing': string;
@@ -252,7 +393,6 @@ export declare const zh: {
252
393
  'action.back': string;
253
394
  'action.copyLink': string;
254
395
  'action.openExternal': string;
255
- 'action.quote': string;
256
396
  'action.manage': string;
257
397
  'action.recent': string;
258
398
  'recent.title': string;
@@ -278,6 +418,7 @@ export declare const zh: {
278
418
  'verdict.unsupportedContent': string;
279
419
  'verdict.fetchFailed': string;
280
420
  'preview.blocked': string;
421
+ 'verdict.willRender': string;
281
422
  'preview.login': string;
282
423
  'preview.unsupportedType': string;
283
424
  'preview.redirected': string;
@@ -287,6 +428,11 @@ export declare const zh: {
287
428
  'preview.unreadable': string;
288
429
  'detail.linkOnlyBadge': string;
289
430
  'detail.fetchingBody': string;
431
+ 'detail.phase.downloading': string;
432
+ 'detail.phase.extracting': string;
433
+ 'detail.phase.storing': string;
434
+ 'detail.fetchElapsed': string;
435
+ 'add.busy': string;
290
436
  'detail.refetch': string;
291
437
  'detail.refetching': string;
292
438
  'detail.refetchTitle': string;
@@ -347,8 +493,6 @@ export declare const zh: {
347
493
  'detail.summaryOnly': string;
348
494
  'detail.resolvedFrom': string;
349
495
  'detail.alsoFrom': string;
350
- 'detail.composerLabel': string;
351
- 'detail.composerEmpty': string;
352
496
  'foot.refreshedAt': string;
353
497
  'foot.scheduled': string;
354
498
  'foot.never': string;
@@ -370,17 +514,141 @@ export declare const zh: {
370
514
  'fetch.failedOpenTitle': string;
371
515
  'fetch.failedFinalTitle': string;
372
516
  'detail.renderFetch': string;
517
+ 'detail.renderingWall': string;
518
+ 'detail.renderFailed': string;
373
519
  'detail.rendering': string;
374
520
  'quote.copied': string;
375
521
  'quote.copyFailed': string;
376
522
  'quote.quoted': string;
377
- 'quote.toSideChat': string;
378
- 'quote.sideChatUnavailable': string;
523
+ 'add.fetching': string;
524
+ 'notes.checkShort': string;
525
+ 'polish.action': string;
526
+ 'polish.draft': string;
527
+ 'polish.continueDraft': string;
528
+ 'polish.tag': string;
529
+ 'polish.tagTitle': string;
530
+ 'polish.running': string;
531
+ 'polish.stalled': string;
532
+ 'polish.continue': string;
533
+ 'polish.done': string;
534
+ 'polish.showMachine': string;
535
+ 'polish.showPolish': string;
536
+ 'polish.awaiting': string;
379
537
  'when.justNow': string;
380
538
  'when.minutes': string;
381
539
  'when.hours': string;
382
540
  'when.yesterday': string;
383
541
  'when.days': string;
542
+ 'notes.tabArticle': string;
543
+ 'notes.tabNotes': string;
544
+ 'notes.tabsLabel': string;
545
+ 'notes.take': string;
546
+ 'notes.sheetTitle': string;
547
+ 'notes.excerpt': string;
548
+ 'notes.commentPlaceholder': string;
549
+ 'notes.commentOptional': string;
550
+ 'notes.save': string;
551
+ 'notes.saveFailed': string;
552
+ 'notes.empty': string;
553
+ 'notes.excerpts': string;
554
+ 'notes.discussions': string;
555
+ 'notes.noDiscussions': string;
556
+ 'notes.select': string;
557
+ 'notes.selectDone': string;
558
+ 'notes.selected': string;
559
+ 'notes.discuss': string;
560
+ 'notes.discussAll': string;
561
+ 'notes.edit': string;
562
+ 'notes.delete': string;
563
+ 'notes.deleteConfirm': string;
564
+ 'notes.notFound': string;
565
+ 'notes.inTranslation': string;
566
+ 'notes.discussedIn': string;
567
+ 'notes.draftHeading': string;
568
+ 'notes.draftComment': string;
569
+ 'notes.draftHint': string;
570
+ 'notes.untitledSession': string;
571
+ 'notes.badge': string;
572
+ 'notes.filter': string;
573
+ 'notes.replyAdd': string;
574
+ 'notes.replyAgent': string;
575
+ 'notes.replyUser': string;
576
+ 'notes.replyEdited': string;
577
+ 'notes.replyPlaceholder': string;
578
+ 'notes.replyEdit': string;
579
+ 'notes.replyRemove': string;
580
+ 'notes.discussionNotes': string;
581
+ 'notes.kindDiscussion': string;
582
+ 'notes.kindCheck': string;
583
+ 'notes.noDiscussionNotes': string;
584
+ 'notes.pointsCheck': string;
585
+ 'notes.pointsDiscussion': string;
586
+ 'notes.check': string;
587
+ 'notes.checkLead': string;
588
+ 'notes.checkDraft': string;
589
+ 'notes.checkDraftNotes': string;
590
+ 'notes.backToSession': string;
591
+ 'media.collapse': string;
592
+ 'media.noFollow': string;
593
+ 'media.expand': string;
594
+ 'media.captions': string;
595
+ 'media.sourcePlatform': string;
596
+ 'media.loading': string;
597
+ 'media.noCaptions': string;
598
+ 'media.noCaptionsAudio': string;
599
+ 'media.sourceLocal': string;
600
+ 'media.play': string;
601
+ 'media.pause': string;
602
+ 'media.startedAt': string;
603
+ 'media.tabTranscript': string;
604
+ 'media.autoTranslate': string;
605
+ 'media.translateAfter': string;
606
+ 'media.chipTitle': string;
607
+ 'media.chipTitleReload': string;
608
+ 'media.timeHint': string;
609
+ 'media.timeHintAudio': string;
610
+ 'media.timeHintOk': string;
611
+ 'media.backToNow': string;
612
+ 'media.speakerDefault': string;
613
+ 'media.speakerHint': string;
614
+ 'media.speakerRename': string;
615
+ 'media.speakersRunning': string;
616
+ 'media.cardPlatform': string;
617
+ 'media.cardLocal': string;
618
+ 'media.cardQueued': string;
619
+ 'media.cardQueuedAhead': string;
620
+ 'media.cardRunning': string;
621
+ 'media.cardFailed': string;
622
+ 'media.cardNone': string;
623
+ 'media.cardNoneAuto': string;
624
+ 'media.localFetching': string;
625
+ 'media.localQueued': string;
626
+ 'media.localQueuedAhead': string;
627
+ 'media.localRunning': string;
628
+ 'media.localEta': string;
629
+ 'media.localStop': string;
630
+ 'media.localStopped': string;
631
+ 'media.localFailed': string;
632
+ 'media.localRetry': string;
633
+ 'media.localModels': string;
634
+ 'media.localModelsGo': string;
635
+ 'media.failed': string;
636
+ 'media.kindVideo': string;
637
+ 'media.kindAudio': string;
638
+ 'notes.sync': string;
639
+ 'notes.syncTitle': string;
640
+ 'notes.syncLast': string;
641
+ 'notes.syncCards': string;
642
+ 'notes.syncReplies': string;
643
+ 'notes.syncKind': string;
644
+ 'notes.syncDone': string;
645
+ 'notes.syncOpen': string;
646
+ 'notes.syncFailed': string;
647
+ 'notes.syncedIn': string;
648
+ 'notes.syncNoCanvas': string;
649
+ 'notes.syncConclusion': string;
650
+ 'notes.syncOriginal': string;
651
+ 'notes.syncRun': string;
384
652
  };
385
653
  declare module '@deepseek-ai/dsh-client-ui-slots' {
386
654
  interface LocaleNamespaceMap {